@capybara-hq/kernel 0.1.0-rc.0 → 0.1.0-rc.10

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 (1152) hide show
  1. package/bootstrap.json +92 -8
  2. package/dist/admin/admin.controller.d.ts +52 -71
  3. package/dist/admin/admin.controller.js +117 -63
  4. package/dist/admin/admin.module.d.ts +3 -0
  5. package/dist/admin/admin.module.js +22 -0
  6. package/dist/admin/admin.schemas.d.ts +57 -0
  7. package/dist/admin/admin.schemas.js +50 -0
  8. package/dist/admin/extensions.controller.d.ts +47 -16
  9. package/dist/admin/extensions.controller.js +94 -23
  10. package/dist/admin/extensions.schemas.d.ts +7 -0
  11. package/dist/admin/extensions.schemas.js +10 -0
  12. package/dist/admin/limit-defaults.d.ts +20 -0
  13. package/dist/admin/limit-defaults.js +10 -0
  14. package/dist/admin/setup-lock.d.ts +16 -0
  15. package/dist/admin/setup-lock.js +47 -0
  16. package/dist/admin/setup.controller.d.ts +9 -9
  17. package/dist/admin/setup.controller.js +28 -26
  18. package/dist/admin/setup.service.d.ts +20 -28
  19. package/dist/admin/setup.service.js +65 -65
  20. package/dist/agents/agent-lookup.d.ts +72 -0
  21. package/dist/agents/agent-lookup.js +208 -0
  22. package/dist/agents/agent-profile.service.d.ts +31 -0
  23. package/dist/agents/agent-profile.service.js +122 -0
  24. package/dist/agents/agents.controller.d.ts +54 -169
  25. package/dist/agents/agents.controller.js +172 -37
  26. package/dist/agents/agents.module.d.ts +10 -0
  27. package/dist/agents/agents.module.js +71 -0
  28. package/dist/agents/agents.schemas.d.ts +389 -0
  29. package/dist/agents/agents.schemas.js +126 -0
  30. package/dist/agents/agents.service.d.ts +104 -76
  31. package/dist/agents/agents.service.js +509 -383
  32. package/dist/agents/definition.d.ts +133 -21
  33. package/dist/agents/definition.js +361 -41
  34. package/dist/agents/from-template.d.ts +106 -0
  35. package/dist/agents/from-template.js +680 -0
  36. package/dist/agents/from-template.service.d.ts +72 -0
  37. package/dist/agents/from-template.service.js +178 -0
  38. package/dist/agents/instruction-files.d.ts +60 -0
  39. package/dist/agents/instruction-files.js +111 -0
  40. package/dist/agents/models.controller.d.ts +44 -6
  41. package/dist/agents/models.controller.js +84 -8
  42. package/dist/agents/org-templates.d.ts +186 -0
  43. package/dist/agents/org-templates.js +868 -0
  44. package/dist/agents/pending-connector-requests.d.ts +79 -0
  45. package/dist/agents/pending-connector-requests.js +215 -0
  46. package/dist/agents/pending-connectors.controller.d.ts +39 -0
  47. package/dist/agents/pending-connectors.controller.js +91 -0
  48. package/dist/agents/pending-connectors.service.d.ts +62 -0
  49. package/dist/agents/pending-connectors.service.js +282 -0
  50. package/dist/agents/profile.d.ts +114 -0
  51. package/dist/agents/profile.js +55 -0
  52. package/dist/agents/readiness.controller.d.ts +26 -0
  53. package/dist/agents/readiness.controller.js +56 -0
  54. package/dist/agents/templates.controller.d.ts +78 -6
  55. package/dist/agents/templates.controller.js +154 -8
  56. package/dist/agents/templates.d.ts +132 -30
  57. package/dist/agents/templates.js +500 -46
  58. package/dist/agents/templates.schemas.d.ts +20 -0
  59. package/dist/agents/templates.schemas.js +45 -0
  60. package/dist/app.d.ts +93 -0
  61. package/dist/app.js +150 -0
  62. package/dist/background/background.controller.d.ts +38 -0
  63. package/dist/background/background.controller.js +88 -0
  64. package/dist/background/background.module.d.ts +10 -0
  65. package/dist/background/background.module.js +39 -0
  66. package/dist/background/background.schemas.d.ts +10 -0
  67. package/dist/background/background.schemas.js +16 -0
  68. package/dist/background/finish.d.ts +44 -0
  69. package/dist/background/finish.js +95 -0
  70. package/dist/background/launch-lock.d.ts +15 -0
  71. package/dist/background/launch-lock.js +40 -0
  72. package/dist/background/launch.d.ts +42 -0
  73. package/dist/background/launch.js +77 -0
  74. package/dist/background/poll.job.d.ts +56 -0
  75. package/dist/background/poll.job.js +195 -0
  76. package/dist/background/render.d.ts +23 -0
  77. package/dist/background/render.js +48 -0
  78. package/dist/background/session.d.ts +48 -0
  79. package/dist/background/session.js +80 -0
  80. package/dist/background/status.d.ts +35 -0
  81. package/dist/background/status.js +57 -0
  82. package/dist/background/stop.d.ts +68 -0
  83. package/dist/background/stop.js +244 -0
  84. package/dist/background/store.d.ts +167 -0
  85. package/dist/background/store.js +361 -0
  86. package/dist/background/store.module.d.ts +6 -0
  87. package/dist/background/store.module.js +22 -0
  88. package/dist/background/tasks.service.d.ts +77 -0
  89. package/dist/background/tasks.service.js +216 -0
  90. package/dist/background/wake-rules.d.ts +66 -0
  91. package/dist/background/wake-rules.js +113 -0
  92. package/dist/background/wake.d.ts +30 -0
  93. package/dist/background/wake.js +63 -0
  94. package/dist/catalog/admin-catalog.controller.d.ts +102 -52
  95. package/dist/catalog/admin-catalog.controller.js +222 -67
  96. package/dist/catalog/admin-catalog.schemas.d.ts +72 -0
  97. package/dist/catalog/admin-catalog.schemas.js +92 -0
  98. package/dist/catalog/catalog-content.d.ts +232 -0
  99. package/dist/catalog/catalog-content.js +367 -0
  100. package/dist/catalog/catalog-files.d.ts +41 -0
  101. package/dist/catalog/catalog-files.js +86 -0
  102. package/dist/catalog/catalog-import.module.d.ts +7 -0
  103. package/dist/catalog/catalog-import.module.js +60 -0
  104. package/dist/catalog/catalog-items.d.ts +290 -0
  105. package/dist/catalog/catalog-items.js +676 -0
  106. package/dist/catalog/catalog-scope.service.d.ts +260 -0
  107. package/dist/catalog/catalog-scope.service.js +1124 -0
  108. package/dist/catalog/catalog.module.d.ts +12 -0
  109. package/dist/catalog/catalog.module.js +81 -0
  110. package/dist/catalog/catalog.service.d.ts +141 -206
  111. package/dist/catalog/catalog.service.js +237 -528
  112. package/dist/catalog/claude/agents.js +15 -10
  113. package/dist/catalog/cli.d.ts +14 -3
  114. package/dist/catalog/cli.js +39 -32
  115. package/dist/catalog/component-promotion.d.ts +96 -0
  116. package/dist/catalog/component-promotion.js +395 -0
  117. package/dist/catalog/component-scope.controller.d.ts +90 -0
  118. package/dist/catalog/component-scope.controller.js +234 -0
  119. package/dist/catalog/component-scope.schemas.d.ts +114 -0
  120. package/dist/catalog/component-scope.schemas.js +97 -0
  121. package/dist/catalog/component-scope.service.d.ts +327 -0
  122. package/dist/catalog/component-scope.service.js +990 -0
  123. package/dist/catalog/component-state.d.ts +188 -0
  124. package/dist/catalog/component-state.js +455 -0
  125. package/dist/catalog/git-source.d.ts +9 -1
  126. package/dist/catalog/git-source.js +29 -2
  127. package/dist/catalog/job-ids.d.ts +45 -0
  128. package/dist/catalog/job-ids.js +40 -0
  129. package/dist/catalog/jobs.d.ts +27 -0
  130. package/dist/catalog/jobs.js +70 -0
  131. package/dist/catalog/locks.d.ts +24 -0
  132. package/dist/catalog/locks.js +63 -0
  133. package/dist/catalog/marketplace-fetch.d.ts +1 -1
  134. package/dist/catalog/marketplace-icons.d.ts +64 -0
  135. package/dist/catalog/marketplace-icons.js +131 -0
  136. package/dist/catalog/marketplaces.controller.d.ts +53 -44
  137. package/dist/catalog/marketplaces.controller.js +146 -51
  138. package/dist/catalog/marketplaces.schemas.d.ts +48 -0
  139. package/dist/catalog/marketplaces.schemas.js +53 -0
  140. package/dist/catalog/marketplaces.service.d.ts +136 -26
  141. package/dist/catalog/marketplaces.service.js +663 -281
  142. package/dist/catalog/org-catalog.controller.d.ts +115 -63
  143. package/dist/catalog/org-catalog.controller.js +207 -100
  144. package/dist/catalog/org-catalog.schemas.d.ts +88 -0
  145. package/dist/catalog/org-catalog.schemas.js +93 -0
  146. package/dist/catalog/org-catalog.service.d.ts +89 -216
  147. package/dist/catalog/org-catalog.service.js +431 -472
  148. package/dist/catalog/org-extension-switch.d.ts +41 -0
  149. package/dist/catalog/org-extension-switch.js +115 -0
  150. package/dist/catalog/org-extension.controller.d.ts +113 -0
  151. package/dist/catalog/org-extension.controller.js +271 -0
  152. package/dist/catalog/org-extension.schemas.d.ts +15 -0
  153. package/dist/catalog/org-extension.schemas.js +22 -0
  154. package/dist/catalog/org-plugin-uploads.controller.d.ts +77 -0
  155. package/dist/catalog/org-plugin-uploads.controller.js +200 -0
  156. package/dist/catalog/org-plugin-uploads.d.ts +71 -0
  157. package/dist/catalog/org-plugin-uploads.js +122 -0
  158. package/dist/catalog/org-plugin-uploads.schemas.d.ts +20 -0
  159. package/dist/catalog/org-plugin-uploads.schemas.js +32 -0
  160. package/dist/catalog/owned-items.d.ts +188 -0
  161. package/dist/catalog/owned-items.js +801 -0
  162. package/dist/catalog/owned-plugin-cleanup.d.ts +56 -0
  163. package/dist/catalog/owned-plugin-cleanup.js +194 -0
  164. package/dist/catalog/ownership.d.ts +172 -0
  165. package/dist/catalog/ownership.js +326 -0
  166. package/dist/catalog/platform-components.d.ts +223 -0
  167. package/dist/catalog/platform-components.js +763 -0
  168. package/dist/catalog/platform-migration.d.ts +115 -0
  169. package/dist/catalog/platform-migration.js +582 -0
  170. package/dist/catalog/plugin-import.d.ts +270 -68
  171. package/dist/catalog/plugin-import.js +1004 -277
  172. package/dist/catalog/plugin-install.d.ts +251 -65
  173. package/dist/catalog/plugin-install.js +1128 -344
  174. package/dist/catalog/plugin-package.js +14 -1
  175. package/dist/catalog/plugin-upgrade.d.ts +301 -188
  176. package/dist/catalog/plugin-upgrade.js +1256 -1068
  177. package/dist/catalog/request-rules.d.ts +65 -0
  178. package/dist/catalog/request-rules.js +217 -0
  179. package/dist/catalog/requests.service.d.ts +205 -117
  180. package/dist/catalog/requests.service.js +612 -369
  181. package/dist/catalog/reserved-names.d.ts +8 -0
  182. package/dist/catalog/reserved-names.js +42 -0
  183. package/dist/catalog/scope-orgs.d.ts +21 -0
  184. package/dist/catalog/scope-orgs.js +67 -0
  185. package/dist/catalog/scope-state.d.ts +35 -0
  186. package/dist/catalog/scope-state.js +87 -0
  187. package/dist/catalog/scope-sync-workers.d.ts +7 -0
  188. package/dist/catalog/scope-sync-workers.js +29 -0
  189. package/dist/catalog/scope-sync.d.ts +176 -0
  190. package/dist/catalog/scope-sync.js +576 -0
  191. package/dist/catalog/scope.d.ts +42 -0
  192. package/dist/catalog/scope.js +42 -0
  193. package/dist/catalog/unshare.d.ts +22 -0
  194. package/dist/catalog/unshare.js +118 -0
  195. package/dist/channels/actions.d.ts +6 -4
  196. package/dist/channels/actions.js +11 -4
  197. package/dist/channels/cards.d.ts +33 -11
  198. package/dist/channels/cards.js +96 -24
  199. package/dist/channels/channels.module.d.ts +40 -0
  200. package/dist/channels/channels.module.js +130 -0
  201. package/dist/channels/channels.schemas.d.ts +37 -0
  202. package/dist/channels/channels.schemas.js +38 -0
  203. package/dist/channels/connections.controller.d.ts +44 -37
  204. package/dist/channels/connections.controller.js +83 -38
  205. package/dist/channels/connections.service.d.ts +101 -30
  206. package/dist/channels/connections.service.js +380 -147
  207. package/dist/channels/inbound.d.ts +44 -38
  208. package/dist/channels/inbound.js +190 -44
  209. package/dist/channels/job-ids.d.ts +10 -0
  210. package/dist/channels/job-ids.js +10 -0
  211. package/dist/channels/jobs.d.ts +85 -0
  212. package/dist/channels/jobs.js +157 -0
  213. package/dist/channels/outbound.d.ts +71 -80
  214. package/dist/channels/outbound.js +219 -201
  215. package/dist/channels/phrases.d.ts +33 -2
  216. package/dist/channels/phrases.js +29 -1
  217. package/dist/channels/supervisor.d.ts +88 -46
  218. package/dist/channels/supervisor.js +230 -132
  219. package/dist/channels/threads.d.ts +34 -8
  220. package/dist/channels/threads.js +79 -13
  221. package/dist/channels/webhook.d.ts +20 -14
  222. package/dist/channels/webhook.js +51 -20
  223. package/dist/config/docs.js +5 -1
  224. package/dist/config/load.d.ts +3 -2
  225. package/dist/config/load.js +3 -2
  226. package/dist/config/nacos-source.js +11 -2
  227. package/dist/config/schema.d.ts +51 -3
  228. package/dist/config/schema.js +269 -27
  229. package/dist/conversations/access.d.ts +31 -0
  230. package/dist/conversations/access.js +110 -0
  231. package/dist/conversations/agent-tree.d.ts +46 -0
  232. package/dist/conversations/agent-tree.js +92 -0
  233. package/dist/conversations/artifacts.d.ts +11 -11
  234. package/dist/conversations/artifacts.js +36 -10
  235. package/dist/conversations/attachments.controller.d.ts +1 -1
  236. package/dist/conversations/attachments.controller.js +8 -6
  237. package/dist/conversations/attachments.module.d.ts +7 -0
  238. package/dist/conversations/attachments.module.js +25 -0
  239. package/dist/conversations/attachments.service.d.ts +60 -22
  240. package/dist/conversations/attachments.service.js +249 -51
  241. package/dist/conversations/conversations.controller.d.ts +86 -50
  242. package/dist/conversations/conversations.controller.js +184 -103
  243. package/dist/conversations/conversations.module.d.ts +8 -0
  244. package/dist/conversations/conversations.module.js +72 -0
  245. package/dist/conversations/conversations.schemas.d.ts +52 -0
  246. package/dist/conversations/conversations.schemas.js +79 -0
  247. package/dist/conversations/conversations.service.d.ts +166 -49
  248. package/dist/conversations/conversations.service.js +383 -179
  249. package/dist/conversations/environment-status.d.ts +24 -0
  250. package/dist/conversations/environment-status.js +71 -0
  251. package/dist/conversations/event-log.d.ts +64 -27
  252. package/dist/conversations/event-log.js +167 -31
  253. package/dist/conversations/events.d.ts +252 -9
  254. package/dist/conversations/events.js +243 -32
  255. package/dist/conversations/files.d.ts +10 -10
  256. package/dist/conversations/files.js +37 -11
  257. package/dist/conversations/idem-keys.d.ts +5 -0
  258. package/dist/conversations/idem-keys.js +5 -0
  259. package/dist/conversations/job-ids.d.ts +6 -0
  260. package/dist/conversations/job-ids.js +6 -0
  261. package/dist/conversations/message-context.d.ts +79 -0
  262. package/dist/conversations/message-context.js +145 -0
  263. package/dist/conversations/outputs-read.d.ts +11 -11
  264. package/dist/conversations/outputs-read.js +31 -7
  265. package/dist/conversations/queue.d.ts +53 -58
  266. package/dist/conversations/queue.js +37 -293
  267. package/dist/conversations/queue.service.d.ts +60 -0
  268. package/dist/conversations/queue.service.js +350 -0
  269. package/dist/conversations/titles.d.ts +83 -27
  270. package/dist/conversations/titles.js +195 -70
  271. package/dist/conversations/tree.d.ts +17 -0
  272. package/dist/conversations/tree.js +42 -0
  273. package/dist/ctx/bus.js +9 -3
  274. package/dist/ctx/create-ctx.d.ts +26 -1
  275. package/dist/ctx/create-ctx.js +45 -16
  276. package/dist/ctx/lock.d.ts +7 -3
  277. package/dist/ctx/lock.js +9 -20
  278. package/dist/ctx/queue.js +3 -2
  279. package/dist/ctx/secrets.d.ts +10 -2
  280. package/dist/ctx/secrets.js +7 -3
  281. package/dist/db/kernel-schema.d.ts +550 -25
  282. package/dist/db/pool.d.ts +10 -0
  283. package/dist/db/pool.js +4 -0
  284. package/dist/devices/device-auth.controller.d.ts +42 -0
  285. package/dist/devices/device-auth.controller.js +116 -0
  286. package/dist/devices/device-auth.d.ts +119 -0
  287. package/dist/devices/device-auth.js +403 -0
  288. package/dist/devices/device-auth.module.d.ts +7 -0
  289. package/dist/devices/device-auth.module.js +25 -0
  290. package/dist/devices/device-gateway.d.ts +128 -0
  291. package/dist/devices/device-gateway.js +530 -0
  292. package/dist/devices/device-provider.d.ts +89 -0
  293. package/dist/devices/device-provider.js +151 -0
  294. package/dist/devices/device-routes.d.ts +36 -0
  295. package/dist/devices/device-routes.js +90 -0
  296. package/dist/devices/devices.module.d.ts +16 -0
  297. package/dist/devices/devices.module.js +44 -0
  298. package/dist/devices/dto.d.ts +66 -0
  299. package/dist/devices/dto.js +44 -0
  300. package/dist/devices/keys.d.ts +25 -0
  301. package/dist/devices/keys.js +25 -0
  302. package/dist/devices/machines.d.ts +118 -0
  303. package/dist/devices/machines.js +366 -0
  304. package/dist/devices/relay.d.ts +100 -0
  305. package/dist/devices/relay.js +373 -0
  306. package/dist/devices/targets.d.ts +28 -0
  307. package/dist/devices/targets.js +73 -0
  308. package/dist/environments/access.d.ts +66 -0
  309. package/dist/environments/access.js +113 -0
  310. package/dist/environments/conversation-environments.d.ts +75 -0
  311. package/dist/environments/conversation-environments.js +231 -0
  312. package/dist/environments/dto.d.ts +25 -0
  313. package/dist/environments/dto.js +12 -0
  314. package/dist/environments/environments.controller.d.ts +36 -0
  315. package/dist/environments/environments.controller.js +124 -0
  316. package/dist/environments/environments.module.d.ts +8 -0
  317. package/dist/environments/environments.module.js +31 -0
  318. package/dist/environments/environments.schemas.d.ts +3 -0
  319. package/dist/environments/environments.schemas.js +14 -0
  320. package/dist/environments/environments.service.d.ts +251 -0
  321. package/dist/environments/environments.service.js +791 -0
  322. package/dist/environments/label.d.ts +11 -0
  323. package/dist/environments/label.js +25 -0
  324. package/dist/environments/legacy-cleanup.job.d.ts +34 -0
  325. package/dist/environments/legacy-cleanup.job.js +141 -0
  326. package/dist/errors.d.ts +136 -2
  327. package/dist/errors.js +136 -2
  328. package/dist/evals/budget.d.ts +42 -21
  329. package/dist/evals/budget.js +114 -62
  330. package/dist/evals/evals.module.d.ts +31 -0
  331. package/dist/evals/evals.module.js +114 -0
  332. package/dist/evals/evals.schemas.d.ts +110 -0
  333. package/dist/evals/evals.schemas.js +107 -0
  334. package/dist/evals/jobs.d.ts +20 -0
  335. package/dist/evals/jobs.js +45 -0
  336. package/dist/evals/reconstruct.d.ts +18 -9
  337. package/dist/evals/reconstruct.js +36 -10
  338. package/dist/evals/recorded-tools.d.ts +37 -1
  339. package/dist/evals/recorded-tools.js +120 -10
  340. package/dist/evals/run-replay.d.ts +75 -10
  341. package/dist/evals/run-replay.js +218 -94
  342. package/dist/evals/runs.controller.d.ts +3 -58
  343. package/dist/evals/runs.controller.js +18 -50
  344. package/dist/evals/runs.service.d.ts +31 -52
  345. package/dist/evals/runs.service.js +281 -255
  346. package/dist/evals/sets.controller.d.ts +3 -29
  347. package/dist/evals/sets.controller.js +18 -39
  348. package/dist/evals/sets.service.d.ts +29 -13
  349. package/dist/evals/sets.service.js +262 -202
  350. package/dist/evals/snapshot.d.ts +5 -4
  351. package/dist/evals/snapshot.js +17 -4
  352. package/dist/evals/step-replay.d.ts +6 -8
  353. package/dist/evals/step-replay.js +17 -10
  354. package/dist/evals/trajectory.controller.d.ts +1 -1
  355. package/dist/evals/trajectory.controller.js +11 -7
  356. package/dist/evals/trajectory.d.ts +2 -2
  357. package/dist/evals/trajectory.js +1 -1
  358. package/dist/evals/trajectory.service.d.ts +13 -7
  359. package/dist/evals/trajectory.service.js +56 -21
  360. package/dist/evals/worker.d.ts +48 -31
  361. package/dist/evals/worker.js +229 -123
  362. package/dist/extensions/admin-ops.d.ts +133 -41
  363. package/dist/extensions/admin-ops.js +378 -172
  364. package/dist/extensions/admin-view.d.ts +82 -32
  365. package/dist/extensions/admin-view.js +284 -71
  366. package/dist/extensions/approvals.d.ts +24 -10
  367. package/dist/extensions/approvals.js +73 -46
  368. package/dist/extensions/blobs.d.ts +27 -10
  369. package/dist/extensions/blobs.js +112 -45
  370. package/dist/extensions/bootstrap.d.ts +136 -46
  371. package/dist/extensions/bootstrap.js +417 -167
  372. package/dist/extensions/cli.d.ts +32 -10
  373. package/dist/extensions/cli.js +52 -98
  374. package/dist/extensions/config-hash.d.ts +10 -0
  375. package/dist/extensions/config-hash.js +38 -0
  376. package/dist/extensions/config-issues.d.ts +19 -0
  377. package/dist/extensions/config-issues.js +48 -0
  378. package/dist/extensions/config-json-schema.d.ts +43 -7
  379. package/dist/extensions/config-json-schema.js +124 -58
  380. package/dist/extensions/deployment-config-store.d.ts +55 -0
  381. package/dist/extensions/deployment-config-store.js +133 -0
  382. package/dist/extensions/deployment-config.d.ts +146 -70
  383. package/dist/extensions/deployment-config.js +439 -246
  384. package/dist/extensions/display-name.d.ts +22 -0
  385. package/dist/extensions/display-name.js +77 -0
  386. package/dist/extensions/effective-config.d.ts +127 -0
  387. package/dist/extensions/effective-config.js +368 -0
  388. package/dist/extensions/enabled.d.ts +5 -5
  389. package/dist/extensions/extensions.module.d.ts +8 -0
  390. package/dist/extensions/extensions.module.js +96 -0
  391. package/dist/extensions/hooks.d.ts +40 -6
  392. package/dist/extensions/hooks.js +83 -17
  393. package/dist/extensions/host.d.ts +161 -80
  394. package/dist/extensions/host.js +505 -213
  395. package/dist/extensions/installs.d.ts +73 -19
  396. package/dist/extensions/installs.js +174 -37
  397. package/dist/extensions/job-ids.d.ts +6 -0
  398. package/dist/extensions/job-ids.js +6 -0
  399. package/dist/extensions/lifecycle-topics.d.ts +18 -0
  400. package/dist/extensions/lifecycle-topics.js +18 -0
  401. package/dist/extensions/lifecycle.d.ts +35 -47
  402. package/dist/extensions/lifecycle.js +103 -39
  403. package/dist/extensions/locks.d.ts +45 -0
  404. package/dist/extensions/locks.js +112 -0
  405. package/dist/extensions/migrate-lock.d.ts +3 -4
  406. package/dist/extensions/org-config.d.ts +141 -49
  407. package/dist/extensions/org-config.js +471 -243
  408. package/dist/extensions/org-levels.d.ts +37 -0
  409. package/dist/extensions/org-levels.js +71 -0
  410. package/dist/extensions/org-overrides.d.ts +151 -0
  411. package/dist/extensions/org-overrides.js +524 -0
  412. package/dist/extensions/package.d.ts +14 -1
  413. package/dist/extensions/package.js +51 -2
  414. package/dist/extensions/permission-view.d.ts +59 -6
  415. package/dist/extensions/permission-view.js +7 -5
  416. package/dist/extensions/plugin-guides.d.ts +129 -0
  417. package/dist/extensions/plugin-guides.js +283 -0
  418. package/dist/extensions/plugin-icons.d.ts +54 -0
  419. package/dist/extensions/plugin-icons.js +125 -0
  420. package/dist/extensions/plugin-items.d.ts +21 -0
  421. package/dist/extensions/plugin-items.js +42 -0
  422. package/dist/extensions/point-defaults.controller.d.ts +28 -0
  423. package/dist/extensions/point-defaults.controller.js +69 -0
  424. package/dist/extensions/point-defaults.d.ts +73 -0
  425. package/dist/extensions/point-defaults.js +236 -0
  426. package/dist/extensions/point-defaults.schemas.d.ts +9 -0
  427. package/dist/extensions/point-defaults.schemas.js +14 -0
  428. package/dist/extensions/registry.d.ts +50 -2
  429. package/dist/extensions/registry.js +91 -4
  430. package/dist/extensions/resolve.d.ts +51 -1
  431. package/dist/extensions/resolve.js +85 -3
  432. package/dist/extensions/single-provider.d.ts +92 -0
  433. package/dist/extensions/single-provider.js +180 -0
  434. package/dist/extensions/sources.d.ts +19 -10
  435. package/dist/extensions/sources.js +34 -13
  436. package/dist/extensions/state.module.d.ts +9 -0
  437. package/dist/extensions/state.module.js +38 -0
  438. package/dist/extensions/unavailable.d.ts +50 -0
  439. package/dist/extensions/unavailable.js +115 -0
  440. package/dist/files/files.module.d.ts +3 -0
  441. package/dist/files/files.module.js +22 -0
  442. package/dist/files/previewers.controller.d.ts +7 -2
  443. package/dist/files/previewers.controller.js +19 -12
  444. package/dist/files/previewers.d.ts +21 -19
  445. package/dist/files/previewers.js +114 -38
  446. package/dist/files/previewers.schemas.d.ts +10 -0
  447. package/dist/files/previewers.schemas.js +9 -0
  448. package/dist/http/adapter.d.ts +3 -0
  449. package/dist/http/adapter.js +25 -0
  450. package/dist/http/api.module.d.ts +3 -110
  451. package/dist/http/api.module.js +86 -358
  452. package/dist/http/app.d.ts +22 -17
  453. package/dist/http/app.js +83 -52
  454. package/dist/http/error-filter.module.d.ts +5 -0
  455. package/dist/http/error-filter.module.js +18 -0
  456. package/dist/http/error.filter.js +2 -2
  457. package/dist/http/{gateway.module.d.ts → gateway-routes.d.ts} +7 -3
  458. package/dist/http/gateway-routes.js +16 -0
  459. package/dist/http/nest-logger.d.ts +6 -5
  460. package/dist/http/nest-logger.js +24 -10
  461. package/dist/http/plugin-dispatch.d.ts +4 -1
  462. package/dist/http/plugin-dispatch.js +14 -2
  463. package/dist/identity/accounts.d.ts +130 -38
  464. package/dist/identity/accounts.js +373 -186
  465. package/dist/identity/api-tokens.d.ts +11 -7
  466. package/dist/identity/api-tokens.js +71 -44
  467. package/dist/identity/audit.d.ts +9 -5
  468. package/dist/identity/audit.js +5 -1
  469. package/dist/identity/auth.controller.d.ts +11 -10
  470. package/dist/identity/auth.controller.js +40 -30
  471. package/dist/identity/auth.guard.d.ts +16 -8
  472. package/dist/identity/auth.guard.js +41 -13
  473. package/dist/identity/binding.d.ts +9 -11
  474. package/dist/identity/binding.js +41 -13
  475. package/dist/identity/cookies.d.ts +26 -5
  476. package/dist/identity/cookies.js +58 -6
  477. package/dist/identity/external-identity-lock.d.ts +17 -0
  478. package/dist/identity/external-identity-lock.js +39 -0
  479. package/dist/identity/external.d.ts +19 -15
  480. package/dist/identity/external.js +163 -125
  481. package/dist/identity/identity.module.d.ts +6 -0
  482. package/dist/identity/identity.module.js +59 -0
  483. package/dist/identity/initial-passwords.controller.d.ts +22 -0
  484. package/dist/identity/initial-passwords.controller.js +49 -0
  485. package/dist/identity/initial-passwords.d.ts +61 -0
  486. package/dist/identity/initial-passwords.job.d.ts +16 -0
  487. package/dist/identity/initial-passwords.job.js +46 -0
  488. package/dist/identity/initial-passwords.js +159 -0
  489. package/dist/identity/me.controller.d.ts +32 -15
  490. package/dist/identity/me.controller.js +78 -33
  491. package/dist/identity/me.schemas.d.ts +14 -0
  492. package/dist/identity/me.schemas.js +17 -0
  493. package/dist/identity/principal.d.ts +11 -3
  494. package/dist/identity/principal.js +11 -3
  495. package/dist/identity/sessions.d.ts +24 -10
  496. package/dist/identity/sessions.js +119 -42
  497. package/dist/identity/settings.d.ts +42 -23
  498. package/dist/identity/settings.js +137 -72
  499. package/dist/identity/sso.controller.d.ts +7 -7
  500. package/dist/identity/sso.controller.js +13 -9
  501. package/dist/identity/sso.d.ts +9 -12
  502. package/dist/identity/sso.js +54 -24
  503. package/dist/identity/super-admin.d.ts +20 -0
  504. package/dist/identity/super-admin.js +81 -0
  505. package/dist/inbox/inbox.module.d.ts +6 -0
  506. package/dist/inbox/inbox.module.js +26 -0
  507. package/dist/inbox/inbox.schemas.d.ts +8 -0
  508. package/dist/inbox/inbox.schemas.js +11 -0
  509. package/dist/inbox/inbox.service.d.ts +68 -11
  510. package/dist/inbox/inbox.service.js +104 -13
  511. package/dist/inbox/org-notices.d.ts +63 -0
  512. package/dist/inbox/org-notices.js +91 -0
  513. package/dist/inbox/platform-inbox.controller.d.ts +23 -0
  514. package/dist/inbox/platform-inbox.controller.js +58 -0
  515. package/dist/inbox/platform-inbox.service.d.ts +151 -0
  516. package/dist/inbox/platform-inbox.service.js +263 -0
  517. package/dist/inbox/platform-notices.d.ts +19 -0
  518. package/dist/inbox/platform-notices.js +9 -0
  519. package/dist/index.d.ts +25 -14
  520. package/dist/index.js +20 -9
  521. package/dist/infra/cache/cache.module.d.ts +3 -0
  522. package/dist/infra/cache/cache.module.js +16 -0
  523. package/dist/infra/cache/cache.service.d.ts +21 -0
  524. package/dist/infra/cache/cache.service.js +80 -0
  525. package/dist/infra/cache/cacheable.decorator.d.ts +32 -0
  526. package/dist/infra/cache/cacheable.decorator.js +83 -0
  527. package/dist/infra/cli/kernel-cli.module.d.ts +66 -0
  528. package/dist/infra/cli/kernel-cli.module.js +173 -0
  529. package/dist/infra/close-within.d.ts +15 -0
  530. package/dist/infra/close-within.js +36 -0
  531. package/dist/infra/config/config.module.d.ts +13 -0
  532. package/dist/infra/config/config.module.js +39 -0
  533. package/dist/infra/config/kernel-config.service.d.ts +25 -0
  534. package/dist/infra/config/kernel-config.service.js +157 -0
  535. package/dist/infra/database/after-commit.d.ts +6 -0
  536. package/dist/infra/database/after-commit.js +9 -0
  537. package/dist/infra/database/database.module.d.ts +25 -0
  538. package/dist/infra/database/database.module.js +91 -0
  539. package/dist/infra/database/kernel-db.d.ts +22 -0
  540. package/dist/infra/database/kernel-db.js +65 -0
  541. package/dist/infra/database/transaction-host.d.ts +50 -0
  542. package/dist/infra/database/transaction-host.js +125 -0
  543. package/dist/infra/database/transactional.decorator.d.ts +15 -0
  544. package/dist/infra/database/transactional.decorator.js +27 -0
  545. package/dist/infra/database/xact-lock.d.ts +17 -0
  546. package/dist/infra/database/xact-lock.js +43 -0
  547. package/dist/infra/events/kernel-events.d.ts +121 -0
  548. package/dist/infra/events/kernel-events.js +65 -0
  549. package/dist/infra/health/health.controller.d.ts +26 -0
  550. package/dist/infra/health/health.controller.js +104 -0
  551. package/dist/infra/health/health.module.d.ts +9 -0
  552. package/dist/infra/health/health.module.js +24 -0
  553. package/dist/infra/health/health.options.d.ts +10 -0
  554. package/dist/infra/health/health.options.js +15 -0
  555. package/dist/infra/health/shutdown-state.d.ts +6 -0
  556. package/dist/infra/health/shutdown-state.js +2 -0
  557. package/dist/infra/lifecycle/graceful-shutdown.module.d.ts +6 -0
  558. package/dist/infra/lifecycle/graceful-shutdown.module.js +23 -0
  559. package/dist/infra/lifecycle/graceful-shutdown.service.d.ts +70 -0
  560. package/dist/infra/lifecycle/graceful-shutdown.service.js +135 -0
  561. package/dist/infra/lifecycle/process-guards.d.ts +52 -0
  562. package/dist/infra/lifecycle/process-guards.js +90 -0
  563. package/dist/infra/lifecycle/shutdown-signals.d.ts +30 -0
  564. package/dist/infra/lifecycle/shutdown-signals.js +48 -0
  565. package/dist/infra/lock/key-template.d.ts +13 -0
  566. package/dist/infra/lock/key-template.js +46 -0
  567. package/dist/infra/lock/lock.module.d.ts +3 -0
  568. package/dist/infra/lock/lock.module.js +16 -0
  569. package/dist/infra/lock/lock.service.d.ts +120 -0
  570. package/dist/infra/lock/lock.service.js +343 -0
  571. package/dist/infra/lock/shared-lease.d.ts +44 -0
  572. package/dist/infra/lock/shared-lease.js +121 -0
  573. package/dist/infra/lock/with-lock.decorator.d.ts +28 -0
  574. package/dist/infra/lock/with-lock.decorator.js +49 -0
  575. package/dist/infra/logging/logging.module.d.ts +18 -0
  576. package/dist/infra/logging/logging.module.js +52 -0
  577. package/dist/infra/queue/add-job-once.d.ts +14 -0
  578. package/dist/infra/queue/add-job-once.js +16 -0
  579. package/dist/infra/queue/configured-processor.d.ts +18 -0
  580. package/dist/infra/queue/configured-processor.js +23 -0
  581. package/dist/infra/queue/job-failure.d.ts +18 -0
  582. package/dist/infra/queue/job-failure.js +26 -0
  583. package/dist/infra/queue/queue-shutdown.d.ts +27 -0
  584. package/dist/infra/queue/queue-shutdown.js +81 -0
  585. package/dist/infra/queue/queue.module.d.ts +16 -0
  586. package/dist/infra/queue/queue.module.js +61 -0
  587. package/dist/infra/queue/redis-connection.d.ts +13 -0
  588. package/dist/infra/queue/redis-connection.js +25 -0
  589. package/dist/infra/queue/retired-schedulers.d.ts +7 -0
  590. package/dist/infra/queue/retired-schedulers.js +9 -0
  591. package/dist/infra/queue/run-job.d.ts +16 -0
  592. package/dist/infra/queue/run-job.js +19 -0
  593. package/dist/infra/redis/redis.module.d.ts +24 -0
  594. package/dist/infra/redis/redis.module.js +91 -0
  595. package/dist/infra/schedule/cron-tick.d.ts +12 -0
  596. package/dist/infra/schedule/cron-tick.js +25 -0
  597. package/dist/infra/schedule/locked-cron.decorator.d.ts +27 -0
  598. package/dist/infra/schedule/locked-cron.decorator.js +53 -0
  599. package/dist/infra/schedule/locked-interval.d.ts +69 -0
  600. package/dist/infra/schedule/locked-interval.js +190 -0
  601. package/dist/infra/schedule/locked-tick.d.ts +90 -0
  602. package/dist/infra/schedule/locked-tick.js +137 -0
  603. package/dist/infra/schedule/schedule.module.d.ts +8 -0
  604. package/dist/infra/schedule/schedule.module.js +27 -0
  605. package/dist/infra/schedule/scheduled-runs.d.ts +69 -0
  606. package/dist/infra/schedule/scheduled-runs.js +163 -0
  607. package/dist/infra/swagger/swagger.d.ts +16 -0
  608. package/dist/infra/swagger/swagger.js +31 -0
  609. package/dist/infra/throttler/credential-throttler.d.ts +35 -0
  610. package/dist/infra/throttler/credential-throttler.js +77 -0
  611. package/dist/infra/throttler/named-throttlers.d.ts +36 -0
  612. package/dist/infra/throttler/named-throttlers.js +157 -0
  613. package/dist/infra/throttler/redis-throttler-storage.d.ts +38 -0
  614. package/dist/infra/throttler/redis-throttler-storage.js +130 -0
  615. package/dist/infra/throttler/throttler.guard.d.ts +23 -0
  616. package/dist/infra/throttler/throttler.guard.js +68 -0
  617. package/dist/infra/throttler/throttler.module.d.ts +15 -0
  618. package/dist/infra/throttler/throttler.module.js +53 -0
  619. package/dist/infra/tokens.d.ts +20 -0
  620. package/dist/infra/tokens.js +20 -0
  621. package/dist/infra/validation/create-zod-dto.d.ts +23 -0
  622. package/dist/infra/validation/create-zod-dto.js +35 -0
  623. package/dist/infra/validation/parse-with-zod.d.ts +7 -0
  624. package/dist/infra/validation/parse-with-zod.js +12 -0
  625. package/dist/infra/validation/validation.module.d.ts +3 -0
  626. package/dist/infra/validation/validation.module.js +16 -0
  627. package/dist/infra/validation/zod-params.d.ts +7 -0
  628. package/dist/infra/validation/zod-params.js +42 -0
  629. package/dist/infra/validation/zod-validation.pipe.d.ts +11 -0
  630. package/dist/infra/validation/zod-validation.pipe.js +31 -0
  631. package/dist/kernel.d.ts +9 -241
  632. package/dist/kernel.js +8 -1305
  633. package/dist/kernel.module.d.ts +17 -0
  634. package/dist/kernel.module.js +145 -0
  635. package/dist/lifecycle/kernel-lifecycle.d.ts +140 -0
  636. package/dist/lifecycle/kernel-lifecycle.js +465 -0
  637. package/dist/lifecycle/tokens.d.ts +3 -0
  638. package/dist/lifecycle/tokens.js +3 -0
  639. package/dist/log-config.d.ts +9 -0
  640. package/dist/log-config.js +27 -0
  641. package/dist/log-context.d.ts +34 -0
  642. package/dist/log-context.js +44 -0
  643. package/dist/log-loki.d.ts +34 -0
  644. package/dist/log-loki.js +145 -0
  645. package/dist/log.d.ts +53 -10
  646. package/dist/log.js +168 -18
  647. package/dist/models/embeddings.d.ts +82 -0
  648. package/dist/models/embeddings.js +326 -0
  649. package/dist/models/enablement.controller.d.ts +40 -0
  650. package/dist/models/enablement.controller.js +74 -0
  651. package/dist/models/enablement.d.ts +101 -0
  652. package/dist/models/enablement.js +264 -0
  653. package/dist/models/models.module.d.ts +7 -0
  654. package/dist/models/models.module.js +36 -0
  655. package/dist/models/org-models.schemas.d.ts +8 -0
  656. package/dist/models/org-models.schemas.js +22 -0
  657. package/dist/models/prices.d.ts +13 -5
  658. package/dist/models/prices.js +69 -39
  659. package/dist/models/purposes.controller.d.ts +6 -4
  660. package/dist/models/purposes.controller.js +16 -11
  661. package/dist/models/purposes.d.ts +103 -23
  662. package/dist/models/purposes.js +208 -77
  663. package/dist/net/public-address.js +3 -2
  664. package/dist/orgs/directory-sync.controller.d.ts +1 -1
  665. package/dist/orgs/directory-sync.controller.js +2 -2
  666. package/dist/orgs/directory-sync.d.ts +74 -35
  667. package/dist/orgs/directory-sync.js +243 -132
  668. package/dist/orgs/invitations.controller.d.ts +8 -8
  669. package/dist/orgs/invitations.controller.js +27 -26
  670. package/dist/orgs/invitations.service.d.ts +12 -9
  671. package/dist/orgs/invitations.service.js +130 -92
  672. package/dist/orgs/job-ids.d.ts +8 -0
  673. package/dist/orgs/job-ids.js +8 -0
  674. package/dist/orgs/members.service.d.ts +19 -12
  675. package/dist/orgs/members.service.js +161 -117
  676. package/dist/orgs/offboarding.d.ts +61 -60
  677. package/dist/orgs/offboarding.js +206 -95
  678. package/dist/orgs/org-lock.d.ts +33 -19
  679. package/dist/orgs/org-lock.js +94 -35
  680. package/dist/orgs/org.guard.d.ts +11 -1
  681. package/dist/orgs/org.guard.js +45 -34
  682. package/dist/orgs/orgs.controller.d.ts +13 -16
  683. package/dist/orgs/orgs.controller.js +29 -20
  684. package/dist/orgs/orgs.module.d.ts +6 -0
  685. package/dist/orgs/orgs.module.js +71 -0
  686. package/dist/orgs/orgs.schemas.d.ts +8 -0
  687. package/dist/orgs/orgs.schemas.js +16 -0
  688. package/dist/orgs/orgs.service.d.ts +47 -21
  689. package/dist/orgs/orgs.service.js +166 -91
  690. package/dist/orgs/roles.d.ts +1 -1
  691. package/dist/orgs/roles.js +5 -1
  692. package/dist/orgs/settings.controller.d.ts +2 -2
  693. package/dist/orgs/settings.controller.js +8 -6
  694. package/dist/orgs/settings.service.d.ts +45 -14
  695. package/dist/orgs/settings.service.js +110 -51
  696. package/dist/overrides.d.ts +63 -0
  697. package/dist/overrides.js +34 -0
  698. package/dist/platform/actor.d.ts +48 -0
  699. package/dist/platform/actor.js +100 -0
  700. package/dist/platform/agent-docs.d.ts +18 -0
  701. package/dist/platform/agent-docs.js +59 -0
  702. package/dist/platform/availability.d.ts +14 -0
  703. package/dist/platform/availability.js +43 -0
  704. package/dist/platform/errors.d.ts +28 -0
  705. package/dist/platform/errors.js +65 -0
  706. package/dist/platform/exclusions.d.ts +11 -0
  707. package/dist/platform/exclusions.js +667 -0
  708. package/dist/platform/method.d.ts +6 -0
  709. package/dist/platform/method.js +15 -0
  710. package/dist/platform/operation.d.ts +169 -0
  711. package/dist/platform/operation.js +90 -0
  712. package/dist/platform/ops/accounts.ops.d.ts +32 -0
  713. package/dist/platform/ops/accounts.ops.js +291 -0
  714. package/dist/platform/ops/admin.ops.d.ts +36 -0
  715. package/dist/platform/ops/admin.ops.js +389 -0
  716. package/dist/platform/ops/agent-skills.ops.d.ts +24 -0
  717. package/dist/platform/ops/agent-skills.ops.js +226 -0
  718. package/dist/platform/ops/agent-templates.ops.d.ts +17 -0
  719. package/dist/platform/ops/agent-templates.ops.js +272 -0
  720. package/dist/platform/ops/agents.ops.d.ts +37 -0
  721. package/dist/platform/ops/agents.ops.js +717 -0
  722. package/dist/platform/ops/approvals.ops.d.ts +30 -0
  723. package/dist/platform/ops/approvals.ops.js +116 -0
  724. package/dist/platform/ops/background.ops.d.ts +14 -0
  725. package/dist/platform/ops/background.ops.js +134 -0
  726. package/dist/platform/ops/catalog-admin.ops.d.ts +74 -0
  727. package/dist/platform/ops/catalog-admin.ops.js +599 -0
  728. package/dist/platform/ops/channels.ops.d.ts +16 -0
  729. package/dist/platform/ops/channels.ops.js +195 -0
  730. package/dist/platform/ops/components.ops.d.ts +46 -0
  731. package/dist/platform/ops/components.ops.js +853 -0
  732. package/dist/platform/ops/connectors.ops.d.ts +17 -0
  733. package/dist/platform/ops/connectors.ops.js +188 -0
  734. package/dist/platform/ops/conversations.ops.d.ts +30 -0
  735. package/dist/platform/ops/conversations.ops.js +470 -0
  736. package/dist/platform/ops/environments.ops.d.ts +26 -0
  737. package/dist/platform/ops/environments.ops.js +311 -0
  738. package/dist/platform/ops/errors.d.ts +16 -0
  739. package/dist/platform/ops/errors.js +30 -0
  740. package/dist/platform/ops/evals.ops.d.ts +28 -0
  741. package/dist/platform/ops/evals.ops.js +783 -0
  742. package/dist/platform/ops/extensions-admin.ops.d.ts +25 -0
  743. package/dist/platform/ops/extensions-admin.ops.js +372 -0
  744. package/dist/platform/ops/extensions.ops.d.ts +25 -0
  745. package/dist/platform/ops/extensions.ops.js +347 -0
  746. package/dist/platform/ops/inbox.ops.d.ts +25 -0
  747. package/dist/platform/ops/inbox.ops.js +378 -0
  748. package/dist/platform/ops/marketplaces.ops.d.ts +22 -0
  749. package/dist/platform/ops/marketplaces.ops.js +466 -0
  750. package/dist/platform/ops/models.ops.d.ts +25 -0
  751. package/dist/platform/ops/models.ops.js +232 -0
  752. package/dist/platform/ops/org-plugins.ops.d.ts +29 -0
  753. package/dist/platform/ops/org-plugins.ops.js +329 -0
  754. package/dist/platform/ops/org-settings.ops.d.ts +16 -0
  755. package/dist/platform/ops/org-settings.ops.js +102 -0
  756. package/dist/platform/ops/orgs.ops.d.ts +28 -0
  757. package/dist/platform/ops/orgs.ops.js +295 -0
  758. package/dist/platform/ops/other-orgs.d.ts +20 -0
  759. package/dist/platform/ops/other-orgs.js +72 -0
  760. package/dist/platform/ops/paging.d.ts +14 -0
  761. package/dist/platform/ops/paging.js +20 -0
  762. package/dist/platform/ops/platform.ops.d.ts +28 -0
  763. package/dist/platform/ops/platform.ops.js +204 -0
  764. package/dist/platform/ops/plugins.ops.d.ts +35 -0
  765. package/dist/platform/ops/plugins.ops.js +476 -0
  766. package/dist/platform/ops/previewers.ops.d.ts +14 -0
  767. package/dist/platform/ops/previewers.ops.js +109 -0
  768. package/dist/platform/ops/requests.ops.d.ts +14 -0
  769. package/dist/platform/ops/requests.ops.js +191 -0
  770. package/dist/platform/ops/role.d.ts +4 -0
  771. package/dist/platform/ops/role.js +10 -0
  772. package/dist/platform/ops/skills.ops.d.ts +17 -0
  773. package/dist/platform/ops/skills.ops.js +216 -0
  774. package/dist/platform/ops/summary.d.ts +10 -0
  775. package/dist/platform/ops/summary.js +18 -0
  776. package/dist/platform/ops/unavailable.d.ts +23 -0
  777. package/dist/platform/ops/unavailable.js +118 -0
  778. package/dist/platform/parity.d.ts +33 -0
  779. package/dist/platform/parity.js +272 -0
  780. package/dist/platform/platform-ops.module.d.ts +39 -0
  781. package/dist/platform/platform-ops.module.js +122 -0
  782. package/dist/platform/platform.module.d.ts +8 -0
  783. package/dist/platform/platform.module.js +25 -0
  784. package/dist/platform/registry.d.ts +30 -0
  785. package/dist/platform/registry.js +111 -0
  786. package/dist/platform/route-schemas.d.ts +18 -0
  787. package/dist/platform/route-schemas.js +63 -0
  788. package/dist/roles/gateway-role.d.ts +54 -0
  789. package/dist/roles/gateway-role.js +118 -0
  790. package/dist/roles/gateway.module.d.ts +9 -0
  791. package/dist/roles/gateway.module.js +31 -0
  792. package/dist/roles/worker-role.d.ts +65 -0
  793. package/dist/roles/worker-role.js +151 -0
  794. package/dist/roles/worker.module.d.ts +14 -0
  795. package/dist/roles/worker.module.js +106 -0
  796. package/dist/runtime/abort.js +19 -2
  797. package/dist/runtime/checkpointer.d.ts +8 -3
  798. package/dist/runtime/checkpointer.js +87 -55
  799. package/dist/runtime/context/build.d.ts +21 -13
  800. package/dist/runtime/context/build.js +106 -29
  801. package/dist/runtime/context/claude-tools.d.ts +4 -1
  802. package/dist/runtime/context/claude-tools.js +13 -12
  803. package/dist/runtime/context/compaction.js +24 -1
  804. package/dist/runtime/context/environment-paths.d.ts +40 -0
  805. package/dist/runtime/context/environment-paths.js +48 -0
  806. package/dist/runtime/context/legacy-text.d.ts +22 -0
  807. package/dist/runtime/context/legacy-text.js +37 -0
  808. package/dist/runtime/context/reminders.d.ts +2 -0
  809. package/dist/runtime/context/reminders.js +2 -0
  810. package/dist/runtime/context/run-context.d.ts +65 -0
  811. package/dist/runtime/context/run-context.js +215 -0
  812. package/dist/runtime/context/skills.d.ts +29 -11
  813. package/dist/runtime/context/skills.js +46 -32
  814. package/dist/runtime/context/tool-changes.d.ts +27 -0
  815. package/dist/runtime/context/tool-changes.js +60 -0
  816. package/dist/runtime/conversation-lock.d.ts +20 -11
  817. package/dist/runtime/conversation-lock.js +62 -72
  818. package/dist/runtime/hook-calls.d.ts +11 -4
  819. package/dist/runtime/hook-calls.js +41 -13
  820. package/dist/runtime/job-ids.d.ts +10 -0
  821. package/dist/runtime/job-ids.js +10 -0
  822. package/dist/runtime/langgraph-loop.d.ts +3 -1
  823. package/dist/runtime/langgraph-loop.js +37 -18
  824. package/dist/runtime/loop.d.ts +42 -6
  825. package/dist/runtime/loop.js +14 -0
  826. package/dist/runtime/maintenance-queue.d.ts +10 -0
  827. package/dist/runtime/maintenance-queue.js +10 -0
  828. package/dist/runtime/maintenance.d.ts +50 -74
  829. package/dist/runtime/maintenance.js +166 -136
  830. package/dist/runtime/model-call.d.ts +61 -15
  831. package/dist/runtime/model-call.js +128 -84
  832. package/dist/runtime/providers.d.ts +158 -27
  833. package/dist/runtime/providers.js +373 -63
  834. package/dist/runtime/quota.d.ts +17 -3
  835. package/dist/runtime/quota.js +27 -2
  836. package/dist/runtime/retired-schedulers.d.ts +7 -0
  837. package/dist/runtime/retired-schedulers.js +31 -0
  838. package/dist/runtime/run-context.service.d.ts +65 -0
  839. package/dist/runtime/run-context.service.js +236 -0
  840. package/dist/runtime/run-control.d.ts +43 -0
  841. package/dist/runtime/run-control.js +89 -0
  842. package/dist/runtime/run-drafts.d.ts +85 -0
  843. package/dist/runtime/run-drafts.js +230 -0
  844. package/dist/runtime/run-finish.d.ts +27 -18
  845. package/dist/runtime/run-finish.js +98 -51
  846. package/dist/runtime/run-jobs.d.ts +46 -0
  847. package/dist/runtime/run-jobs.js +91 -0
  848. package/dist/runtime/run-processors.d.ts +60 -0
  849. package/dist/runtime/run-processors.js +185 -0
  850. package/dist/runtime/run-queue.d.ts +90 -58
  851. package/dist/runtime/run-queue.js +566 -297
  852. package/dist/runtime/run-steps.d.ts +39 -0
  853. package/dist/runtime/run-steps.js +96 -0
  854. package/dist/runtime/run-worker.d.ts +134 -77
  855. package/dist/runtime/run-worker.js +412 -236
  856. package/dist/runtime/runtime.module.d.ts +10 -0
  857. package/dist/runtime/runtime.module.js +122 -0
  858. package/dist/runtime/step-log.d.ts +51 -0
  859. package/dist/runtime/step-log.js +111 -0
  860. package/dist/runtime/stream.controller.d.ts +28 -9
  861. package/dist/runtime/stream.controller.js +72 -13
  862. package/dist/runtime/stream.d.ts +27 -6
  863. package/dist/runtime/stream.js +102 -7
  864. package/dist/runtime/subagents/child.d.ts +58 -51
  865. package/dist/runtime/subagents/child.js +105 -86
  866. package/dist/runtime/subagents/definition.d.ts +32 -28
  867. package/dist/runtime/subagents/definition.js +89 -143
  868. package/dist/runtime/subagents/deliveries.d.ts +71 -0
  869. package/dist/runtime/subagents/deliveries.js +228 -0
  870. package/dist/runtime/subagents/dispatch.d.ts +197 -27
  871. package/dist/runtime/subagents/dispatch.js +336 -270
  872. package/dist/runtime/subagents/limits.d.ts +32 -8
  873. package/dist/runtime/subagents/limits.js +44 -8
  874. package/dist/runtime/subagents/messages.d.ts +95 -0
  875. package/dist/runtime/subagents/messages.js +328 -0
  876. package/dist/runtime/subagents/org-agents.d.ts +4 -4
  877. package/dist/runtime/subagents/org-agents.js +3 -2
  878. package/dist/runtime/subagents/preamble.d.ts +4 -4
  879. package/dist/runtime/subagents/preamble.js +9 -7
  880. package/dist/runtime/subagents/progress.d.ts +10 -8
  881. package/dist/runtime/subagents/progress.js +11 -6
  882. package/dist/runtime/subagents/render.d.ts +30 -0
  883. package/dist/runtime/subagents/render.js +53 -0
  884. package/dist/runtime/subagents/roster.d.ts +27 -10
  885. package/dist/runtime/subagents/roster.js +49 -13
  886. package/dist/runtime/subagents/skill-fork.d.ts +10 -10
  887. package/dist/runtime/subagents/skill-fork.js +23 -8
  888. package/dist/runtime/subagents/status.d.ts +14 -0
  889. package/dist/runtime/subagents/status.js +23 -0
  890. package/dist/runtime/subagents/subagents.service.d.ts +43 -0
  891. package/dist/runtime/subagents/subagents.service.js +106 -0
  892. package/dist/runtime/usage-report-jobs.d.ts +88 -0
  893. package/dist/runtime/usage-report-jobs.js +158 -0
  894. package/dist/runtime/usage-report.d.ts +121 -83
  895. package/dist/runtime/usage-report.js +355 -180
  896. package/dist/runtime/waits.d.ts +258 -81
  897. package/dist/runtime/waits.js +800 -263
  898. package/dist/sandbox/job-ids.d.ts +10 -0
  899. package/dist/sandbox/job-ids.js +10 -0
  900. package/dist/sandbox/jobs.d.ts +68 -0
  901. package/dist/sandbox/jobs.js +150 -0
  902. package/dist/sandbox/leases.d.ts +73 -82
  903. package/dist/sandbox/leases.js +162 -346
  904. package/dist/sandbox/providers.d.ts +46 -0
  905. package/dist/sandbox/providers.js +83 -0
  906. package/dist/sandbox/sandbox.module.d.ts +9 -0
  907. package/dist/sandbox/sandbox.module.js +36 -0
  908. package/dist/sandbox/sandbox.service.d.ts +359 -151
  909. package/dist/sandbox/sandbox.service.js +950 -435
  910. package/dist/sandbox/unreachable.d.ts +30 -0
  911. package/dist/sandbox/unreachable.js +108 -0
  912. package/dist/skills/catalog.d.ts +40 -26
  913. package/dist/skills/catalog.js +120 -99
  914. package/dist/skills/changes.controller.d.ts +11 -4
  915. package/dist/skills/changes.controller.js +34 -9
  916. package/dist/skills/changes.service.d.ts +31 -21
  917. package/dist/skills/changes.service.js +426 -368
  918. package/dist/skills/invocable.controller.d.ts +2 -2
  919. package/dist/skills/invocable.controller.js +10 -7
  920. package/dist/skills/invocation-keys.d.ts +1 -1
  921. package/dist/skills/invocation-keys.js +1 -1
  922. package/dist/skills/invoke.d.ts +19 -18
  923. package/dist/skills/invoke.js +68 -24
  924. package/dist/skills/package.d.ts +20 -1
  925. package/dist/skills/package.js +28 -1
  926. package/dist/skills/skills.controller.d.ts +33 -7
  927. package/dist/skills/skills.controller.js +79 -12
  928. package/dist/skills/skills.module.d.ts +6 -0
  929. package/dist/skills/skills.module.js +39 -0
  930. package/dist/skills/skills.schemas.d.ts +48 -0
  931. package/dist/skills/skills.schemas.js +61 -0
  932. package/dist/skills/skills.service.d.ts +151 -44
  933. package/dist/skills/skills.service.js +636 -204
  934. package/dist/skills/usable.d.ts +81 -0
  935. package/dist/skills/usable.js +379 -0
  936. package/dist/storage/job-ids.d.ts +6 -0
  937. package/dist/storage/job-ids.js +6 -0
  938. package/dist/storage/purge.d.ts +22 -7
  939. package/dist/storage/purge.js +55 -3
  940. package/dist/storage/storage.module.d.ts +6 -0
  941. package/dist/storage/storage.module.js +23 -0
  942. package/dist/storage/storage.service.d.ts +18 -4
  943. package/dist/storage/storage.service.js +44 -3
  944. package/dist/time-zone.d.ts +5 -0
  945. package/dist/time-zone.js +19 -0
  946. package/dist/tools/approvals.controller.d.ts +1 -1
  947. package/dist/tools/approvals.controller.js +14 -11
  948. package/dist/tools/approvals.schemas.d.ts +21 -0
  949. package/dist/tools/approvals.schemas.js +15 -0
  950. package/dist/tools/approvals.service.d.ts +53 -27
  951. package/dist/tools/approvals.service.js +365 -260
  952. package/dist/tools/breaker.d.ts +2 -2
  953. package/dist/tools/breaker.js +21 -3
  954. package/dist/tools/builtin-names.d.ts +109 -0
  955. package/dist/tools/builtin-names.js +173 -0
  956. package/dist/tools/builtins/agent.d.ts +27 -25
  957. package/dist/tools/builtins/agent.js +66 -63
  958. package/dist/tools/builtins/ask-user.d.ts +3 -3
  959. package/dist/tools/builtins/ask-user.js +3 -3
  960. package/dist/tools/builtins/builtin-tools.d.ts +41 -0
  961. package/dist/tools/builtins/builtin-tools.js +151 -0
  962. package/dist/tools/builtins/current-time.d.ts +26 -0
  963. package/dist/tools/builtins/current-time.js +99 -0
  964. package/dist/tools/builtins/handback.d.ts +28 -0
  965. package/dist/tools/builtins/handback.js +53 -0
  966. package/dist/tools/builtins/platform.d.ts +51 -0
  967. package/dist/tools/builtins/platform.js +451 -0
  968. package/dist/tools/builtins/read-tool-output.d.ts +3 -3
  969. package/dist/tools/builtins/read-tool-output.js +3 -3
  970. package/dist/tools/builtins/sandbox/bash.d.ts +5 -5
  971. package/dist/tools/builtins/sandbox/bash.js +293 -41
  972. package/dist/tools/builtins/sandbox/common.d.ts +142 -40
  973. package/dist/tools/builtins/sandbox/common.js +227 -65
  974. package/dist/tools/builtins/sandbox/deliver.d.ts +1 -1
  975. package/dist/tools/builtins/sandbox/deliver.js +21 -18
  976. package/dist/tools/builtins/sandbox/edit.d.ts +1 -1
  977. package/dist/tools/builtins/sandbox/edit.js +65 -51
  978. package/dist/tools/builtins/sandbox/file-state.d.ts +34 -0
  979. package/dist/tools/builtins/sandbox/file-state.js +34 -0
  980. package/dist/tools/builtins/sandbox/glob-match.d.ts +1 -1
  981. package/dist/tools/builtins/sandbox/glob-match.js +1 -1
  982. package/dist/tools/builtins/sandbox/glob.d.ts +1 -1
  983. package/dist/tools/builtins/sandbox/glob.js +19 -14
  984. package/dist/tools/builtins/sandbox/grep.d.ts +7 -4
  985. package/dist/tools/builtins/sandbox/grep.js +155 -36
  986. package/dist/tools/builtins/sandbox/index.d.ts +9 -5
  987. package/dist/tools/builtins/sandbox/index.js +13 -5
  988. package/dist/tools/builtins/sandbox/read.d.ts +2 -2
  989. package/dist/tools/builtins/sandbox/read.js +30 -20
  990. package/dist/tools/builtins/sandbox/task-output.d.ts +79 -0
  991. package/dist/tools/builtins/sandbox/task-output.js +334 -0
  992. package/dist/tools/builtins/sandbox/task-stop.d.ts +10 -0
  993. package/dist/tools/builtins/sandbox/task-stop.js +113 -0
  994. package/dist/tools/builtins/sandbox/write.d.ts +1 -1
  995. package/dist/tools/builtins/sandbox/write.js +52 -45
  996. package/dist/tools/builtins/send-message.d.ts +56 -0
  997. package/dist/tools/builtins/send-message.js +100 -0
  998. package/dist/tools/builtins/skill-load.d.ts +32 -21
  999. package/dist/tools/builtins/skill-load.js +125 -74
  1000. package/dist/tools/builtins/skill-write.d.ts +4 -4
  1001. package/dist/tools/builtins/skill-write.js +12 -12
  1002. package/dist/tools/builtins/tool-search.d.ts +13 -9
  1003. package/dist/tools/builtins/tool-search.js +25 -14
  1004. package/dist/tools/builtins/web/errors.d.ts +8 -0
  1005. package/dist/tools/builtins/web/errors.js +53 -0
  1006. package/dist/tools/builtins/web/extract.d.ts +62 -0
  1007. package/dist/tools/builtins/web/extract.js +271 -0
  1008. package/dist/tools/builtins/web/fetch.d.ts +55 -0
  1009. package/dist/tools/builtins/web/fetch.js +175 -0
  1010. package/dist/tools/builtins/web/index.d.ts +13 -0
  1011. package/dist/tools/builtins/web/index.js +12 -0
  1012. package/dist/tools/builtins/web/page-cache.d.ts +25 -0
  1013. package/dist/tools/builtins/web/page-cache.js +77 -0
  1014. package/dist/tools/builtins/web/search.d.ts +25 -0
  1015. package/dist/tools/builtins/web/search.js +210 -0
  1016. package/dist/tools/builtins/web/url.d.ts +17 -0
  1017. package/dist/tools/builtins/web/url.js +43 -0
  1018. package/dist/tools/canonical-json.d.ts +6 -0
  1019. package/dist/tools/canonical-json.js +16 -0
  1020. package/dist/tools/connector-content.controller.d.ts +1 -1
  1021. package/dist/tools/connector-content.controller.js +11 -6
  1022. package/dist/tools/connector-content.d.ts +12 -15
  1023. package/dist/tools/connector-content.js +53 -18
  1024. package/dist/tools/connectors.controller.d.ts +16 -3
  1025. package/dist/tools/connectors.controller.js +34 -14
  1026. package/dist/tools/connectors.schemas.d.ts +12 -0
  1027. package/dist/tools/connectors.schemas.js +19 -0
  1028. package/dist/tools/connectors.service.d.ts +80 -18
  1029. package/dist/tools/connectors.service.js +529 -358
  1030. package/dist/tools/credentials.d.ts +20 -20
  1031. package/dist/tools/credentials.js +55 -34
  1032. package/dist/tools/display-names.d.ts +9 -0
  1033. package/dist/tools/display-names.js +24 -0
  1034. package/dist/tools/drift.d.ts +29 -41
  1035. package/dist/tools/drift.js +116 -84
  1036. package/dist/tools/elicitation.js +1 -1
  1037. package/dist/tools/extension-tools.controller.d.ts +14 -0
  1038. package/dist/tools/extension-tools.controller.js +37 -0
  1039. package/dist/tools/info.d.ts +73 -13
  1040. package/dist/tools/info.js +151 -39
  1041. package/dist/tools/job-ids.d.ts +13 -0
  1042. package/dist/tools/job-ids.js +15 -0
  1043. package/dist/tools/jobs.d.ts +24 -0
  1044. package/dist/tools/jobs.js +69 -0
  1045. package/dist/tools/legacy-data.d.ts +34 -0
  1046. package/dist/tools/legacy-data.js +76 -0
  1047. package/dist/tools/legacy-keys.d.ts +51 -0
  1048. package/dist/tools/legacy-keys.js +115 -0
  1049. package/dist/tools/naming.d.ts +1 -5
  1050. package/dist/tools/naming.js +1 -7
  1051. package/dist/tools/oauth/flow-paths.d.ts +16 -0
  1052. package/dist/tools/oauth/flow-paths.js +38 -0
  1053. package/dist/tools/oauth/flow.d.ts +30 -30
  1054. package/dist/tools/oauth/flow.js +109 -81
  1055. package/dist/tools/oauth/oauth.controller.d.ts +3 -3
  1056. package/dist/tools/oauth/oauth.controller.js +12 -9
  1057. package/dist/tools/oauth/tokens.d.ts +45 -10
  1058. package/dist/tools/oauth/tokens.js +70 -24
  1059. package/dist/tools/org-tool-switches.d.ts +88 -0
  1060. package/dist/tools/org-tool-switches.js +201 -0
  1061. package/dist/tools/outputs.d.ts +13 -4
  1062. package/dist/tools/outputs.js +48 -4
  1063. package/dist/tools/pipeline.d.ts +108 -80
  1064. package/dist/tools/pipeline.js +396 -409
  1065. package/dist/tools/policy.d.ts +4 -17
  1066. package/dist/tools/policy.js +49 -35
  1067. package/dist/tools/questions.controller.d.ts +2 -2
  1068. package/dist/tools/questions.controller.js +9 -6
  1069. package/dist/tools/questions.service.d.ts +26 -25
  1070. package/dist/tools/questions.service.js +201 -142
  1071. package/dist/tools/registry.d.ts +215 -84
  1072. package/dist/tools/registry.js +382 -264
  1073. package/dist/tools/resources.d.ts +1 -1
  1074. package/dist/tools/resources.js +1 -1
  1075. package/dist/tools/specs.d.ts +5 -4
  1076. package/dist/tools/specs.js +3 -1
  1077. package/dist/tools/tools.module.d.ts +10 -0
  1078. package/dist/tools/tools.module.js +113 -0
  1079. package/dist/tools/validate.js +1 -1
  1080. package/dist/ui/call-extension.d.ts +16 -0
  1081. package/dist/ui/call-extension.js +38 -0
  1082. package/dist/ui/embed-token.d.ts +9 -5
  1083. package/dist/ui/embed-token.js +34 -6
  1084. package/dist/ui/ui-stream.d.ts +22 -17
  1085. package/dist/ui/ui-stream.js +72 -12
  1086. package/dist/ui/ui.module.d.ts +7 -0
  1087. package/dist/ui/ui.module.js +28 -0
  1088. package/dist/ui/views.controller.d.ts +14 -12
  1089. package/dist/ui/views.controller.js +32 -25
  1090. package/dist/ui/views.d.ts +10 -57
  1091. package/dist/ui/views.js +58 -46
  1092. package/package.json +15 -3
  1093. package/src/migrations/0063_tool_keys_claude_code.sql +220 -0
  1094. package/src/migrations/0064_account_last_org.sql +7 -0
  1095. package/src/migrations/0065_conversation_archive.sql +8 -0
  1096. package/src/migrations/0066_extension_display_name.sql +4 -0
  1097. package/src/migrations/0067_agent_profiles.sql +20 -0
  1098. package/src/migrations/0068_agent_avatar_uploads.sql +7 -0
  1099. package/src/migrations/0069_attachments_agent_idx.sql +3 -0
  1100. package/src/migrations/0070_background_tasks.sql +37 -0
  1101. package/src/migrations/0071_background_tasks_reserve.sql +6 -0
  1102. package/src/migrations/0072_background_tasks_stopping.sql +5 -0
  1103. package/src/migrations/0073_org_extension_point_defaults.sql +11 -0
  1104. package/src/migrations/0074_subagent_tree.sql +50 -0
  1105. package/src/migrations/0075_plugin_scope.sql +61 -0
  1106. package/src/migrations/0076_skills_created_by_nullable.sql +6 -0
  1107. package/src/migrations/0077_scope_requests.sql +52 -0
  1108. package/src/migrations/0078_scope_grant_switches.sql +18 -0
  1109. package/src/migrations/0079_scope_live_install_switches.sql +19 -0
  1110. package/src/migrations/0080_rename_enterprise_admin.sql +18 -0
  1111. package/src/migrations/0081_platform_components.sql +129 -0
  1112. package/src/migrations/0082_platform_migration.sql +33 -0
  1113. package/src/migrations/0083_plugin_scope_sync_failures.sql +15 -0
  1114. package/src/migrations/0084_org_owned_items.sql +85 -0
  1115. package/src/migrations/0085_agent_templates_phase4.sql +45 -0
  1116. package/src/migrations/0086_org_layering.sql +30 -0
  1117. package/src/migrations/0087_approval_summary.sql +6 -0
  1118. package/src/migrations/0088_environments.sql +80 -0
  1119. package/src/migrations/0089_model_kinds_usage.sql +38 -0
  1120. package/src/migrations/0090_initial_passwords.sql +27 -0
  1121. package/src/migrations/0091_account_time_zone.sql +4 -0
  1122. package/src/migrations/0092_tools_default_on.sql +27 -0
  1123. package/src/migrations/0093_connected_environments.sql +37 -0
  1124. package/src/migrations/0094_environment_paths_idx.sql +7 -0
  1125. package/src/migrations/0095_environment_files_resets.sql +5 -0
  1126. package/src/migrations/0096_environment_demoted_default.sql +18 -0
  1127. package/src/migrations/0097_extension_installs_enabled_at.sql +16 -0
  1128. package/src/migrations/0098_single_provider_running_first.sql +41 -0
  1129. package/src/migrations/0099_channel_connection_guide_ack.sql +6 -0
  1130. package/src/migrations/0100_catalog_files.sql +13 -0
  1131. package/src/migrations/0101_marketplace_icons.sql +32 -0
  1132. package/dist/catalog/upgrade-targets.d.ts +0 -59
  1133. package/dist/catalog/upgrade-targets.js +0 -90
  1134. package/dist/conversations/sandbox-status.d.ts +0 -21
  1135. package/dist/conversations/sandbox-status.js +0 -24
  1136. package/dist/extensions/org-config.controller.d.ts +0 -24
  1137. package/dist/extensions/org-config.controller.js +0 -59
  1138. package/dist/http/gateway.module.js +0 -13
  1139. package/dist/http/health.controller.d.ts +0 -26
  1140. package/dist/http/health.controller.js +0 -79
  1141. package/dist/http/tokens.d.ts +0 -131
  1142. package/dist/http/tokens.js +0 -131
  1143. package/dist/http/zod.pipe.d.ts +0 -8
  1144. package/dist/http/zod.pipe.js +0 -14
  1145. package/dist/identity/enterprise-admin.d.ts +0 -14
  1146. package/dist/identity/enterprise-admin.js +0 -27
  1147. package/dist/identity/rate-limit.d.ts +0 -55
  1148. package/dist/identity/rate-limit.js +0 -121
  1149. package/dist/sandbox/lifecycle.d.ts +0 -21
  1150. package/dist/sandbox/lifecycle.js +0 -68
  1151. package/dist/tools/builtins/sandbox/names.d.ts +0 -7
  1152. package/dist/tools/builtins/sandbox/names.js +0 -20
