@capybara-hq/kernel 0.1.0-rc.2 → 0.1.0-rc.21

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 (1039) hide show
  1. package/bootstrap.json +94 -5
  2. package/dist/admin/admin-agents.controller.d.ts +28 -0
  3. package/dist/admin/admin-agents.controller.js +79 -0
  4. package/dist/admin/admin-connectors.controller.d.ts +29 -0
  5. package/dist/admin/admin-connectors.controller.js +79 -0
  6. package/dist/admin/admin-items.schemas.d.ts +42 -0
  7. package/dist/admin/admin-items.schemas.js +48 -0
  8. package/dist/admin/admin.controller.d.ts +52 -80
  9. package/dist/admin/admin.controller.js +112 -81
  10. package/dist/admin/admin.module.d.ts +4 -1
  11. package/dist/admin/admin.module.js +50 -4
  12. package/dist/admin/admin.schemas.d.ts +69 -0
  13. package/dist/admin/admin.schemas.js +53 -0
  14. package/dist/admin/audit.controller.d.ts +14 -0
  15. package/dist/admin/audit.controller.js +42 -0
  16. package/dist/admin/audit.schemas.d.ts +8 -0
  17. package/dist/admin/audit.schemas.js +17 -0
  18. package/dist/admin/extensions.controller.d.ts +34 -3
  19. package/dist/admin/extensions.controller.js +66 -8
  20. package/dist/admin/extensions.schemas.d.ts +7 -0
  21. package/dist/admin/extensions.schemas.js +10 -0
  22. package/dist/admin/health.service.d.ts +104 -0
  23. package/dist/admin/health.service.js +246 -0
  24. package/dist/admin/limit-defaults.d.ts +20 -0
  25. package/dist/admin/limit-defaults.js +10 -0
  26. package/dist/admin/overview.controller.d.ts +31 -0
  27. package/dist/admin/overview.controller.js +78 -0
  28. package/dist/admin/overview.schemas.d.ts +8 -0
  29. package/dist/admin/overview.schemas.js +13 -0
  30. package/dist/admin/overview.service.d.ts +112 -0
  31. package/dist/admin/overview.service.js +223 -0
  32. package/dist/admin/platform-audit.service.d.ts +41 -0
  33. package/dist/admin/platform-audit.service.js +70 -0
  34. package/dist/admin/setup-lock.d.ts +1 -1
  35. package/dist/admin/setup-lock.js +1 -1
  36. package/dist/admin/setup.controller.d.ts +1 -1
  37. package/dist/admin/setup.controller.js +1 -1
  38. package/dist/admin/setup.service.d.ts +4 -4
  39. package/dist/admin/setup.service.js +8 -8
  40. package/dist/admin/usage.service.d.ts +149 -0
  41. package/dist/admin/usage.service.js +321 -0
  42. package/dist/agents/admin-agents.d.ts +92 -0
  43. package/dist/agents/admin-agents.js +170 -0
  44. package/dist/agents/agent-lookup.d.ts +24 -0
  45. package/dist/agents/agent-lookup.js +46 -2
  46. package/dist/agents/agent-profile.service.d.ts +31 -0
  47. package/dist/agents/agent-profile.service.js +122 -0
  48. package/dist/agents/agents.controller.d.ts +53 -168
  49. package/dist/agents/agents.controller.js +163 -34
  50. package/dist/agents/agents.module.d.ts +6 -2
  51. package/dist/agents/agents.module.js +41 -7
  52. package/dist/agents/agents.schemas.d.ts +392 -0
  53. package/dist/agents/agents.schemas.js +126 -0
  54. package/dist/agents/agents.service.d.ts +121 -36
  55. package/dist/agents/agents.service.js +411 -121
  56. package/dist/agents/definition.d.ts +142 -21
  57. package/dist/agents/definition.js +389 -43
  58. package/dist/agents/from-template.d.ts +106 -0
  59. package/dist/agents/from-template.js +680 -0
  60. package/dist/agents/from-template.service.d.ts +72 -0
  61. package/dist/agents/from-template.service.js +178 -0
  62. package/dist/agents/instruction-files.d.ts +60 -0
  63. package/dist/agents/instruction-files.js +111 -0
  64. package/dist/agents/models.controller.d.ts +44 -6
  65. package/dist/agents/models.controller.js +84 -8
  66. package/dist/agents/org-templates.d.ts +186 -0
  67. package/dist/agents/org-templates.js +876 -0
  68. package/dist/agents/pending-connector-requests.d.ts +79 -0
  69. package/dist/agents/pending-connector-requests.js +215 -0
  70. package/dist/agents/pending-connectors.controller.d.ts +39 -0
  71. package/dist/agents/pending-connectors.controller.js +91 -0
  72. package/dist/agents/pending-connectors.service.d.ts +62 -0
  73. package/dist/agents/pending-connectors.service.js +282 -0
  74. package/dist/agents/profile.d.ts +114 -0
  75. package/dist/agents/profile.js +55 -0
  76. package/dist/agents/readiness.controller.d.ts +26 -0
  77. package/dist/agents/readiness.controller.js +56 -0
  78. package/dist/agents/templates.controller.d.ts +77 -5
  79. package/dist/agents/templates.controller.js +153 -7
  80. package/dist/agents/templates.d.ts +127 -23
  81. package/dist/agents/templates.js +482 -44
  82. package/dist/agents/templates.schemas.d.ts +20 -0
  83. package/dist/agents/templates.schemas.js +45 -0
  84. package/dist/background/background.controller.d.ts +38 -0
  85. package/dist/background/background.controller.js +88 -0
  86. package/dist/background/background.module.d.ts +10 -0
  87. package/dist/background/background.module.js +39 -0
  88. package/dist/background/background.schemas.d.ts +10 -0
  89. package/dist/background/background.schemas.js +16 -0
  90. package/dist/background/finish.d.ts +44 -0
  91. package/dist/background/finish.js +95 -0
  92. package/dist/background/launch-lock.d.ts +15 -0
  93. package/dist/background/launch-lock.js +40 -0
  94. package/dist/background/launch.d.ts +42 -0
  95. package/dist/background/launch.js +77 -0
  96. package/dist/background/poll.job.d.ts +56 -0
  97. package/dist/background/poll.job.js +195 -0
  98. package/dist/background/render.d.ts +23 -0
  99. package/dist/background/render.js +48 -0
  100. package/dist/background/session.d.ts +48 -0
  101. package/dist/background/session.js +80 -0
  102. package/dist/background/status.d.ts +35 -0
  103. package/dist/background/status.js +57 -0
  104. package/dist/background/stop.d.ts +68 -0
  105. package/dist/background/stop.js +244 -0
  106. package/dist/background/store.d.ts +167 -0
  107. package/dist/background/store.js +361 -0
  108. package/dist/background/store.module.d.ts +6 -0
  109. package/dist/background/store.module.js +22 -0
  110. package/dist/background/tasks.service.d.ts +109 -0
  111. package/dist/background/tasks.service.js +271 -0
  112. package/dist/background/wake-rules.d.ts +66 -0
  113. package/dist/background/wake-rules.js +113 -0
  114. package/dist/background/wake.d.ts +30 -0
  115. package/dist/background/wake.js +63 -0
  116. package/dist/catalog/admin-catalog.controller.d.ts +136 -52
  117. package/dist/catalog/admin-catalog.controller.js +275 -65
  118. package/dist/catalog/admin-catalog.schemas.d.ts +82 -0
  119. package/dist/catalog/admin-catalog.schemas.js +99 -0
  120. package/dist/catalog/appearance.schemas.d.ts +10 -0
  121. package/dist/catalog/appearance.schemas.js +20 -0
  122. package/dist/catalog/appearance.service.d.ts +105 -0
  123. package/dist/catalog/appearance.service.js +306 -0
  124. package/dist/catalog/catalog-content.d.ts +122 -35
  125. package/dist/catalog/catalog-content.js +122 -14
  126. package/dist/catalog/catalog-files.d.ts +42 -0
  127. package/dist/catalog/catalog-files.js +89 -0
  128. package/dist/catalog/catalog-import.module.d.ts +7 -0
  129. package/dist/catalog/catalog-import.module.js +63 -0
  130. package/dist/catalog/catalog-items.d.ts +122 -7
  131. package/dist/catalog/catalog-items.js +301 -13
  132. package/dist/catalog/catalog-scope.service.d.ts +293 -0
  133. package/dist/catalog/catalog-scope.service.js +1236 -0
  134. package/dist/catalog/catalog.module.d.ts +7 -9
  135. package/dist/catalog/catalog.module.js +47 -31
  136. package/dist/catalog/catalog.service.d.ts +122 -31
  137. package/dist/catalog/catalog.service.js +177 -105
  138. package/dist/catalog/claude/agents.js +15 -10
  139. package/dist/catalog/claude/translate.js +3 -0
  140. package/dist/catalog/cli.d.ts +11 -1
  141. package/dist/catalog/cli.js +29 -1
  142. package/dist/catalog/component-promotion.d.ts +96 -0
  143. package/dist/catalog/component-promotion.js +395 -0
  144. package/dist/catalog/component-scope.controller.d.ts +102 -0
  145. package/dist/catalog/component-scope.controller.js +257 -0
  146. package/dist/catalog/component-scope.schemas.d.ts +118 -0
  147. package/dist/catalog/component-scope.schemas.js +97 -0
  148. package/dist/catalog/component-scope.service.d.ts +394 -0
  149. package/dist/catalog/component-scope.service.js +1133 -0
  150. package/dist/catalog/component-state.d.ts +207 -0
  151. package/dist/catalog/component-state.js +484 -0
  152. package/dist/catalog/git-source.d.ts +9 -1
  153. package/dist/catalog/git-source.js +29 -2
  154. package/dist/catalog/job-ids.d.ts +30 -0
  155. package/dist/catalog/job-ids.js +25 -0
  156. package/dist/catalog/marketplace-fetch.d.ts +1 -1
  157. package/dist/catalog/marketplace-icons.d.ts +64 -0
  158. package/dist/catalog/marketplace-icons.js +131 -0
  159. package/dist/catalog/marketplaces.controller.d.ts +50 -41
  160. package/dist/catalog/marketplaces.controller.js +130 -46
  161. package/dist/catalog/marketplaces.schemas.d.ts +48 -0
  162. package/dist/catalog/marketplaces.schemas.js +53 -0
  163. package/dist/catalog/marketplaces.service.d.ts +110 -17
  164. package/dist/catalog/marketplaces.service.js +337 -29
  165. package/dist/catalog/org-catalog.controller.d.ts +114 -62
  166. package/dist/catalog/org-catalog.controller.js +191 -98
  167. package/dist/catalog/org-catalog.schemas.d.ts +104 -0
  168. package/dist/catalog/org-catalog.schemas.js +107 -0
  169. package/dist/catalog/org-catalog.service.d.ts +72 -33
  170. package/dist/catalog/org-catalog.service.js +367 -158
  171. package/dist/catalog/org-extension-switch.d.ts +41 -0
  172. package/dist/catalog/org-extension-switch.js +115 -0
  173. package/dist/catalog/org-extension.controller.d.ts +133 -0
  174. package/dist/catalog/org-extension.controller.js +313 -0
  175. package/dist/catalog/org-extension.schemas.d.ts +15 -0
  176. package/dist/catalog/org-extension.schemas.js +22 -0
  177. package/dist/catalog/org-plugin-uploads.controller.d.ts +77 -0
  178. package/dist/catalog/org-plugin-uploads.controller.js +200 -0
  179. package/dist/catalog/org-plugin-uploads.d.ts +71 -0
  180. package/dist/catalog/org-plugin-uploads.js +122 -0
  181. package/dist/catalog/org-plugin-uploads.schemas.d.ts +20 -0
  182. package/dist/catalog/org-plugin-uploads.schemas.js +32 -0
  183. package/dist/catalog/owned-items.d.ts +188 -0
  184. package/dist/catalog/owned-items.js +808 -0
  185. package/dist/catalog/owned-plugin-cleanup.d.ts +56 -0
  186. package/dist/catalog/owned-plugin-cleanup.js +194 -0
  187. package/dist/catalog/ownership.d.ts +172 -0
  188. package/dist/catalog/ownership.js +326 -0
  189. package/dist/catalog/platform-components.d.ts +243 -0
  190. package/dist/catalog/platform-components.js +872 -0
  191. package/dist/catalog/platform-migration.d.ts +115 -0
  192. package/dist/catalog/platform-migration.js +583 -0
  193. package/dist/catalog/plugin-import.d.ts +254 -47
  194. package/dist/catalog/plugin-import.js +810 -112
  195. package/dist/catalog/plugin-install.d.ts +205 -42
  196. package/dist/catalog/plugin-install.js +828 -126
  197. package/dist/catalog/plugin-package.d.ts +43 -4
  198. package/dist/catalog/plugin-package.js +194 -7
  199. package/dist/catalog/plugin-upgrade.d.ts +308 -225
  200. package/dist/catalog/plugin-upgrade.js +1325 -1131
  201. package/dist/catalog/request-rules.d.ts +65 -0
  202. package/dist/catalog/request-rules.js +217 -0
  203. package/dist/catalog/requests.service.d.ts +194 -118
  204. package/dist/catalog/requests.service.js +530 -343
  205. package/dist/catalog/reserved-names.d.ts +8 -0
  206. package/dist/catalog/reserved-names.js +42 -0
  207. package/dist/catalog/scope-orgs.d.ts +21 -0
  208. package/dist/catalog/scope-orgs.js +67 -0
  209. package/dist/catalog/scope-state.d.ts +35 -0
  210. package/dist/catalog/scope-state.js +87 -0
  211. package/dist/catalog/scope-sync-workers.d.ts +7 -0
  212. package/dist/catalog/scope-sync-workers.js +29 -0
  213. package/dist/catalog/scope-sync.d.ts +176 -0
  214. package/dist/catalog/scope-sync.js +576 -0
  215. package/dist/catalog/scope.d.ts +42 -0
  216. package/dist/catalog/scope.js +42 -0
  217. package/dist/catalog/unshare.d.ts +22 -0
  218. package/dist/catalog/unshare.js +119 -0
  219. package/dist/channels/actions.js +10 -3
  220. package/dist/channels/cards.d.ts +36 -10
  221. package/dist/channels/cards.js +100 -25
  222. package/dist/channels/channels.module.js +13 -2
  223. package/dist/channels/channels.schemas.d.ts +41 -0
  224. package/dist/channels/channels.schemas.js +40 -0
  225. package/dist/channels/connections.controller.d.ts +46 -37
  226. package/dist/channels/connections.controller.js +76 -34
  227. package/dist/channels/connections.service.d.ts +102 -10
  228. package/dist/channels/connections.service.js +271 -24
  229. package/dist/channels/inbound.d.ts +11 -1
  230. package/dist/channels/inbound.js +87 -7
  231. package/dist/channels/outbound.d.ts +14 -1
  232. package/dist/channels/outbound.js +64 -15
  233. package/dist/channels/phrases.d.ts +33 -2
  234. package/dist/channels/phrases.js +29 -1
  235. package/dist/channels/supervisor.d.ts +2 -0
  236. package/dist/channels/supervisor.js +4 -0
  237. package/dist/channels/threads.d.ts +5 -0
  238. package/dist/channels/threads.js +8 -0
  239. package/dist/channels/webhook.d.ts +21 -1
  240. package/dist/channels/webhook.js +39 -4
  241. package/dist/client/client-access.service.d.ts +102 -0
  242. package/dist/client/client-access.service.js +303 -0
  243. package/dist/client/client-builds.service.d.ts +109 -0
  244. package/dist/client/client-builds.service.js +229 -0
  245. package/dist/client/client-delivery.controller.d.ts +25 -0
  246. package/dist/client/client-delivery.controller.js +66 -0
  247. package/dist/client/client-files.d.ts +48 -0
  248. package/dist/client/client-files.js +136 -0
  249. package/dist/client/client-reports.cron.d.ts +13 -0
  250. package/dist/client/client-reports.cron.js +42 -0
  251. package/dist/client/client-reports.service.d.ts +30 -0
  252. package/dist/client/client-reports.service.js +102 -0
  253. package/dist/client/client-sign-in.service.d.ts +21 -0
  254. package/dist/client/client-sign-in.service.js +49 -0
  255. package/dist/client/client.controller.d.ts +49 -0
  256. package/dist/client/client.controller.js +129 -0
  257. package/dist/client/client.module.d.ts +8 -0
  258. package/dist/client/client.module.js +28 -0
  259. package/dist/client/client.schemas.d.ts +61 -0
  260. package/dist/client/client.schemas.js +27 -0
  261. package/dist/config/docs.js +5 -1
  262. package/dist/config/schema.d.ts +35 -2
  263. package/dist/config/schema.js +216 -21
  264. package/dist/conversations/access.d.ts +6 -4
  265. package/dist/conversations/access.js +29 -5
  266. package/dist/conversations/agent-tree.d.ts +46 -0
  267. package/dist/conversations/agent-tree.js +92 -0
  268. package/dist/conversations/artifacts.d.ts +1 -1
  269. package/dist/conversations/artifacts.js +1 -1
  270. package/dist/conversations/attachments.service.d.ts +30 -0
  271. package/dist/conversations/attachments.service.js +130 -5
  272. package/dist/conversations/conversations.controller.d.ts +79 -44
  273. package/dist/conversations/conversations.controller.js +133 -82
  274. package/dist/conversations/conversations.module.d.ts +1 -1
  275. package/dist/conversations/conversations.module.js +10 -7
  276. package/dist/conversations/conversations.schemas.d.ts +52 -0
  277. package/dist/conversations/conversations.schemas.js +79 -0
  278. package/dist/conversations/conversations.service.d.ts +161 -13
  279. package/dist/conversations/conversations.service.js +329 -57
  280. package/dist/conversations/device-status.d.ts +24 -0
  281. package/dist/conversations/device-status.js +71 -0
  282. package/dist/conversations/event-log.d.ts +45 -9
  283. package/dist/conversations/event-log.js +113 -6
  284. package/dist/conversations/events.d.ts +255 -9
  285. package/dist/conversations/events.js +250 -34
  286. package/dist/conversations/message-context.d.ts +79 -0
  287. package/dist/conversations/message-context.js +145 -0
  288. package/dist/conversations/queue.d.ts +5 -2
  289. package/dist/conversations/queue.js +24 -4
  290. package/dist/conversations/queue.service.d.ts +2 -2
  291. package/dist/conversations/queue.service.js +21 -3
  292. package/dist/conversations/titles.d.ts +12 -3
  293. package/dist/conversations/titles.js +40 -16
  294. package/dist/conversations/tree.d.ts +17 -0
  295. package/dist/conversations/tree.js +42 -0
  296. package/dist/ctx/create-ctx.d.ts +48 -5
  297. package/dist/ctx/create-ctx.js +174 -34
  298. package/dist/db/kernel-schema.d.ts +668 -27
  299. package/dist/db/pool.d.ts +5 -0
  300. package/dist/db/pool.js +3 -0
  301. package/dist/devices/access.d.ts +66 -0
  302. package/dist/devices/access.js +113 -0
  303. package/dist/devices/conversation-devices.d.ts +75 -0
  304. package/dist/devices/conversation-devices.js +230 -0
  305. package/dist/devices/devices.controller.d.ts +36 -0
  306. package/dist/devices/devices.controller.js +124 -0
  307. package/dist/devices/devices.module.d.ts +8 -0
  308. package/dist/devices/devices.module.js +34 -0
  309. package/dist/devices/devices.schemas.d.ts +3 -0
  310. package/dist/devices/devices.schemas.js +14 -0
  311. package/dist/devices/devices.service.d.ts +251 -0
  312. package/dist/devices/devices.service.js +791 -0
  313. package/dist/devices/dto.d.ts +25 -0
  314. package/dist/devices/dto.js +12 -0
  315. package/dist/devices/label.d.ts +11 -0
  316. package/dist/devices/label.js +25 -0
  317. package/dist/devices/legacy-cleanup.job.d.ts +34 -0
  318. package/dist/devices/legacy-cleanup.job.js +141 -0
  319. package/dist/errors.d.ts +215 -3
  320. package/dist/errors.js +215 -3
  321. package/dist/evals/evals.module.js +11 -2
  322. package/dist/evals/evals.schemas.d.ts +110 -0
  323. package/dist/evals/evals.schemas.js +107 -0
  324. package/dist/evals/reconstruct.d.ts +18 -9
  325. package/dist/evals/reconstruct.js +36 -10
  326. package/dist/evals/recorded-tools.d.ts +37 -1
  327. package/dist/evals/recorded-tools.js +120 -10
  328. package/dist/evals/run-replay.d.ts +20 -3
  329. package/dist/evals/run-replay.js +78 -14
  330. package/dist/evals/runs.controller.d.ts +2 -57
  331. package/dist/evals/runs.controller.js +1 -42
  332. package/dist/evals/runs.service.d.ts +8 -7
  333. package/dist/evals/runs.service.js +45 -30
  334. package/dist/evals/sets.controller.d.ts +2 -28
  335. package/dist/evals/sets.controller.js +1 -31
  336. package/dist/evals/sets.service.d.ts +7 -7
  337. package/dist/evals/sets.service.js +23 -17
  338. package/dist/evals/snapshot.d.ts +3 -2
  339. package/dist/evals/snapshot.js +17 -4
  340. package/dist/evals/step-replay.d.ts +4 -6
  341. package/dist/evals/step-replay.js +16 -9
  342. package/dist/evals/trajectory.d.ts +5 -3
  343. package/dist/evals/trajectory.js +4 -1
  344. package/dist/evals/trajectory.service.d.ts +8 -3
  345. package/dist/evals/trajectory.service.js +26 -14
  346. package/dist/evals/worker.d.ts +5 -5
  347. package/dist/evals/worker.js +9 -3
  348. package/dist/extensions/admin-ops.d.ts +81 -14
  349. package/dist/extensions/admin-ops.js +181 -47
  350. package/dist/extensions/admin-view.d.ts +57 -10
  351. package/dist/extensions/admin-view.js +249 -27
  352. package/dist/extensions/approvals.d.ts +12 -2
  353. package/dist/extensions/blobs.d.ts +14 -1
  354. package/dist/extensions/blobs.js +49 -5
  355. package/dist/extensions/bootstrap.d.ts +85 -10
  356. package/dist/extensions/bootstrap.js +215 -36
  357. package/dist/extensions/cli.d.ts +12 -0
  358. package/dist/extensions/cli.js +11 -2
  359. package/dist/extensions/config-hash.d.ts +10 -0
  360. package/dist/extensions/config-hash.js +38 -0
  361. package/dist/extensions/config-issues.d.ts +13 -1
  362. package/dist/extensions/config-issues.js +22 -5
  363. package/dist/extensions/config-json-schema.d.ts +43 -7
  364. package/dist/extensions/config-json-schema.js +124 -58
  365. package/dist/extensions/deployment-config-store.d.ts +6 -0
  366. package/dist/extensions/deployment-config.d.ts +94 -9
  367. package/dist/extensions/deployment-config.js +255 -34
  368. package/dist/extensions/display-name.d.ts +22 -0
  369. package/dist/extensions/display-name.js +77 -0
  370. package/dist/extensions/effective-config.d.ts +133 -0
  371. package/dist/extensions/effective-config.js +379 -0
  372. package/dist/extensions/extensions.module.js +31 -12
  373. package/dist/extensions/guide-places.d.ts +68 -0
  374. package/dist/extensions/guide-places.js +152 -0
  375. package/dist/extensions/hooks.d.ts +37 -4
  376. package/dist/extensions/hooks.js +82 -16
  377. package/dist/extensions/host.d.ts +105 -12
  378. package/dist/extensions/host.js +372 -87
  379. package/dist/extensions/installs.d.ts +30 -9
  380. package/dist/extensions/installs.js +57 -16
  381. package/dist/extensions/instance.d.ts +17 -2
  382. package/dist/extensions/instance.js +21 -0
  383. package/dist/extensions/ledger.d.ts +1 -1
  384. package/dist/extensions/locks.d.ts +12 -0
  385. package/dist/extensions/locks.js +26 -0
  386. package/dist/extensions/org-config.d.ts +97 -7
  387. package/dist/extensions/org-config.js +215 -45
  388. package/dist/extensions/org-levels.d.ts +37 -0
  389. package/dist/extensions/org-levels.js +71 -0
  390. package/dist/extensions/org-overrides.d.ts +151 -0
  391. package/dist/extensions/org-overrides.js +524 -0
  392. package/dist/extensions/package.d.ts +18 -4
  393. package/dist/extensions/package.js +56 -3
  394. package/dist/extensions/permission-set.d.ts +35 -5
  395. package/dist/extensions/permission-set.js +36 -5
  396. package/dist/extensions/permission-view.d.ts +106 -13
  397. package/dist/extensions/permission-view.js +33 -15
  398. package/dist/extensions/plugin-guides.d.ts +282 -0
  399. package/dist/extensions/plugin-guides.js +554 -0
  400. package/dist/extensions/plugin-icons.d.ts +54 -0
  401. package/dist/extensions/plugin-icons.js +125 -0
  402. package/dist/extensions/plugin-items.d.ts +21 -0
  403. package/dist/extensions/plugin-items.js +42 -0
  404. package/dist/extensions/point-defaults.controller.d.ts +28 -0
  405. package/dist/extensions/point-defaults.controller.js +69 -0
  406. package/dist/extensions/point-defaults.d.ts +73 -0
  407. package/dist/extensions/point-defaults.js +236 -0
  408. package/dist/extensions/point-defaults.schemas.d.ts +9 -0
  409. package/dist/extensions/point-defaults.schemas.js +14 -0
  410. package/dist/extensions/registry.d.ts +1 -1
  411. package/dist/extensions/registry.js +2 -0
  412. package/dist/extensions/resolve.d.ts +51 -1
  413. package/dist/extensions/resolve.js +85 -3
  414. package/dist/extensions/single-provider.d.ts +92 -0
  415. package/dist/extensions/single-provider.js +180 -0
  416. package/dist/extensions/sources.d.ts +13 -2
  417. package/dist/extensions/sources.js +2 -0
  418. package/dist/extensions/state.module.d.ts +9 -0
  419. package/dist/extensions/state.module.js +46 -0
  420. package/dist/extensions/unavailable.d.ts +50 -0
  421. package/dist/extensions/unavailable.js +115 -0
  422. package/dist/files/previewers.controller.js +2 -3
  423. package/dist/files/previewers.d.ts +10 -3
  424. package/dist/files/previewers.js +40 -11
  425. package/dist/files/previewers.schemas.d.ts +10 -0
  426. package/dist/files/previewers.schemas.js +9 -0
  427. package/dist/http/api.module.js +76 -4
  428. package/dist/http/app.d.ts +11 -2
  429. package/dist/http/app.js +31 -5
  430. package/dist/http/gateway-routes.d.ts +7 -3
  431. package/dist/http/gateway-routes.js +6 -3
  432. package/dist/http/nest-logger.d.ts +6 -5
  433. package/dist/http/nest-logger.js +24 -10
  434. package/dist/http/plugin-dispatch.d.ts +4 -1
  435. package/dist/http/plugin-dispatch.js +14 -2
  436. package/dist/identity/accounts.d.ts +77 -31
  437. package/dist/identity/accounts.js +133 -52
  438. package/dist/identity/audit.d.ts +2 -1
  439. package/dist/identity/auth.controller.js +9 -5
  440. package/dist/identity/auth.guard.d.ts +13 -5
  441. package/dist/identity/auth.guard.js +35 -9
  442. package/dist/identity/cookies.d.ts +26 -5
  443. package/dist/identity/cookies.js +58 -6
  444. package/dist/identity/identity.module.d.ts +1 -1
  445. package/dist/identity/identity.module.js +7 -4
  446. package/dist/identity/initial-passwords.controller.d.ts +22 -0
  447. package/dist/identity/initial-passwords.controller.js +49 -0
  448. package/dist/identity/initial-passwords.d.ts +61 -0
  449. package/dist/identity/initial-passwords.job.d.ts +16 -0
  450. package/dist/identity/initial-passwords.job.js +46 -0
  451. package/dist/identity/initial-passwords.js +159 -0
  452. package/dist/identity/me.controller.d.ts +17 -1
  453. package/dist/identity/me.controller.js +45 -4
  454. package/dist/identity/me.schemas.d.ts +24 -0
  455. package/dist/identity/me.schemas.js +25 -0
  456. package/dist/identity/principal.d.ts +11 -3
  457. package/dist/identity/principal.js +11 -3
  458. package/dist/identity/sessions.d.ts +12 -0
  459. package/dist/identity/sessions.js +45 -0
  460. package/dist/identity/settings.d.ts +99 -12
  461. package/dist/identity/settings.js +234 -25
  462. package/dist/identity/{enterprise-admin.d.ts → super-admin.d.ts} +5 -5
  463. package/dist/identity/{enterprise-admin.js → super-admin.js} +24 -24
  464. package/dist/identity/write-actor.d.ts +11 -0
  465. package/dist/identity/write-actor.js +7 -0
  466. package/dist/inbox/inbox.module.d.ts +4 -1
  467. package/dist/inbox/inbox.module.js +7 -3
  468. package/dist/inbox/inbox.schemas.d.ts +8 -0
  469. package/dist/inbox/inbox.schemas.js +11 -0
  470. package/dist/inbox/inbox.service.d.ts +64 -4
  471. package/dist/inbox/inbox.service.js +74 -4
  472. package/dist/inbox/org-notices.d.ts +63 -0
  473. package/dist/inbox/org-notices.js +91 -0
  474. package/dist/inbox/platform-inbox.controller.d.ts +23 -0
  475. package/dist/inbox/platform-inbox.controller.js +58 -0
  476. package/dist/inbox/platform-inbox.service.d.ts +157 -0
  477. package/dist/inbox/platform-inbox.service.js +281 -0
  478. package/dist/inbox/platform-notices.d.ts +19 -0
  479. package/dist/inbox/platform-notices.js +9 -0
  480. package/dist/index.d.ts +6 -2
  481. package/dist/index.js +7 -1
  482. package/dist/infra/cli/kernel-cli.module.js +9 -1
  483. package/dist/infra/config/kernel-config.service.js +32 -1
  484. package/dist/infra/database/database.module.js +1 -0
  485. package/dist/infra/database/xact-lock.d.ts +1 -1
  486. package/dist/infra/database/xact-lock.js +1 -1
  487. package/dist/infra/events/kernel-events.d.ts +31 -3
  488. package/dist/infra/lifecycle/process-guards.js +4 -0
  489. package/dist/infra/lock/lock.service.d.ts +8 -0
  490. package/dist/infra/lock/lock.service.js +27 -0
  491. package/dist/infra/logging/logging.module.d.ts +4 -2
  492. package/dist/infra/logging/logging.module.js +24 -6
  493. package/dist/infra/presence/presence.module.d.ts +6 -0
  494. package/dist/infra/presence/presence.module.js +22 -0
  495. package/dist/infra/presence/replica-presence.d.ts +87 -0
  496. package/dist/infra/presence/replica-presence.js +189 -0
  497. package/dist/infra/queue/add-job-once.d.ts +14 -0
  498. package/dist/infra/queue/add-job-once.js +16 -0
  499. package/dist/infra/queue/redis-connection.d.ts +6 -0
  500. package/dist/infra/queue/redis-connection.js +7 -0
  501. package/dist/infra/redis/redis.module.js +6 -2
  502. package/dist/infra/throttler/named-throttlers.d.ts +12 -0
  503. package/dist/infra/throttler/named-throttlers.js +67 -0
  504. package/dist/infra/throttler/throttler.guard.js +1 -1
  505. package/dist/infra/tokens.d.ts +6 -1
  506. package/dist/infra/tokens.js +6 -1
  507. package/dist/kernel.module.js +15 -0
  508. package/dist/lifecycle/kernel-lifecycle.d.ts +9 -3
  509. package/dist/lifecycle/kernel-lifecycle.js +51 -11
  510. package/dist/local-devices/device-auth.controller.d.ts +42 -0
  511. package/dist/local-devices/device-auth.controller.js +116 -0
  512. package/dist/local-devices/device-auth.d.ts +119 -0
  513. package/dist/local-devices/device-auth.js +401 -0
  514. package/dist/local-devices/device-auth.module.d.ts +7 -0
  515. package/dist/local-devices/device-auth.module.js +25 -0
  516. package/dist/local-devices/device-routes.d.ts +36 -0
  517. package/dist/local-devices/device-routes.js +90 -0
  518. package/dist/local-devices/dto.d.ts +66 -0
  519. package/dist/local-devices/dto.js +44 -0
  520. package/dist/local-devices/keys.d.ts +25 -0
  521. package/dist/local-devices/keys.js +25 -0
  522. package/dist/local-devices/local-device-gateway.d.ts +134 -0
  523. package/dist/local-devices/local-device-gateway.js +542 -0
  524. package/dist/local-devices/local-device-provider.d.ts +89 -0
  525. package/dist/local-devices/local-device-provider.js +151 -0
  526. package/dist/local-devices/local-devices.module.d.ts +16 -0
  527. package/dist/local-devices/local-devices.module.js +44 -0
  528. package/dist/local-devices/machines.d.ts +118 -0
  529. package/dist/local-devices/machines.js +366 -0
  530. package/dist/local-devices/relay.d.ts +100 -0
  531. package/dist/local-devices/relay.js +373 -0
  532. package/dist/local-devices/targets.d.ts +28 -0
  533. package/dist/local-devices/targets.js +73 -0
  534. package/dist/log.d.ts +13 -1
  535. package/dist/log.js +93 -17
  536. package/dist/models/embeddings.d.ts +82 -0
  537. package/dist/models/embeddings.js +326 -0
  538. package/dist/models/enablement.controller.d.ts +40 -0
  539. package/dist/models/enablement.controller.js +74 -0
  540. package/dist/models/enablement.d.ts +101 -0
  541. package/dist/models/enablement.js +264 -0
  542. package/dist/models/models.module.d.ts +5 -1
  543. package/dist/models/models.module.js +16 -4
  544. package/dist/models/org-models.schemas.d.ts +8 -0
  545. package/dist/models/org-models.schemas.js +22 -0
  546. package/dist/models/prices.d.ts +8 -6
  547. package/dist/models/prices.js +11 -9
  548. package/dist/models/purposes.controller.d.ts +6 -4
  549. package/dist/models/purposes.controller.js +13 -7
  550. package/dist/models/purposes.d.ts +72 -14
  551. package/dist/models/purposes.js +115 -34
  552. package/dist/orgs/directory-sync.d.ts +14 -5
  553. package/dist/orgs/directory-sync.js +41 -17
  554. package/dist/orgs/offboarding.d.ts +12 -8
  555. package/dist/orgs/offboarding.js +54 -33
  556. package/dist/orgs/org-lock.d.ts +5 -0
  557. package/dist/orgs/org-lock.js +13 -0
  558. package/dist/orgs/org.guard.d.ts +10 -0
  559. package/dist/orgs/org.guard.js +43 -32
  560. package/dist/orgs/orgs.controller.d.ts +2 -5
  561. package/dist/orgs/orgs.controller.js +3 -6
  562. package/dist/orgs/orgs.module.js +3 -0
  563. package/dist/orgs/orgs.schemas.d.ts +8 -0
  564. package/dist/orgs/orgs.schemas.js +16 -0
  565. package/dist/orgs/orgs.service.d.ts +23 -8
  566. package/dist/orgs/orgs.service.js +38 -16
  567. package/dist/orgs/roles.d.ts +1 -1
  568. package/dist/orgs/roles.js +5 -1
  569. package/dist/orgs/settings.controller.d.ts +1 -1
  570. package/dist/orgs/settings.service.d.ts +66 -6
  571. package/dist/orgs/settings.service.js +89 -10
  572. package/dist/overrides.d.ts +16 -1
  573. package/dist/overrides.js +10 -0
  574. package/dist/platform/actor.d.ts +48 -0
  575. package/dist/platform/actor.js +100 -0
  576. package/dist/platform/agent-docs.d.ts +18 -0
  577. package/dist/platform/agent-docs.js +59 -0
  578. package/dist/platform/availability.d.ts +14 -0
  579. package/dist/platform/availability.js +43 -0
  580. package/dist/platform/errors.d.ts +28 -0
  581. package/dist/platform/errors.js +65 -0
  582. package/dist/platform/exclusions.d.ts +11 -0
  583. package/dist/platform/exclusions.js +774 -0
  584. package/dist/platform/method.d.ts +6 -0
  585. package/dist/platform/method.js +15 -0
  586. package/dist/platform/operation.d.ts +169 -0
  587. package/dist/platform/operation.js +102 -0
  588. package/dist/platform/ops/accounts.ops.d.ts +32 -0
  589. package/dist/platform/ops/accounts.ops.js +291 -0
  590. package/dist/platform/ops/admin-items.ops.d.ts +37 -0
  591. package/dist/platform/ops/admin-items.ops.js +278 -0
  592. package/dist/platform/ops/admin.ops.d.ts +38 -0
  593. package/dist/platform/ops/admin.ops.js +497 -0
  594. package/dist/platform/ops/agent-skills.ops.d.ts +50 -0
  595. package/dist/platform/ops/agent-skills.ops.js +509 -0
  596. package/dist/platform/ops/agent-templates.ops.d.ts +17 -0
  597. package/dist/platform/ops/agent-templates.ops.js +272 -0
  598. package/dist/platform/ops/agents.ops.d.ts +37 -0
  599. package/dist/platform/ops/agents.ops.js +730 -0
  600. package/dist/platform/ops/approvals.ops.d.ts +30 -0
  601. package/dist/platform/ops/approvals.ops.js +116 -0
  602. package/dist/platform/ops/background.ops.d.ts +14 -0
  603. package/dist/platform/ops/background.ops.js +134 -0
  604. package/dist/platform/ops/catalog-admin.ops.d.ts +92 -0
  605. package/dist/platform/ops/catalog-admin.ops.js +682 -0
  606. package/dist/platform/ops/channels.ops.d.ts +16 -0
  607. package/dist/platform/ops/channels.ops.js +195 -0
  608. package/dist/platform/ops/components.ops.d.ts +46 -0
  609. package/dist/platform/ops/components.ops.js +854 -0
  610. package/dist/platform/ops/connectors.ops.d.ts +17 -0
  611. package/dist/platform/ops/connectors.ops.js +190 -0
  612. package/dist/platform/ops/conversations.ops.d.ts +30 -0
  613. package/dist/platform/ops/conversations.ops.js +470 -0
  614. package/dist/platform/ops/devices.ops.d.ts +26 -0
  615. package/dist/platform/ops/devices.ops.js +311 -0
  616. package/dist/platform/ops/errors.d.ts +16 -0
  617. package/dist/platform/ops/errors.js +30 -0
  618. package/dist/platform/ops/evals.ops.d.ts +28 -0
  619. package/dist/platform/ops/evals.ops.js +783 -0
  620. package/dist/platform/ops/extensions-admin.ops.d.ts +25 -0
  621. package/dist/platform/ops/extensions-admin.ops.js +372 -0
  622. package/dist/platform/ops/extensions.ops.d.ts +25 -0
  623. package/dist/platform/ops/extensions.ops.js +347 -0
  624. package/dist/platform/ops/inbox.ops.d.ts +25 -0
  625. package/dist/platform/ops/inbox.ops.js +381 -0
  626. package/dist/platform/ops/marketplaces.ops.d.ts +22 -0
  627. package/dist/platform/ops/marketplaces.ops.js +466 -0
  628. package/dist/platform/ops/models.ops.d.ts +25 -0
  629. package/dist/platform/ops/models.ops.js +232 -0
  630. package/dist/platform/ops/org-plugins.ops.d.ts +35 -0
  631. package/dist/platform/ops/org-plugins.ops.js +388 -0
  632. package/dist/platform/ops/org-settings.ops.d.ts +18 -0
  633. package/dist/platform/ops/org-settings.ops.js +127 -0
  634. package/dist/platform/ops/orgs.ops.d.ts +28 -0
  635. package/dist/platform/ops/orgs.ops.js +298 -0
  636. package/dist/platform/ops/other-orgs.d.ts +20 -0
  637. package/dist/platform/ops/other-orgs.js +72 -0
  638. package/dist/platform/ops/paging.d.ts +14 -0
  639. package/dist/platform/ops/paging.js +20 -0
  640. package/dist/platform/ops/platform.ops.d.ts +30 -0
  641. package/dist/platform/ops/platform.ops.js +231 -0
  642. package/dist/platform/ops/plugins.ops.d.ts +35 -0
  643. package/dist/platform/ops/plugins.ops.js +476 -0
  644. package/dist/platform/ops/previewers.ops.d.ts +14 -0
  645. package/dist/platform/ops/previewers.ops.js +109 -0
  646. package/dist/platform/ops/requests.ops.d.ts +14 -0
  647. package/dist/platform/ops/requests.ops.js +191 -0
  648. package/dist/platform/ops/role.d.ts +4 -0
  649. package/dist/platform/ops/role.js +10 -0
  650. package/dist/platform/ops/setup.ops.d.ts +24 -0
  651. package/dist/platform/ops/setup.ops.js +212 -0
  652. package/dist/platform/ops/skills.ops.d.ts +17 -0
  653. package/dist/platform/ops/skills.ops.js +160 -0
  654. package/dist/platform/ops/summary.d.ts +10 -0
  655. package/dist/platform/ops/summary.js +18 -0
  656. package/dist/platform/ops/themes.ops.d.ts +14 -0
  657. package/dist/platform/ops/themes.ops.js +47 -0
  658. package/dist/platform/ops/ui.ops.d.ts +8 -0
  659. package/dist/platform/ops/ui.ops.js +41 -0
  660. package/dist/platform/ops/unavailable.d.ts +23 -0
  661. package/dist/platform/ops/unavailable.js +118 -0
  662. package/dist/platform/parity.d.ts +33 -0
  663. package/dist/platform/parity.js +272 -0
  664. package/dist/platform/platform-ops.module.d.ts +43 -0
  665. package/dist/platform/platform-ops.module.js +142 -0
  666. package/dist/platform/platform.module.d.ts +8 -0
  667. package/dist/platform/platform.module.js +25 -0
  668. package/dist/platform/registry.d.ts +30 -0
  669. package/dist/platform/registry.js +111 -0
  670. package/dist/platform/route-schemas.d.ts +18 -0
  671. package/dist/platform/route-schemas.js +85 -0
  672. package/dist/roles/gateway-role.d.ts +18 -3
  673. package/dist/roles/gateway-role.js +33 -5
  674. package/dist/roles/gateway.module.d.ts +2 -1
  675. package/dist/roles/gateway.module.js +6 -3
  676. package/dist/roles/worker-role.d.ts +6 -4
  677. package/dist/roles/worker-role.js +14 -7
  678. package/dist/roles/worker.module.d.ts +1 -1
  679. package/dist/roles/worker.module.js +21 -1
  680. package/dist/runtime/context/build.d.ts +21 -13
  681. package/dist/runtime/context/build.js +106 -29
  682. package/dist/runtime/context/claude-tools.d.ts +4 -1
  683. package/dist/runtime/context/claude-tools.js +13 -12
  684. package/dist/runtime/context/compaction.js +24 -1
  685. package/dist/runtime/context/device-paths.d.ts +40 -0
  686. package/dist/runtime/context/device-paths.js +48 -0
  687. package/dist/runtime/context/legacy-text.d.ts +22 -0
  688. package/dist/runtime/context/legacy-text.js +37 -0
  689. package/dist/runtime/context/reminders.d.ts +2 -0
  690. package/dist/runtime/context/reminders.js +2 -0
  691. package/dist/runtime/context/run-context.d.ts +65 -0
  692. package/dist/runtime/context/run-context.js +215 -0
  693. package/dist/runtime/context/skills.d.ts +29 -11
  694. package/dist/runtime/context/skills.js +46 -32
  695. package/dist/runtime/context/tool-changes.d.ts +27 -0
  696. package/dist/runtime/context/tool-changes.js +60 -0
  697. package/dist/runtime/hook-calls.d.ts +8 -1
  698. package/dist/runtime/hook-calls.js +40 -7
  699. package/dist/runtime/langgraph-loop.d.ts +3 -1
  700. package/dist/runtime/langgraph-loop.js +36 -17
  701. package/dist/runtime/loop.d.ts +35 -6
  702. package/dist/runtime/maintenance.d.ts +9 -4
  703. package/dist/runtime/maintenance.js +35 -8
  704. package/dist/runtime/model-call.d.ts +54 -11
  705. package/dist/runtime/model-call.js +105 -28
  706. package/dist/runtime/providers.d.ts +149 -29
  707. package/dist/runtime/providers.js +332 -63
  708. package/dist/runtime/run-context.service.d.ts +65 -0
  709. package/dist/runtime/run-context.service.js +236 -0
  710. package/dist/runtime/run-control.d.ts +11 -1
  711. package/dist/runtime/run-control.js +12 -0
  712. package/dist/runtime/run-drafts.d.ts +85 -0
  713. package/dist/runtime/run-drafts.js +230 -0
  714. package/dist/runtime/run-finish.d.ts +1 -1
  715. package/dist/runtime/run-jobs.d.ts +3 -5
  716. package/dist/runtime/run-jobs.js +7 -9
  717. package/dist/runtime/run-queue.d.ts +62 -5
  718. package/dist/runtime/run-queue.js +313 -40
  719. package/dist/runtime/run-worker.d.ts +19 -8
  720. package/dist/runtime/run-worker.js +105 -44
  721. package/dist/runtime/runtime.module.js +13 -3
  722. package/dist/runtime/step-log.d.ts +15 -4
  723. package/dist/runtime/step-log.js +24 -7
  724. package/dist/runtime/stream.controller.d.ts +23 -1
  725. package/dist/runtime/stream.controller.js +60 -3
  726. package/dist/runtime/stream.d.ts +4 -1
  727. package/dist/runtime/stream.js +27 -3
  728. package/dist/runtime/subagents/child.d.ts +55 -7
  729. package/dist/runtime/subagents/child.js +105 -7
  730. package/dist/runtime/subagents/definition.d.ts +31 -26
  731. package/dist/runtime/subagents/definition.js +89 -142
  732. package/dist/runtime/subagents/deliveries.d.ts +71 -0
  733. package/dist/runtime/subagents/deliveries.js +228 -0
  734. package/dist/runtime/subagents/dispatch.d.ts +116 -27
  735. package/dist/runtime/subagents/dispatch.js +213 -142
  736. package/dist/runtime/subagents/limits.d.ts +24 -5
  737. package/dist/runtime/subagents/limits.js +40 -6
  738. package/dist/runtime/subagents/messages.d.ts +95 -0
  739. package/dist/runtime/subagents/messages.js +328 -0
  740. package/dist/runtime/subagents/org-agents.js +2 -1
  741. package/dist/runtime/subagents/preamble.d.ts +4 -4
  742. package/dist/runtime/subagents/preamble.js +9 -7
  743. package/dist/runtime/subagents/progress.d.ts +8 -6
  744. package/dist/runtime/subagents/progress.js +11 -6
  745. package/dist/runtime/subagents/render.d.ts +30 -0
  746. package/dist/runtime/subagents/render.js +53 -0
  747. package/dist/runtime/subagents/roster.d.ts +25 -8
  748. package/dist/runtime/subagents/roster.js +48 -12
  749. package/dist/runtime/subagents/skill-fork.d.ts +4 -3
  750. package/dist/runtime/subagents/skill-fork.js +9 -5
  751. package/dist/runtime/subagents/status.d.ts +14 -0
  752. package/dist/runtime/subagents/status.js +23 -0
  753. package/dist/runtime/subagents/subagents.service.d.ts +9 -6
  754. package/dist/runtime/subagents/subagents.service.js +13 -8
  755. package/dist/runtime/usage-report-jobs.d.ts +88 -0
  756. package/dist/runtime/usage-report-jobs.js +158 -0
  757. package/dist/runtime/usage-report.d.ts +35 -39
  758. package/dist/runtime/usage-report.js +171 -97
  759. package/dist/runtime/waits.d.ts +148 -39
  760. package/dist/runtime/waits.js +426 -112
  761. package/dist/sandbox/jobs.d.ts +40 -13
  762. package/dist/sandbox/jobs.js +57 -20
  763. package/dist/sandbox/leases.d.ts +37 -54
  764. package/dist/sandbox/leases.js +71 -115
  765. package/dist/sandbox/providers.d.ts +34 -7
  766. package/dist/sandbox/providers.js +54 -9
  767. package/dist/sandbox/sandbox-file-reader.d.ts +35 -0
  768. package/dist/sandbox/sandbox-file-reader.js +98 -0
  769. package/dist/sandbox/sandbox.module.d.ts +3 -2
  770. package/dist/sandbox/sandbox.module.js +10 -4
  771. package/dist/sandbox/sandbox.service.d.ts +345 -132
  772. package/dist/sandbox/sandbox.service.js +883 -399
  773. package/dist/sandbox/unreachable.d.ts +30 -0
  774. package/dist/sandbox/unreachable.js +108 -0
  775. package/dist/setup/kernel-checks.d.ts +91 -0
  776. package/dist/setup/kernel-checks.js +295 -0
  777. package/dist/setup/oauth-token-probe.d.ts +47 -0
  778. package/dist/setup/oauth-token-probe.js +108 -0
  779. package/dist/setup/redact-check.d.ts +18 -0
  780. package/dist/setup/redact-check.js +46 -0
  781. package/dist/setup/setup-check-registry.d.ts +86 -0
  782. package/dist/setup/setup-check-registry.js +75 -0
  783. package/dist/setup/setup-checks.controller.d.ts +28 -0
  784. package/dist/setup/setup-checks.controller.js +78 -0
  785. package/dist/setup/setup-checks.schemas.d.ts +38 -0
  786. package/dist/setup/setup-checks.schemas.js +43 -0
  787. package/dist/setup/setup-checks.service.d.ts +144 -0
  788. package/dist/setup/setup-checks.service.js +683 -0
  789. package/dist/setup/setup-guides.controller.d.ts +18 -0
  790. package/dist/setup/setup-guides.controller.js +48 -0
  791. package/dist/setup/setup-guides.schemas.d.ts +10 -0
  792. package/dist/setup/setup-guides.schemas.js +6 -0
  793. package/dist/setup/setup-guides.service.d.ts +126 -0
  794. package/dist/setup/setup-guides.service.js +315 -0
  795. package/dist/setup/setup.module.d.ts +8 -0
  796. package/dist/setup/setup.module.js +31 -0
  797. package/dist/skills/agent-skills.controller.d.ts +48 -0
  798. package/dist/skills/agent-skills.controller.js +131 -0
  799. package/dist/skills/agent-skills.service.d.ts +262 -0
  800. package/dist/skills/agent-skills.service.js +996 -0
  801. package/dist/skills/catalog.d.ts +14 -11
  802. package/dist/skills/catalog.js +32 -50
  803. package/dist/skills/changes.controller.d.ts +12 -22
  804. package/dist/skills/changes.controller.js +27 -56
  805. package/dist/skills/changes.service.d.ts +69 -115
  806. package/dist/skills/changes.service.js +249 -598
  807. package/dist/skills/conversation-catalog.d.ts +53 -0
  808. package/dist/skills/conversation-catalog.js +149 -0
  809. package/dist/skills/invocable.controller.d.ts +1 -1
  810. package/dist/skills/invocable.controller.js +2 -2
  811. package/dist/skills/invocation-keys.d.ts +1 -1
  812. package/dist/skills/invocation-keys.js +1 -1
  813. package/dist/skills/invoke.d.ts +3 -3
  814. package/dist/skills/invoke.js +21 -8
  815. package/dist/skills/package.d.ts +15 -1
  816. package/dist/skills/package.js +14 -1
  817. package/dist/skills/skills.controller.d.ts +32 -6
  818. package/dist/skills/skills.controller.js +64 -11
  819. package/dist/skills/skills.module.js +25 -3
  820. package/dist/skills/skills.schemas.d.ts +44 -0
  821. package/dist/skills/skills.schemas.js +68 -0
  822. package/dist/skills/skills.service.d.ts +123 -26
  823. package/dist/skills/skills.service.js +493 -76
  824. package/dist/skills/usable.d.ts +82 -0
  825. package/dist/skills/usable.js +388 -0
  826. package/dist/themes/render-css.d.ts +13 -0
  827. package/dist/themes/render-css.js +135 -0
  828. package/dist/themes/theme-delivery.service.d.ts +36 -0
  829. package/dist/themes/theme-delivery.service.js +116 -0
  830. package/dist/themes/theme-state.d.ts +116 -0
  831. package/dist/themes/theme-state.js +221 -0
  832. package/dist/themes/theme-usage.d.ts +61 -0
  833. package/dist/themes/theme-usage.js +98 -0
  834. package/dist/themes/themes-public.controller.d.ts +33 -0
  835. package/dist/themes/themes-public.controller.js +98 -0
  836. package/dist/themes/themes.controller.d.ts +13 -0
  837. package/dist/themes/themes.controller.js +38 -0
  838. package/dist/themes/themes.module.d.ts +3 -0
  839. package/dist/themes/themes.module.js +21 -0
  840. package/dist/themes/themes.schemas.d.ts +3 -0
  841. package/dist/themes/themes.schemas.js +2 -0
  842. package/dist/themes/themes.service.d.ts +50 -0
  843. package/dist/themes/themes.service.js +99 -0
  844. package/dist/time-zone.d.ts +5 -0
  845. package/dist/time-zone.js +19 -0
  846. package/dist/tools/admin-connectors.d.ts +69 -0
  847. package/dist/tools/admin-connectors.js +135 -0
  848. package/dist/tools/approvals.controller.js +2 -3
  849. package/dist/tools/approvals.schemas.d.ts +21 -0
  850. package/dist/tools/approvals.schemas.js +15 -0
  851. package/dist/tools/approvals.service.d.ts +26 -2
  852. package/dist/tools/approvals.service.js +44 -5
  853. package/dist/tools/builtin-names.d.ts +104 -0
  854. package/dist/tools/builtin-names.js +164 -0
  855. package/dist/tools/builtins/agent.d.ts +27 -25
  856. package/dist/tools/builtins/agent.js +66 -63
  857. package/dist/tools/builtins/ask-user.d.ts +1 -1
  858. package/dist/tools/builtins/ask-user.js +5 -4
  859. package/dist/tools/builtins/builtin-tools.d.ts +23 -4
  860. package/dist/tools/builtins/builtin-tools.js +78 -12
  861. package/dist/tools/builtins/current-time.d.ts +26 -0
  862. package/dist/tools/builtins/current-time.js +99 -0
  863. package/dist/tools/builtins/handback.d.ts +28 -0
  864. package/dist/tools/builtins/handback.js +53 -0
  865. package/dist/tools/builtins/platform.d.ts +51 -0
  866. package/dist/tools/builtins/platform.js +451 -0
  867. package/dist/tools/builtins/read-tool-output.d.ts +1 -1
  868. package/dist/tools/builtins/read-tool-output.js +2 -2
  869. package/dist/tools/builtins/sandbox/bash.d.ts +5 -5
  870. package/dist/tools/builtins/sandbox/bash.js +291 -39
  871. package/dist/tools/builtins/sandbox/common.d.ts +135 -36
  872. package/dist/tools/builtins/sandbox/common.js +222 -62
  873. package/dist/tools/builtins/sandbox/deliver.d.ts +1 -1
  874. package/dist/tools/builtins/sandbox/deliver.js +19 -16
  875. package/dist/tools/builtins/sandbox/edit.d.ts +1 -1
  876. package/dist/tools/builtins/sandbox/edit.js +64 -50
  877. package/dist/tools/builtins/sandbox/file-state.d.ts +34 -0
  878. package/dist/tools/builtins/sandbox/file-state.js +34 -0
  879. package/dist/tools/builtins/sandbox/glob-match.d.ts +1 -1
  880. package/dist/tools/builtins/sandbox/glob-match.js +1 -1
  881. package/dist/tools/builtins/sandbox/glob.d.ts +1 -1
  882. package/dist/tools/builtins/sandbox/glob.js +17 -12
  883. package/dist/tools/builtins/sandbox/grep.d.ts +7 -4
  884. package/dist/tools/builtins/sandbox/grep.js +153 -34
  885. package/dist/tools/builtins/sandbox/index.d.ts +9 -5
  886. package/dist/tools/builtins/sandbox/index.js +13 -5
  887. package/dist/tools/builtins/sandbox/read.d.ts +2 -2
  888. package/dist/tools/builtins/sandbox/read.js +29 -19
  889. package/dist/tools/builtins/sandbox/task-output.d.ts +79 -0
  890. package/dist/tools/builtins/sandbox/task-output.js +334 -0
  891. package/dist/tools/builtins/sandbox/task-stop.d.ts +10 -0
  892. package/dist/tools/builtins/sandbox/task-stop.js +113 -0
  893. package/dist/tools/builtins/sandbox/write.d.ts +1 -1
  894. package/dist/tools/builtins/sandbox/write.js +51 -44
  895. package/dist/tools/builtins/send-message.d.ts +56 -0
  896. package/dist/tools/builtins/send-message.js +100 -0
  897. package/dist/tools/builtins/skill-load.d.ts +29 -18
  898. package/dist/tools/builtins/skill-load.js +125 -73
  899. package/dist/tools/builtins/tool-search.d.ts +13 -9
  900. package/dist/tools/builtins/tool-search.js +25 -14
  901. package/dist/tools/builtins/web/errors.d.ts +8 -0
  902. package/dist/tools/builtins/web/errors.js +53 -0
  903. package/dist/tools/builtins/web/extract.d.ts +62 -0
  904. package/dist/tools/builtins/web/extract.js +271 -0
  905. package/dist/tools/builtins/web/fetch.d.ts +55 -0
  906. package/dist/tools/builtins/web/fetch.js +175 -0
  907. package/dist/tools/builtins/web/index.d.ts +13 -0
  908. package/dist/tools/builtins/web/index.js +12 -0
  909. package/dist/tools/builtins/web/page-cache.d.ts +25 -0
  910. package/dist/tools/builtins/web/page-cache.js +77 -0
  911. package/dist/tools/builtins/web/search.d.ts +25 -0
  912. package/dist/tools/builtins/web/search.js +210 -0
  913. package/dist/tools/builtins/web/url.d.ts +17 -0
  914. package/dist/tools/builtins/web/url.js +43 -0
  915. package/dist/tools/connector-account-policies.d.ts +51 -0
  916. package/dist/tools/connector-account-policies.js +165 -0
  917. package/dist/tools/connectors.controller.d.ts +74 -9
  918. package/dist/tools/connectors.controller.js +133 -16
  919. package/dist/tools/connectors.schemas.d.ts +27 -0
  920. package/dist/tools/connectors.schemas.js +34 -0
  921. package/dist/tools/connectors.service.d.ts +101 -8
  922. package/dist/tools/connectors.service.js +266 -28
  923. package/dist/tools/credentials.d.ts +23 -0
  924. package/dist/tools/credentials.js +90 -1
  925. package/dist/tools/display-names.d.ts +9 -0
  926. package/dist/tools/display-names.js +24 -0
  927. package/dist/tools/drift.js +5 -5
  928. package/dist/tools/elicitation.js +1 -1
  929. package/dist/tools/extension-tools.controller.d.ts +14 -0
  930. package/dist/tools/extension-tools.controller.js +37 -0
  931. package/dist/tools/info.d.ts +61 -4
  932. package/dist/tools/info.js +119 -33
  933. package/dist/tools/legacy-data.d.ts +34 -0
  934. package/dist/tools/legacy-data.js +76 -0
  935. package/dist/tools/legacy-keys.d.ts +51 -0
  936. package/dist/tools/legacy-keys.js +114 -0
  937. package/dist/tools/naming.d.ts +1 -5
  938. package/dist/tools/naming.js +1 -7
  939. package/dist/tools/oauth/flow-paths.d.ts +1 -1
  940. package/dist/tools/oauth/flow-paths.js +1 -1
  941. package/dist/tools/oauth/flow.js +1 -1
  942. package/dist/tools/oauth/tokens.d.ts +54 -7
  943. package/dist/tools/oauth/tokens.js +87 -17
  944. package/dist/tools/org-tool-switches.d.ts +89 -0
  945. package/dist/tools/org-tool-switches.js +201 -0
  946. package/dist/tools/outputs.js +1 -1
  947. package/dist/tools/pipeline.d.ts +67 -47
  948. package/dist/tools/pipeline.js +319 -380
  949. package/dist/tools/policy.d.ts +30 -23
  950. package/dist/tools/policy.js +142 -64
  951. package/dist/tools/questions.controller.d.ts +1 -1
  952. package/dist/tools/questions.controller.js +1 -1
  953. package/dist/tools/questions.service.d.ts +23 -2
  954. package/dist/tools/questions.service.js +104 -2
  955. package/dist/tools/registry.d.ts +189 -68
  956. package/dist/tools/registry.js +318 -236
  957. package/dist/tools/resources.d.ts +1 -1
  958. package/dist/tools/resources.js +1 -1
  959. package/dist/tools/tools.module.js +31 -3
  960. package/dist/tools/validate.js +1 -1
  961. package/dist/ui/admin-ui.controller.d.ts +56 -0
  962. package/dist/ui/admin-ui.controller.js +192 -0
  963. package/dist/ui/arrangement.d.ts +65 -0
  964. package/dist/ui/arrangement.js +171 -0
  965. package/dist/ui/embed-token.d.ts +2 -2
  966. package/dist/ui/embed-token.js +30 -5
  967. package/dist/ui/registry.d.ts +42 -17
  968. package/dist/ui/registry.js +46 -14
  969. package/dist/ui/slots.controller.d.ts +11 -0
  970. package/dist/ui/slots.controller.js +25 -0
  971. package/dist/ui/ui-stream.d.ts +20 -3
  972. package/dist/ui/ui-stream.js +25 -7
  973. package/dist/ui/ui.schemas.d.ts +70 -0
  974. package/dist/ui/ui.schemas.js +65 -0
  975. package/dist/ui/views.controller.d.ts +35 -49
  976. package/dist/ui/views.controller.js +48 -70
  977. package/dist/ui/views.d.ts +112 -18
  978. package/dist/ui/views.js +254 -47
  979. package/package.json +6 -3
  980. package/src/migrations/0063_tool_keys_claude_code.sql +220 -0
  981. package/src/migrations/0064_account_last_org.sql +7 -0
  982. package/src/migrations/0065_conversation_archive.sql +8 -0
  983. package/src/migrations/0066_extension_display_name.sql +4 -0
  984. package/src/migrations/0067_agent_profiles.sql +20 -0
  985. package/src/migrations/0068_agent_avatar_uploads.sql +7 -0
  986. package/src/migrations/0069_attachments_agent_idx.sql +3 -0
  987. package/src/migrations/0070_background_tasks.sql +37 -0
  988. package/src/migrations/0071_background_tasks_reserve.sql +6 -0
  989. package/src/migrations/0072_background_tasks_stopping.sql +5 -0
  990. package/src/migrations/0073_org_extension_point_defaults.sql +11 -0
  991. package/src/migrations/0074_subagent_tree.sql +50 -0
  992. package/src/migrations/0075_plugin_scope.sql +61 -0
  993. package/src/migrations/0076_skills_created_by_nullable.sql +6 -0
  994. package/src/migrations/0077_scope_requests.sql +52 -0
  995. package/src/migrations/0078_scope_grant_switches.sql +18 -0
  996. package/src/migrations/0079_scope_live_install_switches.sql +19 -0
  997. package/src/migrations/0080_rename_enterprise_admin.sql +18 -0
  998. package/src/migrations/0081_platform_components.sql +129 -0
  999. package/src/migrations/0082_platform_migration.sql +33 -0
  1000. package/src/migrations/0083_plugin_scope_sync_failures.sql +15 -0
  1001. package/src/migrations/0084_org_owned_items.sql +85 -0
  1002. package/src/migrations/0085_agent_templates_phase4.sql +45 -0
  1003. package/src/migrations/0086_org_layering.sql +30 -0
  1004. package/src/migrations/0087_approval_summary.sql +6 -0
  1005. package/src/migrations/0088_environments.sql +80 -0
  1006. package/src/migrations/0089_model_kinds_usage.sql +38 -0
  1007. package/src/migrations/0090_initial_passwords.sql +27 -0
  1008. package/src/migrations/0091_account_time_zone.sql +4 -0
  1009. package/src/migrations/0092_tools_default_on.sql +27 -0
  1010. package/src/migrations/0093_connected_environments.sql +37 -0
  1011. package/src/migrations/0094_environment_paths_idx.sql +7 -0
  1012. package/src/migrations/0095_environment_files_resets.sql +5 -0
  1013. package/src/migrations/0096_environment_demoted_default.sql +18 -0
  1014. package/src/migrations/0097_extension_installs_enabled_at.sql +16 -0
  1015. package/src/migrations/0098_single_provider_running_first.sql +41 -0
  1016. package/src/migrations/0099_channel_connection_guide_ack.sql +6 -0
  1017. package/src/migrations/0100_catalog_files.sql +13 -0
  1018. package/src/migrations/0101_marketplace_icons.sql +32 -0
  1019. package/src/migrations/0102_themes.sql +64 -0
  1020. package/src/migrations/0103_ui_theme_setting.sql +7 -0
  1021. package/src/migrations/0104_connector_tool_account_policies.sql +16 -0
  1022. package/src/migrations/0105_devices_rename.sql +136 -0
  1023. package/src/migrations/0106_setup_guides_v2.sql +10 -0
  1024. package/src/migrations/0107_extension_client_builds.sql +50 -0
  1025. package/src/migrations/0108_question_skipped.sql +6 -0
  1026. package/src/migrations/0109_audit_platform_idx.sql +5 -0
  1027. package/src/migrations/0110_usage_time_idx.sql +8 -0
  1028. package/src/migrations/0111_agent_skill_sharing.sql +22 -0
  1029. package/src/migrations/0112_skill_share_requests.sql +4 -0
  1030. package/dist/catalog/upgrade-targets.d.ts +0 -56
  1031. package/dist/catalog/upgrade-targets.js +0 -90
  1032. package/dist/conversations/sandbox-status.d.ts +0 -24
  1033. package/dist/conversations/sandbox-status.js +0 -52
  1034. package/dist/extensions/org-config.controller.d.ts +0 -24
  1035. package/dist/extensions/org-config.controller.js +0 -62
  1036. package/dist/tools/builtins/sandbox/names.d.ts +0 -7
  1037. package/dist/tools/builtins/sandbox/names.js +0 -20
  1038. package/dist/tools/builtins/skill-write.d.ts +0 -59
  1039. package/dist/tools/builtins/skill-write.js +0 -244
