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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (534) hide show
  1. package/bootstrap.json +61 -5
  2. package/dist/admin/admin.controller.d.ts +51 -14
  3. package/dist/admin/admin.controller.js +60 -19
  4. package/dist/admin/extensions.controller.d.ts +16 -2
  5. package/dist/admin/extensions.controller.js +26 -6
  6. package/dist/admin/setup-lock.d.ts +1 -1
  7. package/dist/admin/setup-lock.js +1 -1
  8. package/dist/admin/setup.controller.d.ts +1 -1
  9. package/dist/admin/setup.controller.js +1 -1
  10. package/dist/admin/setup.service.d.ts +4 -4
  11. package/dist/admin/setup.service.js +8 -8
  12. package/dist/agents/agent-lookup.d.ts +16 -0
  13. package/dist/agents/agent-lookup.js +11 -0
  14. package/dist/agents/agents.controller.d.ts +76 -1
  15. package/dist/agents/agents.controller.js +90 -11
  16. package/dist/agents/agents.module.d.ts +4 -1
  17. package/dist/agents/agents.module.js +32 -6
  18. package/dist/agents/agents.service.d.ts +54 -23
  19. package/dist/agents/agents.service.js +180 -76
  20. package/dist/agents/definition.d.ts +49 -0
  21. package/dist/agents/definition.js +45 -0
  22. package/dist/agents/from-template.d.ts +106 -0
  23. package/dist/agents/from-template.js +649 -0
  24. package/dist/agents/from-template.service.d.ts +60 -0
  25. package/dist/agents/from-template.service.js +161 -0
  26. package/dist/agents/models.controller.d.ts +34 -5
  27. package/dist/agents/models.controller.js +50 -6
  28. package/dist/agents/org-templates.d.ts +176 -0
  29. package/dist/agents/org-templates.js +827 -0
  30. package/dist/agents/pending-connector-requests.d.ts +77 -0
  31. package/dist/agents/pending-connector-requests.js +215 -0
  32. package/dist/agents/pending-connectors.controller.d.ts +39 -0
  33. package/dist/agents/pending-connectors.controller.js +91 -0
  34. package/dist/agents/pending-connectors.service.d.ts +62 -0
  35. package/dist/agents/pending-connectors.service.js +282 -0
  36. package/dist/agents/readiness.controller.d.ts +5 -5
  37. package/dist/agents/readiness.controller.js +6 -6
  38. package/dist/agents/templates.controller.d.ts +86 -5
  39. package/dist/agents/templates.controller.js +171 -7
  40. package/dist/agents/templates.d.ts +127 -23
  41. package/dist/agents/templates.js +475 -52
  42. package/dist/background/background.module.js +8 -1
  43. package/dist/background/finish.d.ts +3 -2
  44. package/dist/background/launch-lock.d.ts +4 -3
  45. package/dist/background/launch-lock.js +4 -3
  46. package/dist/background/poll.job.d.ts +9 -6
  47. package/dist/background/poll.job.js +30 -22
  48. package/dist/background/session.d.ts +13 -2
  49. package/dist/background/session.js +13 -0
  50. package/dist/background/stop.d.ts +12 -6
  51. package/dist/background/stop.js +57 -39
  52. package/dist/background/store.d.ts +18 -6
  53. package/dist/background/store.js +12 -6
  54. package/dist/background/tasks.service.d.ts +15 -5
  55. package/dist/background/tasks.service.js +42 -17
  56. package/dist/background/wake-rules.d.ts +27 -18
  57. package/dist/background/wake-rules.js +52 -22
  58. package/dist/background/wake.d.ts +13 -11
  59. package/dist/background/wake.js +20 -14
  60. package/dist/catalog/admin-catalog.controller.d.ts +129 -30
  61. package/dist/catalog/admin-catalog.controller.js +213 -42
  62. package/dist/catalog/catalog-content.d.ts +58 -32
  63. package/dist/catalog/catalog-content.js +34 -8
  64. package/dist/catalog/catalog-import.module.d.ts +7 -0
  65. package/dist/catalog/catalog-import.module.js +60 -0
  66. package/dist/catalog/catalog-items.d.ts +111 -7
  67. package/dist/catalog/catalog-items.js +279 -13
  68. package/dist/catalog/catalog-scope.service.d.ts +260 -0
  69. package/dist/catalog/catalog-scope.service.js +1116 -0
  70. package/dist/catalog/catalog.module.d.ts +7 -9
  71. package/dist/catalog/catalog.module.js +41 -31
  72. package/dist/catalog/catalog.service.d.ts +101 -29
  73. package/dist/catalog/catalog.service.js +104 -106
  74. package/dist/catalog/cli.d.ts +11 -1
  75. package/dist/catalog/cli.js +26 -1
  76. package/dist/catalog/component-promotion.d.ts +96 -0
  77. package/dist/catalog/component-promotion.js +395 -0
  78. package/dist/catalog/component-scope.controller.d.ts +152 -0
  79. package/dist/catalog/component-scope.controller.js +287 -0
  80. package/dist/catalog/component-scope.service.d.ts +303 -0
  81. package/dist/catalog/component-scope.service.js +936 -0
  82. package/dist/catalog/component-state.d.ts +174 -0
  83. package/dist/catalog/component-state.js +437 -0
  84. package/dist/catalog/job-ids.d.ts +30 -0
  85. package/dist/catalog/job-ids.js +25 -0
  86. package/dist/catalog/marketplace-fetch.d.ts +1 -1
  87. package/dist/catalog/marketplaces.controller.d.ts +22 -5
  88. package/dist/catalog/marketplaces.controller.js +56 -7
  89. package/dist/catalog/marketplaces.service.d.ts +54 -14
  90. package/dist/catalog/marketplaces.service.js +71 -22
  91. package/dist/catalog/org-catalog.controller.d.ts +125 -34
  92. package/dist/catalog/org-catalog.controller.js +181 -65
  93. package/dist/catalog/org-catalog.service.d.ts +65 -33
  94. package/dist/catalog/org-catalog.service.js +324 -157
  95. package/dist/catalog/org-extension-switch.d.ts +41 -0
  96. package/dist/catalog/org-extension-switch.js +115 -0
  97. package/dist/catalog/org-extension.controller.d.ts +119 -0
  98. package/dist/catalog/org-extension.controller.js +266 -0
  99. package/dist/catalog/org-plugin-uploads.controller.d.ts +98 -0
  100. package/dist/catalog/org-plugin-uploads.controller.js +213 -0
  101. package/dist/catalog/org-plugin-uploads.d.ts +63 -0
  102. package/dist/catalog/org-plugin-uploads.js +116 -0
  103. package/dist/catalog/owned-items.d.ts +184 -0
  104. package/dist/catalog/owned-items.js +789 -0
  105. package/dist/catalog/owned-plugin-cleanup.d.ts +56 -0
  106. package/dist/catalog/owned-plugin-cleanup.js +194 -0
  107. package/dist/catalog/ownership.d.ts +172 -0
  108. package/dist/catalog/ownership.js +326 -0
  109. package/dist/catalog/platform-components.d.ts +221 -0
  110. package/dist/catalog/platform-components.js +761 -0
  111. package/dist/catalog/platform-migration.d.ts +115 -0
  112. package/dist/catalog/platform-migration.js +582 -0
  113. package/dist/catalog/plugin-import.d.ts +178 -34
  114. package/dist/catalog/plugin-import.js +622 -82
  115. package/dist/catalog/plugin-install.d.ts +185 -41
  116. package/dist/catalog/plugin-install.js +758 -126
  117. package/dist/catalog/plugin-upgrade.d.ts +260 -225
  118. package/dist/catalog/plugin-upgrade.js +1147 -1136
  119. package/dist/catalog/request-rules.d.ts +65 -0
  120. package/dist/catalog/request-rules.js +217 -0
  121. package/dist/catalog/requests.service.d.ts +193 -118
  122. package/dist/catalog/requests.service.js +526 -343
  123. package/dist/catalog/reserved-names.d.ts +8 -0
  124. package/dist/catalog/reserved-names.js +42 -0
  125. package/dist/catalog/scope-orgs.d.ts +21 -0
  126. package/dist/catalog/scope-orgs.js +67 -0
  127. package/dist/catalog/scope-state.d.ts +35 -0
  128. package/dist/catalog/scope-state.js +87 -0
  129. package/dist/catalog/scope-sync-workers.d.ts +7 -0
  130. package/dist/catalog/scope-sync-workers.js +29 -0
  131. package/dist/catalog/scope-sync.d.ts +176 -0
  132. package/dist/catalog/scope-sync.js +576 -0
  133. package/dist/catalog/scope.d.ts +42 -0
  134. package/dist/catalog/scope.js +42 -0
  135. package/dist/catalog/unshare.d.ts +22 -0
  136. package/dist/catalog/unshare.js +118 -0
  137. package/dist/channels/actions.js +1 -0
  138. package/dist/channels/cards.js +20 -2
  139. package/dist/channels/channels.module.js +2 -0
  140. package/dist/channels/inbound.d.ts +9 -1
  141. package/dist/channels/inbound.js +67 -5
  142. package/dist/channels/phrases.d.ts +35 -0
  143. package/dist/channels/phrases.js +29 -0
  144. package/dist/config/docs.js +3 -1
  145. package/dist/config/schema.d.ts +10 -2
  146. package/dist/config/schema.js +70 -22
  147. package/dist/conversations/access.d.ts +6 -4
  148. package/dist/conversations/access.js +27 -5
  149. package/dist/conversations/agent-tree.d.ts +46 -0
  150. package/dist/conversations/agent-tree.js +92 -0
  151. package/dist/conversations/conversations.controller.d.ts +43 -18
  152. package/dist/conversations/conversations.controller.js +79 -38
  153. package/dist/conversations/conversations.module.d.ts +1 -1
  154. package/dist/conversations/conversations.module.js +7 -7
  155. package/dist/conversations/conversations.service.d.ts +73 -15
  156. package/dist/conversations/conversations.service.js +115 -35
  157. package/dist/conversations/environment-status.d.ts +24 -0
  158. package/dist/conversations/environment-status.js +71 -0
  159. package/dist/conversations/event-log.d.ts +20 -5
  160. package/dist/conversations/event-log.js +60 -0
  161. package/dist/conversations/events.d.ts +84 -2
  162. package/dist/conversations/events.js +91 -17
  163. package/dist/conversations/queue.service.d.ts +1 -1
  164. package/dist/conversations/queue.service.js +5 -0
  165. package/dist/conversations/titles.d.ts +5 -3
  166. package/dist/conversations/titles.js +21 -8
  167. package/dist/conversations/tree.d.ts +17 -0
  168. package/dist/conversations/tree.js +42 -0
  169. package/dist/ctx/create-ctx.d.ts +20 -1
  170. package/dist/ctx/create-ctx.js +38 -7
  171. package/dist/db/kernel-schema.d.ts +386 -18
  172. package/dist/environments/access.d.ts +41 -0
  173. package/dist/environments/access.js +77 -0
  174. package/dist/environments/conversation-environments.d.ts +61 -0
  175. package/dist/environments/conversation-environments.js +170 -0
  176. package/dist/environments/dto.d.ts +25 -0
  177. package/dist/environments/dto.js +12 -0
  178. package/dist/environments/environments.controller.d.ts +33 -0
  179. package/dist/environments/environments.controller.js +110 -0
  180. package/dist/environments/environments.module.d.ts +8 -0
  181. package/dist/environments/environments.module.js +27 -0
  182. package/dist/environments/environments.service.d.ts +153 -0
  183. package/dist/environments/environments.service.js +541 -0
  184. package/dist/environments/legacy-cleanup.job.d.ts +34 -0
  185. package/dist/environments/legacy-cleanup.job.js +141 -0
  186. package/dist/errors.d.ts +85 -2
  187. package/dist/errors.js +85 -2
  188. package/dist/evals/reconstruct.d.ts +18 -9
  189. package/dist/evals/reconstruct.js +26 -7
  190. package/dist/evals/run-replay.d.ts +4 -2
  191. package/dist/evals/run-replay.js +20 -6
  192. package/dist/evals/runs.service.d.ts +2 -1
  193. package/dist/evals/runs.service.js +13 -12
  194. package/dist/evals/step-replay.d.ts +4 -6
  195. package/dist/evals/step-replay.js +4 -3
  196. package/dist/evals/trajectory.service.d.ts +8 -3
  197. package/dist/evals/trajectory.service.js +26 -14
  198. package/dist/evals/worker.d.ts +5 -5
  199. package/dist/evals/worker.js +9 -3
  200. package/dist/extensions/admin-ops.d.ts +36 -10
  201. package/dist/extensions/admin-ops.js +65 -42
  202. package/dist/extensions/admin-view.d.ts +37 -10
  203. package/dist/extensions/admin-view.js +103 -20
  204. package/dist/extensions/bootstrap.d.ts +17 -4
  205. package/dist/extensions/bootstrap.js +70 -9
  206. package/dist/extensions/cli.d.ts +12 -0
  207. package/dist/extensions/cli.js +11 -2
  208. package/dist/extensions/config-hash.d.ts +10 -0
  209. package/dist/extensions/config-hash.js +38 -0
  210. package/dist/extensions/deployment-config.d.ts +28 -5
  211. package/dist/extensions/deployment-config.js +48 -7
  212. package/dist/extensions/effective-config.d.ts +127 -0
  213. package/dist/extensions/effective-config.js +368 -0
  214. package/dist/extensions/extensions.module.js +11 -11
  215. package/dist/extensions/hooks.d.ts +37 -4
  216. package/dist/extensions/hooks.js +82 -16
  217. package/dist/extensions/host.d.ts +24 -10
  218. package/dist/extensions/host.js +49 -54
  219. package/dist/extensions/installs.d.ts +20 -8
  220. package/dist/extensions/installs.js +37 -15
  221. package/dist/extensions/org-config.d.ts +75 -6
  222. package/dist/extensions/org-config.js +184 -32
  223. package/dist/extensions/org-levels.d.ts +37 -0
  224. package/dist/extensions/org-levels.js +71 -0
  225. package/dist/extensions/org-overrides.d.ts +151 -0
  226. package/dist/extensions/org-overrides.js +524 -0
  227. package/dist/extensions/permission-view.d.ts +16 -4
  228. package/dist/extensions/permission-view.js +4 -4
  229. package/dist/extensions/plugin-items.d.ts +21 -0
  230. package/dist/extensions/plugin-items.js +42 -0
  231. package/dist/extensions/point-defaults.d.ts +12 -5
  232. package/dist/extensions/point-defaults.js +37 -9
  233. package/dist/extensions/resolve.d.ts +5 -1
  234. package/dist/extensions/resolve.js +15 -2
  235. package/dist/extensions/state.module.d.ts +9 -0
  236. package/dist/extensions/state.module.js +38 -0
  237. package/dist/files/previewers.d.ts +8 -1
  238. package/dist/files/previewers.js +35 -6
  239. package/dist/http/api.module.js +25 -3
  240. package/dist/http/app.d.ts +11 -2
  241. package/dist/http/app.js +31 -5
  242. package/dist/http/plugin-dispatch.d.ts +4 -1
  243. package/dist/http/plugin-dispatch.js +14 -2
  244. package/dist/identity/accounts.d.ts +29 -29
  245. package/dist/identity/accounts.js +47 -47
  246. package/dist/identity/audit.d.ts +2 -1
  247. package/dist/identity/auth.guard.d.ts +13 -5
  248. package/dist/identity/auth.guard.js +26 -9
  249. package/dist/identity/identity.module.d.ts +1 -1
  250. package/dist/identity/identity.module.js +4 -4
  251. package/dist/identity/me.controller.js +1 -1
  252. package/dist/identity/principal.d.ts +3 -3
  253. package/dist/identity/principal.js +3 -3
  254. package/dist/identity/settings.d.ts +22 -11
  255. package/dist/identity/settings.js +53 -18
  256. package/dist/identity/{enterprise-admin.d.ts → super-admin.d.ts} +5 -5
  257. package/dist/identity/{enterprise-admin.js → super-admin.js} +24 -24
  258. package/dist/inbox/inbox.module.d.ts +4 -1
  259. package/dist/inbox/inbox.module.js +7 -3
  260. package/dist/inbox/inbox.service.d.ts +62 -3
  261. package/dist/inbox/inbox.service.js +74 -4
  262. package/dist/inbox/org-notices.d.ts +63 -0
  263. package/dist/inbox/org-notices.js +91 -0
  264. package/dist/inbox/platform-inbox.controller.d.ts +23 -0
  265. package/dist/inbox/platform-inbox.controller.js +58 -0
  266. package/dist/inbox/platform-inbox.service.d.ts +151 -0
  267. package/dist/inbox/platform-inbox.service.js +263 -0
  268. package/dist/inbox/platform-notices.d.ts +19 -0
  269. package/dist/inbox/platform-notices.js +9 -0
  270. package/dist/index.d.ts +1 -1
  271. package/dist/index.js +1 -1
  272. package/dist/infra/cli/kernel-cli.module.js +9 -1
  273. package/dist/infra/config/kernel-config.service.js +24 -1
  274. package/dist/infra/database/xact-lock.d.ts +1 -1
  275. package/dist/infra/database/xact-lock.js +1 -1
  276. package/dist/infra/events/kernel-events.d.ts +19 -2
  277. package/dist/infra/queue/add-job-once.d.ts +14 -0
  278. package/dist/infra/queue/add-job-once.js +16 -0
  279. package/dist/kernel.module.js +6 -0
  280. package/dist/lifecycle/kernel-lifecycle.d.ts +1 -1
  281. package/dist/lifecycle/kernel-lifecycle.js +4 -4
  282. package/dist/models/embeddings.d.ts +82 -0
  283. package/dist/models/embeddings.js +326 -0
  284. package/dist/models/enablement.controller.d.ts +40 -0
  285. package/dist/models/enablement.controller.js +74 -0
  286. package/dist/models/enablement.d.ts +99 -0
  287. package/dist/models/enablement.js +263 -0
  288. package/dist/models/models.module.d.ts +5 -1
  289. package/dist/models/models.module.js +16 -4
  290. package/dist/models/prices.d.ts +5 -5
  291. package/dist/models/prices.js +4 -4
  292. package/dist/models/purposes.controller.d.ts +6 -4
  293. package/dist/models/purposes.controller.js +13 -7
  294. package/dist/models/purposes.d.ts +37 -12
  295. package/dist/models/purposes.js +63 -17
  296. package/dist/orgs/directory-sync.d.ts +14 -5
  297. package/dist/orgs/directory-sync.js +41 -17
  298. package/dist/orgs/offboarding.d.ts +9 -7
  299. package/dist/orgs/offboarding.js +28 -17
  300. package/dist/orgs/org-lock.d.ts +5 -0
  301. package/dist/orgs/org-lock.js +13 -0
  302. package/dist/orgs/org.guard.d.ts +10 -0
  303. package/dist/orgs/org.guard.js +43 -32
  304. package/dist/orgs/orgs.module.js +3 -0
  305. package/dist/orgs/orgs.service.d.ts +20 -7
  306. package/dist/orgs/orgs.service.js +32 -12
  307. package/dist/orgs/roles.d.ts +1 -1
  308. package/dist/orgs/roles.js +5 -1
  309. package/dist/orgs/settings.controller.d.ts +1 -1
  310. package/dist/orgs/settings.service.d.ts +15 -3
  311. package/dist/orgs/settings.service.js +6 -2
  312. package/dist/overrides.d.ts +3 -0
  313. package/dist/overrides.js +2 -0
  314. package/dist/platform/actor.d.ts +48 -0
  315. package/dist/platform/actor.js +100 -0
  316. package/dist/platform/agent-docs.d.ts +18 -0
  317. package/dist/platform/agent-docs.js +59 -0
  318. package/dist/platform/availability.d.ts +14 -0
  319. package/dist/platform/availability.js +43 -0
  320. package/dist/platform/errors.d.ts +11 -0
  321. package/dist/platform/errors.js +26 -0
  322. package/dist/platform/exclusions.d.ts +12 -0
  323. package/dist/platform/exclusions.js +1405 -0
  324. package/dist/platform/method.d.ts +6 -0
  325. package/dist/platform/method.js +15 -0
  326. package/dist/platform/operation.d.ts +92 -0
  327. package/dist/platform/operation.js +35 -0
  328. package/dist/platform/ops/agent-templates.ops.d.ts +14 -0
  329. package/dist/platform/ops/agent-templates.ops.js +92 -0
  330. package/dist/platform/ops/agents.ops.d.ts +19 -0
  331. package/dist/platform/ops/agents.ops.js +294 -0
  332. package/dist/platform/ops/connectors.ops.d.ts +15 -0
  333. package/dist/platform/ops/connectors.ops.js +126 -0
  334. package/dist/platform/ops/errors.d.ts +11 -0
  335. package/dist/platform/ops/errors.js +22 -0
  336. package/dist/platform/ops/extensions.ops.d.ts +19 -0
  337. package/dist/platform/ops/extensions.ops.js +116 -0
  338. package/dist/platform/ops/marketplaces.ops.d.ts +16 -0
  339. package/dist/platform/ops/marketplaces.ops.js +157 -0
  340. package/dist/platform/ops/paging.d.ts +14 -0
  341. package/dist/platform/ops/paging.js +20 -0
  342. package/dist/platform/ops/platform.ops.d.ts +23 -0
  343. package/dist/platform/ops/platform.ops.js +158 -0
  344. package/dist/platform/ops/plugins.ops.d.ts +33 -0
  345. package/dist/platform/ops/plugins.ops.js +377 -0
  346. package/dist/platform/ops/requests.ops.d.ts +14 -0
  347. package/dist/platform/ops/requests.ops.js +153 -0
  348. package/dist/platform/ops/role.d.ts +4 -0
  349. package/dist/platform/ops/role.js +10 -0
  350. package/dist/platform/ops/skills.ops.d.ts +13 -0
  351. package/dist/platform/ops/skills.ops.js +98 -0
  352. package/dist/platform/ops/summary.d.ts +10 -0
  353. package/dist/platform/ops/summary.js +18 -0
  354. package/dist/platform/platform-ops.module.d.ts +7 -0
  355. package/dist/platform/platform-ops.module.js +55 -0
  356. package/dist/platform/platform.module.d.ts +8 -0
  357. package/dist/platform/platform.module.js +25 -0
  358. package/dist/platform/redact-orgs.d.ts +7 -0
  359. package/dist/platform/redact-orgs.js +52 -0
  360. package/dist/platform/registry.d.ts +30 -0
  361. package/dist/platform/registry.js +111 -0
  362. package/dist/roles/worker-role.d.ts +6 -4
  363. package/dist/roles/worker-role.js +14 -7
  364. package/dist/roles/worker.module.d.ts +1 -1
  365. package/dist/roles/worker.module.js +9 -1
  366. package/dist/runtime/context/build.d.ts +6 -4
  367. package/dist/runtime/context/build.js +26 -7
  368. package/dist/runtime/context/claude-tools.d.ts +2 -1
  369. package/dist/runtime/context/claude-tools.js +5 -4
  370. package/dist/runtime/context/compaction.js +9 -0
  371. package/dist/runtime/context/reminders.d.ts +2 -0
  372. package/dist/runtime/context/reminders.js +2 -0
  373. package/dist/runtime/context/skills.js +9 -2
  374. package/dist/runtime/context/tool-changes.d.ts +27 -0
  375. package/dist/runtime/context/tool-changes.js +60 -0
  376. package/dist/runtime/hook-calls.d.ts +8 -1
  377. package/dist/runtime/hook-calls.js +40 -7
  378. package/dist/runtime/langgraph-loop.d.ts +3 -1
  379. package/dist/runtime/langgraph-loop.js +35 -17
  380. package/dist/runtime/loop.d.ts +32 -4
  381. package/dist/runtime/maintenance.d.ts +7 -4
  382. package/dist/runtime/maintenance.js +23 -8
  383. package/dist/runtime/model-call.d.ts +38 -11
  384. package/dist/runtime/model-call.js +97 -24
  385. package/dist/runtime/providers.d.ts +146 -32
  386. package/dist/runtime/providers.js +321 -67
  387. package/dist/runtime/run-control.d.ts +11 -1
  388. package/dist/runtime/run-control.js +12 -0
  389. package/dist/runtime/run-drafts.d.ts +85 -0
  390. package/dist/runtime/run-drafts.js +230 -0
  391. package/dist/runtime/run-jobs.d.ts +3 -5
  392. package/dist/runtime/run-jobs.js +3 -7
  393. package/dist/runtime/run-queue.d.ts +37 -3
  394. package/dist/runtime/run-queue.js +188 -11
  395. package/dist/runtime/run-worker.d.ts +12 -6
  396. package/dist/runtime/run-worker.js +58 -35
  397. package/dist/runtime/runtime.module.js +3 -0
  398. package/dist/runtime/step-log.d.ts +9 -4
  399. package/dist/runtime/step-log.js +8 -5
  400. package/dist/runtime/stream.controller.d.ts +23 -1
  401. package/dist/runtime/stream.controller.js +60 -3
  402. package/dist/runtime/stream.d.ts +4 -1
  403. package/dist/runtime/stream.js +27 -3
  404. package/dist/runtime/subagents/child.d.ts +55 -7
  405. package/dist/runtime/subagents/child.js +105 -7
  406. package/dist/runtime/subagents/definition.d.ts +12 -3
  407. package/dist/runtime/subagents/definition.js +46 -32
  408. package/dist/runtime/subagents/deliveries.d.ts +71 -0
  409. package/dist/runtime/subagents/deliveries.js +228 -0
  410. package/dist/runtime/subagents/dispatch.d.ts +115 -26
  411. package/dist/runtime/subagents/dispatch.js +212 -141
  412. package/dist/runtime/subagents/limits.d.ts +24 -5
  413. package/dist/runtime/subagents/limits.js +40 -6
  414. package/dist/runtime/subagents/messages.d.ts +95 -0
  415. package/dist/runtime/subagents/messages.js +328 -0
  416. package/dist/runtime/subagents/preamble.d.ts +4 -4
  417. package/dist/runtime/subagents/preamble.js +9 -7
  418. package/dist/runtime/subagents/progress.d.ts +8 -6
  419. package/dist/runtime/subagents/progress.js +11 -6
  420. package/dist/runtime/subagents/render.d.ts +30 -0
  421. package/dist/runtime/subagents/render.js +53 -0
  422. package/dist/runtime/subagents/roster.d.ts +24 -7
  423. package/dist/runtime/subagents/roster.js +47 -11
  424. package/dist/runtime/subagents/skill-fork.d.ts +3 -2
  425. package/dist/runtime/subagents/skill-fork.js +8 -4
  426. package/dist/runtime/subagents/status.d.ts +14 -0
  427. package/dist/runtime/subagents/status.js +23 -0
  428. package/dist/runtime/subagents/subagents.service.d.ts +7 -4
  429. package/dist/runtime/subagents/subagents.service.js +11 -6
  430. package/dist/runtime/usage-report-jobs.d.ts +88 -0
  431. package/dist/runtime/usage-report-jobs.js +158 -0
  432. package/dist/runtime/usage-report.d.ts +33 -38
  433. package/dist/runtime/usage-report.js +169 -96
  434. package/dist/runtime/waits.d.ts +140 -37
  435. package/dist/runtime/waits.js +394 -106
  436. package/dist/sandbox/jobs.d.ts +40 -13
  437. package/dist/sandbox/jobs.js +57 -20
  438. package/dist/sandbox/leases.d.ts +37 -54
  439. package/dist/sandbox/leases.js +71 -115
  440. package/dist/sandbox/providers.d.ts +2 -2
  441. package/dist/sandbox/providers.js +1 -1
  442. package/dist/sandbox/sandbox.module.d.ts +3 -2
  443. package/dist/sandbox/sandbox.module.js +4 -3
  444. package/dist/sandbox/sandbox.service.d.ts +229 -134
  445. package/dist/sandbox/sandbox.service.js +630 -409
  446. package/dist/skills/catalog.d.ts +3 -2
  447. package/dist/skills/catalog.js +21 -43
  448. package/dist/skills/changes.controller.d.ts +7 -0
  449. package/dist/skills/changes.controller.js +19 -1
  450. package/dist/skills/invoke.js +8 -3
  451. package/dist/skills/package.d.ts +20 -1
  452. package/dist/skills/package.js +28 -1
  453. package/dist/skills/skills.controller.d.ts +39 -4
  454. package/dist/skills/skills.controller.js +88 -10
  455. package/dist/skills/skills.module.js +10 -1
  456. package/dist/skills/skills.service.d.ts +106 -26
  457. package/dist/skills/skills.service.js +421 -75
  458. package/dist/skills/usable.d.ts +81 -0
  459. package/dist/skills/usable.js +379 -0
  460. package/dist/tools/approvals.service.d.ts +20 -2
  461. package/dist/tools/approvals.service.js +23 -4
  462. package/dist/tools/builtin-names.d.ts +21 -5
  463. package/dist/tools/builtin-names.js +30 -5
  464. package/dist/tools/builtins/agent.d.ts +23 -21
  465. package/dist/tools/builtins/agent.js +62 -55
  466. package/dist/tools/builtins/builtin-tools.d.ts +6 -2
  467. package/dist/tools/builtins/builtin-tools.js +37 -12
  468. package/dist/tools/builtins/handback.d.ts +28 -0
  469. package/dist/tools/builtins/handback.js +53 -0
  470. package/dist/tools/builtins/platform.d.ts +34 -0
  471. package/dist/tools/builtins/platform.js +362 -0
  472. package/dist/tools/builtins/sandbox/bash.js +13 -3
  473. package/dist/tools/builtins/sandbox/common.d.ts +43 -24
  474. package/dist/tools/builtins/sandbox/common.js +80 -45
  475. package/dist/tools/builtins/sandbox/edit.js +2 -2
  476. package/dist/tools/builtins/sandbox/glob.js +2 -2
  477. package/dist/tools/builtins/sandbox/grep.js +2 -4
  478. package/dist/tools/builtins/sandbox/index.d.ts +1 -1
  479. package/dist/tools/builtins/sandbox/index.js +1 -1
  480. package/dist/tools/builtins/sandbox/read.js +1 -1
  481. package/dist/tools/builtins/sandbox/task-output.d.ts +14 -3
  482. package/dist/tools/builtins/sandbox/task-output.js +30 -5
  483. package/dist/tools/builtins/sandbox/task-stop.js +2 -1
  484. package/dist/tools/builtins/sandbox/write.js +2 -2
  485. package/dist/tools/builtins/send-message.d.ts +56 -0
  486. package/dist/tools/builtins/send-message.js +100 -0
  487. package/dist/tools/builtins/skill-load.d.ts +22 -14
  488. package/dist/tools/builtins/skill-load.js +86 -57
  489. package/dist/tools/builtins/skill-write.js +1 -1
  490. package/dist/tools/builtins/web/extract.js +5 -1
  491. package/dist/tools/builtins/web/fetch.js +1 -0
  492. package/dist/tools/builtins/web/search.js +1 -0
  493. package/dist/tools/connectors.controller.d.ts +10 -0
  494. package/dist/tools/connectors.controller.js +12 -0
  495. package/dist/tools/connectors.service.d.ts +46 -5
  496. package/dist/tools/connectors.service.js +94 -15
  497. package/dist/tools/extension-tools.controller.d.ts +14 -0
  498. package/dist/tools/extension-tools.controller.js +37 -0
  499. package/dist/tools/info.d.ts +42 -1
  500. package/dist/tools/info.js +64 -1
  501. package/dist/tools/org-tool-switches.d.ts +74 -0
  502. package/dist/tools/org-tool-switches.js +184 -0
  503. package/dist/tools/pipeline.d.ts +46 -40
  504. package/dist/tools/pipeline.js +193 -364
  505. package/dist/tools/policy.d.ts +1 -1
  506. package/dist/tools/policy.js +36 -16
  507. package/dist/tools/registry.d.ts +98 -5
  508. package/dist/tools/registry.js +87 -9
  509. package/dist/tools/tools.module.js +12 -2
  510. package/dist/ui/views.d.ts +2 -1
  511. package/dist/ui/views.js +17 -3
  512. package/package.json +3 -3
  513. package/src/migrations/0074_subagent_tree.sql +50 -0
  514. package/src/migrations/0075_plugin_scope.sql +61 -0
  515. package/src/migrations/0076_skills_created_by_nullable.sql +6 -0
  516. package/src/migrations/0077_scope_requests.sql +52 -0
  517. package/src/migrations/0078_scope_grant_switches.sql +18 -0
  518. package/src/migrations/0079_scope_live_install_switches.sql +19 -0
  519. package/src/migrations/0080_rename_enterprise_admin.sql +18 -0
  520. package/src/migrations/0081_platform_components.sql +129 -0
  521. package/src/migrations/0082_platform_migration.sql +33 -0
  522. package/src/migrations/0083_plugin_scope_sync_failures.sql +15 -0
  523. package/src/migrations/0084_org_owned_items.sql +85 -0
  524. package/src/migrations/0085_agent_templates_phase4.sql +45 -0
  525. package/src/migrations/0086_org_layering.sql +30 -0
  526. package/src/migrations/0087_approval_summary.sql +6 -0
  527. package/src/migrations/0088_environments.sql +80 -0
  528. package/src/migrations/0089_model_kinds_usage.sql +38 -0
  529. package/dist/catalog/upgrade-targets.d.ts +0 -56
  530. package/dist/catalog/upgrade-targets.js +0 -90
  531. package/dist/conversations/sandbox-status.d.ts +0 -24
  532. package/dist/conversations/sandbox-status.js +0 -52
  533. package/dist/extensions/org-config.controller.d.ts +0 -32
  534. package/dist/extensions/org-config.controller.js +0 -70
