@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,4 +1,5 @@
1
1
  import { HOOKS_AVAILABLE, POLICY_HOOKS, } from "@capybara-hq/plugin-sdk";
2
+ import { NEEDS_CONFIG_REASON } from "./effective-config.js";
2
3
  import { ExtensionUnloadedError } from "./inflight.js";
3
4
  /** Default of `hooks.timeoutMs` (used when a host is built without kernel config, e.g. in tests). */
4
5
  export const DEFAULT_HOOK_TIMEOUT_MS = 5000;
@@ -13,6 +14,18 @@ export const OBSERVE_INFLIGHT_MAX = 64;
13
14
  export const EMPTY_DENY_REASON = "(no reason given)";
14
15
  /** Warnings about a plugin's hooks are logged at most once per plugin, mount and kind in this window. */
15
16
  const WARN_WINDOW_MS = 60_000;
17
+ /**
18
+ * Thrown by a `usage.report` handler wrapper (see {@link HookRegistry.handlers}) instead of calling
19
+ * a handler whose extension's effective config is not valid in the payload's organization.
20
+ */
21
+ export class HookNeedsConfigError extends Error {
22
+ plugin;
23
+ constructor(plugin) {
24
+ super(`extension ${plugin} ${NEEDS_CONFIG_REASON}`);
25
+ this.plugin = plugin;
26
+ this.name = "HookNeedsConfigError";
27
+ }
28
+ }
16
29
  const AVAILABLE = new Set(HOOKS_AVAILABLE);
17
30
  const POLICY = new Set(POLICY_HOOKS);
18
31
  /** Error text that never throws itself (a hostile `message` getter or `toString`). */
@@ -110,7 +123,12 @@ const clipDetail = (s) => clipText(s, HOOK_DETAIL_MAX_CHARS);
110
123
  * If a plugin the organization enabled is expected to run policy hooks on the mount (deployment
111
124
  * state, `expectedPolicy`) but is not loaded on this replica, deny with a generic reason
112
125
  * (`hook_error`, `notLoaded`) without running any policy hook (M-1: fail closed). Observe hooks
113
- * of plugins that are not loaded are simply missing.
126
+ * of plugins that are not loaded are simply missing. Then each enabled plugin with a hook on the
127
+ * mount gets its effective config for the organization (layering spec A §6; one read per plugin
128
+ * and call, failing like the lookup above). A plugin whose config is not valid behaves as one
129
+ * that is not loaded: with a policy hook on the mount the call is denied (`hook_error`,
130
+ * `needsConfig`) without running any policy hook, and its observe hooks are skipped. Every
131
+ * hook is called with `{ config }` as its third argument.
114
132
  * 3. Policy hooks run serially by plugin name (registration order within a plugin), each limited
115
133
  * by `hooks.timeoutMs` (read on every run, hot). `{ deny }`, an error or a timeout stops the chain
116
134
  * and denies (`deny` / `hook_error` / `timeout`). A policy hook cut off by its instance being
@@ -156,13 +174,18 @@ export class HookRegistry {
156
174
  }
157
175
  /**
158
176
  * `usage.report` handlers by plugin name (delivered by the usage queue, not by {@link run}); each
159
- * call runs through the instance's `inflight.run`.
177
+ * call runs through the instance's `inflight.run` with the plugin's effective config for the
178
+ * payload's organization, and throws {@link HookNeedsConfigError} without calling the handler
179
+ * when that config is not valid (layering spec A §6).
160
180
  */
161
181
  handlers(mount) {
162
182
  return this.entries(mount).map(({ src, hook }) => ({
163
183
  plugin: src.name,
164
184
  handler: (payload, signal) => src.inflight.run(signal, async (s) => {
165
- await hook.handler(payload, s);
185
+ const effective = await this.d.effectiveConfig(payload.orgId, src.name);
186
+ if (!effective.ok)
187
+ throw new HookNeedsConfigError(src.name);
188
+ await hook.handler(payload, s, { config: effective.config });
166
189
  }),
167
190
  }));
168
191
  }