@@ -12,385 +12,432 @@ import { Inject, Injectable } from "@nestjs/common";
12
12
  import { sql } from "kysely";
13
13
  import { ApiError } from "../errors.js";
14
14
  import { audit } from "../identity/audit.js";
15
- import { EnterpriseAdminLock } from "../identity/enterprise-admin.js";
15
+ import { readOrgMarketplaceBrowse } from "../identity/settings.js";
16
+ import { SuperAdminLock } from "../identity/super-admin.js";
17
+ import { KernelConfigService } from "../infra/config/kernel-config.service.js";
16
18
  import { KernelDb } from "../infra/database/kernel-db.js";
17
19
  import { TransactionHost } from "../infra/database/transaction-host.js";
18
20
  import { Transactional } from "../infra/database/transactional.decorator.js";
21
+ import { LockService } from "../infra/lock/lock.service.js";
22
+ import { WithLock } from "../infra/lock/with-lock.decorator.js";
19
23
  import { OrgLock } from "../orgs/org-lock.js";
20
24
  import { roleAtLeast } from "../orgs/roles.js";
25
+ import { CatalogService } from "./catalog.service.js";
26
+ import { CatalogScopeService } from "./catalog-scope.service.js";
27
+ import { assertEntryNotDeprecated, loadMarketplaceEntry } from "./marketplaces.service.js";
28
+ import { OrgCatalogService } from "./org-catalog.service.js";
29
+ import { PluginImport } from "./plugin-import.js";
30
+ import { itemsSeenBy } from "./scope-state.js";
21
31
  /** 申请列表一次最多返回的条数。 */
