@capybara-hq/kernel 0.1.0-rc.3 → 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 (604) hide show
  1. package/bootstrap.json +61 -5
  2. package/dist/admin/admin.controller.d.ts +47 -16
  3. package/dist/admin/admin.controller.js +44 -19
  4. package/dist/admin/extensions.controller.d.ts +24 -3
  5. package/dist/admin/extensions.controller.js +48 -8
  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 +19 -0
  13. package/dist/agents/agent-lookup.js +21 -0
  14. package/dist/agents/agent-profile.service.d.ts +29 -0
  15. package/dist/agents/agent-profile.service.js +117 -0
  16. package/dist/agents/agents.controller.d.ts +168 -3
  17. package/dist/agents/agents.controller.js +201 -12
  18. package/dist/agents/agents.module.d.ts +4 -1
  19. package/dist/agents/agents.module.js +36 -6
  20. package/dist/agents/agents.service.d.ts +64 -27
  21. package/dist/agents/agents.service.js +199 -74
  22. package/dist/agents/definition.d.ts +53 -0
  23. package/dist/agents/definition.js +55 -0
  24. package/dist/agents/from-template.d.ts +106 -0
  25. package/dist/agents/from-template.js +649 -0
  26. package/dist/agents/from-template.service.d.ts +60 -0
  27. package/dist/agents/from-template.service.js +161 -0
  28. package/dist/agents/instruction-files.d.ts +60 -0
  29. package/dist/agents/instruction-files.js +111 -0
  30. package/dist/agents/models.controller.d.ts +9 -3
  31. package/dist/agents/models.controller.js +19 -4
  32. package/dist/agents/org-templates.d.ts +176 -0
  33. package/dist/agents/org-templates.js +827 -0
  34. package/dist/agents/pending-connector-requests.d.ts +77 -0
  35. package/dist/agents/pending-connector-requests.js +215 -0
  36. package/dist/agents/pending-connectors.controller.d.ts +39 -0
  37. package/dist/agents/pending-connectors.controller.js +91 -0
  38. package/dist/agents/pending-connectors.service.d.ts +62 -0
  39. package/dist/agents/pending-connectors.service.js +282 -0
  40. package/dist/agents/profile.d.ts +96 -0
  41. package/dist/agents/profile.js +51 -0
  42. package/dist/agents/readiness.controller.d.ts +26 -0
  43. package/dist/agents/readiness.controller.js +56 -0
  44. package/dist/agents/templates.controller.d.ts +86 -5
  45. package/dist/agents/templates.controller.js +171 -7
  46. package/dist/agents/templates.d.ts +127 -23
  47. package/dist/agents/templates.js +476 -53
  48. package/dist/background/background.controller.d.ts +38 -0
  49. package/dist/background/background.controller.js +87 -0
  50. package/dist/background/background.module.d.ts +10 -0
  51. package/dist/background/background.module.js +39 -0
  52. package/dist/background/finish.d.ts +44 -0
  53. package/dist/background/finish.js +94 -0
  54. package/dist/background/launch-lock.d.ts +15 -0
  55. package/dist/background/launch-lock.js +40 -0
  56. package/dist/background/launch.d.ts +36 -0
  57. package/dist/background/launch.js +70 -0
  58. package/dist/background/poll.job.d.ts +56 -0
  59. package/dist/background/poll.job.js +190 -0
  60. package/dist/background/render.d.ts +23 -0
  61. package/dist/background/render.js +48 -0
  62. package/dist/background/session.d.ts +48 -0
  63. package/dist/background/session.js +79 -0
  64. package/dist/background/status.d.ts +35 -0
  65. package/dist/background/status.js +57 -0
  66. package/dist/background/stop.d.ts +68 -0
  67. package/dist/background/stop.js +243 -0
  68. package/dist/background/store.d.ts +162 -0
  69. package/dist/background/store.js +357 -0
  70. package/dist/background/store.module.d.ts +6 -0
  71. package/dist/background/store.module.js +22 -0
  72. package/dist/background/tasks.service.d.ts +77 -0
  73. package/dist/background/tasks.service.js +211 -0
  74. package/dist/background/wake-rules.d.ts +66 -0
  75. package/dist/background/wake-rules.js +113 -0
  76. package/dist/background/wake.d.ts +30 -0
  77. package/dist/background/wake.js +63 -0
  78. package/dist/catalog/admin-catalog.controller.d.ts +129 -30
  79. package/dist/catalog/admin-catalog.controller.js +213 -42
  80. package/dist/catalog/catalog-content.d.ts +58 -32
  81. package/dist/catalog/catalog-content.js +34 -8
  82. package/dist/catalog/catalog-import.module.d.ts +7 -0
  83. package/dist/catalog/catalog-import.module.js +60 -0
  84. package/dist/catalog/catalog-items.d.ts +111 -7
  85. package/dist/catalog/catalog-items.js +279 -13
  86. package/dist/catalog/catalog-scope.service.d.ts +260 -0
  87. package/dist/catalog/catalog-scope.service.js +1116 -0
  88. package/dist/catalog/catalog.module.d.ts +7 -9
  89. package/dist/catalog/catalog.module.js +41 -31
  90. package/dist/catalog/catalog.service.d.ts +101 -29
  91. package/dist/catalog/catalog.service.js +104 -106
  92. package/dist/catalog/claude/agents.js +2 -0
  93. package/dist/catalog/cli.d.ts +11 -1
  94. package/dist/catalog/cli.js +26 -1
  95. package/dist/catalog/component-promotion.d.ts +96 -0
  96. package/dist/catalog/component-promotion.js +395 -0
  97. package/dist/catalog/component-scope.controller.d.ts +152 -0
  98. package/dist/catalog/component-scope.controller.js +287 -0
  99. package/dist/catalog/component-scope.service.d.ts +303 -0
  100. package/dist/catalog/component-scope.service.js +936 -0
  101. package/dist/catalog/component-state.d.ts +174 -0
  102. package/dist/catalog/component-state.js +437 -0
  103. package/dist/catalog/job-ids.d.ts +30 -0
  104. package/dist/catalog/job-ids.js +25 -0
  105. package/dist/catalog/marketplace-fetch.d.ts +1 -1
  106. package/dist/catalog/marketplaces.controller.d.ts +22 -5
  107. package/dist/catalog/marketplaces.controller.js +56 -7
  108. package/dist/catalog/marketplaces.service.d.ts +54 -14
  109. package/dist/catalog/marketplaces.service.js +71 -22
  110. package/dist/catalog/org-catalog.controller.d.ts +125 -34
  111. package/dist/catalog/org-catalog.controller.js +181 -65
  112. package/dist/catalog/org-catalog.service.d.ts +65 -33
  113. package/dist/catalog/org-catalog.service.js +324 -157
  114. package/dist/catalog/org-extension-switch.d.ts +41 -0
  115. package/dist/catalog/org-extension-switch.js +115 -0
  116. package/dist/catalog/org-extension.controller.d.ts +119 -0
  117. package/dist/catalog/org-extension.controller.js +266 -0
  118. package/dist/catalog/org-plugin-uploads.controller.d.ts +98 -0
  119. package/dist/catalog/org-plugin-uploads.controller.js +213 -0
  120. package/dist/catalog/org-plugin-uploads.d.ts +63 -0
  121. package/dist/catalog/org-plugin-uploads.js +116 -0
  122. package/dist/catalog/owned-items.d.ts +184 -0
  123. package/dist/catalog/owned-items.js +789 -0
  124. package/dist/catalog/owned-plugin-cleanup.d.ts +56 -0
  125. package/dist/catalog/owned-plugin-cleanup.js +194 -0
  126. package/dist/catalog/ownership.d.ts +172 -0
  127. package/dist/catalog/ownership.js +326 -0
  128. package/dist/catalog/platform-components.d.ts +221 -0
  129. package/dist/catalog/platform-components.js +761 -0
  130. package/dist/catalog/platform-migration.d.ts +115 -0
  131. package/dist/catalog/platform-migration.js +582 -0
  132. package/dist/catalog/plugin-import.d.ts +178 -34
  133. package/dist/catalog/plugin-import.js +623 -83
  134. package/dist/catalog/plugin-install.d.ts +185 -41
  135. package/dist/catalog/plugin-install.js +758 -126
  136. package/dist/catalog/plugin-upgrade.d.ts +260 -225
  137. package/dist/catalog/plugin-upgrade.js +1148 -1137
  138. package/dist/catalog/request-rules.d.ts +65 -0
  139. package/dist/catalog/request-rules.js +217 -0
  140. package/dist/catalog/requests.service.d.ts +193 -118
  141. package/dist/catalog/requests.service.js +526 -343
  142. package/dist/catalog/reserved-names.d.ts +8 -0
  143. package/dist/catalog/reserved-names.js +42 -0
  144. package/dist/catalog/scope-orgs.d.ts +21 -0
  145. package/dist/catalog/scope-orgs.js +67 -0
  146. package/dist/catalog/scope-state.d.ts +35 -0
  147. package/dist/catalog/scope-state.js +87 -0
  148. package/dist/catalog/scope-sync-workers.d.ts +7 -0
  149. package/dist/catalog/scope-sync-workers.js +29 -0
  150. package/dist/catalog/scope-sync.d.ts +176 -0
  151. package/dist/catalog/scope-sync.js +576 -0
  152. package/dist/catalog/scope.d.ts +42 -0
  153. package/dist/catalog/scope.js +42 -0
  154. package/dist/catalog/unshare.d.ts +22 -0
  155. package/dist/catalog/unshare.js +118 -0
  156. package/dist/channels/actions.js +1 -0
  157. package/dist/channels/cards.js +21 -3
  158. package/dist/channels/channels.module.js +2 -0
  159. package/dist/channels/connections.service.d.ts +16 -1
  160. package/dist/channels/connections.service.js +38 -4
  161. package/dist/channels/inbound.d.ts +9 -1
  162. package/dist/channels/inbound.js +67 -5
  163. package/dist/channels/phrases.d.ts +35 -0
  164. package/dist/channels/phrases.js +29 -0
  165. package/dist/channels/threads.d.ts +5 -0
  166. package/dist/channels/threads.js +8 -0
  167. package/dist/config/docs.js +3 -1
  168. package/dist/config/schema.d.ts +24 -2
  169. package/dist/config/schema.js +145 -19
  170. package/dist/conversations/access.d.ts +6 -4
  171. package/dist/conversations/access.js +29 -5
  172. package/dist/conversations/agent-tree.d.ts +46 -0
  173. package/dist/conversations/agent-tree.js +92 -0
  174. package/dist/conversations/attachments.service.d.ts +30 -0
  175. package/dist/conversations/attachments.service.js +130 -5
  176. package/dist/conversations/conversations.controller.d.ts +79 -23
  177. package/dist/conversations/conversations.controller.js +141 -50
  178. package/dist/conversations/conversations.module.d.ts +1 -1
  179. package/dist/conversations/conversations.module.js +10 -7
  180. package/dist/conversations/conversations.service.d.ts +108 -9
  181. package/dist/conversations/conversations.service.js +237 -30
  182. package/dist/conversations/environment-status.d.ts +24 -0
  183. package/dist/conversations/environment-status.js +71 -0
  184. package/dist/conversations/event-log.d.ts +21 -6
  185. package/dist/conversations/event-log.js +70 -1
  186. package/dist/conversations/events.d.ts +140 -0
  187. package/dist/conversations/events.js +142 -13
  188. package/dist/conversations/queue.d.ts +3 -1
  189. package/dist/conversations/queue.js +13 -2
  190. package/dist/conversations/queue.service.d.ts +1 -1
  191. package/dist/conversations/queue.service.js +8 -1
  192. package/dist/conversations/titles.d.ts +12 -3
  193. package/dist/conversations/titles.js +36 -8
  194. package/dist/conversations/tree.d.ts +17 -0
  195. package/dist/conversations/tree.js +42 -0
  196. package/dist/ctx/create-ctx.d.ts +5 -0
  197. package/dist/ctx/create-ctx.js +15 -5
  198. package/dist/db/kernel-schema.d.ts +420 -20
  199. package/dist/db/pool.d.ts +5 -0
  200. package/dist/db/pool.js +3 -0
  201. package/dist/environments/access.d.ts +41 -0
  202. package/dist/environments/access.js +77 -0
  203. package/dist/environments/conversation-environments.d.ts +61 -0
  204. package/dist/environments/conversation-environments.js +170 -0
  205. package/dist/environments/dto.d.ts +25 -0
  206. package/dist/environments/dto.js +12 -0
  207. package/dist/environments/environments.controller.d.ts +33 -0
  208. package/dist/environments/environments.controller.js +110 -0
  209. package/dist/environments/environments.module.d.ts +8 -0
  210. package/dist/environments/environments.module.js +27 -0
  211. package/dist/environments/environments.service.d.ts +153 -0
  212. package/dist/environments/environments.service.js +541 -0
  213. package/dist/environments/legacy-cleanup.job.d.ts +34 -0
  214. package/dist/environments/legacy-cleanup.job.js +141 -0
  215. package/dist/errors.d.ts +90 -2
  216. package/dist/errors.js +90 -2
  217. package/dist/evals/reconstruct.d.ts +18 -9
  218. package/dist/evals/reconstruct.js +26 -7
  219. package/dist/evals/run-replay.d.ts +7 -2
  220. package/dist/evals/run-replay.js +42 -7
  221. package/dist/evals/step-replay.d.ts +2 -5
  222. package/dist/evals/step-replay.js +13 -7
  223. package/dist/evals/trajectory.js +1 -1
  224. package/dist/evals/trajectory.service.d.ts +8 -3
  225. package/dist/evals/trajectory.service.js +26 -14
  226. package/dist/evals/worker.d.ts +5 -5
  227. package/dist/evals/worker.js +9 -3
  228. package/dist/extensions/admin-ops.d.ts +36 -10
  229. package/dist/extensions/admin-ops.js +67 -42
  230. package/dist/extensions/admin-view.d.ts +39 -10
  231. package/dist/extensions/admin-view.js +111 -20
  232. package/dist/extensions/blobs.js +1 -0
  233. package/dist/extensions/bootstrap.d.ts +17 -4
  234. package/dist/extensions/bootstrap.js +70 -9
  235. package/dist/extensions/cli.d.ts +12 -0
  236. package/dist/extensions/cli.js +11 -2
  237. package/dist/extensions/config-issues.d.ts +13 -1
  238. package/dist/extensions/config-issues.js +22 -5
  239. package/dist/extensions/config-json-schema.d.ts +43 -7
  240. package/dist/extensions/config-json-schema.js +124 -58
  241. package/dist/extensions/deployment-config-store.d.ts +6 -0
  242. package/dist/extensions/deployment-config.d.ts +78 -8
  243. package/dist/extensions/deployment-config.js +172 -34
  244. package/dist/extensions/display-name.d.ts +22 -0
  245. package/dist/extensions/display-name.js +77 -0
  246. package/dist/extensions/effective-config.d.ts +127 -0
  247. package/dist/extensions/effective-config.js +368 -0
  248. package/dist/extensions/extensions.module.js +14 -2
  249. package/dist/extensions/hooks.d.ts +37 -4
  250. package/dist/extensions/hooks.js +82 -16
  251. package/dist/extensions/host.d.ts +45 -2
  252. package/dist/extensions/host.js +112 -16
  253. package/dist/extensions/installs.d.ts +20 -8
  254. package/dist/extensions/installs.js +37 -15
  255. package/dist/extensions/org-config.d.ts +81 -6
  256. package/dist/extensions/org-config.js +195 -44
  257. package/dist/extensions/org-levels.d.ts +37 -0
  258. package/dist/extensions/org-levels.js +71 -0
  259. package/dist/extensions/org-overrides.d.ts +151 -0
  260. package/dist/extensions/org-overrides.js +524 -0
  261. package/dist/extensions/package.d.ts +14 -1
  262. package/dist/extensions/package.js +51 -2
  263. package/dist/extensions/permission-view.d.ts +19 -4
  264. package/dist/extensions/permission-view.js +4 -4
  265. package/dist/extensions/plugin-items.d.ts +21 -0
  266. package/dist/extensions/plugin-items.js +42 -0
  267. package/dist/extensions/point-defaults.controller.d.ts +34 -0
  268. package/dist/extensions/point-defaults.controller.js +71 -0
  269. package/dist/extensions/point-defaults.d.ts +71 -0
  270. package/dist/extensions/point-defaults.js +234 -0
  271. package/dist/extensions/registry.d.ts +1 -1
  272. package/dist/extensions/registry.js +2 -0
  273. package/dist/extensions/resolve.d.ts +5 -1
  274. package/dist/extensions/resolve.js +15 -2
  275. package/dist/files/previewers.d.ts +8 -1
  276. package/dist/files/previewers.js +35 -6
  277. package/dist/http/api.module.js +31 -3
  278. package/dist/http/app.d.ts +11 -2
  279. package/dist/http/app.js +31 -5
  280. package/dist/http/nest-logger.d.ts +6 -5
  281. package/dist/http/nest-logger.js +24 -10
  282. package/dist/identity/accounts.d.ts +29 -29
  283. package/dist/identity/accounts.js +47 -47
  284. package/dist/identity/audit.d.ts +2 -1
  285. package/dist/identity/auth.controller.js +9 -5
  286. package/dist/identity/auth.guard.d.ts +13 -5
  287. package/dist/identity/auth.guard.js +26 -9
  288. package/dist/identity/cookies.d.ts +20 -5
  289. package/dist/identity/cookies.js +44 -6
  290. package/dist/identity/identity.module.d.ts +1 -1
  291. package/dist/identity/identity.module.js +4 -4
  292. package/dist/identity/me.controller.d.ts +5 -1
  293. package/dist/identity/me.controller.js +12 -3
  294. package/dist/identity/principal.d.ts +3 -3
  295. package/dist/identity/principal.js +3 -3
  296. package/dist/identity/sessions.d.ts +12 -0
  297. package/dist/identity/sessions.js +45 -0
  298. package/dist/identity/settings.d.ts +22 -11
  299. package/dist/identity/settings.js +53 -18
  300. package/dist/identity/{enterprise-admin.d.ts → super-admin.d.ts} +5 -5
  301. package/dist/identity/{enterprise-admin.js → super-admin.js} +24 -24
  302. package/dist/inbox/inbox.module.d.ts +4 -1
  303. package/dist/inbox/inbox.module.js +7 -3
  304. package/dist/inbox/inbox.service.d.ts +62 -3
  305. package/dist/inbox/inbox.service.js +74 -4
  306. package/dist/inbox/org-notices.d.ts +63 -0
  307. package/dist/inbox/org-notices.js +91 -0
  308. package/dist/inbox/platform-inbox.controller.d.ts +23 -0
  309. package/dist/inbox/platform-inbox.controller.js +58 -0
  310. package/dist/inbox/platform-inbox.service.d.ts +151 -0
  311. package/dist/inbox/platform-inbox.service.js +263 -0
  312. package/dist/inbox/platform-notices.d.ts +19 -0
  313. package/dist/inbox/platform-notices.js +9 -0
  314. package/dist/index.d.ts +2 -2
  315. package/dist/index.js +1 -1
  316. package/dist/infra/cli/kernel-cli.module.js +9 -1
  317. package/dist/infra/config/kernel-config.service.js +27 -1
  318. package/dist/infra/database/database.module.js +1 -0
  319. package/dist/infra/database/xact-lock.d.ts +1 -1
  320. package/dist/infra/database/xact-lock.js +1 -1
  321. package/dist/infra/events/kernel-events.d.ts +19 -2
  322. package/dist/infra/lifecycle/process-guards.js +4 -0
  323. package/dist/infra/logging/logging.module.d.ts +4 -2
  324. package/dist/infra/logging/logging.module.js +24 -6
  325. package/dist/infra/queue/add-job-once.d.ts +14 -0
  326. package/dist/infra/queue/add-job-once.js +16 -0
  327. package/dist/infra/queue/redis-connection.d.ts +6 -0
  328. package/dist/infra/queue/redis-connection.js +7 -0
  329. package/dist/infra/redis/redis.module.js +6 -2
  330. package/dist/infra/tokens.d.ts +6 -1
  331. package/dist/infra/tokens.js +6 -1
  332. package/dist/kernel.module.js +6 -0
  333. package/dist/lifecycle/kernel-lifecycle.d.ts +1 -1
  334. package/dist/lifecycle/kernel-lifecycle.js +4 -4
  335. package/dist/log.d.ts +13 -1
  336. package/dist/log.js +93 -17
  337. package/dist/models/prices.d.ts +5 -5
  338. package/dist/models/prices.js +4 -4
  339. package/dist/models/purposes.controller.d.ts +6 -4
  340. package/dist/models/purposes.controller.js +13 -7
  341. package/dist/models/purposes.d.ts +43 -9
  342. package/dist/models/purposes.js +48 -18
  343. package/dist/orgs/directory-sync.d.ts +14 -5
  344. package/dist/orgs/directory-sync.js +41 -17
  345. package/dist/orgs/offboarding.d.ts +12 -8
  346. package/dist/orgs/offboarding.js +54 -33
  347. package/dist/orgs/org-lock.d.ts +5 -0
  348. package/dist/orgs/org-lock.js +13 -0
  349. package/dist/orgs/org.guard.d.ts +10 -0
  350. package/dist/orgs/org.guard.js +43 -32
  351. package/dist/orgs/orgs.module.js +3 -0
  352. package/dist/orgs/orgs.service.d.ts +20 -7
  353. package/dist/orgs/orgs.service.js +32 -12
  354. package/dist/orgs/roles.d.ts +1 -1
  355. package/dist/orgs/roles.js +5 -1
  356. package/dist/orgs/settings.controller.d.ts +1 -1
  357. package/dist/orgs/settings.service.d.ts +20 -3
  358. package/dist/orgs/settings.service.js +19 -4
  359. package/dist/overrides.d.ts +3 -0
  360. package/dist/overrides.js +2 -0
  361. package/dist/platform/actor.d.ts +48 -0
  362. package/dist/platform/actor.js +100 -0
  363. package/dist/platform/agent-docs.d.ts +18 -0
  364. package/dist/platform/agent-docs.js +59 -0
  365. package/dist/platform/availability.d.ts +14 -0
  366. package/dist/platform/availability.js +43 -0
  367. package/dist/platform/errors.d.ts +11 -0
  368. package/dist/platform/errors.js +26 -0
  369. package/dist/platform/exclusions.d.ts +12 -0
  370. package/dist/platform/exclusions.js +1387 -0
  371. package/dist/platform/method.d.ts +6 -0
  372. package/dist/platform/method.js +15 -0
  373. package/dist/platform/operation.d.ts +92 -0
  374. package/dist/platform/operation.js +35 -0
  375. package/dist/platform/ops/agent-templates.ops.d.ts +14 -0
  376. package/dist/platform/ops/agent-templates.ops.js +92 -0
  377. package/dist/platform/ops/agents.ops.d.ts +19 -0
  378. package/dist/platform/ops/agents.ops.js +294 -0
  379. package/dist/platform/ops/connectors.ops.d.ts +15 -0
  380. package/dist/platform/ops/connectors.ops.js +126 -0
  381. package/dist/platform/ops/errors.d.ts +11 -0
  382. package/dist/platform/ops/errors.js +22 -0
  383. package/dist/platform/ops/extensions.ops.d.ts +19 -0
  384. package/dist/platform/ops/extensions.ops.js +116 -0
  385. package/dist/platform/ops/marketplaces.ops.d.ts +16 -0
  386. package/dist/platform/ops/marketplaces.ops.js +157 -0
  387. package/dist/platform/ops/paging.d.ts +14 -0
  388. package/dist/platform/ops/paging.js +20 -0
  389. package/dist/platform/ops/platform.ops.d.ts +23 -0
  390. package/dist/platform/ops/platform.ops.js +158 -0
  391. package/dist/platform/ops/plugins.ops.d.ts +33 -0
  392. package/dist/platform/ops/plugins.ops.js +377 -0
  393. package/dist/platform/ops/requests.ops.d.ts +14 -0
  394. package/dist/platform/ops/requests.ops.js +153 -0
  395. package/dist/platform/ops/role.d.ts +4 -0
  396. package/dist/platform/ops/role.js +10 -0
  397. package/dist/platform/ops/skills.ops.d.ts +13 -0
  398. package/dist/platform/ops/skills.ops.js +98 -0
  399. package/dist/platform/ops/summary.d.ts +10 -0
  400. package/dist/platform/ops/summary.js +18 -0
  401. package/dist/platform/platform-ops.module.d.ts +7 -0
  402. package/dist/platform/platform-ops.module.js +55 -0
  403. package/dist/platform/platform.module.d.ts +8 -0
  404. package/dist/platform/platform.module.js +25 -0
  405. package/dist/platform/redact-orgs.d.ts +7 -0
  406. package/dist/platform/redact-orgs.js +52 -0
  407. package/dist/platform/registry.d.ts +30 -0
  408. package/dist/platform/registry.js +111 -0
  409. package/dist/roles/worker-role.d.ts +6 -4
  410. package/dist/roles/worker-role.js +14 -7
  411. package/dist/roles/worker.module.d.ts +1 -1
  412. package/dist/roles/worker.module.js +15 -1
  413. package/dist/runtime/context/build.d.ts +11 -7
  414. package/dist/runtime/context/build.js +46 -19
  415. package/dist/runtime/context/claude-tools.d.ts +3 -1
  416. package/dist/runtime/context/claude-tools.js +8 -6
  417. package/dist/runtime/context/compaction.js +13 -0
  418. package/dist/runtime/context/reminders.d.ts +2 -0
  419. package/dist/runtime/context/reminders.js +2 -0
  420. package/dist/runtime/context/skills.js +9 -2
  421. package/dist/runtime/context/tool-changes.d.ts +27 -0
  422. package/dist/runtime/context/tool-changes.js +60 -0
  423. package/dist/runtime/hook-calls.js +2 -0
  424. package/dist/runtime/langgraph-loop.d.ts +3 -1
  425. package/dist/runtime/langgraph-loop.js +36 -17
  426. package/dist/runtime/loop.d.ts +34 -5
  427. package/dist/runtime/maintenance.d.ts +9 -4
  428. package/dist/runtime/maintenance.js +35 -8
  429. package/dist/runtime/model-call.d.ts +46 -8
  430. package/dist/runtime/model-call.js +72 -21
  431. package/dist/runtime/providers.d.ts +6 -0
  432. package/dist/runtime/providers.js +8 -0
  433. package/dist/runtime/run-control.d.ts +11 -1
  434. package/dist/runtime/run-control.js +12 -0
  435. package/dist/runtime/run-drafts.d.ts +85 -0
  436. package/dist/runtime/run-drafts.js +230 -0
  437. package/dist/runtime/run-jobs.d.ts +3 -5
  438. package/dist/runtime/run-jobs.js +3 -7
  439. package/dist/runtime/run-queue.d.ts +59 -2
  440. package/dist/runtime/run-queue.js +311 -38
  441. package/dist/runtime/run-worker.d.ts +11 -5
  442. package/dist/runtime/run-worker.js +69 -33
  443. package/dist/runtime/runtime.module.js +11 -3
  444. package/dist/runtime/step-log.d.ts +15 -4
  445. package/dist/runtime/step-log.js +24 -7
  446. package/dist/runtime/stream.controller.d.ts +23 -1
  447. package/dist/runtime/stream.controller.js +60 -3
  448. package/dist/runtime/stream.d.ts +4 -1
  449. package/dist/runtime/stream.js +27 -3
  450. package/dist/runtime/subagents/child.d.ts +55 -7
  451. package/dist/runtime/subagents/child.js +105 -7
  452. package/dist/runtime/subagents/definition.d.ts +12 -3
  453. package/dist/runtime/subagents/definition.js +44 -28
  454. package/dist/runtime/subagents/deliveries.d.ts +71 -0
  455. package/dist/runtime/subagents/deliveries.js +228 -0
  456. package/dist/runtime/subagents/dispatch.d.ts +115 -26
  457. package/dist/runtime/subagents/dispatch.js +212 -141
  458. package/dist/runtime/subagents/limits.d.ts +24 -5
  459. package/dist/runtime/subagents/limits.js +40 -6
  460. package/dist/runtime/subagents/messages.d.ts +95 -0
  461. package/dist/runtime/subagents/messages.js +328 -0
  462. package/dist/runtime/subagents/preamble.d.ts +4 -4
  463. package/dist/runtime/subagents/preamble.js +9 -7
  464. package/dist/runtime/subagents/progress.d.ts +8 -6
  465. package/dist/runtime/subagents/progress.js +11 -6
  466. package/dist/runtime/subagents/render.d.ts +30 -0
  467. package/dist/runtime/subagents/render.js +53 -0
  468. package/dist/runtime/subagents/roster.d.ts +24 -7
  469. package/dist/runtime/subagents/roster.js +47 -11
  470. package/dist/runtime/subagents/skill-fork.d.ts +3 -2
  471. package/dist/runtime/subagents/skill-fork.js +8 -4
  472. package/dist/runtime/subagents/status.d.ts +14 -0
  473. package/dist/runtime/subagents/status.js +23 -0
  474. package/dist/runtime/subagents/subagents.service.d.ts +7 -4
  475. package/dist/runtime/subagents/subagents.service.js +11 -6
  476. package/dist/runtime/usage-report.d.ts +2 -1
  477. package/dist/runtime/usage-report.js +19 -13
  478. package/dist/runtime/waits.d.ts +145 -36
  479. package/dist/runtime/waits.js +423 -109
  480. package/dist/sandbox/jobs.d.ts +40 -13
  481. package/dist/sandbox/jobs.js +57 -20
  482. package/dist/sandbox/leases.d.ts +37 -54
  483. package/dist/sandbox/leases.js +71 -115
  484. package/dist/sandbox/providers.d.ts +2 -2
  485. package/dist/sandbox/providers.js +1 -1
  486. package/dist/sandbox/sandbox.module.d.ts +3 -2
  487. package/dist/sandbox/sandbox.module.js +10 -4
  488. package/dist/sandbox/sandbox.service.d.ts +282 -129
  489. package/dist/sandbox/sandbox.service.js +736 -381
  490. package/dist/skills/catalog.d.ts +3 -2
  491. package/dist/skills/catalog.js +21 -43
  492. package/dist/skills/changes.controller.d.ts +7 -0
  493. package/dist/skills/changes.controller.js +19 -1
  494. package/dist/skills/invoke.js +8 -3
  495. package/dist/skills/package.d.ts +20 -1
  496. package/dist/skills/package.js +28 -1
  497. package/dist/skills/skills.controller.d.ts +39 -4
  498. package/dist/skills/skills.controller.js +88 -10
  499. package/dist/skills/skills.module.js +10 -1
  500. package/dist/skills/skills.service.d.ts +106 -26
  501. package/dist/skills/skills.service.js +421 -75
  502. package/dist/skills/usable.d.ts +81 -0
  503. package/dist/skills/usable.js +379 -0
  504. package/dist/tools/approvals.service.d.ts +20 -2
  505. package/dist/tools/approvals.service.js +25 -4
  506. package/dist/tools/builtin-names.d.ts +41 -7
  507. package/dist/tools/builtin-names.js +59 -7
  508. package/dist/tools/builtins/agent.d.ts +23 -21
  509. package/dist/tools/builtins/agent.js +62 -55
  510. package/dist/tools/builtins/builtin-tools.d.ts +19 -1
  511. package/dist/tools/builtins/builtin-tools.js +59 -2
  512. package/dist/tools/builtins/handback.d.ts +28 -0
  513. package/dist/tools/builtins/handback.js +53 -0
  514. package/dist/tools/builtins/platform.d.ts +34 -0
  515. package/dist/tools/builtins/platform.js +362 -0
  516. package/dist/tools/builtins/sandbox/bash.d.ts +1 -1
  517. package/dist/tools/builtins/sandbox/bash.js +241 -4
  518. package/dist/tools/builtins/sandbox/common.d.ts +69 -27
  519. package/dist/tools/builtins/sandbox/common.js +87 -48
  520. package/dist/tools/builtins/sandbox/deliver.js +1 -1
  521. package/dist/tools/builtins/sandbox/edit.js +2 -2
  522. package/dist/tools/builtins/sandbox/glob.js +2 -2
  523. package/dist/tools/builtins/sandbox/grep.js +2 -4
  524. package/dist/tools/builtins/sandbox/index.d.ts +3 -1
  525. package/dist/tools/builtins/sandbox/index.js +7 -1
  526. package/dist/tools/builtins/sandbox/read.js +1 -1
  527. package/dist/tools/builtins/sandbox/task-output.d.ts +74 -0
  528. package/dist/tools/builtins/sandbox/task-output.js +329 -0
  529. package/dist/tools/builtins/sandbox/task-stop.d.ts +10 -0
  530. package/dist/tools/builtins/sandbox/task-stop.js +113 -0
  531. package/dist/tools/builtins/sandbox/write.js +2 -2
  532. package/dist/tools/builtins/send-message.d.ts +56 -0
  533. package/dist/tools/builtins/send-message.js +100 -0
  534. package/dist/tools/builtins/skill-load.d.ts +22 -14
  535. package/dist/tools/builtins/skill-load.js +86 -57
  536. package/dist/tools/builtins/skill-write.js +1 -1
  537. package/dist/tools/builtins/web/errors.d.ts +8 -0
  538. package/dist/tools/builtins/web/errors.js +53 -0
  539. package/dist/tools/builtins/web/extract.d.ts +62 -0
  540. package/dist/tools/builtins/web/extract.js +271 -0
  541. package/dist/tools/builtins/web/fetch.d.ts +55 -0
  542. package/dist/tools/builtins/web/fetch.js +175 -0
  543. package/dist/tools/builtins/web/index.d.ts +13 -0
  544. package/dist/tools/builtins/web/index.js +12 -0
  545. package/dist/tools/builtins/web/page-cache.d.ts +25 -0
  546. package/dist/tools/builtins/web/page-cache.js +77 -0
  547. package/dist/tools/builtins/web/search.d.ts +25 -0
  548. package/dist/tools/builtins/web/search.js +210 -0
  549. package/dist/tools/builtins/web/url.d.ts +17 -0
  550. package/dist/tools/builtins/web/url.js +43 -0
  551. package/dist/tools/connectors.controller.d.ts +10 -0
  552. package/dist/tools/connectors.controller.js +12 -0
  553. package/dist/tools/connectors.service.d.ts +46 -5
  554. package/dist/tools/connectors.service.js +94 -15
  555. package/dist/tools/extension-tools.controller.d.ts +14 -0
  556. package/dist/tools/extension-tools.controller.js +37 -0
  557. package/dist/tools/info.d.ts +42 -1
  558. package/dist/tools/info.js +64 -1
  559. package/dist/tools/oauth/flow-paths.d.ts +1 -1
  560. package/dist/tools/oauth/flow-paths.js +1 -1
  561. package/dist/tools/org-tool-switches.d.ts +74 -0
  562. package/dist/tools/org-tool-switches.js +184 -0
  563. package/dist/tools/pipeline.d.ts +46 -40
  564. package/dist/tools/pipeline.js +202 -364
  565. package/dist/tools/policy.d.ts +1 -1
  566. package/dist/tools/policy.js +36 -16
  567. package/dist/tools/registry.d.ts +120 -8
  568. package/dist/tools/registry.js +112 -19
  569. package/dist/tools/tools.module.js +24 -2
  570. package/dist/tools/validate.js +1 -1
  571. package/dist/ui/views.d.ts +2 -1
  572. package/dist/ui/views.js +17 -3
  573. package/package.json +3 -3
  574. package/src/migrations/0064_account_last_org.sql +7 -0
  575. package/src/migrations/0065_conversation_archive.sql +8 -0
  576. package/src/migrations/0066_extension_display_name.sql +4 -0
  577. package/src/migrations/0067_agent_profiles.sql +20 -0
  578. package/src/migrations/0068_agent_avatar_uploads.sql +7 -0
  579. package/src/migrations/0069_attachments_agent_idx.sql +3 -0
  580. package/src/migrations/0070_background_tasks.sql +37 -0
  581. package/src/migrations/0071_background_tasks_reserve.sql +6 -0
  582. package/src/migrations/0072_background_tasks_stopping.sql +5 -0
  583. package/src/migrations/0073_org_extension_point_defaults.sql +11 -0
  584. package/src/migrations/0074_subagent_tree.sql +50 -0
  585. package/src/migrations/0075_plugin_scope.sql +61 -0
  586. package/src/migrations/0076_skills_created_by_nullable.sql +6 -0
  587. package/src/migrations/0077_scope_requests.sql +52 -0
  588. package/src/migrations/0078_scope_grant_switches.sql +18 -0
  589. package/src/migrations/0079_scope_live_install_switches.sql +19 -0
  590. package/src/migrations/0080_rename_enterprise_admin.sql +18 -0
  591. package/src/migrations/0081_platform_components.sql +129 -0
  592. package/src/migrations/0082_platform_migration.sql +33 -0
  593. package/src/migrations/0083_plugin_scope_sync_failures.sql +15 -0
  594. package/src/migrations/0084_org_owned_items.sql +85 -0
  595. package/src/migrations/0085_agent_templates_phase4.sql +45 -0
  596. package/src/migrations/0086_org_layering.sql +30 -0
  597. package/src/migrations/0087_approval_summary.sql +6 -0
  598. package/src/migrations/0088_environments.sql +80 -0
  599. package/dist/catalog/upgrade-targets.d.ts +0 -56
  600. package/dist/catalog/upgrade-targets.js +0 -90
  601. package/dist/conversations/sandbox-status.d.ts +0 -24
  602. package/dist/conversations/sandbox-status.js +0 -52
  603. package/dist/extensions/org-config.controller.d.ts +0 -24
  604. package/dist/extensions/org-config.controller.js +0 -62
