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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (534) hide show
  1. package/bootstrap.json +61 -5
  2. package/dist/admin/admin.controller.d.ts +51 -14
  3. package/dist/admin/admin.controller.js +60 -19
  4. package/dist/admin/extensions.controller.d.ts +16 -2
  5. package/dist/admin/extensions.controller.js +26 -6
  6. package/dist/admin/setup-lock.d.ts +1 -1
  7. package/dist/admin/setup-lock.js +1 -1
  8. package/dist/admin/setup.controller.d.ts +1 -1
  9. package/dist/admin/setup.controller.js +1 -1
  10. package/dist/admin/setup.service.d.ts +4 -4
  11. package/dist/admin/setup.service.js +8 -8
  12. package/dist/agents/agent-lookup.d.ts +16 -0
  13. package/dist/agents/agent-lookup.js +11 -0
  14. package/dist/agents/agents.controller.d.ts +76 -1
  15. package/dist/agents/agents.controller.js +90 -11
  16. package/dist/agents/agents.module.d.ts +4 -1
  17. package/dist/agents/agents.module.js +32 -6
  18. package/dist/agents/agents.service.d.ts +54 -23
  19. package/dist/agents/agents.service.js +180 -76
  20. package/dist/agents/definition.d.ts +49 -0
  21. package/dist/agents/definition.js +45 -0
  22. package/dist/agents/from-template.d.ts +106 -0
  23. package/dist/agents/from-template.js +649 -0
  24. package/dist/agents/from-template.service.d.ts +60 -0
  25. package/dist/agents/from-template.service.js +161 -0
  26. package/dist/agents/models.controller.d.ts +34 -5
  27. package/dist/agents/models.controller.js +50 -6
  28. package/dist/agents/org-templates.d.ts +176 -0
  29. package/dist/agents/org-templates.js +827 -0
  30. package/dist/agents/pending-connector-requests.d.ts +77 -0
  31. package/dist/agents/pending-connector-requests.js +215 -0
  32. package/dist/agents/pending-connectors.controller.d.ts +39 -0
  33. package/dist/agents/pending-connectors.controller.js +91 -0
  34. package/dist/agents/pending-connectors.service.d.ts +62 -0
  35. package/dist/agents/pending-connectors.service.js +282 -0
  36. package/dist/agents/readiness.controller.d.ts +5 -5
  37. package/dist/agents/readiness.controller.js +6 -6
  38. package/dist/agents/templates.controller.d.ts +86 -5
  39. package/dist/agents/templates.controller.js +171 -7
  40. package/dist/agents/templates.d.ts +127 -23
  41. package/dist/agents/templates.js +475 -52
  42. package/dist/background/background.module.js +8 -1
  43. package/dist/background/finish.d.ts +3 -2
  44. package/dist/background/launch-lock.d.ts +4 -3
  45. package/dist/background/launch-lock.js +4 -3
  46. package/dist/background/poll.job.d.ts +9 -6
  47. package/dist/background/poll.job.js +30 -22
  48. package/dist/background/session.d.ts +13 -2
  49. package/dist/background/session.js +13 -0
  50. package/dist/background/stop.d.ts +12 -6
  51. package/dist/background/stop.js +57 -39
  52. package/dist/background/store.d.ts +18 -6
  53. package/dist/background/store.js +12 -6
  54. package/dist/background/tasks.service.d.ts +15 -5
  55. package/dist/background/tasks.service.js +42 -17
  56. package/dist/background/wake-rules.d.ts +27 -18
  57. package/dist/background/wake-rules.js +52 -22
  58. package/dist/background/wake.d.ts +13 -11
  59. package/dist/background/wake.js +20 -14
  60. package/dist/catalog/admin-catalog.controller.d.ts +129 -30
  61. package/dist/catalog/admin-catalog.controller.js +213 -42
  62. package/dist/catalog/catalog-content.d.ts +58 -32
  63. package/dist/catalog/catalog-content.js +34 -8
  64. package/dist/catalog/catalog-import.module.d.ts +7 -0
  65. package/dist/catalog/catalog-import.module.js +60 -0
  66. package/dist/catalog/catalog-items.d.ts +111 -7
  67. package/dist/catalog/catalog-items.js +279 -13
  68. package/dist/catalog/catalog-scope.service.d.ts +260 -0
  69. package/dist/catalog/catalog-scope.service.js +1116 -0
  70. package/dist/catalog/catalog.module.d.ts +7 -9
  71. package/dist/catalog/catalog.module.js +41 -31
  72. package/dist/catalog/catalog.service.d.ts +101 -29
  73. package/dist/catalog/catalog.service.js +104 -106
  74. package/dist/catalog/cli.d.ts +11 -1
  75. package/dist/catalog/cli.js +26 -1
  76. package/dist/catalog/component-promotion.d.ts +96 -0
  77. package/dist/catalog/component-promotion.js +395 -0
  78. package/dist/catalog/component-scope.controller.d.ts +152 -0
  79. package/dist/catalog/component-scope.controller.js +287 -0
  80. package/dist/catalog/component-scope.service.d.ts +303 -0
  81. package/dist/catalog/component-scope.service.js +936 -0
  82. package/dist/catalog/component-state.d.ts +174 -0
  83. package/dist/catalog/component-state.js +437 -0
  84. package/dist/catalog/job-ids.d.ts +30 -0
  85. package/dist/catalog/job-ids.js +25 -0
  86. package/dist/catalog/marketplace-fetch.d.ts +1 -1
  87. package/dist/catalog/marketplaces.controller.d.ts +22 -5
  88. package/dist/catalog/marketplaces.controller.js +56 -7
  89. package/dist/catalog/marketplaces.service.d.ts +54 -14
  90. package/dist/catalog/marketplaces.service.js +71 -22
  91. package/dist/catalog/org-catalog.controller.d.ts +125 -34
  92. package/dist/catalog/org-catalog.controller.js +181 -65
  93. package/dist/catalog/org-catalog.service.d.ts +65 -33
  94. package/dist/catalog/org-catalog.service.js +324 -157
  95. package/dist/catalog/org-extension-switch.d.ts +41 -0
  96. package/dist/catalog/org-extension-switch.js +115 -0
  97. package/dist/catalog/org-extension.controller.d.ts +119 -0
  98. package/dist/catalog/org-extension.controller.js +266 -0
  99. package/dist/catalog/org-plugin-uploads.controller.d.ts +98 -0
  100. package/dist/catalog/org-plugin-uploads.controller.js +213 -0
  101. package/dist/catalog/org-plugin-uploads.d.ts +63 -0
  102. package/dist/catalog/org-plugin-uploads.js +116 -0
  103. package/dist/catalog/owned-items.d.ts +184 -0
  104. package/dist/catalog/owned-items.js +789 -0
  105. package/dist/catalog/owned-plugin-cleanup.d.ts +56 -0
  106. package/dist/catalog/owned-plugin-cleanup.js +194 -0
  107. package/dist/catalog/ownership.d.ts +172 -0
  108. package/dist/catalog/ownership.js +326 -0
  109. package/dist/catalog/platform-components.d.ts +221 -0
  110. package/dist/catalog/platform-components.js +761 -0
  111. package/dist/catalog/platform-migration.d.ts +115 -0
  112. package/dist/catalog/platform-migration.js +582 -0
  113. package/dist/catalog/plugin-import.d.ts +178 -34
  114. package/dist/catalog/plugin-import.js +622 -82
  115. package/dist/catalog/plugin-install.d.ts +185 -41
  116. package/dist/catalog/plugin-install.js +758 -126
  117. package/dist/catalog/plugin-upgrade.d.ts +260 -225
  118. package/dist/catalog/plugin-upgrade.js +1147 -1136
  119. package/dist/catalog/request-rules.d.ts +65 -0
  120. package/dist/catalog/request-rules.js +217 -0
  121. package/dist/catalog/requests.service.d.ts +193 -118
  122. package/dist/catalog/requests.service.js +526 -343
  123. package/dist/catalog/reserved-names.d.ts +8 -0
  124. package/dist/catalog/reserved-names.js +42 -0
  125. package/dist/catalog/scope-orgs.d.ts +21 -0
  126. package/dist/catalog/scope-orgs.js +67 -0
  127. package/dist/catalog/scope-state.d.ts +35 -0
  128. package/dist/catalog/scope-state.js +87 -0
  129. package/dist/catalog/scope-sync-workers.d.ts +7 -0
  130. package/dist/catalog/scope-sync-workers.js +29 -0
  131. package/dist/catalog/scope-sync.d.ts +176 -0
  132. package/dist/catalog/scope-sync.js +576 -0
  133. package/dist/catalog/scope.d.ts +42 -0
  134. package/dist/catalog/scope.js +42 -0
  135. package/dist/catalog/unshare.d.ts +22 -0
  136. package/dist/catalog/unshare.js +118 -0
  137. package/dist/channels/actions.js +1 -0
  138. package/dist/channels/cards.js +20 -2
  139. package/dist/channels/channels.module.js +2 -0
  140. package/dist/channels/inbound.d.ts +9 -1
  141. package/dist/channels/inbound.js +67 -5
  142. package/dist/channels/phrases.d.ts +35 -0
  143. package/dist/channels/phrases.js +29 -0
  144. package/dist/config/docs.js +3 -1
  145. package/dist/config/schema.d.ts +10 -2
  146. package/dist/config/schema.js +70 -22
  147. package/dist/conversations/access.d.ts +6 -4
  148. package/dist/conversations/access.js +27 -5
  149. package/dist/conversations/agent-tree.d.ts +46 -0
  150. package/dist/conversations/agent-tree.js +92 -0
  151. package/dist/conversations/conversations.controller.d.ts +43 -18
  152. package/dist/conversations/conversations.controller.js +79 -38
  153. package/dist/conversations/conversations.module.d.ts +1 -1
  154. package/dist/conversations/conversations.module.js +7 -7
  155. package/dist/conversations/conversations.service.d.ts +73 -15
  156. package/dist/conversations/conversations.service.js +115 -35
  157. package/dist/conversations/environment-status.d.ts +24 -0
  158. package/dist/conversations/environment-status.js +71 -0
  159. package/dist/conversations/event-log.d.ts +20 -5
  160. package/dist/conversations/event-log.js +60 -0
  161. package/dist/conversations/events.d.ts +84 -2
  162. package/dist/conversations/events.js +91 -17
  163. package/dist/conversations/queue.service.d.ts +1 -1
  164. package/dist/conversations/queue.service.js +5 -0
  165. package/dist/conversations/titles.d.ts +5 -3
  166. package/dist/conversations/titles.js +21 -8
  167. package/dist/conversations/tree.d.ts +17 -0
  168. package/dist/conversations/tree.js +42 -0
  169. package/dist/ctx/create-ctx.d.ts +20 -1
  170. package/dist/ctx/create-ctx.js +38 -7
  171. package/dist/db/kernel-schema.d.ts +386 -18
  172. package/dist/environments/access.d.ts +41 -0
  173. package/dist/environments/access.js +77 -0
  174. package/dist/environments/conversation-environments.d.ts +61 -0
  175. package/dist/environments/conversation-environments.js +170 -0
  176. package/dist/environments/dto.d.ts +25 -0
  177. package/dist/environments/dto.js +12 -0
  178. package/dist/environments/environments.controller.d.ts +33 -0
  179. package/dist/environments/environments.controller.js +110 -0
  180. package/dist/environments/environments.module.d.ts +8 -0
  181. package/dist/environments/environments.module.js +27 -0
  182. package/dist/environments/environments.service.d.ts +153 -0
  183. package/dist/environments/environments.service.js +541 -0
  184. package/dist/environments/legacy-cleanup.job.d.ts +34 -0
  185. package/dist/environments/legacy-cleanup.job.js +141 -0
  186. package/dist/errors.d.ts +85 -2
  187. package/dist/errors.js +85 -2
  188. package/dist/evals/reconstruct.d.ts +18 -9
  189. package/dist/evals/reconstruct.js +26 -7
  190. package/dist/evals/run-replay.d.ts +4 -2
  191. package/dist/evals/run-replay.js +20 -6
  192. package/dist/evals/runs.service.d.ts +2 -1
  193. package/dist/evals/runs.service.js +13 -12
  194. package/dist/evals/step-replay.d.ts +4 -6
  195. package/dist/evals/step-replay.js +4 -3
  196. package/dist/evals/trajectory.service.d.ts +8 -3
  197. package/dist/evals/trajectory.service.js +26 -14
  198. package/dist/evals/worker.d.ts +5 -5
  199. package/dist/evals/worker.js +9 -3
  200. package/dist/extensions/admin-ops.d.ts +36 -10
  201. package/dist/extensions/admin-ops.js +65 -42
  202. package/dist/extensions/admin-view.d.ts +37 -10
  203. package/dist/extensions/admin-view.js +103 -20
  204. package/dist/extensions/bootstrap.d.ts +17 -4
  205. package/dist/extensions/bootstrap.js +70 -9
  206. package/dist/extensions/cli.d.ts +12 -0
  207. package/dist/extensions/cli.js +11 -2
  208. package/dist/extensions/config-hash.d.ts +10 -0
  209. package/dist/extensions/config-hash.js +38 -0
  210. package/dist/extensions/deployment-config.d.ts +28 -5
  211. package/dist/extensions/deployment-config.js +48 -7
  212. package/dist/extensions/effective-config.d.ts +127 -0
  213. package/dist/extensions/effective-config.js +368 -0
  214. package/dist/extensions/extensions.module.js +11 -11
  215. package/dist/extensions/hooks.d.ts +37 -4
  216. package/dist/extensions/hooks.js +82 -16
  217. package/dist/extensions/host.d.ts +24 -10
  218. package/dist/extensions/host.js +49 -54
  219. package/dist/extensions/installs.d.ts +20 -8
  220. package/dist/extensions/installs.js +37 -15
  221. package/dist/extensions/org-config.d.ts +75 -6
  222. package/dist/extensions/org-config.js +184 -32
  223. package/dist/extensions/org-levels.d.ts +37 -0
  224. package/dist/extensions/org-levels.js +71 -0
  225. package/dist/extensions/org-overrides.d.ts +151 -0
  226. package/dist/extensions/org-overrides.js +524 -0
  227. package/dist/extensions/permission-view.d.ts +16 -4
  228. package/dist/extensions/permission-view.js +4 -4
  229. package/dist/extensions/plugin-items.d.ts +21 -0
  230. package/dist/extensions/plugin-items.js +42 -0
  231. package/dist/extensions/point-defaults.d.ts +12 -5
  232. package/dist/extensions/point-defaults.js +37 -9
  233. package/dist/extensions/resolve.d.ts +5 -1
  234. package/dist/extensions/resolve.js +15 -2
  235. package/dist/extensions/state.module.d.ts +9 -0
  236. package/dist/extensions/state.module.js +38 -0
  237. package/dist/files/previewers.d.ts +8 -1
  238. package/dist/files/previewers.js +35 -6
  239. package/dist/http/api.module.js +25 -3
  240. package/dist/http/app.d.ts +11 -2
  241. package/dist/http/app.js +31 -5
  242. package/dist/http/plugin-dispatch.d.ts +4 -1
  243. package/dist/http/plugin-dispatch.js +14 -2
  244. package/dist/identity/accounts.d.ts +29 -29
  245. package/dist/identity/accounts.js +47 -47
  246. package/dist/identity/audit.d.ts +2 -1
  247. package/dist/identity/auth.guard.d.ts +13 -5
  248. package/dist/identity/auth.guard.js +26 -9
  249. package/dist/identity/identity.module.d.ts +1 -1
  250. package/dist/identity/identity.module.js +4 -4
  251. package/dist/identity/me.controller.js +1 -1
  252. package/dist/identity/principal.d.ts +3 -3
  253. package/dist/identity/principal.js +3 -3
  254. package/dist/identity/settings.d.ts +22 -11
  255. package/dist/identity/settings.js +53 -18
  256. package/dist/identity/{enterprise-admin.d.ts → super-admin.d.ts} +5 -5
  257. package/dist/identity/{enterprise-admin.js → super-admin.js} +24 -24
  258. package/dist/inbox/inbox.module.d.ts +4 -1
  259. package/dist/inbox/inbox.module.js +7 -3
  260. package/dist/inbox/inbox.service.d.ts +62 -3
  261. package/dist/inbox/inbox.service.js +74 -4
  262. package/dist/inbox/org-notices.d.ts +63 -0
  263. package/dist/inbox/org-notices.js +91 -0
  264. package/dist/inbox/platform-inbox.controller.d.ts +23 -0
  265. package/dist/inbox/platform-inbox.controller.js +58 -0
  266. package/dist/inbox/platform-inbox.service.d.ts +151 -0
  267. package/dist/inbox/platform-inbox.service.js +263 -0
  268. package/dist/inbox/platform-notices.d.ts +19 -0
  269. package/dist/inbox/platform-notices.js +9 -0
  270. package/dist/index.d.ts +1 -1
  271. package/dist/index.js +1 -1
  272. package/dist/infra/cli/kernel-cli.module.js +9 -1
  273. package/dist/infra/config/kernel-config.service.js +24 -1
  274. package/dist/infra/database/xact-lock.d.ts +1 -1
  275. package/dist/infra/database/xact-lock.js +1 -1
  276. package/dist/infra/events/kernel-events.d.ts +19 -2
  277. package/dist/infra/queue/add-job-once.d.ts +14 -0
  278. package/dist/infra/queue/add-job-once.js +16 -0
  279. package/dist/kernel.module.js +6 -0
  280. package/dist/lifecycle/kernel-lifecycle.d.ts +1 -1
  281. package/dist/lifecycle/kernel-lifecycle.js +4 -4
  282. package/dist/models/embeddings.d.ts +82 -0
  283. package/dist/models/embeddings.js +326 -0
  284. package/dist/models/enablement.controller.d.ts +40 -0
  285. package/dist/models/enablement.controller.js +74 -0
  286. package/dist/models/enablement.d.ts +99 -0
  287. package/dist/models/enablement.js +263 -0
  288. package/dist/models/models.module.d.ts +5 -1
  289. package/dist/models/models.module.js +16 -4
  290. package/dist/models/prices.d.ts +5 -5
  291. package/dist/models/prices.js +4 -4
  292. package/dist/models/purposes.controller.d.ts +6 -4
  293. package/dist/models/purposes.controller.js +13 -7
  294. package/dist/models/purposes.d.ts +37 -12
  295. package/dist/models/purposes.js +63 -17
  296. package/dist/orgs/directory-sync.d.ts +14 -5
  297. package/dist/orgs/directory-sync.js +41 -17
  298. package/dist/orgs/offboarding.d.ts +9 -7
  299. package/dist/orgs/offboarding.js +28 -17
  300. package/dist/orgs/org-lock.d.ts +5 -0
  301. package/dist/orgs/org-lock.js +13 -0
  302. package/dist/orgs/org.guard.d.ts +10 -0
  303. package/dist/orgs/org.guard.js +43 -32
  304. package/dist/orgs/orgs.module.js +3 -0
  305. package/dist/orgs/orgs.service.d.ts +20 -7
  306. package/dist/orgs/orgs.service.js +32 -12
  307. package/dist/orgs/roles.d.ts +1 -1
  308. package/dist/orgs/roles.js +5 -1
  309. package/dist/orgs/settings.controller.d.ts +1 -1
  310. package/dist/orgs/settings.service.d.ts +15 -3
  311. package/dist/orgs/settings.service.js +6 -2
  312. package/dist/overrides.d.ts +3 -0
  313. package/dist/overrides.js +2 -0
  314. package/dist/platform/actor.d.ts +48 -0
  315. package/dist/platform/actor.js +100 -0
  316. package/dist/platform/agent-docs.d.ts +18 -0
  317. package/dist/platform/agent-docs.js +59 -0
  318. package/dist/platform/availability.d.ts +14 -0
  319. package/dist/platform/availability.js +43 -0
  320. package/dist/platform/errors.d.ts +11 -0
  321. package/dist/platform/errors.js +26 -0
  322. package/dist/platform/exclusions.d.ts +12 -0
  323. package/dist/platform/exclusions.js +1405 -0
  324. package/dist/platform/method.d.ts +6 -0
  325. package/dist/platform/method.js +15 -0
  326. package/dist/platform/operation.d.ts +92 -0
  327. package/dist/platform/operation.js +35 -0
  328. package/dist/platform/ops/agent-templates.ops.d.ts +14 -0
  329. package/dist/platform/ops/agent-templates.ops.js +92 -0
  330. package/dist/platform/ops/agents.ops.d.ts +19 -0
  331. package/dist/platform/ops/agents.ops.js +294 -0
  332. package/dist/platform/ops/connectors.ops.d.ts +15 -0
  333. package/dist/platform/ops/connectors.ops.js +126 -0
  334. package/dist/platform/ops/errors.d.ts +11 -0
  335. package/dist/platform/ops/errors.js +22 -0
  336. package/dist/platform/ops/extensions.ops.d.ts +19 -0
  337. package/dist/platform/ops/extensions.ops.js +116 -0
  338. package/dist/platform/ops/marketplaces.ops.d.ts +16 -0
  339. package/dist/platform/ops/marketplaces.ops.js +157 -0
  340. package/dist/platform/ops/paging.d.ts +14 -0
  341. package/dist/platform/ops/paging.js +20 -0
  342. package/dist/platform/ops/platform.ops.d.ts +23 -0
  343. package/dist/platform/ops/platform.ops.js +158 -0
  344. package/dist/platform/ops/plugins.ops.d.ts +33 -0
  345. package/dist/platform/ops/plugins.ops.js +377 -0
  346. package/dist/platform/ops/requests.ops.d.ts +14 -0
  347. package/dist/platform/ops/requests.ops.js +153 -0
  348. package/dist/platform/ops/role.d.ts +4 -0
  349. package/dist/platform/ops/role.js +10 -0
  350. package/dist/platform/ops/skills.ops.d.ts +13 -0
  351. package/dist/platform/ops/skills.ops.js +98 -0
  352. package/dist/platform/ops/summary.d.ts +10 -0
  353. package/dist/platform/ops/summary.js +18 -0
  354. package/dist/platform/platform-ops.module.d.ts +7 -0
  355. package/dist/platform/platform-ops.module.js +55 -0
  356. package/dist/platform/platform.module.d.ts +8 -0
  357. package/dist/platform/platform.module.js +25 -0
  358. package/dist/platform/redact-orgs.d.ts +7 -0
  359. package/dist/platform/redact-orgs.js +52 -0
  360. package/dist/platform/registry.d.ts +30 -0
  361. package/dist/platform/registry.js +111 -0
  362. package/dist/roles/worker-role.d.ts +6 -4
  363. package/dist/roles/worker-role.js +14 -7
  364. package/dist/roles/worker.module.d.ts +1 -1
  365. package/dist/roles/worker.module.js +9 -1
  366. package/dist/runtime/context/build.d.ts +6 -4
  367. package/dist/runtime/context/build.js +26 -7
  368. package/dist/runtime/context/claude-tools.d.ts +2 -1
  369. package/dist/runtime/context/claude-tools.js +5 -4
  370. package/dist/runtime/context/compaction.js +9 -0
  371. package/dist/runtime/context/reminders.d.ts +2 -0
  372. package/dist/runtime/context/reminders.js +2 -0
  373. package/dist/runtime/context/skills.js +9 -2
  374. package/dist/runtime/context/tool-changes.d.ts +27 -0
  375. package/dist/runtime/context/tool-changes.js +60 -0
  376. package/dist/runtime/hook-calls.d.ts +8 -1
  377. package/dist/runtime/hook-calls.js +40 -7
  378. package/dist/runtime/langgraph-loop.d.ts +3 -1
  379. package/dist/runtime/langgraph-loop.js +35 -17
  380. package/dist/runtime/loop.d.ts +32 -4
  381. package/dist/runtime/maintenance.d.ts +7 -4
  382. package/dist/runtime/maintenance.js +23 -8
  383. package/dist/runtime/model-call.d.ts +38 -11
  384. package/dist/runtime/model-call.js +97 -24
  385. package/dist/runtime/providers.d.ts +146 -32
  386. package/dist/runtime/providers.js +321 -67
  387. package/dist/runtime/run-control.d.ts +11 -1
  388. package/dist/runtime/run-control.js +12 -0
  389. package/dist/runtime/run-drafts.d.ts +85 -0
  390. package/dist/runtime/run-drafts.js +230 -0
  391. package/dist/runtime/run-jobs.d.ts +3 -5
  392. package/dist/runtime/run-jobs.js +3 -7
  393. package/dist/runtime/run-queue.d.ts +37 -3
  394. package/dist/runtime/run-queue.js +188 -11
  395. package/dist/runtime/run-worker.d.ts +12 -6
  396. package/dist/runtime/run-worker.js +58 -35
  397. package/dist/runtime/runtime.module.js +3 -0
  398. package/dist/runtime/step-log.d.ts +9 -4
  399. package/dist/runtime/step-log.js +8 -5
  400. package/dist/runtime/stream.controller.d.ts +23 -1
  401. package/dist/runtime/stream.controller.js +60 -3
  402. package/dist/runtime/stream.d.ts +4 -1
  403. package/dist/runtime/stream.js +27 -3
  404. package/dist/runtime/subagents/child.d.ts +55 -7
  405. package/dist/runtime/subagents/child.js +105 -7
  406. package/dist/runtime/subagents/definition.d.ts +12 -3
  407. package/dist/runtime/subagents/definition.js +46 -32
  408. package/dist/runtime/subagents/deliveries.d.ts +71 -0
  409. package/dist/runtime/subagents/deliveries.js +228 -0
  410. package/dist/runtime/subagents/dispatch.d.ts +115 -26
  411. package/dist/runtime/subagents/dispatch.js +212 -141
  412. package/dist/runtime/subagents/limits.d.ts +24 -5
  413. package/dist/runtime/subagents/limits.js +40 -6
  414. package/dist/runtime/subagents/messages.d.ts +95 -0
  415. package/dist/runtime/subagents/messages.js +328 -0
  416. package/dist/runtime/subagents/preamble.d.ts +4 -4
  417. package/dist/runtime/subagents/preamble.js +9 -7
  418. package/dist/runtime/subagents/progress.d.ts +8 -6
  419. package/dist/runtime/subagents/progress.js +11 -6
  420. package/dist/runtime/subagents/render.d.ts +30 -0
  421. package/dist/runtime/subagents/render.js +53 -0
  422. package/dist/runtime/subagents/roster.d.ts +24 -7
  423. package/dist/runtime/subagents/roster.js +47 -11
  424. package/dist/runtime/subagents/skill-fork.d.ts +3 -2
  425. package/dist/runtime/subagents/skill-fork.js +8 -4
  426. package/dist/runtime/subagents/status.d.ts +14 -0
  427. package/dist/runtime/subagents/status.js +23 -0
  428. package/dist/runtime/subagents/subagents.service.d.ts +7 -4
  429. package/dist/runtime/subagents/subagents.service.js +11 -6
  430. package/dist/runtime/usage-report-jobs.d.ts +88 -0
  431. package/dist/runtime/usage-report-jobs.js +158 -0
  432. package/dist/runtime/usage-report.d.ts +33 -38
  433. package/dist/runtime/usage-report.js +169 -96
  434. package/dist/runtime/waits.d.ts +140 -37
  435. package/dist/runtime/waits.js +394 -106
  436. package/dist/sandbox/jobs.d.ts +40 -13
  437. package/dist/sandbox/jobs.js +57 -20
  438. package/dist/sandbox/leases.d.ts +37 -54
  439. package/dist/sandbox/leases.js +71 -115
  440. package/dist/sandbox/providers.d.ts +2 -2
  441. package/dist/sandbox/providers.js +1 -1
  442. package/dist/sandbox/sandbox.module.d.ts +3 -2
  443. package/dist/sandbox/sandbox.module.js +4 -3
  444. package/dist/sandbox/sandbox.service.d.ts +229 -134
  445. package/dist/sandbox/sandbox.service.js +630 -409
  446. package/dist/skills/catalog.d.ts +3 -2
  447. package/dist/skills/catalog.js +21 -43
  448. package/dist/skills/changes.controller.d.ts +7 -0
  449. package/dist/skills/changes.controller.js +19 -1
  450. package/dist/skills/invoke.js +8 -3
  451. package/dist/skills/package.d.ts +20 -1
  452. package/dist/skills/package.js +28 -1
  453. package/dist/skills/skills.controller.d.ts +39 -4
  454. package/dist/skills/skills.controller.js +88 -10
  455. package/dist/skills/skills.module.js +10 -1
  456. package/dist/skills/skills.service.d.ts +106 -26
  457. package/dist/skills/skills.service.js +421 -75
  458. package/dist/skills/usable.d.ts +81 -0
  459. package/dist/skills/usable.js +379 -0
  460. package/dist/tools/approvals.service.d.ts +20 -2
  461. package/dist/tools/approvals.service.js +23 -4
  462. package/dist/tools/builtin-names.d.ts +21 -5
  463. package/dist/tools/builtin-names.js +30 -5
  464. package/dist/tools/builtins/agent.d.ts +23 -21
  465. package/dist/tools/builtins/agent.js +62 -55
  466. package/dist/tools/builtins/builtin-tools.d.ts +6 -2
  467. package/dist/tools/builtins/builtin-tools.js +37 -12
  468. package/dist/tools/builtins/handback.d.ts +28 -0
  469. package/dist/tools/builtins/handback.js +53 -0
  470. package/dist/tools/builtins/platform.d.ts +34 -0
  471. package/dist/tools/builtins/platform.js +362 -0
  472. package/dist/tools/builtins/sandbox/bash.js +13 -3
  473. package/dist/tools/builtins/sandbox/common.d.ts +43 -24
  474. package/dist/tools/builtins/sandbox/common.js +80 -45
  475. package/dist/tools/builtins/sandbox/edit.js +2 -2
  476. package/dist/tools/builtins/sandbox/glob.js +2 -2
  477. package/dist/tools/builtins/sandbox/grep.js +2 -4
  478. package/dist/tools/builtins/sandbox/index.d.ts +1 -1
  479. package/dist/tools/builtins/sandbox/index.js +1 -1
  480. package/dist/tools/builtins/sandbox/read.js +1 -1
  481. package/dist/tools/builtins/sandbox/task-output.d.ts +14 -3
  482. package/dist/tools/builtins/sandbox/task-output.js +30 -5
  483. package/dist/tools/builtins/sandbox/task-stop.js +2 -1
  484. package/dist/tools/builtins/sandbox/write.js +2 -2
  485. package/dist/tools/builtins/send-message.d.ts +56 -0
  486. package/dist/tools/builtins/send-message.js +100 -0
  487. package/dist/tools/builtins/skill-load.d.ts +22 -14
  488. package/dist/tools/builtins/skill-load.js +86 -57
  489. package/dist/tools/builtins/skill-write.js +1 -1
  490. package/dist/tools/builtins/web/extract.js +5 -1
  491. package/dist/tools/builtins/web/fetch.js +1 -0
  492. package/dist/tools/builtins/web/search.js +1 -0
  493. package/dist/tools/connectors.controller.d.ts +10 -0
  494. package/dist/tools/connectors.controller.js +12 -0
  495. package/dist/tools/connectors.service.d.ts +46 -5
  496. package/dist/tools/connectors.service.js +94 -15
  497. package/dist/tools/extension-tools.controller.d.ts +14 -0
  498. package/dist/tools/extension-tools.controller.js +37 -0
  499. package/dist/tools/info.d.ts +42 -1
  500. package/dist/tools/info.js +64 -1
  501. package/dist/tools/org-tool-switches.d.ts +74 -0
  502. package/dist/tools/org-tool-switches.js +184 -0
  503. package/dist/tools/pipeline.d.ts +46 -40
  504. package/dist/tools/pipeline.js +193 -364
  505. package/dist/tools/policy.d.ts +1 -1
  506. package/dist/tools/policy.js +36 -16
  507. package/dist/tools/registry.d.ts +98 -5
  508. package/dist/tools/registry.js +87 -9
  509. package/dist/tools/tools.module.js +12 -2
  510. package/dist/ui/views.d.ts +2 -1
  511. package/dist/ui/views.js +17 -3
  512. package/package.json +3 -3
  513. package/src/migrations/0074_subagent_tree.sql +50 -0
  514. package/src/migrations/0075_plugin_scope.sql +61 -0
  515. package/src/migrations/0076_skills_created_by_nullable.sql +6 -0
  516. package/src/migrations/0077_scope_requests.sql +52 -0
  517. package/src/migrations/0078_scope_grant_switches.sql +18 -0
  518. package/src/migrations/0079_scope_live_install_switches.sql +19 -0
  519. package/src/migrations/0080_rename_enterprise_admin.sql +18 -0
  520. package/src/migrations/0081_platform_components.sql +129 -0
  521. package/src/migrations/0082_platform_migration.sql +33 -0
  522. package/src/migrations/0083_plugin_scope_sync_failures.sql +15 -0
  523. package/src/migrations/0084_org_owned_items.sql +85 -0
  524. package/src/migrations/0085_agent_templates_phase4.sql +45 -0
  525. package/src/migrations/0086_org_layering.sql +30 -0
  526. package/src/migrations/0087_approval_summary.sql +6 -0
  527. package/src/migrations/0088_environments.sql +80 -0
  528. package/src/migrations/0089_model_kinds_usage.sql +38 -0
  529. package/dist/catalog/upgrade-targets.d.ts +0 -56
  530. package/dist/catalog/upgrade-targets.js +0 -90
  531. package/dist/conversations/sandbox-status.d.ts +0 -24
  532. package/dist/conversations/sandbox-status.js +0 -52
  533. package/dist/extensions/org-config.controller.d.ts +0 -32
  534. package/dist/extensions/org-config.controller.js +0 -70