@@ -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();
@@ -0,0 +1,10 @@
1
+ import type { core } from "zod";
2
+ /**
3
+ * 插件部署配置(校验后)中非密钥部分的摘要:先把 schema 里所有 secret 叶子(`configFields` 可达路径,
4
+ * 加载时 `assertSecretsReachable` 已保证密钥都在这些路径上)换成固定占位值,再取 sha256(键排序 JSON) 前 16 位十六进制。
5
+ * 给需要「配置变了就失效」的缓存键用(如模型列表)。密钥不参与摘要:不加盐的短摘要写进 Redis 键名后,
6
+ * 低熵密钥可被离线猜测、泄露的密钥可被确认;代价是轮换密钥不会让缓存失效(缓存内容本来就不该依赖密钥)。
7
+ * 没有部署配置 schema 时无从得知哪些是密钥,摘要不按配置区分。同一份配置在各副本上得到同一摘要。
8
+ * 函数自己按 schema 遮蔽,调用方不必(也不能忘记)先打码。
9
+ */
10
+ export declare function deploymentConfigHash(schema: core.$ZodType | undefined, config: unknown): string;
@@ -0,0 +1,38 @@
1
+ import { createHash } from "node:crypto";
2
+ import { configFields, getPath, setPath } from "../config/fields.js";
3
+ /** 键排序后的 JSON(对象键顺序不影响结果);undefined 字段与 JSON.stringify 一样省略。 */
4
+ const canonicalJson = (v) => {
5
+ if (Array.isArray(v))
6
+ return `[${v.map((x) => (x === undefined ? "null" : canonicalJson(x))).join(",")}]`;
7
+ if (v !== null && typeof v === "object") {
8
+ const entries = Object.entries(v)
9
+ .filter(([, x]) => x !== undefined)
10
+ .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0));
11
+ return `{${entries.map(([k, x]) => `${JSON.stringify(k)}:${canonicalJson(x)}`).join(",")}}`;
12
+ }
13
+ return JSON.stringify(v) ?? "null";
14
+ };
15
+ /** 遮蔽 secret 字段后参与摘要的固定占位值。 */
16
+ const SECRET_PLACEHOLDER = "<secret>";
17
+ /**
18
+ * 插件部署配置(校验后)中非密钥部分的摘要:先把 schema 里所有 secret 叶子(`configFields` 可达路径,
19
+ * 加载时 `assertSecretsReachable` 已保证密钥都在这些路径上)换成固定占位值,再取 sha256(键排序 JSON) 前 16 位十六进制。
20
+ * 给需要「配置变了就失效」的缓存键用(如模型列表)。密钥不参与摘要:不加盐的短摘要写进 Redis 键名后,
21
+ * 低熵密钥可被离线猜测、泄露的密钥可被确认;代价是轮换密钥不会让缓存失效(缓存内容本来就不该依赖密钥)。
22
+ * 没有部署配置 schema 时无从得知哪些是密钥,摘要不按配置区分。同一份配置在各副本上得到同一摘要。
23
+ * 函数自己按 schema 遮蔽,调用方不必(也不能忘记)先打码。
24
+ */
25
+ export function deploymentConfigHash(schema, config) {
26
+ let redacted = null;
27
+ if (schema) {
28
+ redacted = structuredClone(config);
29
+ if (redacted !== null && typeof redacted === "object") {
30
+ for (const f of configFields(schema)) {
31
+ if (f.meta?.secret && getPath(redacted, f.path) !== undefined) {
32
+ setPath(redacted, f.path, SECRET_PLACEHOLDER);
33
+ }
34
+ }
35
+ }
36
+ }
37
+ return createHash("sha256").update(canonicalJson(redacted)).digest("hex").slice(0, 16);
38
+ }
@@ -4,7 +4,7 @@ import type { KernelAppOptions } from "../app.js";
4
4
  import { type ConfigSourceKind } from "../config/sources.js";