@@ -0,0 +1,524 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
8
+ return function (target, key) { decorator(target, key, paramIndex); }
9
+ };
10
+ import { isDeepStrictEqual } from "node:util";
11
+ import { Inject, Injectable } from "@nestjs/common";
12
+ import { configFields, getPath } from "../config/fields.js";
13
+ import { createSecrets } from "../ctx/secrets.js";
14
+ import { ApiError } from "../errors.js";
15
+ import { audit } from "../identity/audit.js";
16
+ import { afterCommit } from "../infra/database/after-commit.js";
17
+ import { KernelDb } from "../infra/database/kernel-db.js";
18
+ import { TransactionHost } from "../infra/database/transaction-host.js";
19
+ import { Transactional } from "../infra/database/transactional.decorator.js";
20
+ import { KERNEL_LOGGER, KEYRING } from "../infra/tokens.js";
21
+ import { OrgLock } from "../orgs/org-lock.js";
22
+ import { toIssues } from "./config-issues.js";
23
+ import { configMessages, safeConfigFormSchema } from "./config-json-schema.js";
24
+ import { applySecretEntries } from "./deployment-config.js";
25
+ import { deleteDeep, setDeep } from "./deployment-config-store.js";
26
+ import { EffectiveConfigs, mergeCopy, OVERRIDE_SECRETS_NAMESPACE, overrideSecretKey, overrideSecretPaths, platformOverrideValues, } from "./effective-config.js";
27
+ import { ExtensionHost } from "./host.js";
28
+ import { extensionVisibleTo } from "./org-config.js";
29
+ import { fieldLevels } from "./org-levels.js";
30
+ const levelOf = (levels, path) => levels.get(path.split(".")[0]) ?? "hidden";
31
+ const notOverridable = (plugin, paths) => new ApiError("extension.field_not_overridable", `These config fields of extension ${plugin} cannot be set by an organization: ${paths.join(", ")}`, paths.map((path) => ({ path })));
32
+ const noCopy = (plugin) => new ApiError("extension.no_org_override", `This organization follows the platform configuration of extension ${plugin}`);
33
+ /**
34
+ * Org copies of an extension's overridable deployment config (spec A §5.4, §5.5, §5.8): one row of
35
+ * `extension_org_overrides` per copy (its non-secret values), each secret in `capybara.secrets`
36
+ * under the org (namespace `kernel`, key `plugin-override:<plugin>:<path>`), written in the same
37
+ * transaction under the org row lock. Writes are org-audited and evict the cached copy after the
38
+ * commit. Platform secrets never enter a copy.
39
+ */
40
+ let OrgOverrides = class OrgOverrides {
41
+ kdb;
42
+ txHost;
43
+ keyring;
44
+ host;
45
+ orgLock;
46
+ effective;
47
+ log;
48
+ constructor(kdb, txHost, keyring, host,
49
+ /** The org row lock: re-checks `org.extensions.manage` under the lock. */
50
+ orgLock, effective, log) {
51
+ this.kdb = kdb;
52
+ this.txHost = txHost;
53
+ this.keyring = keyring;
54
+ this.host = host;
55
+ this.orgLock = orgLock;
56
+ this.effective = effective;
57
+ this.log = log;
58
+ }
59
+ get db() {
60
+ return this.kdb.db;
61
+ }
62
+ running(plugin) {
63
+ const inst = this.host.current(plugin);
64
+ if (!inst)
65
+ throw new ApiError("extension.not_found", `Extension ${plugin} is not installed`);
66
+ const schema = inst.manifest.config?.deployment;
67
+ return { inst, schema, levels: fieldLevels(schema) };
68
+ }
69
+ /**
70
+ * The running extension, for an org: one the org does not see under plugin scope (a `named`
71
+ * plugin without it) is answered like an unknown one, so its platform values never reach it.
72
+ */
73
+ async runningFor(orgId, plugin) {
74
+ const run = this.running(plugin);
75
+ if (!(await extensionVisibleTo(this.db, orgId, plugin))) {
76
+ throw new ApiError("extension.not_found", `Extension ${plugin} is not installed`);
77
+ }
78
+ return run;
79
+ }
80
+ /** The org's view (read-only and overridable fields, the copy state and validity). */
81
+ async view(orgId, plugin) {
82
+ return this.render(orgId, await this.runningFor(orgId, plugin));
83
+ }
84
+ /**
85
+ * Saves overridable fields (`values` keyed by field dot path: `null` clears, omitted keeps;
86
+ * secret fields too, as in the platform form) and secret record entries. The first save creates
87
+ * the copy from the platform's non-secret overridable values plus `values` (secret fields start
88
+ * empty). A path that is not an overridable field of the schema (read-only, hidden, unknown) ->
89
+ * 400 `extension.field_not_overridable`; an invalid result (an empty required secret included)
90
+ * -> 400 `extension.config_invalid`, nothing written. Audits `extension.org_override_saved`.
91
+ */
92
+ async save(orgId, plugin, values, secretEntries, actor) {
93
+ const run = await this.runningFor(orgId, plugin);
94
+ const fields = new Map((run.schema ? configFields(run.schema) : []).map((f) => [f.path, f.meta?.secret === true]));
95
+ const paths = [...Object.keys(values), ...secretEntries.map((e) => e.path)];
96
+ const refused = [
97
+ ...new Set(paths.filter((p) => !fields.has(p) || levelOf(run.levels, p) !== "override")),
98
+ ];
99
+ if (refused.length > 0)
100
+ throw notOverridable(plugin, refused);
101
+ const badEntries = secretEntries.filter((e) => fields.get(e.path) !== true || Object.hasOwn(values, e.path));
102
+ if (badEntries.length > 0) {
103
+ throw new ApiError("validation_failed", `Invalid secret entries for the organization config of extension ${plugin}`, badEntries.map((e) => ({
104
+ path: e.path,
105
+ message: Object.hasOwn(values, e.path)
106
+ ? "given both in values and in secretEntries"
107
+ : "not a secret field",
108
+ })));
109
+ }
110
+ return this.writeSave(orgId, plugin, run, fields, values, secretEntries, actor);
111
+ }
112
+ async writeSave(orgId, plugin, run, fields, values, secretEntries, actor) {
113
+ const schema = run.schema;
114
+ const t = this.db;
115
+ await this.orgLock.lockFor(orgId, actor.accountId, "org.extensions.manage");
116
+ const row = await this.lockedRow(orgId, plugin);
117
+ const platform = await this.host.rawDeploymentConfig(plugin);
118
+ const prior = row
119
+ ? { config: structuredClone(row.config), secrets: await this.readSecrets(orgId, plugin) }
120
+ : undefined;
121
+ const copy = prior
122
+ ? structuredClone(prior)
123
+ : { config: platformOverrideValues(schema, platform), secrets: {} };
124
+ for (const [path, v] of Object.entries(values)) {
125
+ if (fields.get(path)) {
126
+ if (v === null)
127
+ delete copy.secrets[path];
128
+ else
129
+ copy.secrets[path] = structuredClone(v);
130
+ }
131
+ else if (v === null)
132
+ deleteDeep(copy.config, path);
133
+ else
134
+ setDeep(copy.config, path, structuredClone(v));
135
+ }
136
+ if (secretEntries.length > 0) {
137
+ const records = {};
138
+ for (const e of secretEntries) {
139
+ if (copy.secrets[e.path] !== undefined) {
140
+ setDeep(records, e.path, structuredClone(copy.secrets[e.path]));
141
+ }
142
+ }
143
+ applySecretEntries(records, secretEntries);
144
+ for (const e of secretEntries) {
145
+ const v = getPath(records, e.path);
146
+ if (v === undefined)
147
+ delete copy.secrets[e.path];
148
+ else
149
+ copy.secrets[e.path] = v;
150
+ }
151
+ }
152
+ const merged = this.validated(plugin, run, platform, copy);
153
+ // a secret is compared only with the copy's own previous value, never with the platform's
154
+ // (an audit that said "unchanged" would tell the org its key equals the platform's, A §5.5);
155
+ // on a first save every touched secret counts as changed
156
+ const before = prior ? mergeCopy(schema, platform, prior) : platform;
157
+ const changed = [...new Set(touchedPaths(values, secretEntries))]
158
+ .filter((p) => fields.get(p)
159
+ ? !prior || !isDeepStrictEqual(prior.secrets[p], copy.secrets[p])
160
+ : !isDeepStrictEqual(getPath(before, p), getPath(merged, p)))
161
+ .sort();
162
+ await t
163
+ .insertInto("extension_org_overrides")
164
+ .values({
165
+ plugin,
166
+ org_id: orgId,
167
+ config: JSON.stringify(copy.config),
168
+ created_by: actor.accountId,
169
+ updated_by: actor.accountId,
170
+ })
171
+ .onConflict((oc) => oc.columns(["plugin", "org_id"]).doUpdateSet({
172
+ config: JSON.stringify(copy.config),
173
+ updated_by: actor.accountId,
174
+ updated_at: new Date(),
175
+ }))
176
+ .execute();
177
+ await this.writeSecrets(orgId, plugin, schema, run.levels, copy.secrets);
178
+ await audit(t, {
179
+ actorAccountId: actor.accountId,
180
+ ...(actor.tokenId !== undefined && { actorTokenId: actor.tokenId }),
181
+ orgId,
182
+ action: "extension.org_override_saved",
183
+ target: plugin,
184
+ detail: { changedPaths: changed },
185
+ });
186
+ const secretValues = Object.values(copy.secrets);
187
+ afterCommit(async () => {
188
+ if (secretValues.length > 0)
189
+ this.log.addOrgSecrets(secretValues);
190
+ await this.effective.invalidate(orgId, plugin);
191
+ });
192
+ return this.render(orgId, run);
193
+ }
194
+ /**
195
+ * Takes the platform's current values of non-secret overridable fields into the copy (spec A
196
+ * §5.5); the copy stays a copy. A secret, read-only, hidden or unknown path -> 400
197
+ * `extension.field_not_overridable`; no copy -> 404 `extension.no_org_override`. Audits
198
+ * `extension.org_override_taken`.
199
+ */
200
+ async take(orgId, plugin, paths, actor) {
201
+ const run = await this.runningFor(orgId, plugin);
202
+ const fields = new Map((run.schema ? configFields(run.schema) : []).map((f) => [f.path, f.meta?.secret === true]));
203
+ const refused = [
204
+ ...new Set(paths.filter((p) => fields.get(p) !== false || levelOf(run.levels, p) !== "override")),
205
+ ];
206
+ if (refused.length > 0)
207
+ throw notOverridable(plugin, refused);
208
+ return this.writeTake(orgId, plugin, run, paths, actor);
209
+ }
210
+ async writeTake(orgId, plugin, run, paths, actor) {
211
+ const t = this.db;
212
+ await this.orgLock.lockFor(orgId, actor.accountId, "org.extensions.manage");
213
+ const row = await this.lockedRow(orgId, plugin);
214
+ if (!row)
215
+ throw noCopy(plugin);
216
+ const copy = {
217
+ config: structuredClone(row.config),
218
+ secrets: await this.readSecrets(orgId, plugin),
219
+ };
220
+ const platform = await this.host.rawDeploymentConfig(plugin);
221
+ const changed = [];
222
+ for (const p of [...new Set(paths)]) {
223
+ const v = getPath(platform, p);
224
+ if (!isDeepStrictEqual(getPath(copy.config, p), v))
225
+ changed.push(p);
226
+ if (v === undefined)
227
+ deleteDeep(copy.config, p);
228
+ else
229
+ setDeep(copy.config, p, structuredClone(v));
230
+ }
231
+ this.validated(plugin, run, platform, copy);
232
+ await t
233
+ .updateTable("extension_org_overrides")
234
+ .set({
235
+ config: JSON.stringify(copy.config),
236
+ updated_by: actor.accountId,
237
+ updated_at: new Date(),
238
+ })
239
+ .where("plugin", "=", plugin)
240
+ .where("org_id", "=", orgId)
241
+ .execute();
242
+ await audit(t, {
243
+ actorAccountId: actor.accountId,
244
+ ...(actor.tokenId !== undefined && { actorTokenId: actor.tokenId }),
245
+ orgId,
246
+ action: "extension.org_override_taken",
247
+ target: plugin,
248
+ detail: { changedPaths: changed.sort() },
249
+ });
250
+ afterCommit(() => this.effective.invalidate(orgId, plugin));
251
+ return this.render(orgId, run);
252
+ }
253
+ /**
254
+ * Drops the copy and every secret of it in one transaction; the org follows the platform again
255
+ * (spec A §5.5). No copy -> 404 `extension.no_org_override`. Audits `extension.org_override_reset`.
256
+ */
257
+ async reset(orgId, plugin, actor) {
258
+ return this.writeReset(orgId, plugin, await this.runningFor(orgId, plugin), actor);
259
+ }
260
+ async writeReset(orgId, plugin, run, actor) {
261
+ const t = this.db;
262
+ await this.orgLock.lockFor(orgId, actor.accountId, "org.extensions.manage");
263
+ const gone = await t
264
+ .deleteFrom("extension_org_overrides")
265
+ .where("plugin", "=", plugin)
266
+ .where("org_id", "=", orgId)
267
+ .returning("plugin")
268
+ .executeTakeFirst();
269
+ if (!gone)
270
+ throw noCopy(plugin);
271
+ const store = createSecrets(t, this.keyring, OVERRIDE_SECRETS_NAMESPACE);
272
+ for (const key of await this.secretKeys(orgId, plugin))
273
+ await store.delete(orgId, key);
274
+ await audit(t, {
275
+ actorAccountId: actor.accountId,
276
+ ...(actor.tokenId !== undefined && { actorTokenId: actor.tokenId }),
277
+ orgId,
278
+ action: "extension.org_override_reset",
279
+ target: plugin,
280
+ });
281
+ afterCommit(() => this.effective.invalidate(orgId, plugin));
282
+ return this.render(orgId, run);
283
+ }
284
+ /**
285
+ * The orgs (not deleted) holding a copy of the extension, oldest first, with the overridable
286
+ * non-secret fields that differ from the platform and whether each copy secret is set (spec A
287
+ * §5.7); never a secret value. Differences need the running schema: an extension not running on
288
+ * this replica lists no differences and only the secrets the copies hold.
289
+ */
290
+ async listForPlugin(plugin) {
291
+ const t = this.db;
292
+ const rows = await t
293
+ .selectFrom("extension_org_overrides as ov")
294
+ .innerJoin("orgs", "orgs.id", "ov.org_id")
295
+ .select(["ov.org_id", "orgs.name", "ov.created_at", "ov.config"])
296
+ .where("ov.plugin", "=", plugin)
297
+ .where("orgs.deleted_at", "is", null)
298
+ .orderBy("ov.created_at")
299
+ .orderBy("ov.org_id")
300
+ .execute();
301
+ const inst = this.host.current(plugin);
302
+ const schema = inst?.manifest.config?.deployment;
303
+ const levels = fieldLevels(schema);
304
+ const secretPaths = schema ? overrideSecretPaths(schema, levels) : undefined;
305
+ const plain = schema
306
+ ? configFields(schema).filter((f) => f.meta?.secret !== true && levelOf(levels, f.path) === "override")
307
+ : [];
308
+ const platform = rows.length > 0 ? await this.host.rawDeploymentConfig(plugin) : undefined;
309
+ const out = [];
310
+ for (const r of rows) {
311
+ const keys = await this.secretKeys(r.org_id, plugin);
312
+ const prefix = overrideSecretKey(plugin, "");
313
+ const held = new Set(keys.map((k) => k.slice(prefix.length)));
314
+ out.push({
315
+ orgId: r.org_id,
316
+ orgName: r.name,
317
+ createdAt: new Date(r.created_at).toISOString(),
318
+ differing: plain
319
+ .filter((f) => {
320
+ const own = getPath(r.config, f.path);
321
+ return own !== undefined && !isDeepStrictEqual(own, getPath(platform, f.path));
322
+ })
323
+ .map((f) => f.path),
324
+ secrets: (secretPaths ?? [...held].sort()).map((path) => ({ path, set: held.has(path) })),
325
+ });
326
+ }
327
+ return out;
328
+ }
329
+ /** The merged copy validated with the full schema; invalid -> 400 `extension.config_invalid`. */
330
+ validated(plugin, run, platform, copy) {
331
+ const schema = run.schema;
332
+ const merged = mergeCopy(schema, platform, copy);
333
+ const r = schema.safeParse(merged);
334
+ if (!r.success) {
335
+ throw new ApiError("extension.config_invalid", `Invalid organization copy of the configuration of extension ${plugin}`, orgIssues(toIssues(r.error, this.messagesOf(plugin, run)), run.levels));
336
+ }
337
+ return merged;
338
+ }
339
+ messagesOf(plugin, run) {
340
+ return configMessages(this.formSchemaOf(plugin, run));
341
+ }
342
+ /** The deployment form JSON Schema (hints dropped when invalid; one warning). Never throws. */
343
+ formSchemaOf(plugin, run) {
344
+ if (!run.schema)
345
+ return undefined;
346
+ const r = safeConfigFormSchema(run.schema, "deployment", (err, fallback) => this.log.warn("the deployment config form schema could not be built with its UI hints; hints dropped", { plugin, version: run.inst.manifest.version, schema: fallback, err }));
347
+ return r?.schema;
348
+ }
349
+ async lockedRow(orgId, plugin) {
350
+ return this.db
351
+ .selectFrom("extension_org_overrides")
352
+ .select(["config", "created_at"])
353
+ .where("plugin", "=", plugin)
354
+ .where("org_id", "=", orgId)
355
+ .forUpdate()
356
+ .executeTakeFirst();
357
+ }
358
+ /** The keys of the org's copy secrets for `plugin` (any path, current or stale). */
359
+ async secretKeys(orgId, plugin) {
360
+ const prefix = overrideSecretKey(plugin, "");
361
+ const rows = await this.db
362
+ .selectFrom("secrets")
363
+ .select("key")
364
+ .where("namespace", "=", OVERRIDE_SECRETS_NAMESPACE)
365
+ .where("org_id", "=", orgId)
366
+ .where("key", "like", `${prefix}%`)
367
+ .execute();
368
+ return rows.map((r) => r.key).filter((k) => k.startsWith(prefix));
369
+ }
370
+ async readSecrets(orgId, plugin) {
371
+ const prefix = overrideSecretKey(plugin, "");
372
+ const store = createSecrets(this.db, this.keyring, OVERRIDE_SECRETS_NAMESPACE);
373
+ const out = {};
374
+ for (const key of await this.secretKeys(orgId, plugin)) {
375
+ const v = await store.get(orgId, key);
376
+ if (v !== null)
377
+ out[key.slice(prefix.length)] = JSON.parse(v);
378
+ }
379
+ return out;
380
+ }
381
+ /** Writes the copy's secrets of the current schema and drops stale keys (paths no longer secret). */
382
+ async writeSecrets(orgId, plugin, schema, levels, secrets) {
383
+ const store = createSecrets(this.db, this.keyring, OVERRIDE_SECRETS_NAMESPACE);
384
+ const live = overrideSecretPaths(schema, levels);
385
+ for (const p of live) {
386
+ const v = secrets[p];
387
+ if (v === undefined)
388
+ await store.delete(orgId, overrideSecretKey(plugin, p));
389
+ else
390
+ await store.set(orgId, overrideSecretKey(plugin, p), JSON.stringify(v));
391
+ }
392
+ const keep = new Set(live.map((p) => overrideSecretKey(plugin, p)));
393
+ for (const key of await this.secretKeys(orgId, plugin)) {
394
+ if (!keep.has(key))
395
+ await store.delete(orgId, key);
396
+ }
397
+ }
398
+ async render(orgId, run) {
399
+ const row = await this.db
400
+ .selectFrom("extension_org_overrides")
401
+ .select(["config", "created_at"])
402
+ .where("plugin", "=", run.inst.name)
403
+ .where("org_id", "=", orgId)
404
+ .executeTakeFirst();
405
+ const held = row ? new Set(await this.secretPathsHeld(orgId, run.inst.name)) : new Set();
406
+ // readonly values and secret state as the running instance has them (defaults applied, as
407
+ // the platform form shows); overridable values raw, as a copy stores and `take` copies them
408
+ const parsed = run.inst.config;
409
+ const raw = await this.host.rawDeploymentConfig(run.inst.name);
410
+ const fields = [];
411
+ for (const f of run.schema ? configFields(run.schema) : []) {
412
+ const level = levelOf(run.levels, f.path);
413
+ if (level === "hidden")
414
+ continue;
415
+ const secret = f.meta?.secret === true;
416
+ const pv = level === "override" && !secret
417
+ ? (getPath(raw, f.path) ?? getPath(parsed, f.path))
418
+ : getPath(parsed, f.path);
419
+ const field = {
420
+ path: f.path,
421
+ level,
422
+ secret,
423
+ platform: secret
424
+ ? { set: pv !== undefined }
425
+ : pv === undefined
426
+ ? {}
427
+ : { value: structuredClone(pv) },
428
+ };
429
+ if (row && level === "override") {
430
+ if (secret)
431
+ field.org = { set: held.has(f.path) };
432
+ else {
433
+ const ov = getPath(row.config, f.path);
434
+ field.org = ov === undefined ? {} : { value: structuredClone(ov) };
435
+ field.differs = ov !== undefined && !isDeepStrictEqual(ov, pv);
436
+ }
437
+ }
438
+ fields.push(field);
439
+ }
440
+ const eff = await this.effective.get(orgId, run.inst.name);
441
+ const form = this.formSchemaOf(run.inst.name, run);
442
+ return {
443
+ state: row ? "copy" : "following",
444
+ schema: form ? orgFormSchema(form, run.levels) : null,
445
+ ...(row && { createdAt: new Date(row.created_at).toISOString() }),
446
+ fields,
447
+ valid: eff.ok,
448
+ issues: eff.ok ? [] : orgIssues(eff.issues, run.levels),
449
+ };
450
+ }
451
+ async secretPathsHeld(orgId, plugin) {
452
+ const prefix = overrideSecretKey(plugin, "");
453
+ return (await this.secretKeys(orgId, plugin)).map((k) => k.slice(prefix.length));
454
+ }
455
+ };
456
+ __decorate([
457
+ Transactional()
458
+ ], OrgOverrides.prototype, "writeSave", null);
459
+ __decorate([
460
+ Transactional()
461
+ ], OrgOverrides.prototype, "writeTake", null);
462
+ __decorate([
463
+ Transactional()
464
+ ], OrgOverrides.prototype, "writeReset", null);
465
+ __decorate([
466
+ Transactional({ isolationLevel: "repeatable read", accessMode: "read only" })
467
+ ], OrgOverrides.prototype, "listForPlugin", null);
468
+ OrgOverrides = __decorate([
469
+ Injectable(),
470
+ __param(0, Inject(KernelDb)),
471
+ __param(1, Inject(TransactionHost)),
472
+ __param(2, Inject(KEYRING)),
473
+ __param(3, Inject(ExtensionHost)),
474
+ __param(4, Inject(OrgLock)),
475
+ __param(5, Inject(EffectiveConfigs)),
476
+ __param(6, Inject(KERNEL_LOGGER))
477
+ ], OrgOverrides);
478
+ export { OrgOverrides };
479
+ /**
480
+ * The form JSON Schema an org may see (spec A §5.6, "hidden fields are not sent to the org at
481
+ * all"): a copy with only the read-only and overridable top-level properties, `required` limited
482
+ * to them, and root `x-ui` hints naming a hidden field dropped (`secrets[]` by path; `order` lists
483
+ * none). Values are never in it: `configJsonSchema` already strips secret defaults and examples.
484
+ */
485
+ export function orgFormSchema(js, levels) {
486
+ const out = structuredClone(js);
487
+ const shown = (key) => (levels.get(key) ?? "hidden") !== "hidden";
488
+ const props = out.properties;
489
+ if (typeof props === "object" && props !== null) {
490
+ out.properties = Object.fromEntries(Object.entries(props).filter(([k]) => shown(k)));
491
+ }
492
+ if (Array.isArray(out.required)) {
493
+ out.required = out.required.filter((k) => typeof k === "string" && shown(k));
494
+ }
495
+ const ui = out["x-ui"];
496
+ if (typeof ui === "object" && ui !== null && !Array.isArray(ui)) {
497
+ const hints = ui;
498
+ if (Array.isArray(hints.secrets)) {
499
+ hints.secrets = hints.secrets.filter((e) => typeof e?.path === "string" && shown(e.path.split(".")[0]));
500
+ }
501
+ }
502
+ return out;
503
+ }
504
+ /** Every path a save touches. */
505
+ function touchedPaths(values, entries) {
506
+ return [...Object.keys(values), ...entries.map((e) => e.path)];
507
+ }
508
+ /**
509
+ * Issues as an org may see them: an issue on a hidden field would name a field the org never
510
+ * sees, so those collapse into one root issue.
511
+ */
512
+ export function orgIssues(issues, levels) {
513
+ const shown = issues.filter((i) => i.path !== "" && levelOf(levels, i.path) !== "hidden");
514
+ if (shown.length === issues.length)
515
+ return issues;
516
+ return [
517
+ ...shown,
518
+ {
519
+ path: "",
520
+ segments: [],
521
+ message: "the platform configuration of this extension is incomplete",
522
+ },
523
+ ];
524
+ }
@@ -1,4 +1,4 @@
1
- import { type PluginExtensionSection } from "@capybara-hq/plugin-sdk";
1
+ import { type LocalizedName, type PluginExtensionSection } from "@capybara-hq/plugin-sdk";
2
2
  import { ApiError } from "../errors.js";