@@ -1,19 +1,36 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
8
+ return function (target, key) { decorator(target, key, paramIndex); }
9
+ };
1
10
  import { randomUUID } from "node:crypto";
2
- import { CATALOG_ITEM_NAME_RE, marketplaceEntryVersion, PLUGIN_MANIFEST_FILE, parseMarketplaceManifest, parsePluginManifest, SDK_VERSION, SEMVER_VERSION_RE, } from "@capybara-hq/plugin-sdk";
11
+ import { CATALOG_ITEM_NAME_RE, marketplaceEntryDeprecation, marketplaceEntryVersion, PLUGIN_MANIFEST_FILE, parseMarketplaceManifest, parsePluginManifest, pluginDescription, SDK_VERSION, SEMVER_VERSION_RE, } from "@capybara-hq/plugin-sdk";
12
+ import { Inject, Injectable } from "@nestjs/common";
3
13
  import { sql } from "kysely";
4
14
  import semver from "semver";
5
15
  import { MARKETPLACE_MAX_MIRRORS } from "../config/schema.js";
6
16
  import { ConfigError } from "../config/types.js";
7
17
  import { createSecrets } from "../ctx/secrets.js";
8
18
  import { ApiError } from "../errors.js";
9
- import { DEPLOYMENT_SECRETS_ORG } from "../extensions/deployment-config.js";
19
+ import { DEPLOYMENT_SECRETS_ORG } from "../extensions/deployment-config-store.js";
10
20
  import { audit } from "../identity/audit.js";