22
32
  export const CATALOG_REQUESTS_LIST_MAX = 200;
23
33
  const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
24
34
  const requestNotFound = () => new ApiError("catalog.request_not_found", "Catalog request not found");
25
35
  const itemNotFound = () => new ApiError("catalog.item_not_found", "Catalog item not found");
26
- const itemDisabled = () => new ApiError("catalog.item_disabled", "This catalog item is disabled by the enterprise admin and cannot be newly installed");
27
- /** 在调用方事务里读条目的策略(FOR SHARE:与企业管理员改策略 / 删除互斥)。不存在或已删除 → undefined。 */
28
- async function lockItem(t, itemId) {
29
- if (!UUID_RE.test(itemId))
30
- return undefined;
31
- return t
32
- .selectFrom("catalog_items")
33
- .select(["id", "name", "policy", "deleted_at"])
34
- .where("id", "=", itemId)
35
- .forShare()
36
- .executeTakeFirst();
37
- }
38
- async function hasGrant(db, orgId, itemId) {
39
- const g = await db
40
- .selectFrom("catalog_org_grants")
41
- .select("item_id")
42
- .where("item_id", "=", itemId)
43
- .where("org_id", "=", orgId)
44
- .executeTakeFirst();
45
- return g !== undefined;
46
- }
47
- /**
48
- * Before an org creates a component from the catalog (enabling an extension, creating a connector
49
- * from a template, importing a skill), re-checks the item policy in the caller's transaction (C22):
50
- * deleted or disabled -> `catalog.item_disabled`; needs_approval without an enterprise admin grant
51
- * for this org -> `catalog.approval_required`; allow or granted -> passes. A dependency's
52
- * components pass `approvedBy`, the item the org is installing (spec §10: approval follows the
53
- * installed plugin only): the dependency's own item must still be live and not disabled, and the
54
- * approval is judged by `approvedBy`.
55
- */
56
- export async function assertItemInstallable(t, orgId, itemId, approvedBy = itemId) {
57
- if (approvedBy !== itemId) {
58
- const own = await lockItem(t, itemId);
59
- if (!own || own.deleted_at !== null || own.policy === "disabled")
60
- throw itemDisabled();
61
- }
62
- const item = await lockItem(t, approvedBy);
63
- if (!item || item.deleted_at !== null || item.policy === "disabled")
64
- throw itemDisabled();
65
- if (item.policy === "needs_approval" && !(await hasGrant(t, orgId, approvedBy))) {
66
- throw new ApiError("catalog.approval_required", "This catalog item needs enterprise admin approval before this organization can install it");
67
- }
68
- }
69
- /**
70
- * The extensions among `plugins` whose own catalog item (the non-deleted item with the same name) is
71
- * disabled (FOR SHARE: exclusive with policy changes). A disabled item is a master switch: no path
72
- * (direct enabling, its item, another plugin) can newly enable its extension (Ruling M-5).
73
- */
74
- export async function disabledPluginItems(db, plugins) {
75
- if (plugins.length === 0)
76
- return [];
77
- const rows = await db
78
- .selectFrom("catalog_items")
79
- .select("name")
80
- .where("name", "in", [...plugins])
81
- .where("policy", "=", "disabled")
82
- .where("deleted_at", "is", null)
83
- .orderBy("name")
84
- .forShare()
85
- .execute();
86
- return [...new Set(rows.map((r) => r.name))];
87
- }
88
- /**
89
- * Throws `catalog.item_disabled` when a plugin's own catalog item is disabled (the message names
90
- * the plugin).
91
- */
92
- export function pluginItemDisabled(names) {
93
- return new ApiError("catalog.item_disabled", `The enterprise admin disabled the catalog item of extension ${names.join(", ")}; it cannot be newly enabled, not even through a plugin that bundles it`);
94
- }
95
- /**
96
- * When an org enables an extension directly (not by installing from an item, e.g.
97
- * `PUT /orgs/:orgId/extensions/:extension`), it is judged by every catalog item that brought it into the
98
- * deployment (`extension_catalog_sources`), and **the strictest wins**: any source disabled ->
99
- * `catalog.item_disabled`; otherwise any source needs_approval without a grant of that item to the
100
- * org -> `catalog.approval_required`; all allow / granted -> passes. Deleted items no longer count
101
- * as sources (an enterprise admin deleting an item withdraws its constraint). No source (not
102
- * installed through the catalog) -> not bound by catalog policy.
103
- */
104
- export async function assertPluginSourcesInstallable(t, orgId, plugin) {
105
- const rows = await t
106
- .selectFrom("extension_catalog_sources as s")
107
- .innerJoin("catalog_items as i", "i.id", "s.item_id")
108
- .select(["i.id", "i.policy"])
109
- .where("s.plugin", "=", plugin)
110
- .where("i.deleted_at", "is", null)
111
- .orderBy("i.id")
112
- .forShare("i")
113
- .execute();
114
- if (rows.some((r) => r.policy === "disabled"))
115
- throw itemDisabled();
116
- for (const r of rows) {
117
- if (r.policy === "needs_approval" && !(await hasGrant(t, orgId, r.id))) {
118
- throw new ApiError("catalog.approval_required", "A catalog item that brought this extension in needs enterprise admin approval before this organization can enable it");
119
- }
120
- }
121
- }
122
- /**
123
- * Cancels catalog requests still pending in the caller's transaction (`db` is its handle; when the
124
- * item or the org is deleted), status `cancelled` (the decider is the actor). Each one audits
125
- * `catalog.request_cancelled` (with the reason). Returns how many were cancelled.
126
- */
127
- export async function cancelPendingRequests(db, where, actor, reason, opts = {}) {
128
- let q = db
129
- .updateTable("catalog_requests")
130
- .set({ status: "cancelled", decided_by: actor, decided_at: sql `now()` })
131
- .where("status", "=", "pending");
132
- q =
133
- "itemId" in where ? q.where("item_id", "=", where.itemId) : q.where("org_id", "=", where.orgId);
134
- const rows = await q.returning(["id", "org_id", "item_id", "stage"]).execute();
135
- for (const r of rows) {
136
- await audit(db, {
137
- actorAccountId: actor,
138
- ...(opts.actorTokenId !== undefined && { actorTokenId: opts.actorTokenId }),
139
- orgId: r.org_id,
140
- action: "catalog.request_cancelled",
141
- target: r.id,
142
- detail: { itemId: r.item_id, stage: r.stage, reason },
143
- });
144
- }
145
- return rows.length;
146
- }
36
+ const itemDisabled = () => new ApiError("catalog.item_disabled", "This catalog item is disabled by the super admin and cannot be requested");
37
+ const alreadyDecided = () => new ApiError("catalog.request_decided", "This request has already been decided");
38
+ const pendingExists = () => new ApiError("catalog.request_pending", "This organization already has a pending request of this kind for it");
39
+ /** A unique violation (the partial index of pending requests). */
40
+ const isUniqueViolation = (e) => typeof e === "object" && e !== null && e.code === "23505";
41
+ /** The deployment-level kinds (decided by the super admin). */
42
+ const DEPLOYMENT_KINDS = ["access", "import"];
43
+ /** The org-level kinds (decided by the org admins). */
44
+ const ORG_KINDS = ["enable", "connector_setup"];
147
45
  /**
148
- * Catalog requests and approvals (C22 / F-AF). Two levels:
149
- * - a member request (stage `org`) goes to the org admins' inbox, an org admin (`catalog.decide`)
150
- * approves or rejects it; when the item is needs_approval without a grant for this org, approving
151
- * moves the request to stage `deployment` (still pending) for the enterprise admins to decide;
152
- * - an org admin installing a needs_approval item without a grant -> creates a stage `deployment`
153
- * request (or moves the existing pending one there);
154
- * - an enterprise admin approving a stage `deployment` request -> writes a grant
155
- * (`catalog_org_grants`, valid across versions), after which org admins can install.
156
- * One pending request per org and item (partial unique index; org-side writes all run inside the
157
- * org row lock, in order). No in-process state.
46
+ * Catalog requests under plugin scope (spec §5.1). Three kinds, one pending request per (org,
47
+ * kind, item or entry) (partial unique indexes; org-side writes run inside the org row lock):
48
+ * - `enable`: a member asks the org admins to switch on an item that is off in the org (an
49
+ * `optional` item); an org admin approving it switches the item on, as that admin;
50
+ * - `access`: an org admin asks the super admin for a `named` item shown to orgs outside its
51
+ * list; approving adds the org to the list (`CatalogScopeService.addOrg`), the scope sync then
52
+ * installs it;
53
+ * - `import`: an org admin asks for a marketplace entry not in the catalog (deployment setting
54
+ * `orgMarketplaceBrowse`); approving prepares the import and returns its staging, the request
55
+ * resolves when the super admin confirms it (scope default `named` = the requesting org);
56
+ * - `connector_setup` (ruling P4-7): one per agent (`agent_id`, `pending_keys`), asking the org
57
+ * admins to set up an agent's pending connectors; written by the agents module
58
+ * (`PendingConnectorRequests`), closed by binding (`approved`) or the agent's deletion
59
+ * (`cancelled`); here it is listed and rejected.
60
+ * A rejection stores an optional reason. Decided requests show in the requester's inbox until
61
+ * dismissed. No in-process state.
158
62
  */