3
3
  import { HOST_ZOD_VERSION, type PackageTgzLimits } from "../packages/tgz.js";
4
4
  import { type PermissionSet } from "./permission-set.js";
@@ -57,6 +57,8 @@ export interface ExtensionPackage {
57
57
  size: number;
58
58
  packageJson: Record<string, unknown>;
59
59
  section: ExtensionPackageSection;
60
+ /** The plugin.json `displayName`, when the plugin has one. */
61
+ displayName?: LocalizedName;
60
62
  files: {
61
63
  path: string;
62
64
  size: number;
@@ -105,6 +107,17 @@ export declare function readMigrationSql(root: string, section: Pick<PluginExten
105
107
  file: string;
106
108
  sql: string;
107
109
  }[]>;
110
+ /**
111
+ * The plugin.json `displayName` of the plugin a config-declared extension module belongs to: the
112
+ * `.capybara-plugin/plugin.json` beside the nearest `package.json` above the module's directory
113
+ * `dir`. Nothing when there is no such file or it names another plugin than the extension `name`
114
+ * (a module inside some other plugin's directory); `problem` when it cannot be read or is not a
115
+ * valid plugin.json (the extension then has no display name of its own).
116
+ */
117
+ export declare function declaredDisplayName(dir: string, name: string): Promise<{
118
+ displayName?: LocalizedName;
119
+ problem?: string;
120
+ }>;
108
121
  /**
109
122
  * Unpacks the package into `dir` (dropping the `package/` prefix). `dir` must not exist or be empty;
110
123
  * the unpack rules and limits are the same as {@link readExtensionPackage} (paths, file types, entry
@@ -1,6 +1,6 @@
1
1
  import { mkdir, readdir, readFile, writeFile } from "node:fs/promises";
2
- import { dirname, posix, relative, resolve as resolvePath } from "node:path";
3
- import { checkEntryImports, isSafePackagePath, PLUGIN_MANIFEST_FILE, } from "@capybara-hq/plugin-sdk";
2
+ import { dirname, join, posix, relative, resolve as resolvePath } from "node:path";
3
+ import { checkEntryImports, isSafePackagePath, PLUGIN_MANIFEST_FILE, parsePluginManifest, } from "@capybara-hq/plugin-sdk";
4
4
  import { init as lexerInit, parse as lexerParse } from "es-module-lexer";
5
5
  import { PluginPackageError, readPluginPackage } from "../catalog/plugin-package.js";
6
6
  import { pluginSchemaName } from "../ctx/create-ctx.js";
@@ -159,6 +159,7 @@ export async function readExtensionPackage(bytes, opts) {
159
159
  size: plugin.size,
160
160
  packageJson: plugin.packageJson,
161
161
  section: { ...ext, name: manifest.name, version: manifest.version },
162
+ ...(manifest.displayName !== undefined && { displayName: manifest.displayName }),
162
163
  files: [...files].map(([path, data]) => ({ path, size: data.byteLength })),
163
164
  migrationSql,
164
165
  };
@@ -206,6 +207,54 @@ export async function readMigrationSql(root, section) {
206
207
  out.push({ file, sql: await readFile(resolvePath(dir, file), "utf8") });
207
208
  return out;
208
209
  }
210
+ /**
211
+ * The plugin.json `displayName` of the plugin a config-declared extension module belongs to: the
212
+ * `.capybara-plugin/plugin.json` beside the nearest `package.json` above the module's directory
213
+ * `dir`. Nothing when there is no such file or it names another plugin than the extension `name`
214
+ * (a module inside some other plugin's directory); `problem` when it cannot be read or is not a
215
+ * valid plugin.json (the extension then has no display name of its own).
216
+ */
217
+ export async function declaredDisplayName(dir, name) {
218
+ let root;
219
+ for (let d = resolvePath(dir);;) {
220
+ try {
221
+ await readFile(join(d, "package.json"));
222
+ root = d;
223
+ break;
224
+ }
225
+ catch {
226
+ // none here: go up
227
+ }
228
+ const up = dirname(d);
229
+ if (up === d)
230
+ return {};
231
+ d = up;
232
+ }
233
+ let text;
234
+ try {
235
+ text = await readFile(join(root, PLUGIN_MANIFEST_FILE), "utf8");
236
+ }
237
+ catch {
238
+ return {};
239
+ }
240
+ let json;
241
+ try {
242
+ json = JSON.parse(text);
243
+ }
244
+ catch (e) {
245
+ return { problem: `${PLUGIN_MANIFEST_FILE} is not valid JSON: ${errMsg(e)}` };
246
+ }
247
+ // another plugin's plugin.json (valid or not) says nothing about this extension
248
+ const named = json?.name;
249
+ if (typeof named === "string" && named !== name)
250
+ return {};
251
+ const m = parsePluginManifest(json);
252
+ if ("errors" in m)
253
+ return { problem: m.errors.slice(0, 3).join("; ") };
254
+ if (m.name !== name)
255
+ return {};
256
+ return m.displayName === undefined ? {} : { displayName: m.displayName };
257
+ }
209
258
  /**
210
259
  * Unpacks the package into `dir` (dropping the `package/` prefix). `dir` must not exist or be empty;
211
260
  * the unpack rules and limits are the same as {@link readExtensionPackage} (paths, file types, entry