11
- import { lockEnterpriseAdminsAndAuthorize } from "../identity/enterprise-admin.js";
21
+ import { SuperAdminLock } from "../identity/super-admin.js";
22
+ import { KernelConfigService } from "../infra/config/kernel-config.service.js";
23
+ import { KernelDb } from "../infra/database/kernel-db.js";
24
+ import { TransactionHost } from "../infra/database/transaction-host.js";
25
+ import { Transactional } from "../infra/database/transactional.decorator.js";
26
+ import { KERNEL_LOGGER, KEYRING } from "../infra/tokens.js";
12
27
  import { KERNEL_VERSION } from "../version.js";
13
28
  import { CLAUDE_PLUGIN_FILE } from "./claude/manifest.js";
14
29
  import { CLAUDE_MARKETPLACE_FILE, parseClaudeMarketplace, } from "./claude/marketplace.js";
15
30
  import { expandGitUrl, GitSourceError, gitErrorDetails, gitLocationIdentity, gitUrlIdentity, normalGitPath, readGitTreeAndOids, resolveGitCommit, } from "./git-source.js";
31
+ import { CatalogSourceLock } from "./locks.js";
16
32
  import { fetchMarketplaceManifest, MarketplaceFetchError, MarketplaceInvalidError, marketplaceNetPolicy, marketplaceUrlProblem, } from "./marketplace-fetch.js";