5
5
  import { type Keyring } from "../ctx/secrets.js";
6
6
  import type { KernelSchemaDb } from "../db/kernel-schema.js";
7
- import { EnterpriseAdminLock } from "../identity/enterprise-admin.js";
7
+ import { SuperAdminLock } from "../identity/super-admin.js";
8
8
  import { KernelConfigService } from "../infra/config/kernel-config.service.js";
9
9
  import { KernelDb } from "../infra/database/kernel-db.js";
10
10
  import { TransactionHost } from "../infra/database/transaction-host.js";
@@ -20,6 +20,7 @@ import { ExtensionLifecycle } from "./lifecycle.js";
20
20
  import { PLUGIN_DEPLOYMENT_CONFIG_TOPIC } from "./lifecycle-topics.js";
21
21
  import { PluginDeploymentConfigLock } from "./locks.js";
22
22
  export { DEPLOYMENT_SECRETS_ORG, type DeploymentSchemaInfo, mergeDeploymentConfig, readStoredDeploymentConfig, schemaFields, secretPathsOf, };
23
+ type Obj = Record<string, unknown>;
23
24
  export type { ConfigIssue };
24
25
  export { PLUGIN_DEPLOYMENT_CONFIG_TOPIC };
25
26
  /** 后台一个部署配置字段:来源、是否只读;非密钥字段给出生效值,密钥字段只给 `set`。 */