159
63
  let CatalogRequestsService = class CatalogRequestsService {
160
64
  kdb;
161
65
  orgLock;
162
66
  adminLock;
67
+ orgCatalog;
68
+ scope;
69
+ catalog;
70
+ config;
71
+ pluginImport;
163
72
  txHost;
73
+ lockService;
164
74
  constructor(kdb,
165
- /** The org row and enterprise admin locks: both join the caller's transaction. */
166
- orgLock, adminLock, txHost) {
75
+ /** The org row and super admin locks: both join the caller's transaction. */
76
+ orgLock, adminLock, orgCatalog, scope, catalog, config, pluginImport, txHost,
77
+ /** Serializes the approvals of one `import` request (`@WithLock`). */
78
+ lockService) {
167
79
  this.kdb = kdb;
168
80
  this.orgLock = orgLock;
169
81
  this.adminLock = adminLock;
82
+ this.orgCatalog = orgCatalog;
83
+ this.scope = scope;
84
+ this.catalog = catalog;
85
+ this.config = config;
86
+ this.pluginImport = pluginImport;
170
87
  this.txHost = txHost;
88
+ this.lockService = lockService;
171
89
  }
172
90
  /** The kernel-schema handle of the current context (the transaction, else the pool). */
173
91
  get db() {
174
92
  return this.kdb.db;
175
93
  }
176
94
  /**
177
- * A member request (`catalog.request`, re-checked inside the org row lock). Item missing /
178
- * deleted -> `catalog.item_not_found`; disabled -> org admins get `catalog.item_disabled`,
179
- * members get `catalog.item_not_found` (members do not see disabled items). An existing pending
180
- * request is returned as is (`created: false`), no new one. Audits `catalog.requested`.
95
+ * A request for a catalog item (`POST /orgs/:orgId/catalog/:itemId/requests`): `enable`
96
+ * (`catalog.request`, members and up) or `access` (`catalog.decide`, org admins), checked first.
97
+ * The item as the org sees it: absent (missing, deleted, hidden, disabled for a member) ->
98
+ * `catalog.item_not_found`; disabled -> `catalog.item_disabled` for an org admin; its extension
99
+ * unable to run on the platform -> `catalog.request_invalid`; `access` needs
100
+ * `not_offered`, `enable` needs `off` (else `catalog.request_invalid`); a pending request of the
101
+ * kind -> `catalog.request_pending`. Audits `catalog.requested`.
181
102
  */
182
- async request(orgId, actor, itemId, input, opts = {}) {
183
- const r = await this.writeRequest(orgId, actor, itemId, input, opts);
184
- return { request: await this.view(r.id), created: r.created };
185
- }
186
- async writeRequest(orgId, actor, itemId, input, opts) {
187
- const t = this.db;
188
- const { role } = await this.orgLock.lockAndAuthorize(orgId, actor, "catalog.request");
189
- const item = await lockItem(t, itemId);
190
- if (!item || item.deleted_at !== null)
103
+ async requestItem(orgId, actor, itemId, input, opts = {}) {
104
+ const action = input.kind === "access" ? "catalog.decide" : "catalog.request";
105
+ await this.authorize(orgId, actor, action);
106
+ if (!UUID_RE.test(itemId))
107
+ throw itemNotFound();
108
+ const [item] = await this.orgCatalog.list(orgId, actor, itemId);
109
+ if (!item)
191
110
  throw itemNotFound();
192
- // 成员看不到 disabled 的条目(列表、详情、图标一致):同样答 not found,不暴露条目存在
193
- if (item.policy === "disabled") {
194
- throw roleAtLeast(role, "admin") ? itemDisabled() : itemNotFound();
111
+ if (item.state === "unavailable" && item.reason === "plugin_disabled")
112
+ throw itemDisabled();
113
+ if (item.state === "unavailable") {
114
+ throw new ApiError("catalog.request_invalid", `This plugin's extension cannot run on the platform now (${item.reason ?? "unavailable"}); only the super admin can fix that`);
115
+ }
116
+ const want = input.kind === "access" ? "not_offered" : "off";
117
+ if (item.state !== want) {
118
+ throw new ApiError("catalog.request_invalid", input.kind === "access"
119
+ ? "This plugin is already offered to this organization"
120
+ : "This plugin is not off in this organization (or not one an org admin switches on)");
195
121
  }
196
- const existing = await this.pendingRow(orgId, itemId);
122
+ const id = await this.writeItemRequest(orgId, actor, item.name, itemId, input, opts);
123
+ return this.view(id);
124
+ }
125
+ /** The role check alone, before any item error (a member cannot probe items by error codes). */
126
+ async authorize(orgId, actor, action) {
127
+ await this.orgLock.lockAndAuthorize(orgId, actor, action);
128
+ }
129
+ async writeItemRequest(orgId, actor, name, itemId, input, opts) {
130
+ const t = this.db;
131
+ await this.orgLock.lockAndAuthorize(orgId, actor, input.kind === "access" ? "catalog.decide" : "catalog.request");
132
+ const existing = await t
133
+ .selectFrom("catalog_requests")
134
+ .select("id")
135
+ .where("org_id", "=", orgId)
136
+ .where("item_id", "=", itemId)
137
+ .where("kind", "=", input.kind)
138
+ .where("status", "=", "pending")
139
+ .executeTakeFirst();
197
140
  if (existing)
198
- return { id: existing.id, created: false };
141
+ throw pendingExists();
199
142
  const id = randomUUID();
200
- await t
201
- .insertInto("catalog_requests")
202
- .values({
203
- id,
204
- org_id: orgId,
205
- item_id: itemId,
206
- version: input.version ?? null,
207
- stage: "org",
208
- requested_by: actor,
209
- note: input.note ?? "",
210
- })
211
- .execute();
143
+ try {
144
+ await t
145
+ .insertInto("catalog_requests")
146
+ .values({
147
+ id,
148
+ org_id: orgId,
149
+ item_id: itemId,
150
+ kind: input.kind,
151
+ // still written for the old NOT NULL / CHECK, never read
152
+ stage: input.kind === "enable" ? "org" : "deployment",
153
+ requested_by: actor,
154
+ note: input.note ?? "",
155
+ })
156
+ .execute();
157
+ }
158
+ catch (e) {
159
+ if (isUniqueViolation(e))
160
+ throw pendingExists();
161
+ throw e;
162
+ }
212
163
  await audit(t, {
213
164
  actorAccountId: actor,
214
165
  ...(opts.actorTokenId !== undefined && { actorTokenId: opts.actorTokenId }),
215
166
  orgId,
216
167
  action: "catalog.requested",
217
168
  target: id,
218
- detail: { itemId, name: item.name, stage: "org" },
169
+ detail: { itemId, name, kind: input.kind, ...opts.auditDetail },
219
170
  });
220
- return { id, created: true };
221
- }
222
- pendingRow(orgId, itemId) {
223
- return this.db
224
- .selectFrom("catalog_requests")
225
- .select(["id", "stage"])
226
- .where("org_id", "=", orgId)
227
- .where("item_id", "=", itemId)
228
- .where("status", "=", "pending")
229
- .executeTakeFirst();
171
+ return id;
230
172
  }
231
173
  /**
232
- * An org admin installing a needs_approval item without a grant: in the caller's transaction (the
233
- * caller has locked the org row and re-checked the role) creates a stage `deployment` request; an
234
- * existing pending request is moved to deployment (a member request goes to the enterprise admins
235
- * with it). Returns the request id. Audits `catalog.requested`.
174
+ * An org admin asks for a marketplace entry to be imported (`POST /orgs/:orgId/
175
+ * marketplace-requests`, `catalog.decide`). The deployment setting `orgMarketplaceBrowse` off ->
176
+ * `catalog.marketplace_browse_disabled`; the marketplace or the entry / version missing ->
177
+ * `marketplace.not_found` / `marketplace.entry_not_found`; a deprecated version ->
178
+ * `marketplace.entry_deprecated`; a live item of that name ->
179
+ * `catalog.request_invalid` (ask for access instead) when the org can see or request that item
180
+ * (a hidden one is not revealed: the request is accepted); a pending request for the entry ->
181
+ * `catalog.request_pending`. Audits `catalog.requested`.
236
182
  */
237
- async requestDeployment(orgId, actor, item, version, opts = {}) {
183
+ async requestImport(orgId, actor, input, opts = {}) {
184
+ const id = await this.writeImportRequest(orgId, actor, input, opts);
185
+ return this.view(id);
186
+ }
187
+ async writeImportRequest(orgId, actor, input, opts) {
238
188
  const t = this.db;
239
- const existing = await this.pendingRow(orgId, item.id);
240
- if (existing) {
241
- if (existing.stage === "org") {
242
- await t
243
- .updateTable("catalog_requests")
244
- .set({ stage: "deployment", org_decided_by: actor, org_decided_at: sql `now()` })
245
- .where("id", "=", existing.id)
246
- .execute();
247
- await audit(t, {
248
- actorAccountId: actor,
249
- ...(opts.actorTokenId !== undefined && { actorTokenId: opts.actorTokenId }),
250
- orgId,
251
- action: "catalog.request_decided",
252
- target: existing.id,
253
- detail: { itemId: item.id, decision: "approve", stage: "org", escalated: true },
254
- });
255
- }
256
- return existing.id;
189
+ await this.orgLock.lockAndAuthorize(orgId, actor, "catalog.decide");
190
+ if (!(await readOrgMarketplaceBrowse(t))) {
191
+ throw new ApiError("catalog.marketplace_browse_disabled", "Organizations cannot browse the marketplaces or request imports in this deployment");
257
192
  }
193
+ const { entry } = await loadMarketplaceEntry(t, this.config.get(), input.marketplaceId, input.name, input.version);
194
+ assertEntryNotDeprecated(entry);
195
+ const live = await t
196
+ .selectFrom("catalog_items")
197
+ .select("id")
198
+ .where("name", "=", input.name)
199
+ .where("deleted_at", "is", null)
200
+ .executeTakeFirst();
201
+ // Only an item the org can see or request is named back to it; a hidden `named` item stays
202
+ // unknown and the request is accepted (approving it adds the org to that item's list)
203
+ if (live && (await itemsSeenBy(t, orgId, [live.id])).has(live.id)) {
204
+ throw new ApiError("catalog.request_invalid", `Plugin ${input.name} is already in the catalog; request access to it instead`);
205
+ }
206
+ const existing = await t
207
+ .selectFrom("catalog_requests")
208
+ .select("id")
209
+ .where("org_id", "=", orgId)
210
+ .where("kind", "=", "import")
211
+ .where("marketplace_id", "=", input.marketplaceId)
212
+ .where("entry_name", "=", input.name)
213
+ .where("status", "=", "pending")
214
+ .executeTakeFirst();
215
+ if (existing)
216
+ throw pendingExists();
258
217
  const id = randomUUID();
259
- await t
260
- .insertInto("catalog_requests")
261
- .values({
262
- id,
263
- org_id: orgId,
264
- item_id: item.id,
265
- version,
266
- stage: "deployment",
267
- requested_by: actor,
268
- })
269
- .execute();
218
+ try {
219
+ await t
220
+ .insertInto("catalog_requests")
221
+ .values({
222
+ id,
223
+ org_id: orgId,
224
+ item_id: null,
225
+ kind: "import",
226
+ stage: "deployment",
227
+ marketplace_id: input.marketplaceId,
228
+ entry_name: input.name,
229
+ entry_version: input.version,
230
+ requested_by: actor,
231
+ note: input.note ?? "",
232
+ })
233
+ .execute();
234
+ }
235
+ catch (e) {
236
+ if (isUniqueViolation(e))
237
+ throw pendingExists();
238
+ throw e;
239
+ }
270
240
  await audit(t, {
271
241
  actorAccountId: actor,
272
242
  ...(opts.actorTokenId !== undefined && { actorTokenId: opts.actorTokenId }),
273
243
  orgId,
274
244
  action: "catalog.requested",
275
245
  target: id,
276
- detail: { itemId: item.id, name: item.name, stage: "deployment" },
246
+ detail: {
247
+ kind: "import",
248
+ marketplaceId: input.marketplaceId,
249
+ name: input.name,
250
+ version: input.version,
251
+ ...opts.auditDetail,
252
+ },
277
253
  });
278
254
  return id;
279
255
  }
280
256
  /**
281
- * 安装成功后:本组织该条目仍 pending 的申请(成员申请 stage org,以及之前因 needs_approval 建的 stage deployment
282
- * 申请——条目之后改成 allow 再装的就不会一直挂着)标为 approved(安装者即决定人),收件箱与企业管理员列表随之清空。
283
- * 在调用方事务里执行。
284
- */
285
- async resolveByInstall(orgId, itemId, actor, opts = {}) {
286
- const t = this.db;
287
- const rows = await t
288
- .updateTable("catalog_requests")
289
- .set({ status: "approved", decided_by: actor, decided_at: sql `now()` })
290
- .where("org_id", "=", orgId)
291
- .where("item_id", "=", itemId)
292
- .where("status", "=", "pending")
293
- .returning(["id", "stage"])
294
- .execute();
295
- for (const r of rows) {
296
- await audit(t, {
297
- actorAccountId: actor,
298
- ...(opts.actorTokenId !== undefined && { actorTokenId: opts.actorTokenId }),
299
- orgId,
300
- action: "catalog.request_decided",
301
- target: r.id,
302
- detail: { itemId, decision: "approve", stage: r.stage, installed: true },
303
- });
304
- }
305
- }
306
- /**
307
- * An org admin decides a member request (`catalog.decide`, re-checked inside the org row lock;
308
- * the request row FOR UPDATE). Not this org's request -> `catalog.request_not_found`; already
309
- * decided or handed to the enterprise admins -> `catalog.request_decided`. On approval: item
310
- * deleted or disabled -> `catalog.item_disabled`; needs_approval without a grant -> moved to stage
311
- * deployment (still pending); otherwise approved. Audits `catalog.request_decided`.
257
+ * An org admin decides a member's `enable` or `connector_setup` request (`catalog.decide`). Not
258
+ * this org's request of those kinds -> `catalog.request_not_found`; decided ->
259
+ * `catalog.request_decided`. Approving an `enable` request switches the item on in the org as the
260
+ * deciding admin ({@link OrgCatalogService.setSwitch}: its errors, e.g. inputs the install
261
+ * needs, leave the request pending); the install itself resolves the request. A
262
+ * `connector_setup` request is approved only by binding its connectors (ruling P4-T6-6):
263
+ * approving it -> `catalog.request_invalid`. Rejecting stores the reason. Audits
264
+ * `catalog.request_decided`.
312
265
  */
313
266
  async decideOrg(orgId, actor, requestId, decision, opts = {}) {
314
267
  if (!UUID_RE.test(requestId))
315
268
  throw requestNotFound();
316
- await this.writeDecideOrg(orgId, actor, requestId, decision, opts);
269
+ if (decision.approve) {
270
+ const itemId = await this.pendingOrgRequest(orgId, actor, requestId);
271
+ await this.orgCatalog.setSwitch(orgId, actor, itemId, { enabled: true }, opts.actorTokenId);
272
+ }
273
+ await this.writeDecision(requestId, actor, decision, opts, { orgId });
317
274
  return this.view(requestId);
318
275
  }
319
- async writeDecideOrg(orgId, actor, requestId, decision, opts) {
320
- const t = this.db;
276
+ /** The item of a pending `enable` request of the org (the decider re-checked). */
277
+ async pendingOrgRequest(orgId, actor, requestId) {
321
278
  await this.orgLock.lockAndAuthorize(orgId, actor, "catalog.decide");
322
- const row = await t
279
+ const row = await this.db
323
280
  .selectFrom("catalog_requests")
324
- .select(["id", "item_id", "stage", "status"])
281
+ .select(["item_id", "status", "kind"])
325
282
  .where("id", "=", requestId)
326
283
  .where("org_id", "=", orgId)
327
- .forUpdate()
284
+ .where("kind", "in", [...ORG_KINDS])
328
285
  .executeTakeFirst();
329
286
  if (!row)
330
287
  throw requestNotFound();
331
- if (row.status !== "pending" || row.stage !== "org") {
332
- throw new ApiError("catalog.request_decided", row.status === "pending"
333
- ? "This request is waiting for the enterprise admin"
334
- : "This request has already been decided");
288
+ if (row.status !== "pending")
289
+ throw alreadyDecided();
290
+ if (row.kind === "connector_setup") {
291
+ throw new ApiError("catalog.request_invalid", "A connector setup request is resolved by binding the agent's connectors; reject it to refuse");
335
292
  }
336
- let escalated = false;
337
- if (decision === "approve") {
338
- const item = await lockItem(t, row.item_id);
339
- if (!item || item.deleted_at !== null || item.policy === "disabled")
340
- throw itemDisabled();
341
- escalated = item.policy === "needs_approval" && !(await hasGrant(t, orgId, row.item_id));
293
+ if (row.item_id === null)
294
+ throw requestNotFound();
295
+ return row.item_id;
296
+ }
297
+ /**
298
+ * A super admin decides an `access` or `import` request (re-checked inside the super
299
+ * admin lock; the request row FOR UPDATE). Missing or an `enable` request ->
300
+ * `catalog.request_not_found`; decided -> `catalog.request_decided`. Approving `access`: the item
301
+ * deleted or disabled -> `catalog.item_disabled`, the org deleted -> not found; otherwise the org
302
+ * joins the item's `named` list. Approving `import` prepares the import of the entry and returns
303
+ * it; the request stays pending, linked to the staging, until that confirm commits (approving
304
+ * again prepares a new one). Audits `catalog.request_decided` (`catalog.request_import_prepared`
305
+ * for an import's approval).
306
+ */
307
+ async decideDeployment(actor, requestId, decision, opts = {}) {
308
+ if (!UUID_RE.test(requestId))
309
+ throw requestNotFound();
310
+ const row = await this.pendingDeploymentRequest(actor, requestId);
311
+ if (decision.approve && row.kind === "import")
312
+ return this.approveImport(actor, requestId, opts);
313
+ await this.writeDecision(requestId, actor, decision, opts, { deployment: true });
314
+ return { request: await this.view(requestId) };
315
+ }
316
+ /**
317
+ * Approves an `import` request, one approval of a request at a time (across replicas): an item
318
+ * of the entry's name that holds the requested version already (one hidden from the org, which
319
+ * is why the request was accepted) -> the org joins its `named` list at once, nothing imported;
320
+ * a staging linked by an earlier approval and not expired -> that staging again; otherwise the
321
+ * import is prepared and linked. The confirm of a staging adds the org to an item that exists by
322
+ * then (`PluginImport.commit`).
323
+ */
324
+ async approveImport(actor, requestId, opts) {
325
+ const row = await this.pendingDeploymentRequest(actor, requestId);
326
+ if (row.marketplace_id === null || row.entry_name === null) {
327
+ throw new ApiError("catalog.request_invalid", "The marketplace of this request was deleted; reject it");
342
328
  }
343
- await t
329
+ const existing = await this.db
330
+ .selectFrom("catalog_items as i")
331
+ .innerJoin("catalog_item_versions as v", "v.item_id", "i.id")
332
+ .select("i.id")
333
+ .where("i.name", "=", row.entry_name)
334
+ .where("i.deleted_at", "is", null)
335
+ .where("v.version", "=", row.entry_version ?? "")
336
+ .executeTakeFirst();
337
+ if (existing) {
338
+ await this.writeDecision(requestId, actor, { approve: true }, opts, {
339
+ deployment: true,
340
+ grantItem: existing.id,
341
+ });
342
+ return { request: await this.view(requestId) };
343
+ }
344
+ if (row.staging_id !== null) {
345
+ const staged = await this.pluginImport.staged(row.staging_id).catch(() => undefined);
346
+ if (staged) {
347
+ return {
348
+ request: await this.view(requestId),
349
+ import: {
350
+ stagingId: staged.stagingId,
351
+ review: staged.review,
352
+ permissionsMismatch: staged.permissionsMismatch ?? null,
353
+ },
354
+ };
355
+ }
356
+ }
357
+ const prepared = await this.catalog.importFromMarketplace(actor, {
358
+ marketplaceId: row.marketplace_id,
359
+ name: row.entry_name,
360
+ ...(row.entry_version !== null && { version: row.entry_version }),
361
+ }, opts);
362
+ await this.linkStaging(actor, requestId, prepared.stagingId, opts);
363
+ return { request: await this.view(requestId), import: prepared };
364
+ }
365
+ /** A pending `access` / `import` request (the row locked; the super admin re-checked). */
366
+ async pendingDeploymentRequest(actor, requestId) {
367
+ await this.adminLock.lockAndAuthorize(actor);
368
+ const row = await this.db
369
+ .selectFrom("catalog_requests")
370
+ .select(["kind", "status", "marketplace_id", "entry_name", "entry_version", "staging_id"])
371
+ .where("id", "=", requestId)
372
+ .where("kind", "in", [...DEPLOYMENT_KINDS])
373
+ .forUpdate()
374
+ .executeTakeFirst();
375
+ if (!row)
376
+ throw requestNotFound();
377
+ if (row.status !== "pending")
378
+ throw alreadyDecided();
379
+ return row;
380
+ }
381
+ /** Links a still pending `import` request to its prepared staging. */
382
+ async linkStaging(actor, requestId, stagingId, opts) {
383
+ await this.adminLock.lockAndAuthorize(actor);
384
+ const row = await this.db
385
+ .selectFrom("catalog_requests")
386
+ .select(["org_id", "status", "entry_name"])
387
+ .where("id", "=", requestId)
388
+ .forUpdate()
389
+ .executeTakeFirstOrThrow();
390
+ if (row.status !== "pending")
391
+ throw alreadyDecided();
392
+ await this.db
344
393
  .updateTable("catalog_requests")
345
- .set(escalated
346
- ? { stage: "deployment", org_decided_by: actor, org_decided_at: sql `now()` }
347
- : {
348
- status: decision === "approve" ? "approved" : "rejected",
349
- decided_by: actor,
350
- decided_at: sql `now()`,
351
- })
394
+ .set({ staging_id: stagingId })
352
395
  .where("id", "=", requestId)
353
396
  .execute();
354
- await audit(t, {
397
+ await audit(this.db, {
355
398
  actorAccountId: actor,
356
399
  ...(opts.actorTokenId !== undefined && { actorTokenId: opts.actorTokenId }),
357
- orgId,
358
- action: "catalog.request_decided",
400
+ orgId: row.org_id,
401
+ action: "catalog.request_import_prepared",
359
402
  target: requestId,
360
- detail: { itemId: row.item_id, decision, stage: "org", escalated },
403
+ detail: { name: row.entry_name, stagingId },
361
404
  });
362
405
  }
363
406
  /**
364
- * An enterprise admin decides a stage deployment request (re-checked inside the enterprise admin
365
- * lock; the request row FOR UPDATE). Missing or still at the org stage ->
366
- * `catalog.request_not_found`; already decided -> `catalog.request_decided`; on approval, item
367
- * deleted or disabled -> `catalog.item_disabled`, the request's org deleted ->
368
- * `catalog.request_not_found`. Approval writes a grant to `catalog_org_grants`. Audits
369
- * `catalog.request_decided` (with orgId).
407
+ * Writes a decision (the request row FOR UPDATE): org side (`orgId`: the org admin re-checked,
408
+ * `enable` only) or deployment side (the super admin re-checked, `access` / `import`). An
409
+ * approval of an `enable` request may find it approved already by the install it triggered.
370
410
  */
371
- async decideDeployment(actor, requestId, decision, opts = {}) {
372
- if (!UUID_RE.test(requestId))
373
- throw requestNotFound();
374
- await this.writeDecideDeployment(actor, requestId, decision, opts);
375
- return this.view(requestId);
376
- }
377
- async writeDecideDeployment(actor, requestId, decision, opts) {
411
+ async writeDecision(requestId, actor, decision, opts, side) {
378
412
  const t = this.db;
379
- await this.adminLock.lockAndAuthorize(actor);
380
- const row = await t
413
+ if ("orgId" in side)
414
+ await this.orgLock.lockAndAuthorize(side.orgId, actor, "catalog.decide");
415
+ else
416
+ await this.adminLock.lockAndAuthorize(actor);
417
+ let q = t
381
418
  .selectFrom("catalog_requests")
382
- .select(["id", "org_id", "item_id", "stage", "status"])
383
- .where("id", "=", requestId)
384
- .forUpdate()
385
- .executeTakeFirst();
386
- if (row?.stage !== "deployment")
419
+ .select(["id", "org_id", "item_id", "kind", "status", "decided_by"])
420
+ .where("id", "=", requestId);
421
+ q =
422
+ "orgId" in side
423
+ ? q.where("org_id", "=", side.orgId).where("kind", "in", [...ORG_KINDS])
424
+ : q.where("kind", "in", [...DEPLOYMENT_KINDS]);
425
+ const row = await q.forUpdate().executeTakeFirst();
426
+ if (!row)
387
427
  throw requestNotFound();
388
428
  if (row.status !== "pending") {
389
- throw new ApiError("catalog.request_decided", "This request has already been decided");
429
+ // The switch-on of this approval already resolved it (the install approves pending requests)
430
+ if (decision.approve && row.kind === "enable" && row.status === "approved")
431
+ return;
432
+ throw alreadyDecided();
390
433
  }
391
- if (decision === "approve") {
392
- const item = await lockItem(t, row.item_id);
393
- if (!item || item.deleted_at !== null || item.policy === "disabled")
434
+ if (decision.approve && row.kind === "access" && row.item_id !== null) {
435
+ const item = await t
436
+ .selectFrom("catalog_items")
437
+ .select(["deleted_at", "disabled"])
438
+ .where("id", "=", row.item_id)
439
+ .executeTakeFirst();
440
+ if (!item || item.deleted_at !== null || item.disabled)
394
441
  throw itemDisabled();
395
442
  const org = await t
396
443
  .selectFrom("orgs")
@@ -399,16 +446,19 @@ let CatalogRequestsService = class CatalogRequestsService {
399
446
  .executeTakeFirst();
400
447
  if (!org || org.deleted_at !== null)
401
448
  throw requestNotFound();
402
- await t
403
- .insertInto("catalog_org_grants")
404
- .values({ item_id: row.item_id, org_id: row.org_id, granted_by: actor })
405
- .onConflict((oc) => oc.columns(["item_id", "org_id"]).doNothing())
406
- .execute();
449
+ await this.scope.addOrg(actor, row.item_id, row.org_id, { ...opts, requestId });
450
+ }
451
+ // An `import` request whose entry is in the catalog already: the org joins that item's list
452
+ const grantItem = "grantItem" in side ? side.grantItem : undefined;
453
+ if (decision.approve && row.kind === "import" && grantItem !== undefined) {
454
+ await this.scope.addOrg(actor, grantItem, row.org_id, { ...opts, requestId });
407
455
  }
408
456
  await t
409
457
  .updateTable("catalog_requests")
410
458
  .set({
411
- status: decision === "approve" ? "approved" : "rejected",
459
+ status: decision.approve ? "approved" : "rejected",
460
+ reason: decision.approve ? null : (decision.reason ?? null),
461
+ ...(grantItem !== undefined && { item_id: grantItem }),
412
462
  decided_by: actor,
413
463
  decided_at: sql `now()`,
414
464
  })
@@ -420,36 +470,62 @@ let CatalogRequestsService = class CatalogRequestsService {
420
470
  orgId: row.org_id,
421
471
  action: "catalog.request_decided",
422
472
  target: requestId,
423
- detail: { itemId: row.item_id, decision, stage: "deployment" },
473
+ detail: {
474
+ itemId: row.item_id,
475
+ kind: row.kind,
476
+ decision: decision.approve ? "approve" : "reject",
477
+ ...(!decision.approve && decision.reason !== undefined && { reason: decision.reason }),
478
+ },
424
479
  });
425
480
  }
426
- /** 企业管理员的申请列表(stage deployment;`status` 缺省 pending),新的在前。 */
481
+ /**
482
+ * The requester dismisses a decided request from the inbox (`POST /orgs/:orgId/
483
+ * catalog-requests/:id/dismiss`). Not the requester's decided request in this org ->
484
+ * `catalog.request_not_found`.
485
+ */
486
+ async dismiss(orgId, accountId, requestId) {
487
+ if (!UUID_RE.test(requestId))
488
+ throw requestNotFound();
489
+ const r = await this.db
490
+ .updateTable("catalog_requests")
491
+ .set({ dismissed_at: sql `now()` })
492
+ .where("id", "=", requestId)
493
+ .where("org_id", "=", orgId)
494
+ .where("requested_by", "=", accountId)
495
+ .where("status", "in", ["approved", "rejected"])
496
+ .where("dismissed_at", "is", null)
497
+ .executeTakeFirst();
498
+ if (r.numUpdatedRows === 0n)
499
+ throw requestNotFound();
500
+ }
501
+ /** 超级管理员的申请列表(`access` / `import`;`status` 缺省 pending),新的在前。 */
427
502
  async listDeployment(q = {}) {
428
503
  const rows = await this.baseQuery()
429
- .where("r.stage", "=", "deployment")
504
+ .where("r.kind", "in", [...DEPLOYMENT_KINDS])
430
505
  .where("r.status", "=", q.status ?? "pending")
431
506
  .where("o.deleted_at", "is", null)
432
507
  .orderBy("r.created_at", "desc")
433
508
  .orderBy("r.id")
434
509
  .limit(CATALOG_REQUESTS_LIST_MAX)
435
510
  .execute();
436
- return rows.map(toView);
511
+ return this.toViews(rows);
437
512
  }
438
- /** 待企业管理员处理的申请数(后台概览)。 */
513
+ /** 待超级管理员处理的申请数(后台概览)。 */
439
514
  async countPendingDeployment() {
440
515
  const r = await this.db
441
516
  .selectFrom("catalog_requests as r")
442
517
  .innerJoin("orgs as o", "o.id", "r.org_id")
443
518
  .select(sql `count(*)`.as("n"))
444
- .where("r.stage", "=", "deployment")
519
+ .where("r.kind", "in", [...DEPLOYMENT_KINDS])
445
520
  .where("r.status", "=", "pending")
446
521
  .where("o.deleted_at", "is", null)
447
522
  .executeTakeFirstOrThrow();
448
523
  return Number(r.n);
449
524
  }
450
525
  /**
451
- * 收件箱:当前用户是本组织管理员(实时读角色)时,返回待他处理的成员申请(stage org、pending),新的在前;
452
- * 否则为空。
526
+ * The inbox: when the account is an org admin of the org (the role read live), the members'
527
+ * pending `enable` requests and the pending `connector_setup` requests, newest first; otherwise
528
+ * none.
453
529
  */
454
530
  async listForOrgAdmin(orgId, accountId) {
455
531
  const m = await this.db
@@ -462,99 +538,210 @@ let CatalogRequestsService = class CatalogRequestsService {
462
538
  return [];
463
539
  const rows = await this.baseQuery()
464
540
  .where("r.org_id", "=", orgId)
465
- .where("r.stage", "=", "org")
541
+ .where("r.kind", "in", [...ORG_KINDS])
466
542
  .where("r.status", "=", "pending")
467
543
  .orderBy("r.created_at", "desc")
468
544
  .orderBy("r.id")
469
545
  .limit(CATALOG_REQUESTS_LIST_MAX)
470
546
  .execute();
471
- return rows.map(toView);
547
+ // A request on an item the org can no longer see (its scope hid it since) is left out, so
548
+ // nothing reveals the item's name to the org; a setup request of a deleted agent too
549
+ const ids = [...new Set(rows.flatMap((r) => (r.item_id !== null ? [r.item_id] : [])))];
550
+ const seen = await itemsSeenBy(this.db, orgId, ids);
551
+ return this.toViews(rows.filter((r) => r.kind === "connector_setup"
552
+ ? r.agent_id !== null && r.agent_deleted_at === null
553
+ : r.item_id !== null && seen.has(r.item_id)));
472
554
  }
473
- /** 本组织各条目最新的一条申请(组织目录列表用)。 */
474
- async latestByItem(orgId) {
475
- const rows = await this.db
476
- .selectFrom("catalog_requests")
477
- .select(["id", "item_id", "stage", "status", "created_at"])
478
- .where("org_id", "=", orgId)
479
- .orderBy("created_at", "asc")
555
+ /** The inbox: the account's decided requests in the org it has not dismissed, newest first. */
556
+ async listDecidedForRequester(orgId, accountId) {
557
+ const rows = await this.baseQuery()
558
+ .where("r.org_id", "=", orgId)
559
+ .where("r.requested_by", "=", accountId)
560
+ .where("r.status", "in", ["approved", "rejected"])
561
+ .where("r.dismissed_at", "is", null)
562
+ .orderBy("r.decided_at", "desc")
563
+ .orderBy("r.id")
564
+ .limit(CATALOG_REQUESTS_LIST_MAX)
565
+ .execute();
566
+ return this.toViews(rows);
567
+ }
568
+ /**
569
+ * The account's own requests in the org, pending and decided (dismissed ones too), newest first;
570
+ * cancelled ones are left out (the Platform tool's `requests.list-mine`).
571
+ */
572
+ async listForRequester(orgId, accountId) {
573
+ const rows = await this.baseQuery()
574
+ .where("r.org_id", "=", orgId)
575
+ .where("r.requested_by", "=", accountId)
576
+ .where("r.status", "in", ["pending", "approved", "rejected"])
577
+ .orderBy("r.created_at", "desc")
578
+ .orderBy("r.id")
579
+ .limit(CATALOG_REQUESTS_LIST_MAX)
480
580
  .execute();
481
- const out = new Map();
482
- for (const r of rows)
483
- out.set(r.item_id, { id: r.id, stage: r.stage, status: r.status });
484
- return out;
581
+ return this.toViews(rows);
485
582
  }
486
583
  async view(id) {
487
584
  const row = await this.baseQuery().where("r.id", "=", id).executeTakeFirst();
488
585
  if (!row)
489
586
  throw requestNotFound();
490
- return toView(row);
587
+ return (await this.toViews([row]))[0];
588
+ }
589
+ /** The views of `rows`, with the display names of the connector templates setup requests name. */
590
+ async toViews(rows) {
591
+ const ids = new Set();
592
+ for (const r of rows) {
593
+ if (r.kind !== "connector_setup")
594
+ continue;
595
+ const def = r.agent_definition;
596
+ for (const c of def?.pendingConnectors ?? []) {
597
+ if ("template" in c.source && UUID_RE.test(c.source.template))
598
+ ids.add(c.source.template);
599
+ }
600
+ }
601
+ const names = new Map();
602
+ if (ids.size > 0) {
603
+ const found = await this.db
604
+ .selectFrom("platform_connector_templates")
605
+ .select(["id", "file"])
606
+ .where("id", "in", [...ids])
607
+ .execute();
608
+ for (const t of found) {
609
+ const dn = t.file?.displayName;
610
+ names.set(t.id, dn ?? null);
611
+ }
612
+ }
613
+ return rows.map((r) => toView(r, names));
491
614
  }
492
615
  baseQuery() {
493
- return this.db
616
+ return (this.db
494
617
  .selectFrom("catalog_requests as r")
495
- .innerJoin("catalog_items as i", "i.id", "r.item_id")
618
+ .leftJoin("catalog_items as i", "i.id", "r.item_id")
496
619
  .innerJoin("orgs as o", "o.id", "r.org_id")
497
620
  .leftJoin("accounts as a", "a.id", "r.requested_by")
621
+ // a connector_setup request's agent and its current version (name, pending connectors)
622
+ .leftJoin("agents as ag", "ag.id", "r.agent_id")
623
+ .leftJoin("agent_versions as av", (j) => j.onRef("av.agent_id", "=", "ag.id").onRef("av.version", "=", "ag.current_version"))
498
624
  .select([
625
+ "r.agent_id",
626
+ "r.pending_keys",
627
+ "ag.deleted_at as agent_deleted_at",
628
+ "av.definition as agent_definition",
499
629
  "r.id",
500
630
  "r.org_id",
501
631
  "o.name as org_name",
632
+ "r.kind",
502
633
  "r.item_id",
503
634
  "i.name",
504
635
  "i.display_name",
505
- "r.version",
506
- "r.stage",
636
+ "r.marketplace_id",
637
+ "r.entry_name",
638
+ "r.entry_version",
507
639
  "r.status",
508
640
  "r.note",
641
+ "r.reason",
509
642
  "r.requested_by",
510
643
  "a.display_name as requested_by_name",
511
644
  "r.decided_by",
512
645
  "r.decided_at",
513
- "r.org_decided_by",
514
- "r.org_decided_at",
646
+ "r.staging_id",
515
647
  "r.created_at",
516
- ]);
648
+ ]));
517
649
  }
518
650
  };
519
651
  __decorate([
520
652
  Transactional()
521
- ], CatalogRequestsService.prototype, "writeRequest", null);
653
+ ], CatalogRequestsService.prototype, "authorize", null);
522
654
  __decorate([
523
- Transactional({ propagation: "mandatory" })
524
- ], CatalogRequestsService.prototype, "requestDeployment", null);
655
+ Transactional()
656
+ ], CatalogRequestsService.prototype, "writeItemRequest", null);
525
657
  __decorate([
526
- Transactional({ propagation: "mandatory" })
527
- ], CatalogRequestsService.prototype, "resolveByInstall", null);
658
+ Transactional()
659
+ ], CatalogRequestsService.prototype, "writeImportRequest", null);
660
+ __decorate([
661
+ Transactional()
662
+ ], CatalogRequestsService.prototype, "pendingOrgRequest", null);
663
+ __decorate([
664
+ WithLock({ key: "catalog-request-#{1}", ttl: 60_000, waitTimeout: 180_000 })
665
+ ], CatalogRequestsService.prototype, "approveImport", null);
666
+ __decorate([
667
+ Transactional()
668
+ ], CatalogRequestsService.prototype, "pendingDeploymentRequest", null);
528
669
  __decorate([
529
670
  Transactional()
530
- ], CatalogRequestsService.prototype, "writeDecideOrg", null);
671
+ ], CatalogRequestsService.prototype, "linkStaging", null);
531
672
  __decorate([
532
673
  Transactional()
533
- ], CatalogRequestsService.prototype, "writeDecideDeployment", null);
674
+ ], CatalogRequestsService.prototype, "writeDecision", null);
534
675
  CatalogRequestsService = __decorate([
535
676
  Injectable(),
536
677
  __param(0, Inject(KernelDb)),
537
678
  __param(1, Inject(OrgLock)),
538
- __param(2, Inject(EnterpriseAdminLock)),
539
- __param(3, Inject(TransactionHost))
679
+ __param(2, Inject(SuperAdminLock)),
680
+ __param(3, Inject(OrgCatalogService)),
681
+ __param(4, Inject(CatalogScopeService)),
682
+ __param(5, Inject(CatalogService)),
683
+ __param(6, Inject(KernelConfigService)),
684
+ __param(7, Inject(PluginImport)),
685
+ __param(8, Inject(TransactionHost)),
686
+ __param(9, Inject(LockService))
540
687
  ], CatalogRequestsService);
541
688
  export { CatalogRequestsService };
542
- function toView(r) {
689
+ /** The view fields of a `connector_setup` request (ruling P4-T6-5); null for other kinds. */
690
+ function setupFields(r, templateNames) {
691
+ if (r.kind !== "connector_setup" || r.agent_id === null)
692
+ return { agent: null, connectors: null };
693
+ const def = (r.agent_definition ?? null);
694
+ const pending = new Map((def?.pendingConnectors ?? []).map((c) => [c.key, c]));
695
+ const connectors = [];
696
+ for (const key of r.pending_keys ?? []) {
697
+ const c = pending.get(key);
698
+ if (c === undefined)
699
+ continue;
700
+ const src = c.source;
701
+ connectors.push({
702
+ key,
703
+ label: c.label,
704
+ kind: "template" in src ? "template" : "needs",
705
+ source: "template" in src
706
+ ? { template: { id: src.template, displayName: templateNames.get(src.template) ?? null } }
707
+ : {
708
+ needs: {
709
+ protocol: src.needs.protocol,
710
+ endpoint: src.needs.endpoint,
711
+ tools: [...src.needs.tools],
712
+ },
713
+ },
714
+ tools: c.tools !== undefined && c.tools.length > 0 ? [...c.tools] : null,
715
+ // jsonb keeps no key order: sorted
716
+ policies: Object.keys(c.policies ?? {}).sort(),
717
+ });
718
+ }
719
+ return {
720
+ agent: { id: r.agent_id, name: def?.name ?? "", deleted: r.agent_deleted_at !== null },
721
+ connectors,
722
+ };
723
+ }
724
+ function toView(r, templateNames) {
543
725
  return {
544
726
  id: r.id,
545
727
  orgId: r.org_id,
546
728
  orgName: r.org_name,
547
- item: { id: r.item_id, name: r.name, displayName: r.display_name },
548
- version: r.version,
549
- stage: r.stage,
729
+ kind: r.kind,
730
+ item: r.item_id !== null && r.name !== null
731
+ ? { id: r.item_id, name: r.name, displayName: r.display_name }
732
+ : null,
733
+ entry: r.entry_name !== null
734
+ ? { marketplaceId: r.marketplace_id, name: r.entry_name, version: r.entry_version }
735
+ : null,
736
+ ...setupFields(r, templateNames),
550
737
  status: r.status,
551
738
  note: r.note,
739
+ reason: r.reason,
552
740
  requestedBy: r.requested_by,
553
741
  requestedByName: r.requested_by_name,
554
742
  decidedBy: r.decided_by,
555
743
  decidedAt: r.decided_at?.toISOString() ?? null,
556
- orgDecidedBy: r.org_decided_by,
557
- orgDecidedAt: r.org_decided_at?.toISOString() ?? null,
744
+ stagingId: r.status === "pending" ? r.staging_id : null,
558
745
  createdAt: r.created_at.toISOString(),
559
746
  };
560
747
  }