@@ -0,0 +1,60 @@
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
+ import { Module } from "@nestjs/common";
8
+ import { ExtensionsModule } from "../extensions/extensions.module.js";
9
+ import { SuperAdminLockModule } from "../identity/super-admin.js";
10
+ import { QueueModule } from "../infra/queue/queue.module.js";
11
+ import { OrgLockModule } from "../orgs/org-lock.js";
12
+ import { MAINTENANCE_QUEUE_NAME } from "../runtime/maintenance-queue.js";
13
+ import { StorageModule } from "../storage/storage.module.js";
14
+ import { CatalogService } from "./catalog.service.js";
15
+ import { ComponentPromotion } from "./component-promotion.js";
16
+ import { CatalogItemLock, CatalogSourceLock } from "./locks.js";
17
+ import { MarketplacesService } from "./marketplaces.service.js";
18
+ import { PlatformComponents } from "./platform-components.js";
19
+ import { PluginImport } from "./plugin-import.js";
20
+ // Its own file so that `SkillsModule` can import it (an owner's new version of a promoted skill is
21
+ // written to its platform row, ruling P3-4) without a module file cycle through `CatalogModule`.
22
+ /**
23
+ * The platform side of the catalog: marketplaces, the one import review (prepare -> confirm), the
24
+ * items and their platform components. The CLI's `capybara plugins *` and `capybara bootstrap` run on this
25
+ * part alone.
26
+ */
27
+ let CatalogImportModule = class CatalogImportModule {
28
+ };
29
+ CatalogImportModule = __decorate([
30
+ Module({
31
+ imports: [
32
+ ExtensionsModule,
33
+ SuperAdminLockModule,
34
+ // an org upload re-checks the owner org's admin (`PluginImport`, ruling P3-7)
35
+ OrgLockModule,
36
+ StorageModule,
37
+ // a failed post-import platform sync enqueues the migration job (`PluginImport.syncPlatform`)
38
+ QueueModule.registerQueue(MAINTENANCE_QUEUE_NAME),
39
+ ],
40
+ providers: [
41
+ CatalogSourceLock,
42
+ CatalogItemLock,
43
+ MarketplacesService,
44
+ PluginImport,
45
+ PlatformComponents,
46
+ // promote on share (ruling P3-3): the admin component routes and the owner's 可共享
47
+ ComponentPromotion,
48
+ CatalogService,
49
+ ],
50
+ exports: [
51
+ MarketplacesService,
52
+ PluginImport,
53
+ PlatformComponents,
54
+ ComponentPromotion,
55
+ CatalogService,
56
+ CatalogItemLock,
57
+ ],
58
+ })
59
+ ], CatalogImportModule);
60
+ export { CatalogImportModule };
@@ -1,10 +1,13 @@
1
1
  import type { Connector, ConnectorTemplateSpec, LocalizedName, PluginManifest } from "@capybara-hq/plugin-sdk";