@@ -41,6 +42,11 @@ export interface DeploymentConfigField {
41
42
  * (item names, not secret values; spec §4.3). Other secret fields report only `set`.
42
43
  */
43
44
  keys?: string[];
45
+ /**
46
+ * What orgs may do with the field (spec A §5.1, the level of its top-level key): `readonly` (they
47
+ * see it) or `override` (they may bring their own value); absent = hidden from orgs.
48
+ */
49
+ org?: "readonly" | "override";
44
50
  }
45
51
  /**
46
52
  * One operation on a secret record drawn per item (spec §4.3), only for a path some
@@ -76,6 +82,11 @@ export interface DeploymentConfigView {
76
82
  validated: boolean;
77
83
  /** 校验失败的原因(只有路径与说明,不含值)。 */
78
84
  issues: ConfigIssue[];
85
+ /**
86
+ * The required `override` fields the platform left empty (spec A §5.4a): the extension still
87
+ * loads, and every org that follows the platform must configure them itself.
88
+ */
89
+ orgMustConfigure: string[];
79
90
  }
80
91
  /**
81
92
  * Deployment-level extension config (D8 / C10): non-secret fields are stored in
@@ -88,7 +99,7 @@ export interface DeploymentConfigView {
88
99
  export declare class ExtensionDeploymentConfigService {
89
100
  private readonly kdb;
90
101
  readonly txHost: TransactionHost;
91
- /** The enterprise admin lock (identity/enterprise-admin.ts): joins the transaction. */
102
+ /** The super admin lock (identity/super-admin.ts): joins the transaction. */
92
103
  private readonly adminLock;