@@ -177,6 +200,8 @@ export class HookRegistry {
177
200
  let enabled;
178
201
  let frozen;
179
202
  let missing;
203
+ /** Effective config per enabled plugin with a hook here; null = not valid in the org. */
204
+ const configs = new Map();
180
205
  try {
181
206
  const abort = abortOf(signal);
182
207
  try {
@@ -194,6 +219,19 @@ export class HookRegistry {
194
219
  }
195
220
  if (!all.some((e) => enabled.has(e.src.name)))
196
221
  return { allowed: true };
222
+ for (const name of new Set(all.map((e) => e.src.name).filter((n) => enabled.has(n)))) {
223
+ const abortCfg = abortOf(signal);
224
+ try {
225
+ const e = await Promise.race([
226
+ this.d.effectiveConfig(payload.orgId, name),
227
+ abortCfg.aborted,
228
+ ]);
229
+ configs.set(name, e.ok ? { config: e.config } : null);
230
+ }
231
+ finally {
232
+ abortCfg.cleanup();
233
+ }
234
+ }
197
235
  // Cost: one clone + deep-freeze per call. The model.request payload carries no media bytes
198
236
  // (hookRequestOf, I-3), so it stays small. Freezing in place would freeze the logged object.
199
237
  // The clone is skipped when has() is false or no enabled plugin has a hook on this mount.
@@ -207,7 +245,7 @@ export class HookRegistry {
207
245
  if (firstPolicy !== undefined) {
208
246
  // R10: no plugin ran; the named plugin is only the first policy plugin on this mount, so
209
247
  // the detail says so instead of blaming it
210
- const detail = clipDetail(`Hooks could not run (organization lookup or payload copy failed) before any plugin was called; ${firstPolicy} is named only as the first policy plugin on ${mount}: ${raw}`);
248
+ const detail = clipDetail(`Hooks could not run (organization lookup, config read or payload copy failed) before any plugin was called; ${firstPolicy} is named only as the first policy plugin on ${mount}: ${raw}`);
211
249
  this.d.log.warn("plugin hooks could not run; denying the call", {
212
250
  mount,
213
251
  firstPolicyPlugin: firstPolicy,
@@ -227,9 +265,19 @@ export class HookRegistry {
227
265
  }
228
266
  return { allowed: true };
229
267
  }
230
- const active = all.filter((e) => enabled.has(e.src.name));
268
+ const active = all.filter((e) => enabled.has(e.src.name) && configs.get(e.src.name));
231
269
  const timeoutMs = this.d.config().hooks.timeoutMs;
232
- let outcome = missing.length > 0 ? this.notLoadedDenial(mount, missing) : { allowed: true };
270
+ // spec A §6: a policy plugin without a valid config in the org behaves as one not loaded
271
+ const needy = [
272
+ ...new Set(all
273
+ .filter((e) => e.hook.mode === "policy" && configs.get(e.src.name) === null)
274
+ .map((e) => e.src.name)),
275
+ ];
276
+ let outcome = missing.length > 0
277
+ ? this.notLoadedDenial(mount, missing)
278
+ : needy.length > 0
279
+ ? this.needsConfigDenial(mount, needy)
280
+ : { allowed: true };
233
281
  // policy hooks grouped per plugin (entries are sorted, so groups are contiguous)
234
282
  const groups = [];
235
283
  for (const e of active) {
@@ -242,7 +290,8 @@ export class HookRegistry {
242
290
  groups.push({ src: e.src, hooks: [e.hook] });
243
291
  }
244
292
  for (const g of outcome.allowed ? groups : []) {
245
- const denied = await this.runPolicies(mount, g.src, g.hooks, frozen, signal, timeoutMs);
293
+ const call = configs.get(g.src.name);
294
+ const denied = await this.runPolicies(mount, g.src, g.hooks, frozen, call, signal, timeoutMs);
246
295
  if (denied) {
247
296
  outcome = denied;
248
297
  break;
@@ -251,8 +300,10 @@ export class HookRegistry {
251
300
  // observe hooks are resolved again now: if the plugin was upgraded while the policy hooks ran,
252
301
  // the current generation observes (the retiring one no longer accepts calls)
253
302
  for (const e of this.entries(mount)) {
254
- if (e.hook.mode === "observe" && enabled.has(e.src.name)) {
255
- this.dispatchObserve(mount, e.src, e.hook, frozen, signal);
303
+ const call = configs.get(e.src.name);
304
+ // no config read for it (not valid in the org, or a plugin that appeared meanwhile): skipped
305
+ if (e.hook.mode === "observe" && enabled.has(e.src.name) && call) {
306
+ this.dispatchObserve(mount, e.src, e.hook, frozen, call, signal);
256
307
  }
257
308
  }
258
309
  return outcome;
@@ -277,6 +328,21 @@ export class HookRegistry {
277
328
  notLoaded: true,
278
329
  };
279
330
  }
331
+ /**
332
+ * The layering spec A §6 denial: `needy` (sorted) are enabled policy plugins whose effective
333
+ * config is not valid in the organization. Generic model-visible reason, as for M-1.
334
+ */
335
+ needsConfigDenial(mount, needy) {
336
+ const plugin = needy[0];
337
+ return {
338
+ allowed: false,
339
+ plugin,
340
+ reason: unavailableReason(plugin),
341
+ cause: "hook_error",
342
+ detail: `extension ${needy.join(", ")} declares a policy hook on ${mount} but ${NEEDS_CONFIG_REASON}; the call was denied without running any policy hook`,
343
+ needsConfig: true,
344
+ };
345
+ }
280
346
  /** Active entries of a mount point, sorted by plugin name (stable: registration order within). */
281
347
  entries(mount) {
282
348
  return this.d
@@ -285,14 +351,14 @@ export class HookRegistry {
285
351
  .sort((a, b) => (a.src.name < b.src.name ? -1 : a.src.name > b.src.name ? 1 : 0));
286
352
  }
287
353
  /** One plugin's policy hooks in registration order; reruns once on a newer generation if revoked. */
288
- async runPolicies(mount, src, hooks, payload, signal, timeoutMs, rerun = false) {
354
+ async runPolicies(mount, src, hooks, payload, call, signal, timeoutMs, rerun = false) {
289
355
  const plugin = src.name;
290
356
  for (const hook of hooks) {
291
357
  if (signal.aborted)
292
358
  throw signal.reason;
293
359
  let r;
294
360
  try {
295
- r = await src.inflight.run(signal, (s) => this.call(hook, payload, s, timeoutMs));
361
+ r = await src.inflight.run(signal, (s) => this.call(hook, payload, call, s, timeoutMs));
296
362
  }
297
363
  catch (err) {
298
364
  if (signal.aborted)
@@ -301,7 +367,7 @@ export class HookRegistry {
301
367
  const cur = this.d.current(plugin);
302
368
  if (!rerun && cur && cur !== src) {
303
369
  const again = cur.hooks.filter((h) => h.mount === mount && h.mode === "policy");
304
- return this.runPolicies(mount, cur, again, payload, signal, timeoutMs, true);
370
+ return this.runPolicies(mount, cur, again, payload, call, signal, timeoutMs, true);
305
371
  }
306
372
  }
307
373
  r = { kind: "error", message: errMsg(err) };
@@ -338,7 +404,7 @@ export class HookRegistry {
338
404
  return undefined;
339
405
  }
340
406
  /** Fire-and-forget observe call through the instance's in-flight tracker, capped per plugin. */
341
- dispatchObserve(mount, src, hook, payload, signal) {
407
+ dispatchObserve(mount, src, hook, payload, call, signal) {
342
408
  const plugin = src.name;
343
409
  const n = this.observing.get(plugin) ?? 0;
344
410
  if (n >= OBSERVE_INFLIGHT_MAX) {
@@ -349,7 +415,7 @@ export class HookRegistry {
349
415
  this.observing.set(plugin, n + 1);
350
416
  void (async () => {
351
417
  try {
352
- const r = await src.inflight.run(signal, (s) => this.call(hook, payload, s, timeoutMs));
418
+ const r = await src.inflight.run(signal, (s) => this.call(hook, payload, call, s, timeoutMs));
353
419
  if (r.kind === "error" || r.kind === "timeout") {
354
420
  await this.warnOnce(plugin, mount, "failed", "plugin observe hook failed; the call continued", r.kind === "timeout" ? `timed out after ${timeoutMs} ms` : r.message);
355
421
  }
@@ -371,7 +437,7 @@ export class HookRegistry {
371
437
  * Calls one handler with its own signal (aborted on timeout or when `s` aborts). Rejects with
372
438
  * `s.reason` when `s` aborts first, so callers can tell an abort from a hook failure.
373
439
  */
374
- async call(hook, payload, s, timeoutMs) {
440
+ async call(hook, payload, call, s, timeoutMs) {
375
441
  const ac = new AbortController();
376
442
  const onAbort = () => ac.abort(s.reason);
377
443
  if (s.aborted)
@@ -385,7 +451,7 @@ export class HookRegistry {
385
451
  timer = setTimeout(() => resolve("timeout"), timeoutMs);
386
452
  });
387
453
  const handled = Promise.resolve()
388
- .then(() => hook.handler(payload, ac.signal))
454
+ .then(() => hook.handler(payload, ac.signal, { config: call.config }))
389
455
  .then((v) => ({ v }), (err) => ({ err }));
390
456
  const result = await Promise.race([handled, timedOut, abort.aborted]);
391
457
  if (result === "timeout") {
@@ -13,6 +13,7 @@ import type { KernelLogger } from "../log.js";
13
13
  import { EmbedTokens } from "../ui/embed-token.js";
14
14
  import type { UiActionHandler, UiRender } from "../ui/registry.js";
15
15
  import { ExtensionApprovals, type PendingExtension } from "./approvals.js";
16
+ import { EffectiveConfigs } from "./effective-config.js";
16
17
  import { HookRegistry } from "./hooks.js";
17
18
  import type { InflightTracker } from "./inflight.js";
18
19
  import { type DesiredExtension, ExtensionInstalls } from "./installs.js";
@@ -112,6 +113,11 @@ export declare class ExtensionHost {
112
113
  private readonly status;
113
114
  private readonly config;
114
115
  private readonly log;
116
+ /**
117
+ * Each hook call's effective config for its organization, and the providers excluded from an
118
+ * org's point resolution (layering spec A §6).
119
+ */
120
+ private readonly effective;
115
121
  /**
116
122
  * Only resolves extensions and runs migrations in dependency order: no deployment config check, no
117
123
  * setup, no Redis (for `capybara migrate`). Like `load()` it checks secret markers first
@@ -244,7 +250,12 @@ export declare class ExtensionHost {
244
250
  */
245
251
  installs: ExtensionInstalls, approvals: ExtensionApprovals,
246
252
  /** This replica's load status table (`extension_replica_status`): every load result writes a row. */
247
- status: ReplicaStatusStore, config: KernelConfigService, kdb: KernelDb, redis: Redis, busSubscriber: BusSubscriber, keyring: Keyring, embedTokens: EmbedTokens, locks: LockService, log: KernelLogger, options: Pick<KernelAppOptions, "resolveFrom">);
253
+ status: ReplicaStatusStore, config: KernelConfigService, kdb: KernelDb, redis: Redis, busSubscriber: BusSubscriber, keyring: Keyring, embedTokens: EmbedTokens, locks: LockService, log: KernelLogger, options: Pick<KernelAppOptions, "resolveFrom">,
254
+ /**
255
+ * Each hook call's effective config for its organization, and the providers excluded from an
256
+ * org's point resolution (layering spec A §6).
257
+ */
258
+ effective: Pick<EffectiveConfigs, "get">);
248
259
  /** The startup config's `extensionConfig` (file / Nacos merged with env). */
249
260
  private get extensionConfig();
250
261
  /** `extensionPermissions.autoApprove` (development and trials only; see `planApprovals`). */
@@ -489,6 +500,13 @@ export declare class ExtensionHost {
489
500
  * (如 `identity-source@1` 的登录配置);未加载返回 undefined。不得回显到响应或日志。
490
501
  */
491
502
  deploymentConfig(plugin: string): unknown;
503
+ /**
504
+ * The raw (unparsed) deployment config of a running extension: the startup config merged with
505
+ * the PG values, as the host reads it before parsing (secrets included; never echo it). An org
506
+ * copy is applied to this and parsed once (layering spec A §6), so schema transforms are not
507
+ * run twice. Without a running instance, the stored values without a schema.
508
+ */
509
+ rawDeploymentConfig(plugin: string): Promise<unknown>;
492
510
  /**
493
511
  * 本副本拿得到的插件清单里的部署级 schema(生效实例 → 配置声明 → 安装记录准备好的候选);
494
512
  * 都没有返回 undefined(如未加载的安装记录:调用方改用包内静态清单)。
@@ -31,9 +31,11 @@ import { ExtensionApprovals, planApprovals, readSnapshots, withPreApproved, } fr
31
31
  import { ExtensionBlobIntegrityError } from "./blobs.js";
32
32
  import { toIssues } from "./config-issues.js";
33
33
  import { configFormSchema, describeConfigUiProblems } from "./config-json-schema.js";
34
+ import { EffectiveConfigs } from "./effective-config.js";
34
35
  import { HookRegistry } from "./hooks.js";
35
36
  import { ExtensionInstalls } from "./installs.js";
36
37
  import { ImportTracker, importExtensionModule, ManifestMismatchError, matchesSection, setupInstance, warnUpgrades, } from "./instance.js";
38
+ import { parseLoadGate } from "./org-levels.js";
37
39
  import { declaredDisplayName, permissionSetOfSection, readMigrationSql } from "./package.js";
38
40
  import { blockingKeys, computePermissionSet, UI_VIEW_KEY_PREFIX, } from "./permission-set.js";
39
41
  import { ExtensionRegistry } from "./registry.js";
@@ -172,7 +174,7 @@ function warnPending(log, p) {
172
174
  : "extension not loaded: a required extension point is only provided by extensions awaiting permission approval", { plugin: p.plugin, version: p.version, blockedBy: p.blockedBy });
173
175
  return;
174
176
  }
175
- log.warn("extension not loaded: permissions awaiting approval (an enterprise admin approves it in the admin console, or run `capybara extensions review`, then `capybara extensions approve <name>`; running replicas load it without a restart)", { plugin: p.plugin, version: p.version, reason: p.reason, added: p.added, removed: p.removed });
177
+ log.warn("extension not loaded: permissions awaiting approval (a super admin approves it in the admin console, or run `capybara extensions review`, then `capybara extensions approve <name>`; running replicas load it without a restart)", { plugin: p.plugin, version: p.version, reason: p.reason, added: p.added, removed: p.removed });
176
178
  }
177
179
  /**
178
180
  * 跑单个插件的迁移(`migrationsDir` 为迁移目录的绝对路径;没有迁移时为 undefined);返回已应用的文件,
@@ -235,6 +237,7 @@ let ExtensionHost = class ExtensionHost {
235
237
  status;
236
238
  config;
237
239
  log;
240
+ effective;
238
241
  /**
239
242
  * Only resolves extensions and runs migrations in dependency order: no deployment config check, no
240
243
  * setup, no Redis (for `capybara migrate`). Like `load()` it checks secret markers first
@@ -407,13 +410,19 @@ let ExtensionHost = class ExtensionHost {
407
410
  */
408
411
  installs, approvals,
409
412
  /** This replica's load status table (`extension_replica_status`): every load result writes a row. */
410
- status, config, kdb, redis, busSubscriber, keyring, embedTokens, locks, log, options) {
413
+ status, config, kdb, redis, busSubscriber, keyring, embedTokens, locks, log, options,
414
+ /**
415
+ * Each hook call's effective config for its organization, and the providers excluded from an
416
+ * org's point resolution (layering spec A §6).
417
+ */
418
+ effective) {
411
419
  this.registry = registry;
412
420
  this.installs = installs;
413
421
  this.approvals = approvals;
414
422
  this.status = status;
415
423
  this.config = config;
416
424
  this.log = log;
425
+ this.effective = effective;
417
426
  const c = config.get();
418
427
  this.deps = {
419
428
  db: kdb.pool,
@@ -433,6 +442,7 @@ let ExtensionHost = class ExtensionHost {
433
442
  current: (plugin) => this.registry.current(plugin),
434
443
  expectedPolicy: (mount) => this.expectedPolicy(mount),
435
444
  enabledPlugins: (orgId) => this.enabledPlugins(orgId),
445
+ effectiveConfig: (orgId, plugin) => effective.get(orgId, plugin),
436
446
  locks,
437
447
  config: () => ({ hooks: { timeoutMs: this.config.get().hooks.timeoutMs } }),
438
448
  log,
@@ -1190,7 +1200,9 @@ let ExtensionHost = class ExtensionHost {
1190
1200
  return undefined;
1191
1201
  }
1192
1202
  let config = raw;
1193
- const parsed = readConfig ? schema?.safeParse(raw) : undefined;
1203
+ // the load gate (spec A §5.4a): overridable fields may stay empty on the platform, so
1204
+ // `ctx.config` may lack them; hidden and read-only fields must be complete
1205
+ const parsed = readConfig && schema ? parseLoadGate(schema, raw) : undefined;
1194
1206
  if (a.source !== "install")
1195
1207
  this.configValidity.set(name, parsed?.success ?? true);
1196
1208
  if (decision.action === "pending") {
@@ -1365,7 +1377,7 @@ let ExtensionHost = class ExtensionHost {
1365
1377
  permissions: d.set,
1366
1378
  configurable: schema !== undefined,
1367
1379
  configValid: this.configValidity.get(name) ??
1368
- (schema ? schema.safeParse(this.extensionConfig[name] ?? {}).success : true),
1380
+ (schema ? parseLoadGate(schema, this.extensionConfig[name] ?? {}).success : true),
1369
1381
  displayName: this.declaredDisplayNames.get(name) ?? null,
1370
1382
  };
1371
1383
  });
@@ -1604,6 +1616,7 @@ let ExtensionHost = class ExtensionHost {
1604
1616
  .all()
1605
1617
  .flatMap((i) => i.provided.has(ref) ? [{ plugin: i.name, impl: i.provided.get(ref) }] : []),
1606
1618
  enabledPlugins: (orgId) => this.enabledPlugins(orgId),
1619
+ configOk: async (orgId, plugin) => (await this.effective.get(orgId, plugin)).ok,
1607
1620
  };
1608
1621
  get loadDeps() {
1609
1622
  return {
@@ -1711,6 +1724,15 @@ let ExtensionHost = class ExtensionHost {
1711
1724
  deploymentConfig(plugin) {
1712
1725
  return this.registry.deploymentConfig(plugin);
1713
1726
  }
1727
+ /**
1728
+ * The raw (unparsed) deployment config of a running extension: the startup config merged with
1729
+ * the PG values, as the host reads it before parsing (secrets included; never echo it). An org
1730
+ * copy is applied to this and parsed once (layering spec A §6), so schema transforms are not
1731
+ * run twice. Without a running instance, the stored values without a schema.
1732
+ */
1733
+ rawDeploymentConfig(plugin) {
1734
+ return this.rawConfigOf(plugin, this.registry.current(plugin)?.manifest.config?.deployment);
1735
+ }
1714
1736
  /**
1715
1737
  * 本副本拿得到的插件清单里的部署级 schema(生效实例 → 配置声明 → 安装记录准备好的候选);
1716
1738
  * 都没有返回 undefined(如未加载的安装记录:调用方改用包内静态清单)。
@@ -1746,7 +1768,7 @@ let ExtensionHost = class ExtensionHost {
1746
1768
  if (schema) {
1747
1769
  try {
1748
1770
  const raw = await this.rawConfigOf(plugin, schema);
1749
- this.configValidity.set(plugin, schema.safeParse(raw).success);
1771
+ this.configValidity.set(plugin, parseLoadGate(schema, raw).success);
1750
1772
  }
1751
1773
  catch (err) {
1752
1774
  this.log.warn("cannot read the stored deployment config of plugin", {
@@ -1768,7 +1790,7 @@ let ExtensionHost = class ExtensionHost {
1768
1790
  this.log.error("cannot read the stored deployment config of plugin; keeping its current config", { plugin, err });
1769
1791
  return "invalid";
1770
1792
  }
1771
- const r = schema.safeParse(raw);
1793
+ const r = parseLoadGate(schema, raw);
1772
1794
  if (!r.success) {
1773
1795
  this.log.warn("plugin deployment config changed but is invalid on this replica; keeping the current config", {
1774
1796
  plugin,
@@ -2178,6 +2200,7 @@ ExtensionHost = __decorate([
2178
2200
  __param(9, Inject(EmbedTokens)),
2179
2201
  __param(10, Inject(LockService)),
2180
2202
  __param(11, Inject(KERNEL_LOGGER)),
2181
- __param(12, Inject(KERNEL_APP_OPTIONS))
2203
+ __param(12, Inject(KERNEL_APP_OPTIONS)),
2204
+ __param(13, Inject(EffectiveConfigs))
2182
2205
  ], ExtensionHost);
2183
2206
  export { ExtensionHost };
@@ -1,10 +1,11 @@
1
1
  import { type PluginExtensionSection } from "@capybara-hq/plugin-sdk";
2
2
  import type { core } from "zod";
3
3
  import type { Keyring } from "../ctx/secrets.js";
4
- import { EnterpriseAdminLock } from "../identity/enterprise-admin.js";
4
+ import { SuperAdminLock } from "../identity/super-admin.js";
5
5
  import { KernelConfigService } from "../infra/config/kernel-config.service.js";
6
6
  import { KernelDb } from "../infra/database/kernel-db.js";
7
7
  import { TransactionHost } from "../infra/database/transaction-host.js";
8
+ import { OrgLock } from "../orgs/org-lock.js";
8
9
  import { type ProvenanceResult } from "../packages/provenance.js";
9
10
  import { ExtensionApprovals } from "./approvals.js";
10
11
  import { ExtensionBlobs } from "./blobs.js";
@@ -83,7 +84,7 @@ export interface IngestSource {
83
84
  export declare class ExtensionInstalls {
84
85
  private readonly db;
85
86
  readonly txHost: TransactionHost;
86
- /** The enterprise admin lock (identity/enterprise-admin.ts): joins the transaction. */
87
+ /** The super admin lock (identity/super-admin.ts): joins the transaction. */
87
88
  private readonly adminLock;
88
89
  private readonly blobs;
89
90
  private readonly approvals;
@@ -91,11 +92,15 @@ export declare class ExtensionInstalls {
91
92
  private readonly registry;
92
93
  private readonly config;
93
94
  private readonly keyring;
95
+ /** The owner org's lock: an org upload re-checks its org admin instead (ruling P3-10). */
96
+ private readonly orgLock;
94
97
  constructor(db: KernelDb, txHost: TransactionHost,
95
- /** The enterprise admin lock (identity/enterprise-admin.ts): joins the transaction. */
96
- adminLock: EnterpriseAdminLock, blobs: ExtensionBlobs, approvals: ExtensionApprovals,
98
+ /** The super admin lock (identity/super-admin.ts): joins the transaction. */
99
+ adminLock: SuperAdminLock, blobs: ExtensionBlobs, approvals: ExtensionApprovals,
97
100
  /** The config-declared extension names (an install cannot take them, C15). */
98
- registry: ExtensionRegistry, config: KernelConfigService, keyring: Keyring);
101
+ registry: ExtensionRegistry, config: KernelConfigService, keyring: Keyring,
102
+ /** The owner org's lock: an org upload re-checks its org admin instead (ruling P3-10). */
103
+ orgLock: OrgLock);
99
104
  /**
100
105
  * An extension's effective deployment config, not validated yet (C10): the startup config
101
106
  * (`fileValue`, file / Nacos merged with env) completed by the fields stored in PG; merged by
@@ -112,19 +117,26 @@ export declare class ExtensionInstalls {
112
117
  * - extension name equal to a config-declared one -> `extension.config_declared`;
113
118
  * - an install record of the same name comes from another npm package -> `extension.name_conflict`
114
119
  * (a new version of the same package is an upgrade, handled elsewhere).
115
- * `actor` null means the CLI (no enterprise admin re-check, audit without an actor).
120
+ * `actor` null means the CLI (no super admin re-check, audit without an actor). `owner`: an org
121
+ * upload (spec §14, P3-10): the actor is re-checked as an org admin of that org (`catalog.upload`)
122
+ * instead of a super admin; the package is only stored, as always (nothing runs, no install).
116
123
  */
117
124
  ingest(actor: string | null, bytes: Uint8Array, src: IngestSource, opts?: {
118
125
  actorTokenId?: string;
119
126
  store?: "object" | "pg";
120
127
  expectPackageName?: string;
128
+ owner?: {
129
+ orgId: string;
130
+ };
121
131
  }): Promise<PackageReview>;
122
132
  /**
123
- * The enterprise admin re-check under its lock, in a transaction of its own (`requires_new`, as
133
+ * The super admin re-check under its lock, in a transaction of its own (`requires_new`, as
124
134
  * before the conversion): the package write that follows never runs inside a caller's
125
135
  * transaction holding the lock.
126
136
  */
127
137
  private authorize;
138
+ /** The super admin, or for an org upload the owner org's admin, re-checked under its lock. */
139
+ private authorizeIn;
128
140
  /**
129
141
  * The `extension.package_uploaded` audit, re-checking the actor under the lock, committed on its
130
142
  * own (`requires_new`): the stored package it records is not rolled back by a caller either.
@@ -138,7 +150,7 @@ export declare class ExtensionInstalls {
138
150
  /**
139
151
  * Fetches one package from the configured npm registry (verified by `dist.integrity`, see
140
152
  * packages/npm.ts), downloading only, not storing: download failure -> `packages.npm_failed` (502);
141
- * over `packages.maxBytes` -> `extension.package_too_large`. Enterprise catalog npm imports use it
153
+ * over `packages.maxBytes` -> `extension.package_too_large`. Platform catalog npm imports use it
142
154
  * too.
143
155
  */
144
156
  fetchNpm(input: {
@@ -12,12 +12,13 @@ import { Inject, Injectable } from "@nestjs/common";
12
12
  import { configFields } from "../config/fields.js";
13
13
  import { ApiError } from "../errors.js";
14
14
  import { audit } from "../identity/audit.js";
15
- import { EnterpriseAdminLock } from "../identity/enterprise-admin.js";
15
+ import { SuperAdminLock } from "../identity/super-admin.js";
16
16
  import { KernelConfigService } from "../infra/config/kernel-config.service.js";
17
17
  import { KernelDb } from "../infra/database/kernel-db.js";
18
18
  import { TransactionHost } from "../infra/database/transaction-host.js";
19
19
  import { Transactional } from "../infra/database/transactional.decorator.js";
20
20
  import { KEYRING } from "../infra/tokens.js";
21
+ import { OrgLock } from "../orgs/org-lock.js";
21
22
  import { fetchNpmPackage, IntegrityMismatchError, NpmFetchError, PackageTooLargeError, } from "../packages/npm.js";
22
23
  import { fetchProvenance, PROVENANCE_TIMEOUT_MS, } from "../packages/provenance.js";
23
24
  import { ExtensionApprovals } from "./approvals.js";
@@ -45,11 +46,14 @@ let ExtensionInstalls = class ExtensionInstalls {
45
46
  registry;
46
47
  config;
47
48
  keyring;
49
+ orgLock;
48
50
  constructor(db, txHost,
49
- /** The enterprise admin lock (identity/enterprise-admin.ts): joins the transaction. */
51
+ /** The super admin lock (identity/super-admin.ts): joins the transaction. */
50
52
  adminLock, blobs, approvals,
51
53
  /** The config-declared extension names (an install cannot take them, C15). */
52
- registry, config, keyring) {
54
+ registry, config, keyring,
55
+ /** The owner org's lock: an org upload re-checks its org admin instead (ruling P3-10). */
56
+ orgLock) {
53
57
  this.db = db;
54
58
  this.txHost = txHost;
55
59
  this.adminLock = adminLock;
@@ -58,6 +62,7 @@ let ExtensionInstalls = class ExtensionInstalls {
58
62
  this.registry = registry;
59
63
  this.config = config;
60
64
  this.keyring = keyring;
65
+ this.orgLock = orgLock;
61
66
  }
62
67
  /**
63
68
  * An extension's effective deployment config, not validated yet (C10): the startup config
@@ -84,9 +89,14 @@ let ExtensionInstalls = class ExtensionInstalls {
84
89
  * - extension name equal to a config-declared one -> `extension.config_declared`;
85
90
  * - an install record of the same name comes from another npm package -> `extension.name_conflict`
86
91
  * (a new version of the same package is an upgrade, handled elsewhere).
87
- * `actor` null means the CLI (no enterprise admin re-check, audit without an actor).
92
+ * `actor` null means the CLI (no super admin re-check, audit without an actor). `owner`: an org
93
+ * upload (spec §14, P3-10): the actor is re-checked as an org admin of that org (`catalog.upload`)
94
+ * instead of a super admin; the package is only stored, as always (nothing runs, no install).
88
95
  */
89
96
  async ingest(actor, bytes, src, opts = {}) {
97
+ if (opts.owner !== undefined && actor === null) {
98
+ throw new Error("an org upload has an actor");
99
+ }
90
100
  const maxBytes = this.config.get().packages.maxBytes;
91
101
  if (bytes.byteLength > maxBytes) {
92
102
  throw new ApiError("extension.package_too_large", `The extension package is larger than ${maxBytes} bytes`);
@@ -121,9 +131,9 @@ let ExtensionInstalls = class ExtensionInstalls {
121
131
  if (installed && installed.package_name !== packageName) {
122
132
  throw new ApiError("extension.name_conflict", `Extension ${m.name} is already installed from package ${installed.package_name}; package ${packageName} uses the same extension name`);
123
133
  }
124
- // 写包之前在锁内复核发起人仍是企业管理员(守卫读到的身份可能已过期);审计在写完后同样复核
134
+ // 写包之前在锁内复核发起人仍是超级管理员(守卫读到的身份可能已过期);审计在写完后同样复核
125
135
  if (actor !== null)
126
- await this.authorize(actor);
136
+ await this.authorize(actor, opts.owner);
127
137
  await this.blobs.put(pkg, bytes, {
128
138
  source: src.source,
129
139
  ref: src.ref,
@@ -135,7 +145,8 @@ let ExtensionInstalls = class ExtensionInstalls {
135
145
  version: m.version,
136
146
  sha256: pkg.sha256,
137
147
  source: src.source,
138
- });
148
+ ...(opts.owner !== undefined && { orgId: opts.owner.orgId }),
149
+ }, opts.owner);
139
150
  const set = permissionSetOfPackage(pkg);
140
151
  const snapshot = (await this.approvals.all()).get(m.name);
141
152
  const { added, removed } = diffPermissions(snapshot?.permissions, set);
@@ -153,20 +164,27 @@ let ExtensionInstalls = class ExtensionInstalls {
153
164
  };
154
165
  }
155
166
  /**
156
- * The enterprise admin re-check under its lock, in a transaction of its own (`requires_new`, as
167
+ * The super admin re-check under its lock, in a transaction of its own (`requires_new`, as
157
168
  * before the conversion): the package write that follows never runs inside a caller's
158
169
  * transaction holding the lock.
159
170
  */
160
- async authorize(actor) {
161
- await this.adminLock.lockAndAuthorize(actor);
171
+ async authorize(actor, owner) {
172
+ await this.authorizeIn(actor, owner);
173
+ }
174
+ /** The super admin, or for an org upload the owner org's admin, re-checked under its lock. */
175
+ async authorizeIn(actor, owner) {
176
+ if (owner !== undefined)
177
+ await this.orgLock.lockAndAuthorize(owner.orgId, actor, "catalog.upload");
178
+ else
179
+ await this.adminLock.lockAndAuthorize(actor);
162
180
  }
163
181
  /**
164
182
  * The `extension.package_uploaded` audit, re-checking the actor under the lock, committed on its
165
183
  * own (`requires_new`): the stored package it records is not rolled back by a caller either.
166
184
  */
167
- async auditUpload(actor, actorTokenId, detail) {
185
+ async auditUpload(actor, actorTokenId, detail, owner) {
168
186
  if (actor !== null)
169
- await this.adminLock.lockAndAuthorize(actor);
187
+ await this.authorizeIn(actor, owner);
170
188
  await audit(this.db.db, {
171
189
  ...(actor !== null && { actorAccountId: actor }),
172
190
  ...(actorTokenId !== undefined && { actorTokenId }),
@@ -182,7 +200,7 @@ let ExtensionInstalls = class ExtensionInstalls {
182
200
  /**
183
201
  * Fetches one package from the configured npm registry (verified by `dist.integrity`, see
184
202
  * packages/npm.ts), downloading only, not storing: download failure -> `packages.npm_failed` (502);
185
- * over `packages.maxBytes` -> `extension.package_too_large`. Enterprise catalog npm imports use it
203
+ * over `packages.maxBytes` -> `extension.package_too_large`. Platform catalog npm imports use it
186
204
  * too.
187
205
  */
188
206
  async fetchNpm(input, signal) {
@@ -332,6 +350,9 @@ let ExtensionInstalls = class ExtensionInstalls {
332
350
  __decorate([
333
351
  Transactional({ propagation: "requires_new" })
334
352
  ], ExtensionInstalls.prototype, "authorize", null);
353
+ __decorate([
354
+ Transactional({ propagation: "mandatory" })
355
+ ], ExtensionInstalls.prototype, "authorizeIn", null);
335
356
  __decorate([
336
357
  Transactional({ propagation: "requires_new" })
337
358
  ], ExtensionInstalls.prototype, "auditUpload", null);
@@ -339,11 +360,12 @@ ExtensionInstalls = __decorate([
339
360
  Injectable(),
340
361
  __param(0, Inject(KernelDb)),
341
362
  __param(1, Inject(TransactionHost)),
342
- __param(2, Inject(EnterpriseAdminLock)),
363
+ __param(2, Inject(SuperAdminLock)),
343
364
  __param(3, Inject(ExtensionBlobs)),
344
365
  __param(4, Inject(ExtensionApprovals)),
345
366
  __param(5, Inject(ExtensionRegistry)),
346
367
  __param(6, Inject(KernelConfigService)),
347
- __param(7, Inject(KEYRING))
368
+ __param(7, Inject(KEYRING)),
369
+ __param(8, Inject(OrgLock))
348
370
  ], ExtensionInstalls);
349
371
  export { ExtensionInstalls };