33
+ import { checkMarketplaceIcon, fetchMarketplaceIcon, gitIconPaths, MARKETPLACE_ICON_CONCURRENCY, MARKETPLACE_ICON_FETCHES_MAX, MARKETPLACE_ICON_MAX_BYTES, MARKETPLACE_ICON_RETRY_MS, marketplaceIconUrl, wantedIcons, } from "./marketplace-icons.js";
17
34
  import { compareVersions, newestFirst, sameRelease } from "./versions.js";
18
35
  /** 官方清单来源的 id。 */
19
36
  export const OFFICIAL_MARKETPLACE_ID = "official";
@@ -227,6 +244,20 @@ export function headsToResolve(entries, imported, config, max) {
227
244
  export const HOST_VERSIONS = { kernel: KERNEL_VERSION, sdk: SDK_VERSION };
228
245
  /** Whether this deployment satisfies the entry's `minKernel`. */
229
246
  export const entryCompatible = (e) => e.minKernel === undefined || semver.gte(HOST_VERSIONS.kernel, e.minKernel);
247
+ /** Whether the marketplace marks the entry deprecated (`deprecated: true` or with a reason). */
248
+ export const entryDeprecated = (e) => marketplaceEntryDeprecation(e) !== null;
249
+ /**
250
+ * Refuses importing (or requesting) a deprecated marketplace entry: 409
251
+ * `marketplace.entry_deprecated`, its reason in the message and details.
252
+ */
253
+ export function assertEntryNotDeprecated(e) {
254
+ const d = marketplaceEntryDeprecation(e);
255
+ if (d === null)
256
+ return;
257
+ const version = marketplaceEntryVersion(e);
258
+ throw new ApiError("marketplace.entry_deprecated", `${e.name}${version !== null ? `@${version}` : ""} is deprecated by its marketplace` +
259
+ `${d.reason !== null ? `: ${d.reason}` : ""}; import another version`, [{ entry: e.name, version, reason: d.reason }]);
260
+ }
230
261
  /**
231
262
  * The form of a marketplace address (spec §5.1): `owner/repo` (expanded to GitHub), an https URL
232
263
  * whose path ends in `.git`, or any URL with `form: "git"` is a git repository; anything else
@@ -266,7 +297,7 @@ export function hostAllowed(host, config) {
266
297
  return allowed.length === 0 || allowed.includes(host.toLowerCase());
267
298
  }
268
299
  /** Why an entry is not importable from a marketplace of `form`, or undefined when it is. */
269
- function unimportable(e, form, config) {
300
+ export function unimportable(e, form, config) {
270
301
  if ("path" in e.source && form !== "git")
271
302
  return "path_needs_git_marketplace";
272
303
  const host = entrySourceHost(e);
@@ -276,10 +307,30 @@ function unimportable(e, form, config) {
276
307
  }
277
308
  /** 来源是否生效:本身启用,official 还要配置没关。 */
278
309
  export const sourceEffective = (row, config) => row.enabled && (!row.builtin || config.marketplaces.official.enabled);
310
+ /**
311
+ * The default entry of a marketplace plugin (`version` `""`: the entry without a version), the
312
+ * same order as the web's market row (`groupMarketplaceEntries`, apps/web/src/lib/catalog.ts):
313
+ * the newest `usable` versioned entry, a stable version before a prerelease; else the entry
314
+ * without a version that is not deprecated; else the newest versioned one that is not deprecated;
315
+ * else the entry without a version; else the newest.
316
+ */
317
+ export function pickDefaultEntry(entries, o) {
318
+ const versioned = entries
319
+ .filter((e) => e.version !== "")
320
+ .sort((a, b) => newestFirst(a.version, b.version));
321
+ const bare = entries.filter((e) => e.version === "");
322
+ return (versioned.find((e) => o.usable(e) && semver.prerelease(e.version) === null) ??
323
+ versioned.find(o.usable) ??
324
+ bare.find((e) => !o.deprecated(e)) ??
325
+ versioned.find((e) => !o.deprecated(e)) ??
326
+ bare[0] ??
327
+ versioned[0]);
328
+ }
279
329
  /**
280
330
  * Reads a marketplace entry for import: `version` given -> the entry listing that version; omitted
281
- * -> the newest compatible versioned entry, else the entry without a version, else the newest
282
- * versioned one (refused later as incompatible). Marketplace missing -> `marketplace.not_found`;
331
+ * -> {@link pickDefaultEntry} over the compatible, importable entries that are not deprecated
332
+ * (a fallback is refused later as incompatible or deprecated). Marketplace missing ->
333
+ * `marketplace.not_found`;
283
334
  * marketplace disabled (official offline included), entry or version missing ->
284
335
  * `marketplace.entry_not_found`.
285
336
  */
@@ -309,13 +360,13 @@ export async function loadMarketplaceEntry(db, config, sourceId, name, version)
309
360
  pickedRow = entries.find((e) => e.version === version);
310
361
  }
311
362
  else {
312
- const versioned = entries
313
- .filter((e) => e.version !== "")
314
- .sort((a, b) => newestFirst(a.version, b.version));
315
- pickedRow =
316
- versioned.find((e) => entryCompatible(e.entry)) ??
317
- entries.find((e) => e.version === "") ??
318
- versioned[0];
363
+ pickedRow = pickDefaultEntry(entries, {
364
+ // compatible, importable, not deprecated
365
+ usable: (e) => entryCompatible(e.entry) &&
366
+ unimportable(e.entry, src.form, config) === undefined &&
367
+ !entryDeprecated(e.entry),
368
+ deprecated: (e) => entryDeprecated(e.entry),
369
+ });
319
370
  }
320
371
  const picked = pickedRow?.entry;
321
372
  if (!picked) {
@@ -337,19 +388,37 @@ export async function loadMarketplaceEntry(db, config, sourceId, name, version)
337
388
  };
338
389
  }
339
390
  /**
340
- * Marketplaces (D16 / C25 / C26, `/api/v1/admin/marketplaces/*`, enterprise admins only): the official
391
+ * Marketplaces (D16 / C25 / C26, `/api/v1/admin/marketplaces/*`, super admins only): the official
341
392
  * marketplace (config `marketplaces.official.*`, synced at startup into the marketplace with id
342
- * `official`) and enterprise marketplaces (PG, optional token in secrets). A refresh (maintenance
393
+ * `official`) and custom marketplaces (PG, optional token in secrets). A refresh (maintenance
343
394
  * job `catalogs-refresh` every `marketplaces.refreshIntervalMinutes` minutes, or manual) tries the main
344
395
  * URL and then the mirrors with If-None-Match; on success it replaces that marketplace's cached
345
396
  * entries as a whole, when all fail (an invalid manifest included) it keeps the previous ones with
346
397
  * status `error`. A status change audits `marketplace.refreshed` and logs once. Stateless, shared
347
398
  * by every replica.
348
399
  */
349
- export class MarketplacesService {
350
- d;
351
- constructor(d) {
352
- this.d = d;
400
+ let MarketplacesService = class MarketplacesService {
401
+ kdb;
402
+ adminLock;
403
+ sourceLock;
404
+ config;
405
+ keyring;
406
+ log;
407
+ txHost;
408
+ constructor(kdb,
409
+ /** The super admin lock (identity/super-admin.ts): joins the caller's transaction. */
410
+ adminLock, sourceLock, config, keyring, log, txHost) {
411
+ this.kdb = kdb;
412
+ this.adminLock = adminLock;
413
+ this.sourceLock = sourceLock;
414
+ this.config = config;
415
+ this.keyring = keyring;
416
+ this.log = log;
417
+ this.txHost = txHost;
418
+ }
419
+ /** The kernel-schema handle of the current context (the transaction, else the pool). */
420
+ get db() {
421
+ return this.kdb.db;
353
422
  }
354
423
  /**
355
424
  * Creates / updates the official marketplace from config (name, URL, its form per
@@ -360,14 +429,14 @@ export class MarketplacesService {
360
429
  * without the schema).
361
430
  */
362
431
  async syncOfficialFromConfig() {
363
- const o = this.d.config().marketplaces.official;
432
+ const o = this.config.get().marketplaces.official;
364
433
  const { form, url } = marketplaceForm(o.url);
365
434
  if (form === "git" && o.mirrors.length > 0) {
366
435
  throw new ConfigError("invalid configuration:\n - marketplaces.official.mirrors: a git marketplace has no mirrors (point marketplaces.official.url at a mirror repository instead)");
367
436
  }
368
437
  const mirrors = JSON.stringify(o.mirrors);
369
438
  const same = sql `marketplaces.url = excluded.url AND marketplaces.form = excluded.form`;
370
- await this.d.db
439
+ await this.db
371
440
  .insertInto("marketplaces")
372
441
  .values({
373
442
  id: OFFICIAL_MARKETPLACE_ID,
@@ -393,7 +462,7 @@ export class MarketplacesService {
393
462
  }
394
463
  /** 全部来源(official 在前,其余按创建时间)。 */
395
464
  async list() {
396
- const rows = (await this.d.db
465
+ const rows = (await this.db
397
466
  .selectFrom("marketplaces")
398
467
  .selectAll()
399
468
  .orderBy("builtin", "desc")
@@ -403,7 +472,7 @@ export class MarketplacesService {
403
472
  return this.views(rows);
404
473
  }
405
474
  async get(id) {
406
- const row = (await this.d.db
475
+ const row = (await this.db
407
476
  .selectFrom("marketplaces")
408
477
  .selectAll()
409
478
  .where("id", "=", id)
@@ -413,7 +482,7 @@ export class MarketplacesService {
413
482
  return (await this.views([row]))[0];
414
483
  }
415
484
  /**
416
- * Adds an enterprise marketplace (audit `marketplace.added`). URL and mirrors must be https,
485
+ * Adds a custom marketplace (audit `marketplace.added`). URL and mirrors must be https,
417
486
  * without user info. The form follows {@link marketplaceForm}; a git marketplace may name a `ref`
418
487
  * (branch or tag, default the remote HEAD) and has no mirrors.
419
488
  */
@@ -425,44 +494,67 @@ export class MarketplacesService {
425
494
  if (input.token !== undefined)
426
495
  this.checkToken(input.token);
427
496
  const id = randomUUID();
428
- await this.d.db.transaction().execute(async (trx) => {
429
- await lockEnterpriseAdminsAndAuthorize(trx, actor);
430
- await trx
431
- .insertInto("marketplaces")
432
- .values({
433
- id,
497
+ await this.writeAdd(actor, id, { ...input, name, form, url }, opts);
498
+ return this.get(id);
499
+ }
500
+ /**
501
+ * The read-only checks of {@link add}, for the `Platform` tool's precheck (before the card): the
502
+ * name, URL and git fields as `add` checks them (throws `validation_failed`), then the source
503
+ * that has the same URL and ref already, if any (adding a duplicate is allowed; the tool points
504
+ * the agent at the existing source instead).
505
+ */
506
+ async checkAdd(input) {
507
+ this.checkName(input.name);
508
+ const { form, url } = marketplaceForm(input.url);
509
+ this.checkUrls(url, []);
510
+ this.checkGitFields(form, input.ref ?? null, []);
511
+ const same = await this.db
512
+ .selectFrom("marketplaces")
513
+ .select(["id", "name"])
514
+ .where("url", "=", url)
515
+ .where("ref", input.ref === undefined ? "is" : "=", input.ref ?? null)
516
+ .executeTakeFirst();
517
+ return same ?? null;
518
+ }
519
+ async writeAdd(actor, id, input, opts) {
520
+ const { name, url, form } = input;
521
+ const t = this.db;
522
+ await this.adminLock.lockAndAuthorize(actor);
523
+ await t
524
+ .insertInto("marketplaces")
525
+ .values({
526
+ id,
527
+ name,
528
+ url,
529
+ form,
530
+ ref: input.ref ?? null,
531
+ mirrors: JSON.stringify(input.mirrors ?? []),
532
+ builtin: false,
533
+ enabled: true,
534
+ created_by: actor,
535
+ })
536
+ .execute();
537
+ if (input.token !== undefined) {
538
+ await this.secrets().set(DEPLOYMENT_SECRETS_ORG, tokenKey(id), input.token);
539
+ }
540
+ await audit(t, {
541
+ actorAccountId: actor,
542
+ ...(opts.actorTokenId !== undefined && { actorTokenId: opts.actorTokenId }),
543
+ action: "marketplace.added",
544
+ target: id,
545
+ detail: {
434
546
  name,
435
547
  url,
436
548
  form,
437
- ref: input.ref ?? null,
438
- mirrors: JSON.stringify(input.mirrors ?? []),
439
- builtin: false,
440
- enabled: true,
441
- created_by: actor,
442
- })
443
- .execute();
444
- if (input.token !== undefined) {
445
- await this.secrets(trx).set(DEPLOYMENT_SECRETS_ORG, tokenKey(id), input.token);
446
- }
447
- await audit(trx, {
448
- actorAccountId: actor,
449
- ...(opts.actorTokenId !== undefined && { actorTokenId: opts.actorTokenId }),
450
- action: "marketplace.added",
451
- target: id,
452
- detail: {
453
- name,
454
- url,
455
- form,
456
- ...(input.ref !== undefined && { ref: input.ref }),
457
- mirrors: input.mirrors ?? [],
458
- hasToken: input.token !== undefined,
459
- },
460
- });
549
+ ...(input.ref !== undefined && { ref: input.ref }),
550
+ mirrors: input.mirrors ?? [],
551
+ hasToken: input.token !== undefined,
552
+ ...opts.auditDetail,
553
+ },
461
554
  });
462
- return this.get(id);
463
555
  }
464
556
  /**
465
- * Updates an enterprise marketplace (audit `marketplace.updated`, listing the changed fields, the
557
+ * Updates a custom marketplace (audit `marketplace.updated`, listing the changed fields, the
466
558
  * token's value never recorded; not written when unchanged). `token: null` clears the token.
467
559
  * Official only takes `enabled`, any other field -> `marketplace.builtin`. Changing the URL, form
468
560
  * or ref clears the ETag and the last commit (the next refresh reads everything again); a new URL
@@ -472,129 +564,131 @@ export class MarketplacesService {
472
564
  */
473
565
  async update(actor, id, patch, opts = {}) {
474
566
  const name = patch.name !== undefined ? this.checkName(patch.name) : undefined;
475
- await this.d.db.transaction().execute(async (trx) => {
476
- await lockEnterpriseAdminsAndAuthorize(trx, actor);
477
- const row = (await trx
478
- .selectFrom("marketplaces")
479
- .selectAll()
480
- .where("id", "=", id)
481
- .forUpdate()
482
- .executeTakeFirst());
483
- if (!row)
484
- throw notFound();
485
- if (row.builtin &&
486
- (name !== undefined ||
487
- patch.url !== undefined ||
488
- patch.form !== undefined ||
489
- patch.ref !== undefined ||
490
- patch.mirrors !== undefined ||
491
- patch.token !== undefined)) {
492
- throw builtinErr("changed");
493
- }
494
- const target = patch.url !== undefined || patch.form !== undefined
495
- ? marketplaceForm(patch.url ?? row.url, patch.form)
496
- : { form: row.form, url: row.url };
497
- // Switching form clears the other form's fields unless the patch sets them: the ref when
498
- // becoming http, the mirrors when becoming git
499
- const switched = target.form !== row.form;
500
- const ref = patch.ref !== undefined ? patch.ref : switched && target.form === "http" ? null : row.ref;
501
- const mirrors = patch.mirrors ?? (switched && target.form === "git" ? [] : row.mirrors);
502
- this.checkUrls(target.url, mirrors);
503
- this.checkGitFields(target.form, ref, mirrors);
504
- if (typeof patch.token === "string")
505
- this.checkToken(patch.token);
506
- const changed = [];
507
- const set = {};
508
- if (name !== undefined && name !== row.name) {
509
- set.name = name;
510
- changed.push("name");
511
- }
512
- if (target.url !== row.url) {
513
- set.url = target.url;
514
- changed.push("url");
515
- }
516
- if (target.form !== row.form) {
517
- set.form = target.form;
518
- changed.push("form");
519
- }
520
- if (ref !== row.ref) {
521
- set.ref = ref;
522
- changed.push("ref");
523
- }
524
- if (set.url !== undefined || set.form !== undefined || set.ref !== undefined) {
525
- set.etag = null;
526
- set.last_commit = null;
527
- }
528
- if (JSON.stringify(mirrors) !== JSON.stringify(row.mirrors)) {
529
- set.mirrors = JSON.stringify(mirrors);
530
- changed.push("mirrors");
531
- }
532
- if (patch.enabled !== undefined && patch.enabled !== row.enabled) {
533
- set.enabled = patch.enabled;
534
- changed.push("enabled");
535
- }
536
- if (Object.keys(set).length > 0) {
537
- await trx.updateTable("marketplaces").set(set).where("id", "=", id).execute();
538
- }
539
- if (patch.token !== undefined) {
540
- const secrets = this.secrets(trx);
541
- const had = (await secrets.get(DEPLOYMENT_SECRETS_ORG, tokenKey(id))) !== null;
542
- if (patch.token === null) {
543
- if (had) {
544
- await secrets.delete(DEPLOYMENT_SECRETS_ORG, tokenKey(id));
545
- changed.push("token");
546
- }
547
- }
548
- else {
549
- await secrets.set(DEPLOYMENT_SECRETS_ORG, tokenKey(id), patch.token);
567
+ await this.writeUpdate(actor, id, name, patch, opts);
568
+ return this.get(id);
569
+ }
570
+ async writeUpdate(actor, id, name, patch, opts) {
571
+ const t = this.db;
572
+ await this.adminLock.lockAndAuthorize(actor);
573
+ const row = (await t
574
+ .selectFrom("marketplaces")
575
+ .selectAll()
576
+ .where("id", "=", id)
577
+ .forUpdate()
578
+ .executeTakeFirst());
579
+ if (!row)
580
+ throw notFound();
581
+ if (row.builtin &&
582
+ (name !== undefined ||
583
+ patch.url !== undefined ||
584
+ patch.form !== undefined ||
585
+ patch.ref !== undefined ||
586
+ patch.mirrors !== undefined ||
587
+ patch.token !== undefined)) {
588
+ throw builtinErr("changed");
589
+ }
590
+ const target = patch.url !== undefined || patch.form !== undefined
591
+ ? marketplaceForm(patch.url ?? row.url, patch.form)
592
+ : { form: row.form, url: row.url };
593
+ // Switching form clears the other form's fields unless the patch sets them: the ref when
594
+ // becoming http, the mirrors when becoming git
595
+ const switched = target.form !== row.form;
596
+ const ref = patch.ref !== undefined ? patch.ref : switched && target.form === "http" ? null : row.ref;
597
+ const mirrors = patch.mirrors ?? (switched && target.form === "git" ? [] : row.mirrors);
598
+ this.checkUrls(target.url, mirrors);
599
+ this.checkGitFields(target.form, ref, mirrors);
600
+ if (typeof patch.token === "string")
601
+ this.checkToken(patch.token);
602
+ const changed = [];
603
+ const set = {};
604
+ if (name !== undefined && name !== row.name) {
605
+ set.name = name;
606
+ changed.push("name");
607
+ }
608
+ if (target.url !== row.url) {
609
+ set.url = target.url;
610
+ changed.push("url");
611
+ }
612
+ if (target.form !== row.form) {
613
+ set.form = target.form;
614
+ changed.push("form");
615
+ }
616
+ if (ref !== row.ref) {
617
+ set.ref = ref;
618
+ changed.push("ref");
619
+ }
620
+ if (set.url !== undefined || set.form !== undefined || set.ref !== undefined) {
621
+ set.etag = null;
622
+ set.last_commit = null;
623
+ }
624
+ if (JSON.stringify(mirrors) !== JSON.stringify(row.mirrors)) {
625
+ set.mirrors = JSON.stringify(mirrors);
626
+ changed.push("mirrors");
627
+ }
628
+ if (patch.enabled !== undefined && patch.enabled !== row.enabled) {
629
+ set.enabled = patch.enabled;
630
+ changed.push("enabled");
631
+ }
632
+ if (Object.keys(set).length > 0) {
633
+ await t.updateTable("marketplaces").set(set).where("id", "=", id).execute();
634
+ }
635
+ if (patch.token !== undefined) {
636
+ const secrets = this.secrets();
637
+ const had = (await secrets.get(DEPLOYMENT_SECRETS_ORG, tokenKey(id))) !== null;
638
+ if (patch.token === null) {
639
+ if (had) {
640
+ await secrets.delete(DEPLOYMENT_SECRETS_ORG, tokenKey(id));
550
641
  changed.push("token");
551
642
  }
552
643
  }
553
- if (changed.length === 0)
554
- return;
555
- await audit(trx, {
556
- actorAccountId: actor,
557
- ...(opts.actorTokenId !== undefined && { actorTokenId: opts.actorTokenId }),
558
- action: "marketplace.updated",
559
- target: id,
560
- detail: {
561
- changed,
562
- ...(set.enabled !== undefined && { enabled: set.enabled }),
563
- ...(set.url !== undefined && { url: set.url }),
564
- ...(set.form !== undefined && { form: set.form }),
565
- ...(set.ref !== undefined && { ref: set.ref }),
566
- },
567
- });
644
+ else {
645
+ await secrets.set(DEPLOYMENT_SECRETS_ORG, tokenKey(id), patch.token);
646
+ changed.push("token");
647
+ }
648
+ }
649
+ if (changed.length === 0)
650
+ return;
651
+ await audit(t, {
652
+ actorAccountId: actor,
653
+ ...(opts.actorTokenId !== undefined && { actorTokenId: opts.actorTokenId }),
654
+ action: "marketplace.updated",
655
+ target: id,
656
+ detail: {
657
+ changed,
658
+ ...(set.enabled !== undefined && { enabled: set.enabled }),
659
+ ...(set.url !== undefined && { url: set.url }),
660
+ ...(set.form !== undefined && { form: set.form }),
661
+ ...(set.ref !== undefined && { ref: set.ref }),
662
+ ...opts.auditDetail,
663
+ },
568
664
  });
569
- return this.get(id);
570
665
  }
571
666
  /**
572
- * Deletes an enterprise marketplace (audit `marketplace.removed`): its cached entries and token
667
+ * Deletes a custom marketplace (audit `marketplace.removed`): its cached entries and token
573
668
  * are deleted; imported catalog items are kept (their marketplace becomes null). Official can
574
669
  * only be disabled -> `marketplace.builtin`.
575
670
  */
576
671
  async remove(actor, id, opts = {}) {
577
- await this.d.db.transaction().execute(async (trx) => {
578
- await lockEnterpriseAdminsAndAuthorize(trx, actor);
579
- const row = await trx
580
- .selectFrom("marketplaces")
581
- .select(["builtin", "name", "url"])
582
- .where("id", "=", id)
583
- .forUpdate()
584
- .executeTakeFirst();
585
- if (!row)
586
- throw notFound();
587
- if (row.builtin)
588
- throw builtinErr("deleted");
589
- await trx.deleteFrom("marketplaces").where("id", "=", id).execute();
590
- await this.secrets(trx).delete(DEPLOYMENT_SECRETS_ORG, tokenKey(id));
591
- await audit(trx, {
592
- actorAccountId: actor,
593
- ...(opts.actorTokenId !== undefined && { actorTokenId: opts.actorTokenId }),
594
- action: "marketplace.removed",
595
- target: id,
596
- detail: { name: row.name, url: row.url },
597
- });
672
+ const t = this.db;
673
+ await this.adminLock.lockAndAuthorize(actor);
674
+ const row = await t
675
+ .selectFrom("marketplaces")
676
+ .select(["builtin", "name", "url"])
677
+ .where("id", "=", id)
678
+ .forUpdate()
679
+ .executeTakeFirst();
680
+ if (!row)
681
+ throw notFound();
682
+ if (row.builtin)
683
+ throw builtinErr("deleted");
684
+ await t.deleteFrom("marketplaces").where("id", "=", id).execute();
685
+ await this.secrets().delete(DEPLOYMENT_SECRETS_ORG, tokenKey(id));
686
+ await audit(t, {
687
+ actorAccountId: actor,
688
+ ...(opts.actorTokenId !== undefined && { actorTokenId: opts.actorTokenId }),
689
+ action: "marketplace.removed",
690
+ target: id,
691
+ detail: { name: row.name, url: row.url, ...opts.auditDetail },
598
692
  });
599
693
  }
600
694
  /**
@@ -609,8 +703,8 @@ export class MarketplacesService {
609
703
  * (the message gives each URL's failure).
610
704
  */
611
705
  async refresh(id, signal, actor, opts = {}) {
612
- const config = this.d.config();
613
- const row = (await this.d.db
706
+ const config = this.config.get();
707
+ const row = (await this.db
614
708
  .selectFrom("marketplaces")
615
709
  .selectAll()
616
710
  .where("id", "=", id)
@@ -624,7 +718,7 @@ export class MarketplacesService {
624
718
  }
625
719
  const token = row.builtin
626
720
  ? undefined
627
- : ((await this.secrets(this.d.db).get(DEPLOYMENT_SECRETS_ORG, tokenKey(id))) ?? undefined);
721
+ : ((await this.secrets().get(DEPLOYMENT_SECRETS_ORG, tokenKey(id))) ?? undefined);
628
722
  const tokenOrigin = new URL(row.url).origin;
629
723
  const errors = [];
630
724
  // the API code of each failed URL (undefined: an ordinary fetch failure)
@@ -660,7 +754,7 @@ export class MarketplacesService {
660
754
  etag: row.etag,
661
755
  ...(token !== undefined && { token, tokenOrigin }),
662
756
  maxBytes: config.marketplaces.maxIndexBytes,
663
- timeoutMs: this.d.fetchTimeoutMs ?? MARKETPLACE_FETCH_TIMEOUT_MS,
757
+ timeoutMs: MARKETPLACE_FETCH_TIMEOUT_MS,
664
758
  net: marketplaceNetPolicy(config),
665
759
  signal,
666
760
  });
@@ -688,89 +782,35 @@ export class MarketplacesService {
688
782
  ? new Map()
689
783
  : await this.resolveHeads(id, outcome === "not_modified" ? undefined : outcome.manifest.plugins, { url: row.url, token }, signal);
690
784
  const lastError = status === "error" ? errors.join("\n").slice(0, MAX_ERROR_CHARS) : null;
691
- const from = await this.d.db.transaction().execute(async (trx) => {
692
- await sql `SELECT pg_advisory_xact_lock(hashtext(${`capybara.catalog-source:${id}`}))`.execute(trx);
693
- const cur = await trx
694
- .selectFrom("marketplaces")
695
- .select(["last_status", "url", "mirrors", "form", "ref", "last_commit"])
696
- .where("id", "=", id)
697
- .forUpdate()
698
- .executeTakeFirst();
699
- if (!cur)
700
- throw notFound();
701
- // The admin changed the URL / mirrors during the fetch: what we fetched is the old address's
702
- // content, so write no entries, ETag or status (the next refresh uses the new address)
703
- if (cur.url !== row.url ||
704
- cur.form !== row.form ||
705
- cur.ref !== row.ref ||
706
- // another refresh wrote a commit meanwhile: ours may be older, never move it back
707
- cur.last_commit !== row.last_commit ||
708
- JSON.stringify(cur.mirrors) !== JSON.stringify(row.mirrors)) {
709
- return "stale";
710
- }
711
- if (outcome !== undefined && outcome !== "not_modified") {
712
- await this.replaceEntries(trx, id, outcome.manifest.plugins, outcome.trees, outcome.overlays);
713
- }
714
- if (outcome !== undefined) {
715
- // heads not resolved this time are unknown again (never a stale head)
716
- await trx
717
- .updateTable("marketplace_entries")
718
- .set({ head_commit: null, tree_oid: null })
719
- .where("source_id", "=", id)
720
- .where("head_commit", "is not", null)
721
- .execute();
722
- }
723
- for (const [key, head] of heads) {
724
- const [name, version] = key.split("\0");
725
- await trx
726
- .updateTable("marketplace_entries")
727
- .set({ head_commit: head.commit, tree_oid: head.tree })
728
- .where("source_id", "=", id)
729
- .where("name", "=", name)
730
- .where("version", "=", version)
731
- .execute();
732
- }
733
- await trx
734
- .updateTable("marketplaces")
735
- .set({
736
- last_status: status,
737
- last_error: lastError,
738
- last_refreshed_at: sql `now()`,
739
- ...(outcome !== undefined &&
740
- outcome !== "not_modified" && {
741
- etag: outcome.etag,
742
- last_commit: outcome.commit ?? null,
743
- owner_name: outcome.manifest.owner?.name ?? null,
744
- skipped: JSON.stringify(outcome.skipped ?? []),
745
- }),
746
- })
747
- .where("id", "=", id)
748
- .execute();
749
- if (cur.last_status !== status) {
750
- await audit(trx, {
751
- ...(actor !== undefined && { actorAccountId: actor }),
752
- ...(opts.actorTokenId !== undefined && { actorTokenId: opts.actorTokenId }),
753
- action: "marketplace.refreshed",
754
- target: id,
755
- detail: {
756
- from: cur.last_status,
757
- to: status,
758
- ...(lastError !== null && { error: lastError }),
759
- },
760
- });
761
- }
762
- return cur.last_status;
763
- });
785
+ const from = await this.recordRefresh(row, { outcome, heads, status, lastError }, actor, opts);
764
786
  if (from === "stale") {
765
- this.d.log.info("marketplace changed during refresh; result discarded", { marketplace: id });
787
+ this.log.info("marketplace changed during refresh; result discarded", { marketplace: id });
766
788
  return this.get(id);
767
789
  }
790
+ if (outcome !== undefined) {
791
+ // a failed icon never fails the refresh: the entry shows its initial
792
+ try {
793
+ await this.syncIcons(row, outcome === "not_modified" ? undefined : outcome.icons, signal);
794
+ // only now is the commit fully synced: a refresh at it may be not_modified from here on
795
+ if (outcome !== "not_modified" && outcome.commit !== undefined) {
796
+ await this.db
797
+ .updateTable("marketplaces")
798
+ .set({ icons_commit: outcome.commit })
799
+ .where("id", "=", id)
800
+ .where("last_commit", "=", outcome.commit)
801
+ .execute();
802
+ }
803
+ }
804
+ catch (err) {
805
+ this.log.warn("marketplace icons not updated", { marketplace: id, err });
806
+ }
807
+ }
768
808
  if (from !== status) {
769
809
  if (status === "error") {
770
- this.d.log.warn("marketplace refresh failed", { marketplace: id, error: lastError });
810
+ this.log.warn("marketplace refresh failed", { marketplace: id, error: lastError });
771
811
  }
772
812
  else {
773
- this.d.log.info("marketplace refreshed", { marketplace: id });
813
+ this.log.info("marketplace refreshed", { marketplace: id });
774
814
  }
775
815
  }
776
816
  if (status === "error" && opts.throwOnError) {
@@ -784,8 +824,9 @@ export class MarketplacesService {
784
824
  }
785
825
  /**
786
826
  * Reads a git marketplace (spec §5.1): resolves `ref` (default the remote HEAD); the same commit
787
- * as the last refresh -> `not_modified` (nothing else is fetched). Otherwise only what the root
788
- * needs is read, in this order: `.capybara-plugin/marketplace.json` (at most
827
+ * as the last refresh, whose path icons were stored too (`icons_commit`) -> `not_modified`
828
+ * (nothing else is fetched; a commit whose icons were not stored is read again). Otherwise only
829
+ * what the root needs is read, in this order: `.capybara-plugin/marketplace.json` (at most
789
830
  * `marketplaces.maxIndexBytes`, validated like an http manifest); `.claude-plugin/marketplace.json`
790
831
  * (a Claude Code marketplace: each entry's component fields and `strict` become its overlay, and
791
832
  * entries Capybara cannot store are `skipped`); else a single-plugin repo (the root has
@@ -794,7 +835,7 @@ export class MarketplacesService {
794
835
  * (Decision 3). Throws {@link GitSourceError} or {@link MarketplaceInvalidError}.
795
836
  */
796
837
  async fetchGit(row, token, signal) {
797
- const config = this.d.config();
838
+ const config = this.config.get();
798
839
  const options = {
799
840
  net: marketplaceNetPolicy(config),
800
841
  maxBytes: config.packages.maxBytes,
@@ -803,12 +844,12 @@ export class MarketplacesService {
803
844
  };
804
845
  const loc = { url: row.url, ...(row.ref !== null && { ref: row.ref }) };
805
846
  const commit = await resolveGitCommit(loc, options);
806
- if (commit === row.last_commit)
847
+ if (commit === row.last_commit && commit === row.icons_commit)
807
848
  return "not_modified";
808
849
  const MANIFEST = ".capybara-plugin/marketplace.json";
809
850
  let hasSkills = false;
810
851
  const dec = (b) => new TextDecoder().decode(b);
811
- const { files, trees } = await readGitTreeAndOids({ url: row.url, commit }, {
852
+ const { files, trees, blobs: icons, } = await readGitTreeAndOids({ url: row.url, commit }, {
812
853
  ...options,
813
854
  include: (path, type) => {
814
855
  if (path === "skills" && type === "tree")
@@ -824,6 +865,13 @@ export class MarketplacesService {
824
865
  trees: (read) => read.has(MANIFEST) || !read.has(CLAUDE_MARKETPLACE_FILE)
825
866
  ? pathEntryDirs(read.get(MANIFEST), config.marketplaces.maxIndexBytes)
826
867
  : claudePathEntryDirs(read.get(CLAUDE_MARKETPLACE_FILE), config.marketplaces.maxIndexBytes, config.marketplaces.allowInsecureLoopback),
868
+ // the icon files the entries name (a Claude Code marketplace names none)
869
+ blobs: {
870
+ paths: (read) => read.has(MANIFEST) || !read.has(CLAUDE_MARKETPLACE_FILE)
871
+ ? gitIconPaths(read, MANIFEST, config.marketplaces.maxIndexBytes, MARKETPLACE_ICON_FETCHES_MAX)
872
+ : [],
873
+ maxBytes: MARKETPLACE_ICON_MAX_BYTES,
874
+ },
827
875
  });
828
876
  const raw = files.get(MANIFEST);
829
877
  const claudeRaw = files.get(CLAUDE_MARKETPLACE_FILE);
@@ -881,9 +929,16 @@ export class MarketplacesService {
881
929
  if ("errors" in m) {
882
930
  throw new MarketplaceInvalidError(`the repository is a single plugin, but its ${PLUGIN_MANIFEST_FILE} is invalid: ${m.errors.slice(0, 5).join("; ")}`, m.errors);
883
931
  }
932
+ const d = pluginDescription(m.description);
884
933
  entry = {
885
934
  name: m.name,
886
- summary: { en: m.description.slice(0, SUMMARY_MAX) },
935
+ summary: {
936
+ en: d.en.slice(0, SUMMARY_MAX),
937
+ ...(d.zh !== undefined && { zh: d.zh.slice(0, SUMMARY_MAX) }),
938
+ },
939
+ ...(m.displayName !== undefined && { displayName: m.displayName }),
940
+ // the plugin's own icon, read from the same commit
941
+ ...(m.icon !== undefined && { icon: `./${normalGitPath(m.icon)}` }),
887
942
  version: m.version,
888
943
  source: { path: "." },
889
944
  };
@@ -903,7 +958,7 @@ export class MarketplacesService {
903
958
  }
904
959
  manifest = { schemaVersion: 1, name: row.name, plugins: [entry] };
905
960
  }
906
- return { manifest, etag: null, commit, trees };
961
+ return { manifest, etag: null, commit, trees, icons };
907
962
  }
908
963
  /**
909
964
  * Resolves the branch heads of the entries {@link headsToResolve} picks (at most
@@ -914,9 +969,9 @@ export class MarketplacesService {
914
969
  * entry unknown (never fails the refresh). Returns `name\0version` -> head.
915
970
  */
916
971
  async resolveHeads(id, fresh, m, signal) {
917
- const config = this.d.config();
972
+ const config = this.config.get();
918
973
  const listed = fresh ??
919
- (await this.d.db
974
+ (await this.db
920
975
  .selectFrom("marketplace_entries")
921
976
  .select("entry")
922
977
  .where("source_id", "=", id)
@@ -925,7 +980,7 @@ export class MarketplacesService {
925
980
  const names = [...new Set(listed.filter((e) => "git" in e.source).map((e) => e.name))];
926
981
  if (names.length === 0)
927
982
  return out;
928
- const imported = await this.d.db
983
+ const imported = await this.db
929
984
  .selectFrom("catalog_items as i")
930
985
  .innerJoin("catalog_item_versions as v", "v.item_id", "i.id")
931
986
  .select(["i.name", "v.version", "v.source", "v.source_ref", "v.integrity", "v.source_detail"])
@@ -933,7 +988,7 @@ export class MarketplacesService {
933
988
  .where("i.name", "in", names)
934
989
  .execute();
935
990
  const todo = headsToResolve(listed, imported, config, MARKETPLACE_HEADS_MAX);
936
- const timeoutMs = this.d.fetchTimeoutMs ?? MARKETPLACE_FETCH_TIMEOUT_MS;
991
+ const timeoutMs = MARKETPLACE_FETCH_TIMEOUT_MS;
937
992
  const queue = [...todo];
938
993
  await Promise.all(Array.from({ length: Math.min(HEADS_CONCURRENCY, queue.length) }, async () => {
939
994
  for (let e = queue.shift(); e !== undefined; e = queue.shift()) {
@@ -959,7 +1014,7 @@ export class MarketplacesService {
959
1014
  }
960
1015
  catch (err) {
961
1016
  // a head lookup never fails the refresh: that entry stays unknown
962
- this.d.log.warn("cannot resolve the branch head of a marketplace entry", {
1017
+ this.log.warn("cannot resolve the branch head of a marketplace entry", {
963
1018
  marketplace: id,
964
1019
  entry: e.name,
965
1020
  error: err instanceof Error ? err.message : String(err),
@@ -969,14 +1024,207 @@ export class MarketplacesService {
969
1024
  }));
970
1025
  return out;
971
1026
  }
972
- /** The token of an enterprise marketplace (undefined without one; official never has one). */
1027
+ /**
1028
+ * Brings the marketplace's stored icons (`marketplace_icons`) in line with its stored entries
1029
+ * after a refresh (outside any transaction: downloads first, then one short write). A repository
1030
+ * path (git marketplaces) is taken from `fresh`, the files of the commit just read, and kept as
1031
+ * stored when the commit did not change (`fresh` undefined). A URL is downloaded only when it is
1032
+ * not stored yet (its content is treated as fixed), at most {@link MARKETPLACE_ICON_FETCHES_MAX}
1033
+ * per refresh, under the marketplace network rules and `marketplaces.allowedHosts`, never with
1034
+ * the token. A failed download is remembered (`marketplace_icon_failures`) and retried only after
1035
+ * {@link MARKETPLACE_ICON_RETRY_MS}, URLs never tried first, so broken URLs never starve the
1036
+ * cap. An icon that is missing, too large or not a real svg / png is skipped and logged; icons
1037
+ * (and failures) no entry names any more are deleted.
1038
+ */
1039
+ async syncIcons(row, fresh, signal) {
1040
+ const config = this.config.get();
1041
+ const entries = await this.db
1042
+ .selectFrom("marketplace_entries")
1043
+ .select("entry")
1044
+ .where("source_id", "=", row.id)
1045
+ .execute();
1046
+ const { paths, urls } = wantedIcons(entries.map((r) => r.entry), row.form);
1047
+ const have = new Set((await this.db
1048
+ .selectFrom("marketplace_icons")
1049
+ .select("ref")
1050
+ .where("source_id", "=", row.id)
1051
+ .execute()).map((r) => r.ref));
1052
+ // the URLs that failed before, oldest failure first, and whether their backoff is over
1053
+ const failures = await this.db
1054
+ .selectFrom("marketplace_icon_failures")
1055
+ .select([
1056
+ "ref",
1057
+ sql `failed_at <= now() - make_interval(secs => ${MARKETPLACE_ICON_RETRY_MS / 1000})`.as("due"),
1058
+ ])
1059
+ .where("source_id", "=", row.id)
1060
+ .orderBy("failed_at")
1061
+ .orderBy("ref")
1062
+ .execute();
1063
+ const failedBefore = new Map(failures.map((f) => [f.ref, f.due]));
1064
+ const put = [];
1065
+ const keep = new Set();
1066
+ const problems = [];
1067
+ for (const ref of paths) {
1068
+ if (fresh === undefined) {
1069
+ if (have.has(ref))
1070
+ keep.add(ref);
1071
+ continue;
1072
+ }
1073
+ const data = fresh.get(ref.slice(2));
1074
+ const r = data === undefined
1075
+ ? `${ref} is not a file of at most ${MARKETPLACE_ICON_MAX_BYTES} bytes in the repository`
1076
+ : checkMarketplaceIcon(ref, data);
1077
+ if (typeof r === "string")
1078
+ problems.push({ icon: ref, problem: r });
1079
+ else
1080
+ put.push({ ref, icon: r });
1081
+ }
1082
+ // IPv6 hostnames come bracketed from URL; allowedHosts entries are written without brackets
1083
+ const hostOf = (url) => new URL(url).hostname.toLowerCase().replace(/^\[(.*)\]$/, "$1");
1084
+ const neverTried = [];
1085
+ for (const url of urls) {
1086
+ if (have.has(url)) {
1087
+ keep.add(url);
1088
+ continue;
1089
+ }
1090
+ const host = hostOf(url);
1091
+ if (!hostAllowed(host, config)) {
1092
+ problems.push({ icon: url, problem: `${host} is not in marketplaces.allowedHosts` });
1093
+ }
1094
+ else if (!failedBefore.has(url)) {
1095
+ neverTried.push(url);
1096
+ }
1097
+ }
1098
+ // retries after the never-tried URLs, oldest failure first, within the cap
1099
+ const retries = failures
1100
+ .filter((f) => f.due && urls.has(f.ref) && !have.has(f.ref))
1101
+ .map((f) => f.ref)
1102
+ .filter((url) => hostAllowed(hostOf(url), config));
1103
+ const toFetch = [...neverTried, ...retries].slice(0, MARKETPLACE_ICON_FETCHES_MAX);
1104
+ const net = marketplaceNetPolicy(config);
1105
+ const queue = [...toFetch];
1106
+ const failed = [];
1107
+ await Promise.all(Array.from({ length: Math.min(MARKETPLACE_ICON_CONCURRENCY, queue.length) }, async () => {
1108
+ for (let url = queue.shift(); url !== undefined; url = queue.shift()) {
1109
+ if (signal.aborted)
1110
+ return;
1111
+ const r = await fetchMarketplaceIcon(url, { net, signal });
1112
+ if (typeof r === "string") {
1113
+ problems.push({ icon: url, problem: r });
1114
+ // an aborted refresh says nothing about the URL
1115
+ if (!signal.aborted)
1116
+ failed.push(url);
1117
+ }
1118
+ else
1119
+ put.push({ ref: url, icon: r });
1120
+ }
1121
+ }));
1122
+ if (problems.length > 0) {
1123
+ this.log.warn("marketplace icons skipped", {
1124
+ marketplace: row.id,
1125
+ count: problems.length,
1126
+ problems: problems.slice(0, 5),
1127
+ });
1128
+ }
1129
+ const gone = [...have].filter((ref) => !keep.has(ref) && !put.some((p) => p.ref === ref));
1130
+ // failures of URLs now stored or named by no entry
1131
+ const cleared = [...failedBefore.keys()].filter((ref) => !urls.has(ref) || put.some((p) => p.ref === ref));
1132
+ if (put.length > 0 || gone.length > 0 || failed.length > 0 || cleared.length > 0) {
1133
+ await this.writeIcons(row.id, { put, gone, failed, cleared });
1134
+ }
1135
+ }
1136
+ /**
1137
+ * Writes a refresh's icons: upserts `put`, deletes `gone`, records the `failed` downloads and
1138
+ * forgets the `cleared` failures (see {@link syncIcons}).
1139
+ */
1140
+ async writeIcons(id, w) {
1141
+ const t = this.db;
1142
+ if (w.gone.length > 0) {
1143
+ await t
1144
+ .deleteFrom("marketplace_icons")
1145
+ .where("source_id", "=", id)
1146
+ .where("ref", "in", w.gone)
1147
+ .execute();
1148
+ }
1149
+ for (const { ref, icon } of w.put) {
1150
+ const values = {
1151
+ sha256: icon.sha256,
1152
+ content_type: icon.contentType,
1153
+ data: Buffer.from(icon.data),
1154
+ fetched_at: sql `now()`,
1155
+ };
1156
+ await t
1157
+ .insertInto("marketplace_icons")
1158
+ .values({ source_id: id, ref, ...values })
1159
+ .onConflict((oc) => oc.columns(["source_id", "ref"]).doUpdateSet(values))
1160
+ .execute();
1161
+ }
1162
+ if (w.cleared.length > 0) {
1163
+ await t
1164
+ .deleteFrom("marketplace_icon_failures")
1165
+ .where("source_id", "=", id)
1166
+ .where("ref", "in", w.cleared)
1167
+ .execute();
1168
+ }
1169
+ // sorted: two replicas refreshing at once lock the rows in the same order
1170
+ for (const ref of [...w.failed].sort()) {
1171
+ await t
1172
+ .insertInto("marketplace_icon_failures")
1173
+ .values({ source_id: id, ref })
1174
+ .onConflict((oc) => oc.columns(["source_id", "ref"]).doUpdateSet({
1175
+ failed_at: sql `now()`,
1176
+ attempts: sql `marketplace_icon_failures.attempts + 1`,
1177
+ }))
1178
+ .execute();
1179
+ }
1180
+ }
1181
+ /**
1182
+ * A stored marketplace icon by its sha256 (the address the entries carry); not stored ->
1183
+ * `catalog.icon_not_found`. Read from PG, never from the network. `browsable` (the org route):
1184
+ * the marketplace must also be one the org browse lists (effective), else not found.
1185
+ */
1186
+ async icon(id, sha256, opts = {}) {
1187
+ if (opts.browsable) {
1188
+ // the org browse lists enabled marketplaces only (official also needs the config on)
1189
+ const m = await this.db
1190
+ .selectFrom("marketplaces")
1191
+ .select(["builtin", "enabled"])
1192
+ .where("id", "=", id)
1193
+ .executeTakeFirst();
1194
+ if (!m || !sourceEffective(m, this.config.get())) {
1195
+ throw new ApiError("catalog.icon_not_found", "This marketplace has no such icon");
1196
+ }
1197
+ }
1198
+ const row = /^[0-9a-f]{64}$/.test(sha256)
1199
+ ? await this.db
1200
+ .selectFrom("marketplace_icons")
1201
+ .select(["content_type", "data"])
1202
+ .where("source_id", "=", id)
1203
+ .where("sha256", "=", sha256)
1204
+ .limit(1)
1205
+ .executeTakeFirst()
1206
+ : undefined;
1207
+ if (!row)
1208
+ throw new ApiError("catalog.icon_not_found", "This marketplace has no such icon");
1209
+ // checked again on read, like a catalog icon (`readCatalogIcon`): PG may have been changed
1210
+ const data = new Uint8Array(row.data);
1211
+ const checked = checkMarketplaceIcon(row.content_type === "image/svg+xml" ? "icon.svg" : "icon.png", data);
1212
+ if (typeof checked === "string") {
1213
+ throw new ApiError("internal", `Stored marketplace icon is invalid: ${checked}`);
1214
+ }
1215
+ if (checked.sha256 !== sha256) {
1216
+ throw new ApiError("internal", "Stored marketplace icon does not match its recorded hash");
1217
+ }
1218
+ return { contentType: checked.contentType, data };
1219
+ }
1220
+ /** The token of a custom marketplace (undefined without one; official never has one). */
973
1221
  async token(id) {
974
- return (await this.secrets(this.d.db).get(DEPLOYMENT_SECRETS_ORG, tokenKey(id))) ?? undefined;
1222
+ return (await this.secrets().get(DEPLOYMENT_SECRETS_ORG, tokenKey(id))) ?? undefined;
975
1223
  }
976
1224
  /** Refreshes every effective marketplace (maintenance job `catalogs-refresh`), one failing not stopping the rest. */
977
1225
  async refreshAll(signal) {
978
- const config = this.d.config();
979
- const rows = await this.d.db
1226
+ const config = this.config.get();
1227
+ const rows = await this.db
980
1228
  .selectFrom("marketplaces")
981
1229
  .select(["id", "builtin", "enabled"])
982
1230
  .orderBy("id")
@@ -990,7 +1238,7 @@ export class MarketplacesService {
990
1238
  await this.refresh(r.id, signal);
991
1239
  }
992
1240
  catch (err) {
993
- this.d.log.error("marketplace refresh crashed", { marketplace: r.id, err });
1241
+ this.log.error("marketplace refresh crashed", { marketplace: r.id, err });
994
1242
  }
995
1243
  }
996
1244
  }
@@ -1000,9 +1248,11 @@ export class MarketplacesService {
1000
1248
  * first), marketplace, at most {@link MARKETPLACE_ENTRIES_MAX}; `truncated` means there are more
1001
1249
  * (the UI suggests narrowing the filter).
1002
1250
  */
1003
- async entries(q = {}) {
1004
- const config = this.d.config();
1005
- let query = this.d.db
1251
+ async entries(q = {},
1252
+ /** The URL of a stored marketplace icon (default: the admin route). */
1253
+ iconUrl = marketplaceIconUrl) {
1254
+ const config = this.config.get();
1255
+ let query = this.db
1006
1256
  .selectFrom("marketplace_entries as e")
1007
1257
  .innerJoin("marketplaces as s", "s.id", "e.source_id")
1008
1258
  .select([
@@ -1034,6 +1284,8 @@ export class MarketplacesService {
1034
1284
  eb(sql `coalesce(e.npm, '')`, "ilike", like),
1035
1285
  eb(sql `e.entry->'summary'->>'en'`, "ilike", like),
1036
1286
  eb(sql `coalesce(e.entry->'summary'->>'zh', '')`, "ilike", like),
1287
+ eb(sql `coalesce(e.entry->'displayName'->>'en', '')`, "ilike", like),
1288
+ eb(sql `coalesce(e.entry->'displayName'->>'zh', '')`, "ilike", like),
1037
1289
  ]));
1038
1290
  }
1039
1291
  const fetched = await query.execute();
@@ -1043,7 +1295,7 @@ export class MarketplacesService {
1043
1295
  a.source_id.localeCompare(b.source_id));
1044
1296
  if (rows.length === 0)
1045
1297
  return { items: [], truncated: false };
1046
- const items = await this.d.db
1298
+ const items = await this.db
1047
1299
  .selectFrom("catalog_items as i")
1048
1300
  .leftJoin("catalog_item_versions as v", "v.item_id", "i.id")
1049
1301
  .select([
@@ -1078,6 +1330,16 @@ export class MarketplacesService {
1078
1330
  a.imported.sort(newestFirst);
1079
1331
  a.versions = a.imported.map((v) => v.version);
1080
1332
  }
1333
+ const iconRows = await this.db
1334
+ .selectFrom("marketplace_icons")
1335
+ .select(["source_id", "ref", "sha256"])
1336
+ .where("source_id", "in", [...new Set(rows.map((r) => r.source_id))])
1337
+ .execute();
1338
+ const iconOf = new Map(iconRows.map((i) => [`${i.source_id}\0${i.ref}`, i.sha256]));
1339
+ const iconUrlOf = (sourceId, ref) => {
1340
+ const sha = ref === undefined ? undefined : iconOf.get(`${sourceId}\0${ref}`);
1341
+ return sha === undefined ? null : iconUrl(sourceId, sha);
1342
+ };
1081
1343
  const views = rows.map((r) => {
1082
1344
  const e = r.entry;
1083
1345
  const version = marketplaceEntryVersion(e);
@@ -1092,17 +1354,25 @@ export class MarketplacesService {
1092
1354
  name: r.name,
1093
1355
  version,
1094
1356
  summary: e.summary,
1357
+ displayName: e.displayName ?? null,
1095
1358
  minKernel: e.minKernel ?? null,
1096
1359
  homepage: e.homepage ?? null,
1097
1360
  permissions: e.permissions ?? null,
1098
1361
  source: e.source,
1362
+ deprecated: marketplaceEntryDeprecation(e),
1099
1363
  format: r.claude === null ? "capybara" : "claude-code",
1100
1364
  compatible,
1101
1365
  importable,
1102
1366
  ...(reason !== undefined && { reason }),
1103
1367
  adopted: adopted ? { itemId: adopted.itemId, versions: [...adopted.versions] } : null,
1104
- newerAvailable: compatible && version !== null && top !== undefined && compareVersions(version, top) > 0,
1368
+ icon: iconUrlOf(r.source_id, e.icon),
1369
+ newerAvailable: compatible &&
1370
+ !entryDeprecated(e) &&
1371
+ version !== null &&
1372
+ top !== undefined &&
1373
+ compareVersions(version, top) > 0,
1105
1374
  contentChanged: adopted !== null &&
1375
+ !entryDeprecated(e) &&
1106
1376
  entryContentChanged(e, {
1107
1377
  marketplaceId: r.source_id,
1108
1378
  headCommit: r.head_commit,
@@ -1114,14 +1384,96 @@ export class MarketplacesService {
1114
1384
  });
1115
1385
  return { items: views, truncated };
1116
1386
  }
1387
+ /**
1388
+ * Writes a refresh's result under the marketplace's lock (entries, heads, status, the status
1389
+ * change audit); `stale` when the marketplace changed during the fetch (nothing is written).
1390
+ */
1391
+ async recordRefresh(row, r, actor, opts) {
1392
+ const { id } = row;
1393
+ const { outcome, heads, status, lastError } = r;
1394
+ await this.sourceLock.lock(id);
1395
+ const t = this.db;
1396
+ const cur = await t
1397
+ .selectFrom("marketplaces")
1398
+ .select(["last_status", "url", "mirrors", "form", "ref", "last_commit"])
1399
+ .where("id", "=", id)
1400
+ .forUpdate()
1401
+ .executeTakeFirst();
1402
+ if (!cur)
1403
+ throw notFound();
1404
+ // The admin changed the URL / mirrors during the fetch: what we fetched is the old address's
1405
+ // content, so write no entries, ETag or status (the next refresh uses the new address)
1406
+ if (cur.url !== row.url ||
1407
+ cur.form !== row.form ||
1408
+ cur.ref !== row.ref ||
1409
+ // another refresh wrote a commit meanwhile: ours may be older, never move it back
1410
+ cur.last_commit !== row.last_commit ||
1411
+ JSON.stringify(cur.mirrors) !== JSON.stringify(row.mirrors)) {
1412
+ return "stale";
1413
+ }
1414
+ if (outcome !== undefined && outcome !== "not_modified") {
1415
+ await this.replaceEntries(id, outcome.manifest.plugins, outcome.trees, outcome.overlays);
1416
+ }
1417
+ if (outcome !== undefined) {
1418
+ // heads not resolved this time are unknown again (never a stale head)
1419
+ await t
1420
+ .updateTable("marketplace_entries")
1421
+ .set({ head_commit: null, tree_oid: null })
1422
+ .where("source_id", "=", id)
1423
+ .where("head_commit", "is not", null)
1424
+ .execute();
1425
+ }
1426
+ for (const [key, head] of heads) {
1427
+ const [name, version] = key.split("\0");
1428
+ await t
1429
+ .updateTable("marketplace_entries")
1430
+ .set({ head_commit: head.commit, tree_oid: head.tree })
1431
+ .where("source_id", "=", id)
1432
+ .where("name", "=", name)
1433
+ .where("version", "=", version)
1434
+ .execute();
1435
+ }
1436
+ await t
1437
+ .updateTable("marketplaces")
1438
+ .set({
1439
+ last_status: status,
1440
+ last_error: lastError,
1441
+ last_refreshed_at: sql `now()`,
1442
+ ...(outcome !== undefined &&
1443
+ outcome !== "not_modified" && {
1444
+ etag: outcome.etag,
1445
+ last_commit: outcome.commit ?? null,
1446
+ owner_name: outcome.manifest.owner?.name ?? null,
1447
+ skipped: JSON.stringify(outcome.skipped ?? []),
1448
+ }),
1449
+ })
1450
+ .where("id", "=", id)
1451
+ .execute();
1452
+ if (cur.last_status !== status) {
1453
+ await audit(t, {
1454
+ ...(actor !== undefined && { actorAccountId: actor }),
1455
+ ...(opts.actorTokenId !== undefined && { actorTokenId: opts.actorTokenId }),
1456
+ action: "marketplace.refreshed",
1457
+ target: id,
1458
+ detail: {
1459
+ from: cur.last_status,
1460
+ to: status,
1461
+ ...(lastError !== null && { error: lastError }),
1462
+ ...opts.auditDetail,
1463
+ },
1464
+ });
1465
+ }
1466
+ return cur.last_status;
1467
+ }
1117
1468
  /**
1118
1469
  * Replaces the entries of a marketplace; `trees` (a git marketplace) gives each path entry the
1119
1470
  * tree oid of its directory.
1120
1471
  */
1121
- async replaceEntries(trx, id, entries, trees, overlays) {
1122
- await trx.deleteFrom("marketplace_entries").where("source_id", "=", id).execute();
1472
+ async replaceEntries(id, entries, trees, overlays) {
1473
+ const t = this.db;
1474
+ await t.deleteFrom("marketplace_entries").where("source_id", "=", id).execute();
1123
1475
  for (let i = 0; i < entries.length; i += INSERT_BATCH) {
1124
- await trx
1476
+ await t
1125
1477
  .insertInto("marketplace_entries")
1126
1478
  .values(entries.slice(i, i + INSERT_BATCH).map((e) => ({
1127
1479
  source_id: id,
@@ -1138,15 +1490,15 @@ export class MarketplacesService {
1138
1490
  async views(rows) {
1139
1491
  if (rows.length === 0)
1140
1492
  return [];
1141
- const config = this.d.config();
1493
+ const config = this.config.get();
1142
1494
  const ids = rows.map((r) => r.id);
1143
- const counts = await this.d.db
1495
+ const counts = await this.db
1144
1496
  .selectFrom("marketplace_entries")
1145
1497
  .select(["source_id", (eb) => eb.fn.countAll().as("n")])
1146
1498
  .where("source_id", "in", ids)
1147
1499
  .groupBy("source_id")
1148
1500
  .execute();
1149
- const tokens = await this.d.db
1501
+ const tokens = await this.db
1150
1502
  .selectFrom("secrets")
1151
1503
  .select("key")
1152
1504
  .where("namespace", "=", SECRETS_NAMESPACE)
@@ -1176,8 +1528,9 @@ export class MarketplacesService {
1176
1528
  createdAt: r.created_at.toISOString(),
1177
1529
  }));
1178
1530
  }
1179
- secrets(db) {
1180
- return createSecrets(db, this.d.keyring, SECRETS_NAMESPACE);
1531
+ /** The deployment secrets on the current context's handle (the transaction, else the pool). */
1532
+ secrets() {
1533
+ return createSecrets(this.db, this.keyring, SECRETS_NAMESPACE);
1181
1534
  }
1182
1535
  checkName(name) {
1183
1536
  const n = name.trim();
@@ -1187,7 +1540,7 @@ export class MarketplacesService {
1187
1540
  return n;
1188
1541
  }
1189
1542
  checkUrls(url, mirrors) {
1190
- const allow = this.d.config().marketplaces.allowInsecureLoopback;
1543
+ const allow = this.config.get().marketplaces.allowInsecureLoopback;
1191
1544
  if (mirrors.length > MARKETPLACE_MAX_MIRRORS) {
1192
1545
  throw new ApiError("validation_failed", `at most ${MARKETPLACE_MAX_MIRRORS} mirrors`);
1193
1546
  }
@@ -1214,4 +1567,33 @@ export class MarketplacesService {
1214
1567
  throw new ApiError("validation_failed", `token must be 1–${MAX_TOKEN_CHARS} characters without line breaks`);
1215
1568
  }
1216
1569
  }
1217
- }
1570
+ };
1571
+ __decorate([
1572
+ Transactional()
1573
+ ], MarketplacesService.prototype, "writeAdd", null);
1574
+ __decorate([
1575
+ Transactional()
1576
+ ], MarketplacesService.prototype, "writeUpdate", null);
1577
+ __decorate([
1578
+ Transactional()
1579
+ ], MarketplacesService.prototype, "remove", null);
1580
+ __decorate([
1581
+ Transactional()
1582
+ ], MarketplacesService.prototype, "writeIcons", null);
1583
+ __decorate([
1584
+ Transactional()
1585
+ ], MarketplacesService.prototype, "recordRefresh", null);
1586
+ __decorate([
1587
+ Transactional({ propagation: "mandatory" })
1588
+ ], MarketplacesService.prototype, "replaceEntries", null);
1589
+ MarketplacesService = __decorate([
1590
+ Injectable(),
1591
+ __param(0, Inject(KernelDb)),
1592
+ __param(1, Inject(SuperAdminLock)),
1593
+ __param(2, Inject(CatalogSourceLock)),
1594
+ __param(3, Inject(KernelConfigService)),
1595
+ __param(4, Inject(KEYRING)),
1596
+ __param(5, Inject(KERNEL_LOGGER)),
1597
+ __param(6, Inject(TransactionHost))
1598
+ ], MarketplacesService);
1599
+ export { MarketplacesService };