93
104
  private readonly configLock;
94
105
  private readonly keyring;
@@ -106,8 +117,8 @@ export declare class ExtensionDeploymentConfigService {
106
117
  /** Where each startup-config field comes from (see `extensionConfigSources`); those fields are read-only. */
107
118
  private readonly sources;
108
119
  constructor(kdb: KernelDb, txHost: TransactionHost,
109
- /** The enterprise admin lock (identity/enterprise-admin.ts): joins the transaction. */
110
- adminLock: EnterpriseAdminLock, configLock: PluginDeploymentConfigLock, keyring: Keyring, config: KernelConfigService,
120
+ /** The super admin lock (identity/super-admin.ts): joins the transaction. */
121
+ adminLock: SuperAdminLock, configLock: PluginDeploymentConfigLock, keyring: Keyring, config: KernelConfigService,
111
122
  /** This replica's extension schemas (loaded, config-declared or prepared install records). */
112
123
  host: ExtensionHost,
113
124
  /** The effective (stored plus startup) deployment config. */
@@ -142,7 +153,7 @@ export declare class ExtensionDeploymentConfigService {
142
153
  * is re-encrypted whole, then validated with `values`; the audit lists the record's path, no keys.
143
154
  * A path no hint names -> 400 `validation_failed`; one in the startup config -> 409
144
155
  * `extension.config_readonly`.
145
- * In a transaction, first `lockEnterpriseAdminsAndAuthorize` (re-checks the enterprise admin under
156
+ * In a transaction, first `lockSuperAdminsAndAuthorize` (re-checks the super admin under
146
157
  * the lock), then an advisory lock per extension; audit `extension.deployment_config_updated`
147
158
  * (detail only `changedPaths`). After the commit publishes {@link PLUGIN_DEPLOYMENT_CONFIG_TOPIC} and
148
159
  * applies it on this replica right away.
@@ -157,6 +168,12 @@ export declare class ExtensionDeploymentConfigService {
157
168
  private write;
158
169
  private info;
159
170
  private render;
171
+ /**
172
+ * The required `override` fields the platform left empty ({@link DeploymentConfigView}
173
+ * `orgMustConfigure`); reads nothing when the extension has no `override` field. Unknown to the
174
+ * deployment -> `extension.not_found`.
175
+ */
176
+ orgMustConfigure(plugin: string): Promise<string[]>;
160
177
  /**
161
178
  * The form JSON Schema of the description: the zod schema's, else the package's static one. A
162
179
  * hint conversion that throws (a hand-made package) drops the hints: the plain schema, or none
@@ -167,6 +184,12 @@ export declare class ExtensionDeploymentConfigService {
167
184
  /** The secret record paths some hint of the form schema names. */
168
185
  private hintedPaths;
169
186
  }
187
+ /**
188
+ * Applies secret entries in order to the decrypted config `next` (in place): each record is read
189
+ * from `next` at its path, renamed, set or removed, and put back; an empty record is removed (the
190
+ * field falls back to its default).
191
+ */
192
+ export declare function applySecretEntries(next: Obj, entries: readonly SecretEntry[]): void;
170
193
  /**
171
194
  * 本副本拿不到模块时(未加载的安装记录)按包内审阅过的静态清单给出字段(没有 zod schema:不校验,加载时再校验)。
172
195
  * The package's `extension.configSchemas.deployment` (written by the packer) is the form schema;
@@ -14,7 +14,7 @@ import { configSourceKind, extensionConfigSources, fieldSource, } from "../confi
14
14
  import { createSecrets } from "../ctx/secrets.js";
15
15
  import { ApiError } from "../errors.js";
16
16
  import { audit } from "../identity/audit.js";
17
- import { EnterpriseAdminLock } from "../identity/enterprise-admin.js";
17
+ import { SuperAdminLock } from "../identity/super-admin.js";
18
18
  import { KernelConfigService } from "../infra/config/kernel-config.service.js";
19
19
  import { KernelDb } from "../infra/database/kernel-db.js";
20
20
  import { TransactionHost } from "../infra/database/transaction-host.js";
@@ -30,6 +30,7 @@ import { ExtensionInstalls } from "./installs.js";
30
30
  import { ExtensionLifecycle } from "./lifecycle.js";
31
31
  import { PLUGIN_DEPLOYMENT_CONFIG_TOPIC } from "./lifecycle-topics.js";
32
32
  import { PluginDeploymentConfigLock } from "./locks.js";
33
+ import { fieldLevels, jsonSchemaFieldLevels, missingOverridable, parseLoadGate, } from "./org-levels.js";
33
34
  export { DEPLOYMENT_SECRETS_ORG, mergeDeploymentConfig, readStoredDeploymentConfig, schemaFields, secretPathsOf, };
34
35
  export { PLUGIN_DEPLOYMENT_CONFIG_TOPIC };
35
36
  /** 某字段 zod 叶子上的默认值(整份配置不合法、校验没能补上默认值时,视图仍按它显示)。 */
@@ -64,7 +65,7 @@ let ExtensionDeploymentConfigService = class ExtensionDeploymentConfigService {
64
65
  /** Where each startup-config field comes from (see `extensionConfigSources`); those fields are read-only. */
65
66
  sources;
66
67
  constructor(kdb, txHost,
67
- /** The enterprise admin lock (identity/enterprise-admin.ts): joins the transaction. */
68
+ /** The super admin lock (identity/super-admin.ts): joins the transaction. */
68
69
  adminLock, configLock, keyring, config,
69
70
  /** This replica's extension schemas (loaded, config-declared or prepared install records). */
70
71
  host,
@@ -142,7 +143,7 @@ let ExtensionDeploymentConfigService = class ExtensionDeploymentConfigService {
142
143
  * is re-encrypted whole, then validated with `values`; the audit lists the record's path, no keys.
143
144
  * A path no hint names -> 400 `validation_failed`; one in the startup config -> 409
144
145
  * `extension.config_readonly`.
145
- * In a transaction, first `lockEnterpriseAdminsAndAuthorize` (re-checks the enterprise admin under
146
+ * In a transaction, first `lockSuperAdminsAndAuthorize` (re-checks the super admin under
146
147
  * the lock), then an advisory lock per extension; audit `extension.deployment_config_updated`
147
148
  * (detail only `changedPaths`). After the commit publishes {@link PLUGIN_DEPLOYMENT_CONFIG_TOPIC} and
148
149
  * applies it on this replica right away.
@@ -241,7 +242,8 @@ let ExtensionDeploymentConfigService = class ExtensionDeploymentConfigService {
241
242
  applySecretEntries(next, secretEntries);
242
243
  const touched = new Set([...Object.keys(values), ...secretEntries.map((e) => e.path)]);
243
244
  if (info.schema) {
244
- const r = info.schema.safeParse(mergeDeploymentConfig(next, fileValue, fieldPaths));
245
+ // overridable fields may stay empty on the platform (spec A §5.4a)
246
+ const r = parseLoadGate(info.schema, mergeDeploymentConfig(next, fileValue, fieldPaths));
245
247
  if (!r.success) {
246
248
  // 启动配置里只读字段自己的问题这里改不了(照样保存,插件保持待配置),其余拒绝
247
249
  const issues = toIssues(r.error, this.messagesOf(plugin, info)).filter((i) => i.path === "" || fieldSource(sources, i.path) === undefined);
@@ -303,7 +305,8 @@ let ExtensionDeploymentConfigService = class ExtensionDeploymentConfigService {
303
305
  let valid = true;
304
306
  let issues = [];
305
307
  if (info.schema) {
306
- const r = info.schema.safeParse(raw);
308
+ // the load gate: overridable fields may stay empty (spec A §5.4a)
309
+ const r = parseLoadGate(info.schema, raw);
307
310
  if (r.success)
308
311
  effective = r.data;
309
312
  else {
@@ -313,6 +316,7 @@ let ExtensionDeploymentConfigService = class ExtensionDeploymentConfigService {
313
316
  }
314
317
  const formSchema = this.formSchemaOf(plugin, info);
315
318
  const hinted = formSchema ? hintedSecretPaths(formSchema) : new Set();
319
+ const levels = levelsOf(info);
316
320
  const fields = info.fields.map((f) => {
317
321
  const from = fieldSource(sources, f.path);
318
322
  let value = getPath(effective, f.path);
@@ -327,12 +331,14 @@ let ExtensionDeploymentConfigService = class ExtensionDeploymentConfigService {
327
331
  value = d.value;
328
332
  source = value === undefined ? "unset" : "default";
329
333
  }
334
+ const level = levels.get(f.path.split(".")[0]);
330
335
  const base = {
331
336
  path: f.path,
332
337
  secret: f.secret,
333
338
  hot: f.hot,
334
339
  source,
335
340
  readonly: from !== undefined,
341
+ ...(level !== undefined && level !== "hidden" && { org: level }),
336
342
  };
337
343
  // a schema default (e.g. `secret(record).default({})`) is no secret anybody set
338
344
  const set = value !== undefined && source !== "default";
@@ -354,8 +360,23 @@ let ExtensionDeploymentConfigService = class ExtensionDeploymentConfigService {
354
360
  valid,
355
361
  validated: info.schema !== undefined,
356
362
  issues,
363
+ orgMustConfigure: orgMustConfigureOf(info, raw, levels),
357
364
  };
358
365
  }
366
+ /**
367
+ * The required `override` fields the platform left empty ({@link DeploymentConfigView}
368
+ * `orgMustConfigure`); reads nothing when the extension has no `override` field. Unknown to the
369
+ * deployment -> `extension.not_found`.
370
+ */
371
+ async orgMustConfigure(plugin) {
372
+ const info = await this.info(plugin);
373
+ const levels = levelsOf(info);
374
+ if (![...levels.values()].includes("override"))
375
+ return [];
376
+ const stored = await this.readStored(plugin, info);
377
+ const raw = mergeDeploymentConfig(stored, this.fileConfig()[plugin], info.fields.map((f) => f.path));
378
+ return orgMustConfigureOf(info, raw, levels);
379
+ }
359
380
  /**
360
381
  * The form JSON Schema of the description: the zod schema's, else the package's static one. A
361
382
  * hint conversion that throws (a hand-made package) drops the hints: the plain schema, or none
@@ -391,7 +412,7 @@ ExtensionDeploymentConfigService = __decorate([
391
412
  Injectable(),
392
413
  __param(0, Inject(KernelDb)),
393
414
  __param(1, Inject(TransactionHost)),
394
- __param(2, Inject(EnterpriseAdminLock)),
415
+ __param(2, Inject(SuperAdminLock)),
395
416
  __param(3, Inject(PluginDeploymentConfigLock)),
396
417
  __param(4, Inject(KEYRING)),
397
418
  __param(5, Inject(KernelConfigService)),
@@ -404,12 +425,32 @@ ExtensionDeploymentConfigService = __decorate([
404
425
  __param(12, Inject(ExtensionDisplayNames))
405
426
  ], ExtensionDeploymentConfigService);
406
427
  export { ExtensionDeploymentConfigService };
428
+ /** The org level of each top-level key: from the zod schema, else the package's form schema. */
429
+ function levelsOf(info) {
430
+ return info.schema
431
+ ? fieldLevels(info.schema)
432
+ : jsonSchemaFieldLevels(info.jsonSchema);
433
+ }
434
+ /**
435
+ * The required `override` keys `raw` leaves empty: by the zod schema, else (a static form schema)
436
+ * the `required` keys marked `override` that have no value.
437
+ */
438
+ function orgMustConfigureOf(info, raw, levels) {
439
+ if (info.schema)
440
+ return missingOverridable(info.schema, raw);
441
+ const required = info.jsonSchema?.required;
442
+ if (!Array.isArray(required))
443
+ return [];
444
+ return [...levels]
445
+ .filter(([k, l]) => l === "override" && required.includes(k) && getPath(raw, k) === undefined)
446
+ .map(([k]) => k);
447
+ }
407
448
  /**
408
449
  * Applies secret entries in order to the decrypted config `next` (in place): each record is read
409
450
  * from `next` at its path, renamed, set or removed, and put back; an empty record is removed (the
410
451
  * field falls back to its default).
411
452
  */
412
- function applySecretEntries(next, entries) {
453
+ export function applySecretEntries(next, entries) {
413
454
  for (const e of entries) {
414
455
  const cur = getPath(next, e.path);
415
456
  const rec = isObj(cur) ? { ...cur } : {};