2
2
  import type { KernelConfig } from "../config/schema.js";
3
3
  import type { KernelSchemaDb, SourceFormat } from "../db/kernel-schema.js";
4
+ import type { ExtensionAdmin } from "../extensions/admin-view.js";
4
5
  import type { StorageService } from "../storage/storage.service.js";
5
- import type { CatalogItemView, CatalogPolicy, CatalogVersionSource, PermissionsMismatch, SourceDetail } from "./catalog.service.js";
6
+ import type { CatalogItemView, CatalogPolicy, CatalogVersionSource, ComponentCounts, PermissionsMismatch, SourceDetail } from "./catalog.service.js";
6
7
  import type { TranslationReport } from "./claude/report.js";
7
8
  import { type ImportedAs } from "./marketplaces.service.js";
9
+ import { type Owner } from "./ownership.js";
10
+ import type { PluginScope } from "./scope.js";
8
11
  /**
9
12
  * The object storage prefix of one import (relative to `deployment/`):
10
13
  * `directory/<itemId>/<version>/<importId>/`. Each import gets a new `importId`, so the losing one of
@@ -36,6 +39,12 @@ export interface CatalogListing {
36
39
  }
37
40
  /** Input of {@link writeCatalogVersion}. */
38
41
  export interface CatalogVersionWrite {
42
+ /**
43
+ * A new version of an org-owned item: `latest_version` (and the listing) stays where it is; it
44
+ * moves only when the version is applied or confirmed (ruling P3-34). The version row is
45
+ * written not applied (`applied_at` null, ruling P3-52) until {@link markVersionApplied}.
46
+ */
47
+ keepLatest?: boolean;
39
48
  /** null: the CLI (no account). */
40
49
  actor: string | null;
41
50
  actorTokenId?: string;
@@ -86,6 +95,16 @@ export interface CatalogVersionWrite {
86
95
  * the source is not git. An item without package.json is identified by it instead of a package name.
87
96
  */
88
97
  export declare function gitIdentity(detail: SourceDetail | undefined): string | null;
98
+ /**
99
+ * An org's own version imported but not applied (pre-flight F4, ruling P3-12): the live item named
100
+ * `name` owned by `ownerOrgId` (same package) has a version of the release of `p.version` with the
101
+ * same content digest and no extension, other than the platform's version. Uploading it again
102
+ * retries its update instead of `catalog.version_exists`. undefined otherwise.
103
+ */
104
+ export declare function unappliedOwnVersion(db: KernelSchemaDb, name: string, ownerOrgId: string, p: Pick<ImportIdentity, "packageName" | "version" | "contentDigest">): Promise<{
105
+ itemId: string;
106
+ version: string;
107
+ } | undefined>;
89
108
  /** What is being imported, as far as the version conflict rules need it. */
90
109
  export interface ImportIdentity {
91
110
  packageName: string | null;
@@ -126,17 +145,34 @@ export declare function precheckCatalogImport(db: KernelSchemaDb, name: string,
126
145
  }>;
127
146
  /**
128
147
  * Writes a catalog version in the caller's transaction (`db` is its handle; the caller has
129
- * re-checked the enterprise admin and holds the name's {@link CatalogItemLock}): checks conflicts again (the same source; no version of
148
+ * re-checked the super admin and holds the name's {@link CatalogItemLock}): checks conflicts again (the same source; no version of
130
149
  * the release with the same content; `version` not taken meanwhile), creates the item when there is
131
150
  * none or adds the version (latest and display fields change only for a newer version, a version
132
151
  * equal but for build metadata being newer as the later import), and writes the version row (with
133
152
  * its content digest) and the `catalog.imported` audit. Returns the item id.
134
153
  */
135
- export declare function writeCatalogVersion(db: KernelSchemaDb, w: CatalogVersionWrite): Promise<string>;
154
+ export declare function writeCatalogVersion(db: KernelSchemaDb, w: CatalogVersionWrite): Promise<{
155
+ id: string;
156
+ created: boolean;
157
+ }>;
158
+ /**
159
+ * Records that `version` of the item was applied or confirmed (ruling P3-52), in the caller's
160
+ * transaction: from then on it may serve other orgs and the generic update. Idempotent.
161
+ */
162
+ export declare function markVersionApplied(db: KernelSchemaDb, itemId: string, version: string): Promise<void>;
163
+ /**
164
+ * Whether a version may serve other orgs, dependency resolution and the generic update (ruling
165
+ * P3-52): applied or confirmed, and never rejected, whoever owns the item now.
166
+ */
167
+ export declare function versionUsable(v: {
168
+ applied_at: Date | null;
169
+ rejected_at: Date | null;
170
+ }): boolean;
136
171
  /**
137
172
  * An extension name belongs to the npm package that first installed it (`extension_name_owners`,
138
173
  * Ruling P3): when another package owns it, the import is refused right away with
139
- * `extension.name_conflict` (the same code as at install), instead of failing only at deploy time.
174
+ * `extension.name_conflict` (the same code as at install, details `[{ owner }]`: the owner of the
175
+ * package holding it), instead of failing only at deploy time.
140
176
  */
141
177
  export declare function assertPluginNameOwner(db: KernelSchemaDb, name: string, packageName: string | null): Promise<void>;
142
178
  /** A catalog version as {@link marketplaceLatest} compares it with its marketplace entries. */
@@ -151,8 +187,10 @@ export interface MarketplaceStatus {
151
187
  contentChanged: boolean;
152
188
  }
153
189
  /**
154
- * For each marketplace-imported item, its marketplace (when enabled): the highest compatible
155
- * version listed, and whether a compatible entry's content changed at an imported version.
190
+ * For each marketplace-imported item, its marketplace (when enabled): the version to update to
191
+ * (the highest compatible, importable, non-deprecated stable version listed, a prerelease only
192
+ * when no such stable version exists, as the market rows fold them), and whether a compatible,
193
+ * non-deprecated entry's content changed at an imported version.
156
194
  */
157
195
  export declare function marketplaceLatest(db: KernelSchemaDb, config: KernelConfig, items: {
158
196
  id: string;
@@ -168,6 +206,60 @@ export declare function countInstalls(db: KernelSchemaDb, items: {
168
206
  version: string;
169
207
  extension_sha256: string | null;
170
208
  }[]>): Promise<Map<string, number>>;
209
+ /**
210
+ * Every id is a live org (`validation_failed` naming the unknown ones otherwise): the orgs of a
211
+ * `named` scope.
212
+ */
213
+ export declare function assertOrgsExist(db: KernelSchemaDb, orgs: readonly string[]): Promise<void>;
214
+ /** The scope facts of an item's admin view (see {@link CatalogItemView}). */
215
+ export interface ItemScopeFacts {
216
+ scopeOrgs: string[];
217
+ enabledOrgs: number;
218
+ /** Orgs whose admin switched an `all` item off (0 for other scopes and builtin items). */
219
+ offCount: number;
220
+ pending: boolean;
221
+ /** The digest `confirm` takes (null unless pending and readable). */
222
+ permissionsHash: string | null;
223
+ /** The platform, or the org that owns the item (ruling P3-1). */
224
+ owner: Owner;
225
+ }
226
+ /** The facts of a view that shows none of the scope facts, only the item's owner. */
227
+ export declare function ownerOnlyFacts(owner: Owner): ItemScopeFacts;
228
+ /** What an item with an extension needs confirming (see {@link itemConfirmations}). */
229
+ export type ItemConfirmations = ReadonlyMap<string, {
230
+ pending: boolean;
231
+ permissionsHash: string | null;
232
+ }>;
233
+ /**
234
+ * Per item id: is its extension waiting for a person's confirmation (pending) and the permission
235
+ * digest to confirm. Pending when the extension is not installed on the deployment, when the
236
+ * installed version's permission set is not covered by the stored snapshot, or (a builtin item)
237
+ * when the snapshot is the bootstrap step's, never confirmed by a person. Items whose latest
238
+ * version has no extension are never pending.
239
+ */
240
+ export declare function itemConfirmations(admin: ExtensionAdmin, items: {
241
+ id: string;
242
+ name: string;
243
+ builtin: boolean;
244
+ latest_version: string;
245
+ owner_org_id: string | null;
246
+ pending_version: string | null;
247
+ }[], versions: ReadonlyMap<string, {
248
+ version: string;
249
+ extension_sha256: string | null;
250
+ }[]>): Promise<ItemConfirmations>;
251
+ /**
252
+ * Per item: the orgs of its `named` list, the orgs it is on in (a live plugin install; every org for
253
+ * a builtin item) and whether it is pending (`confirmations`, see {@link itemConfirmations}).
254
+ */
255
+ export declare function itemScopeFacts(db: KernelSchemaDb, items: {
256
+ id: string;
257
+ name: string;
258
+ scope: PluginScope;
259
+ builtin: boolean;
260
+ latest_version: string;
261
+ owner_org_id: string | null;
262
+ }[], confirmations: ItemConfirmations): Promise<Map<string, ItemScopeFacts>>;
171
263
  export declare function itemView(i: {
172
264
  id: string;
173
265
  name: string;
@@ -175,12 +267,24 @@ export declare function itemView(i: {
175
267
  display_name: LocalizedName | null;
176
268
  description: string;
177
269
  policy: CatalogPolicy;
270
+ scope: PluginScope;
271
+ builtin: boolean;
272
+ disabled: boolean;
273
+ shown_to_others: boolean;
178
274
  latest_version: string;
179
275
  marketplace_id?: string | null;
180
276
  updated_at: Date;
277
+ shareable: boolean;
278
+ awaiting_confirmation: boolean;
279
+ pending_version: string | null;
181
280
  }, versions: {
182
281
  version: string;
183
282
  source: string;
184
283
  imported_at?: Date;
185
- }[], installs?: number, marketplace?: MarketplaceStatus): CatalogItemView;
284
+ /** The version's plugin.json (counted for `componentCounts`; absent: nothing counted). */
285
+ manifest?: unknown;
286
+ source_format?: SourceFormat;
287
+ }[], installs?: number, marketplace?: MarketplaceStatus, facts?: ItemScopeFacts): CatalogItemView;
288
+ /** The components a version's plugin.json brings, by kind (none without a manifest). */
289
+ export declare function componentCountsOf(m: PluginManifest | undefined): ComponentCounts;
186
290
  export {};
@@ -1,10 +1,14 @@
1
+ import { pluginDescription } from "@capybara-hq/plugin-sdk";
1
2
  import { sql } from "kysely";
3
+ import semver from "semver";
2
4
  import { ApiError } from "../errors.js";
3
5
  import { enabledExtensionsByOrg } from "../extensions/enabled.js";
6
+ import { blockingKeys } from "../extensions/permission-set.js";
4
7
  import { audit } from "../identity/audit.js";
5
8
  import { endpointCredentialIssues } from "../tools/endpoint.js";
6
9
  import { gitLocationIdentity } from "./git-source.js";
7
- import { entryCompatible, entryContentChanged, sourceEffective, } from "./marketplaces.service.js";
10
+ import { entryCompatible, entryContentChanged, entryDeprecated, sourceEffective, unimportable, } from "./marketplaces.service.js";
11
+ import { ownerOf, ownersOf, PLATFORM_OWNER, packageOwner, pendingDigest, } from "./ownership.js";
8
12
  import { schemaHasPath } from "./schema-path.js";
9
13
  import { compareVersions, newestFirst, sameRelease, withBuild } from "./versions.js";
10
14
  /**
@@ -121,6 +125,33 @@ async function itemVersions(db, itemId) {
121
125
  .where("item_id", "=", itemId)
122
126
  .execute();
123
127
  }
128
+ /**
129
+ * An org's own version imported but not applied (pre-flight F4, ruling P3-12): the live item named
130
+ * `name` owned by `ownerOrgId` (same package) has a version of the release of `p.version` with the
131
+ * same content digest and no extension, other than the platform's version. Uploading it again
132
+ * retries its update instead of `catalog.version_exists`. undefined otherwise.
133
+ */
134
+ export async function unappliedOwnVersion(db, name, ownerOrgId, p) {
135
+ const item = await db
136
+ .selectFrom("catalog_items")
137
+ .select(["id", "package_name", "platform_synced_version"])
138
+ .where("name", "=", name)
139
+ .where("deleted_at", "is", null)
140
+ .where("owner_org_id", "=", ownerOrgId)
141
+ .executeTakeFirst();
142
+ if (!item || item.package_name !== p.packageName)
143
+ return undefined;
144
+ const rows = await db
145
+ .selectFrom("catalog_item_versions")
146
+ .select(["version", "content_digest", "extension_sha256"])
147
+ .where("item_id", "=", item.id)
148
+ .where("content_digest", "=", p.contentDigest)
149
+ .execute();
150
+ const same = rows.find((v) => sameRelease(v.version, p.version) &&
151
+ v.extension_sha256 === null &&
152
+ v.version !== item.platform_synced_version);
153
+ return same && { itemId: item.id, version: same.version };
154
+ }
124
155
  /** `atConfirm`: found under the lock at confirm (another import committed after the review). */
125
156
  const versionExists = (version, sameContent, atConfirm = false) => new ApiError("catalog.version_exists", (sameContent
126
157
  ? `Version ${version} of this catalog item is already imported with the same content`
@@ -180,7 +211,7 @@ export async function precheckCatalogImport(db, name, p) {
180
211
  }
181
212
  /**
182
213
  * Writes a catalog version in the caller's transaction (`db` is its handle; the caller has
183
- * re-checked the enterprise admin and holds the name's {@link CatalogItemLock}): checks conflicts again (the same source; no version of
214
+ * re-checked the super admin and holds the name's {@link CatalogItemLock}): checks conflicts again (the same source; no version of
184
215
  * the release with the same content; `version` not taken meanwhile), creates the item when there is
185
216
  * none or adds the version (latest and display fields change only for a newer version, a version
186
217
  * equal but for build metadata being newer as the later import), and writes the version row (with
@@ -191,6 +222,7 @@ export async function writeCatalogVersion(db, w) {
191
222
  const { name, version, listing } = w;
192
223
  const live = await liveItem(t, name);
193
224
  let id;
225
+ const created = live === undefined;
194
226
  if (live) {
195
227
  id = live.id;
196
228
  assertSameSource(live, w.packageName, sourceIdentity(w.source.detail, w.marketplaceId));
@@ -203,7 +235,7 @@ export async function writeCatalogVersion(db, w) {
203
235
  }, true);
204
236
  if (existing.some((v) => v.version === version))
205
237
  throw versionExists(version, false, true);
206
- const newer = compareVersions(version, live.latest_version) >= 0;
238
+ const newer = w.keepLatest !== true && compareVersions(version, live.latest_version) >= 0;
207
239
  await t
208
240
  .updateTable("catalog_items")
209
241
  .set({
@@ -256,6 +288,8 @@ export async function writeCatalogVersion(db, w) {
256
288
  translation: w.translation != null ? JSON.stringify(w.translation) : null,
257
289
  license_text: w.licenseText ?? null,
258
290
  license_truncated: w.licenseTruncated === true,
291
+ // an org's version is usable only once applied or confirmed (ruling P3-52)
292
+ ...(w.keepLatest === true && { applied_at: null }),
259
293
  })
260
294
  .execute();
261
295
  await audit(t, {
@@ -275,12 +309,33 @@ export async function writeCatalogVersion(db, w) {
275
309
  ...w.auditDetail,
276
310
  },
277
311
  });
278
- return id;
312
+ return { id, created };
313
+ }
314
+ /**
315
+ * Records that `version` of the item was applied or confirmed (ruling P3-52), in the caller's
316
+ * transaction: from then on it may serve other orgs and the generic update. Idempotent.
317
+ */
318
+ export async function markVersionApplied(db, itemId, version) {
319
+ await db
320
+ .updateTable("catalog_item_versions")
321
+ .set({ applied_at: sql `now()` })
322
+ .where("item_id", "=", itemId)
323
+ .where("version", "=", version)
324
+ .where("applied_at", "is", null)
325
+ .execute();
326
+ }
327
+ /**
328
+ * Whether a version may serve other orgs, dependency resolution and the generic update (ruling
329
+ * P3-52): applied or confirmed, and never rejected, whoever owns the item now.
330
+ */
331
+ export function versionUsable(v) {
332
+ return v.applied_at !== null && v.rejected_at === null;
279
333
  }
280
334
  /**
281
335
  * An extension name belongs to the npm package that first installed it (`extension_name_owners`,
282
336
  * Ruling P3): when another package owns it, the import is refused right away with
283
- * `extension.name_conflict` (the same code as at install), instead of failing only at deploy time.
337
+ * `extension.name_conflict` (the same code as at install, details `[{ owner }]`: the owner of the
338
+ * package holding it), instead of failing only at deploy time.
284
339
  */
285
340
  export async function assertPluginNameOwner(db, name, packageName) {
286
341
  const owner = await db
@@ -289,7 +344,9 @@ export async function assertPluginNameOwner(db, name, packageName) {
289
344
  .where("name", "=", name)
290
345
  .executeTakeFirst();
291
346
  if (owner && owner.package_name !== packageName) {
292
- throw new ApiError("extension.name_conflict", `Extension name ${name} belongs to package ${owner.package_name}; ${packageLabel(packageName)} cannot use it`);
347
+ throw new ApiError("extension.name_conflict", `Extension name ${name} belongs to package ${owner.package_name}; ${packageLabel(packageName)} cannot use it`,
348
+ // who holds it (package -> item -> owner, ruling P3-14)
349
+ [{ owner: await packageOwner(db, owner.package_name, name) }]);
293
350
  }
294
351
  }
295
352
  /** "package <name>", or what a plugin without package.json is called in messages. */
@@ -310,8 +367,10 @@ function assertSameSource(item, packageName, source) {
310
367
  }
311
368
  }
312
369
  /**
313
- * For each marketplace-imported item, its marketplace (when enabled): the highest compatible
314
- * version listed, and whether a compatible entry's content changed at an imported version.
370
+ * For each marketplace-imported item, its marketplace (when enabled): the version to update to
371
+ * (the highest compatible, importable, non-deprecated stable version listed, a prerelease only
372
+ * when no such stable version exists, as the market rows fold them), and whether a compatible,
373
+ * non-deprecated entry's content changed at an imported version.
315
374
  */
316
375
  export async function marketplaceLatest(db, config, items, versions) {
317
376
  const out = new Map();
@@ -331,6 +390,7 @@ export async function marketplaceLatest(db, config, items, versions) {
331
390
  "s.builtin",
332
391
  "s.enabled",
333
392
  "s.url",
393
+ "s.form",
334
394
  "s.last_commit",
335
395
  ])
336
396
  .where("e.source_id", "in", [...new Set(sourced.map((i) => i.marketplace_id))])
@@ -340,11 +400,17 @@ export async function marketplaceLatest(db, config, items, versions) {
340
400
  const listed = rows.filter((r) => r.source_id === i.marketplace_id &&
341
401
  r.name === i.name &&
342
402
  sourceEffective(r, config) &&
343
- entryCompatible(r.entry));
344
- const [best] = listed
345
- .filter((r) => r.version !== "")
403
+ entryCompatible(r.entry) &&
404
+ // a deprecated version is never the one to update to, nor content to import again
405
+ !entryDeprecated(r.entry));
406
+ // As the market rows fold them: the newest importable stable version, a prerelease only when
407
+ // no stable one can be imported
408
+ const importable = listed
409
+ .filter((r) => r.version !== "" &&
410
+ unimportable(r.entry, r.form, config) === undefined)
346
411
  .map((r) => r.version)
347
412
  .sort(newestFirst);
413
+ const best = importable.find((v) => semver.prerelease(v) === null) ?? importable[0];
348
414
  const recorded = versions.get(i.id) ?? [];
349
415
  out.set(i.id, {
350
416
  latest: best ?? null,
@@ -386,25 +452,225 @@ export async function countInstalls(db, items, versions) {
386
452
  }
387
453
  return new Map([...orgs].map(([id, set]) => [id, set.size]));
388
454
  }
389
- export function itemView(i, versions, installs = 0, marketplace = { latest: null, contentChanged: false }) {
455
+ /**
456
+ * Every id is a live org (`validation_failed` naming the unknown ones otherwise): the orgs of a
457
+ * `named` scope.
458
+ */
459
+ export async function assertOrgsExist(db, orgs) {
460
+ if (orgs.length === 0)
461
+ return;
462
+ const found = await db
463
+ .selectFrom("orgs")
464
+ .select("id")
465
+ .where("id", "in", [...orgs])
466
+ .where("deleted_at", "is", null)
467
+ .execute();
468
+ const known = new Set(found.map((o) => o.id));
469
+ const unknown = orgs.filter((o) => !known.has(o));
470
+ if (unknown.length > 0) {
471
+ throw new ApiError("validation_failed", `orgs: unknown organizations ${unknown.join(", ")}`, [
472
+ { path: "orgs", message: `unknown organizations: ${unknown.join(", ")}` },
473
+ ]);
474
+ }
475
+ }
476
+ /** The facts of a view that shows none of the scope facts, only the item's owner. */
477
+ export function ownerOnlyFacts(owner) {
478
+ return {
479
+ scopeOrgs: [],
480
+ enabledOrgs: 0,
481
+ offCount: 0,
482
+ pending: false,
483
+ permissionsHash: null,
484
+ owner,
485
+ };
486
+ }
487
+ const NO_FACTS = ownerOnlyFacts(PLATFORM_OWNER);
488
+ /**
489
+ * Per item id: is its extension waiting for a person's confirmation (pending) and the permission
490
+ * digest to confirm. Pending when the extension is not installed on the deployment, when the
491
+ * installed version's permission set is not covered by the stored snapshot, or (a builtin item)
492
+ * when the snapshot is the bootstrap step's, never confirmed by a person. Items whose latest
493
+ * version has no extension are never pending.
494
+ */
495
+ export async function itemConfirmations(admin, items, versions) {
496
+ const out = new Map();
497
+ // An org-owned item waits only while an upload of it does (rulings P3-9, P3-10): the digest of
498
+ // that version's package (P3-11); nothing else of an org's item is the super admin's to confirm
499
+ for (const i of items) {
500
+ if (i.owner_org_id === null)
501
+ continue;
502
+ const sha = i.pending_version === null
503
+ ? null
504
+ : ((versions.get(i.id) ?? []).find((v) => v.version === i.pending_version)
505
+ ?.extension_sha256 ?? null);
506
+ if (sha === null) {
507
+ out.set(i.id, { pending: false, permissionsHash: null });
508
+ continue;
509
+ }
510
+ const hash = await admin.packageReviewHash(sha);
511
+ out.set(i.id, {
512
+ pending: true,
513
+ permissionsHash: hash === null ? null : pendingDigest(sha, hash),
514
+ });
515
+ }
516
+ const withExtension = items.flatMap((i) => {
517
+ if (i.owner_org_id !== null)
518
+ return [];
519
+ const sha = (versions.get(i.id) ?? []).find((v) => v.version === i.latest_version)?.extension_sha256 ??
520
+ null;
521
+ return sha === null ? [] : [{ item: i, sha }];
522
+ });
523
+ if (withExtension.length === 0)
524
+ return out;
525
+ // only these items' extensions: reading every installed package would also log each one that
526
+ // cannot be read right now (the bootstrap step confirms before the object store is loaded)
527
+ const names = new Set(withExtension.map((w) => w.item.name));
528
+ const installed = new Map((await admin.list(names)).map((v) => [v.name, v]));
529
+ for (const { item, sha } of withExtension) {
530
+ const v = installed.get(item.name);
531
+ if (!v) {
532
+ out.set(item.id, { pending: true, permissionsHash: await admin.packageReviewHash(sha) });
533
+ continue;
534
+ }
535
+ const pending = v.snapshot === null ||
536
+ blockingKeys(v.added).length > 0 ||
537
+ (item.builtin && v.snapshot.source === "bootstrap");
538
+ out.set(item.id, {
539
+ pending,
540
+ permissionsHash: pending && v.error === undefined ? v.reviewHash : null,
541
+ });
542
+ }
543
+ return out;
544
+ }
545
+ const LIVE_INSTALL = ["installing", "installed", "upgrading"];
546
+ /**
547
+ * Per item: the orgs of its `named` list, the orgs it is on in (a live plugin install; every org for
548
+ * a builtin item) and whether it is pending (`confirmations`, see {@link itemConfirmations}).
549
+ */
550
+ export async function itemScopeFacts(db, items, confirmations) {
551
+ const owners = await ownersOf(db, items.flatMap((i) => (i.owner_org_id === null ? [] : [i.owner_org_id])));
552
+ const out = new Map(items.map((i) => [
553
+ i.id,
554
+ {
555
+ scopeOrgs: [],
556
+ enabledOrgs: 0,
557
+ offCount: 0,
558
+ pending: confirmations.get(i.id)?.pending ?? false,
559
+ permissionsHash: confirmations.get(i.id)?.permissionsHash ?? null,
560
+ owner: ownerOf(i.owner_org_id, owners),
561
+ },
562
+ ]));
563
+ if (items.length === 0)
564
+ return out;
565
+ const ids = items.map((i) => i.id);
566
+ // one after the other: `db` may be a transaction's single connection
567
+ const listed = await db
568
+ .selectFrom("catalog_item_scope_orgs")
569
+ .select(["item_id", "org_id"])
570
+ .where("item_id", "in", ids)
571
+ .orderBy("org_id")
572
+ .execute();
573
+ for (const r of listed)
574
+ out.get(r.item_id)?.scopeOrgs.push(r.org_id);
575
+ const live = await db
576
+ .selectFrom("plugin_installs as a")
577
+ .innerJoin("orgs as o", "o.id", "a.org_id")
578
+ .select(["a.item_id", (eb) => eb.fn.count("a.org_id").distinct().as("n")])
579
+ .where("a.item_id", "in", ids)
580
+ .where("a.status", "in", [...LIVE_INSTALL])
581
+ .where("o.deleted_at", "is", null)
582
+ .groupBy("a.item_id")
583
+ .execute();
584
+ for (const r of live) {
585
+ const f = out.get(r.item_id);
586
+ if (f)
587
+ f.enabledOrgs = Number(r.n);
588
+ }
589
+ // the orgs that switched an `all` item off (layering spec §4): one grouped count for the page
590
+ const everywhere = items.filter((i) => i.scope === "all" && !i.builtin).map((i) => i.id);
591
+ if (everywhere.length > 0) {
592
+ const off = await db
593
+ .selectFrom("catalog_item_org_switches as s")
594
+ .innerJoin("orgs as o", "o.id", "s.org_id")
595
+ .select(["s.item_id", (eb) => eb.fn.countAll().as("n")])
596
+ .where("s.item_id", "in", everywhere)
597
+ .where("s.enabled", "=", false)
598
+ .where("o.deleted_at", "is", null)
599
+ .groupBy("s.item_id")
600
+ .execute();
601
+ for (const r of off) {
602
+ const f = out.get(r.item_id);
603
+ if (f)
604
+ f.offCount = Number(r.n);
605
+ }
606
+ }
607
+ if (items.some((i) => i.builtin)) {
608
+ const orgs = await db
609
+ .selectFrom("orgs")
610
+ .select((eb) => eb.fn.countAll().as("n"))
611
+ .where("deleted_at", "is", null)
612
+ .executeTakeFirstOrThrow();
613
+ for (const i of items) {
614
+ const f = out.get(i.id);
615
+ if (i.builtin && f)
616
+ f.enabledOrgs = Number(orgs.n);
617
+ }
618
+ }
619
+ return out;
620
+ }
621
+ /** The `zh` text of a stored manifest's description; null without one (or an unreadable manifest). */
622
+ function descriptionZhOf(manifest) {
623
+ const d = manifest?.description;
624
+ if (typeof d !== "object" || d === null)
625
+ return null;
626
+ const zh = pluginDescription(d).zh;
627
+ return typeof zh === "string" ? zh : null;
628
+ }
629
+ export function itemView(i, versions, installs = 0, marketplace = { latest: null, contentChanged: false }, facts = NO_FACTS) {
390
630
  const sorted = [...versions].sort((a, b) => newestFirst({ version: a.version, importedAt: a.imported_at ?? null }, { version: b.version, importedAt: b.imported_at ?? null }));
391
631
  const top = sorted[0]?.version ?? i.latest_version;
392
632
  const latestMarketplaceVersion = marketplace.latest;
633
+ const current = versions.find((v) => v.version === i.latest_version);
393
634
  return {
394
635
  id: i.id,
395
636
  name: i.name,
396
637
  publisher: i.publisher,
397
638
  displayName: i.display_name,
398
639
  description: i.description,
640
+ descriptionZh: descriptionZhOf(current?.manifest),
399
641
  policy: i.policy,
642
+ scope: i.builtin ? "all" : i.scope,
643
+ scopeOrgs: [...facts.scopeOrgs],
644
+ builtin: i.builtin,
645
+ disabled: i.disabled,
646
+ shownToOthers: i.shown_to_others,
647
+ owner: facts.owner,
648
+ shareable: i.shareable,
649
+ awaitingConfirmation: i.awaiting_confirmation,
650
+ pendingVersion: i.pending_version,
651
+ enabledOrgs: facts.enabledOrgs,
652
+ offCount: facts.offCount,
653
+ pending: facts.pending,
654
+ permissionsHash: facts.permissionsHash,
400
655
  latestVersion: i.latest_version,
401
656
  versions: sorted.map((v) => v.version),
402
657
  installs,
403
- source: versions.find((v) => v.version === i.latest_version)?.source ?? "file",
658
+ source: current?.source ?? "file",
404
659
  marketplaceId: i.marketplace_id ?? null,
405
660
  latestMarketplaceVersion,
406
661
  newerInMarketplace: latestMarketplaceVersion !== null && compareVersions(latestMarketplaceVersion, top) > 0,
407
662
  contentChanged: marketplace.contentChanged,
663
+ componentCounts: componentCountsOf(current?.manifest),
664
+ sourceFormat: current?.source_format ?? "capybara",
408
665
  updatedAt: i.updated_at.toISOString(),
409
666
  };
410
667
  }
668
+ /** The components a version's plugin.json brings, by kind (none without a manifest). */
669
+ export function componentCountsOf(m) {
670
+ return {
671
+ extension: m?.extension === undefined ? 0 : 1,
672
+ skills: m?.skills?.length ?? 0,
673
+ connectorTemplates: m?.connectorTemplates?.length ?? 0,
674
+ agentTemplates: m?.agents?.length ?? 0,
675
+ };
676
+ }