@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,582 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
8
+ return function (target, key) { decorator(target, key, paramIndex); }
9
+ };
10
+ // The migration of what exists to platform components (plugin scope phase 2, Task 5; spec §6
11
+ // "Migration of what exists" and §13.5): the platform rows of every catalog item that has none,
12
+ // org copies of plugin skills and agent templates linked to them (ruling B2), clashing org skills
13
+ // renamed, and connectors linked to their platform connector template (ruling E2). Each step only
14
+ // touches rows that still need it, so the job runs at every worker start (ruling P2-2: it also heals
15
+ // an item whose sync after its import failed) and once a day, and a run with nothing to do only
16
+ // reads.
17
+ import { randomUUID } from "node:crypto";
18
+ import { isSkillName } from "@capybara-hq/plugin-sdk";
19
+ import { Inject, Injectable } from "@nestjs/common";
20
+ import { sql } from "kysely";
21
+ import { platformTemplatesOn } from "../agents/templates.js";
22
+ import { audit } from "../identity/audit.js";
23
+ import { KernelConfigService } from "../infra/config/kernel-config.service.js";
24
+ import { KernelDb } from "../infra/database/kernel-db.js";
25
+ import { TransactionHost } from "../infra/database/transaction-host.js";
26
+ import { Transactional } from "../infra/database/transactional.decorator.js";
27
+ import { LockService } from "../infra/lock/lock.service.js";
28
+ import { LockedInterval } from "../infra/schedule/locked-interval.js";
29
+ import { KERNEL_LOGGER } from "../infra/tokens.js";
30
+ import { OrgLock } from "../orgs/org-lock.js";
31
+ import { platformSkillsOn } from "../skills/usable.js";
32
+ import { canonicalJson } from "../tools/canonical-json.js";
33
+ import { skillFilesDigest } from "./catalog-content.js";
34
+ import { PlatformComponents } from "./platform-components.js";
35
+ import { compareVersions } from "./versions.js";
36
+ /** The job's name (`@LockedInterval`, run lock `cron:platform-components-migrate`). */
37
+ export const PLATFORM_MIGRATION_JOB = "platform-components-migrate";
38
+ /** Besides every worker start, the job runs once a day (a heal: normally nothing to do). */
39
+ const PERIOD_MS = 24 * 3600_000;
40
+ /** Finished runs are kept this long (the first one always: it marks the migration as done). */
41
+ const RUNS_KEPT_MS = 30 * 24 * 3600_000;
42
+ /** The run lock's lifetime without renewal (renewed while a run lasts). */
43
+ const LOCK_TTL_MS = 60_000;
44
+ /** Plugin install statuses of a plugin that is on in the org (phase 1, org catalog state). */
45
+ const LIVE_INSTALL = ["installing", "installed", "upgrading"];
46
+ /** The audit action and inbox notice of a renamed skill. */
47
+ export const SKILL_RENAMED = "skill_renamed";
48
+ const emptyStats = () => ({
49
+ itemsSynced: [],
50
+ itemsFailed: [],
51
+ skillsLinked: 0,
52
+ skillsPinned: 0,
53
+ skillsRenamed: 0,
54
+ templatesLinked: 0,
55
+ templatesPinned: 0,
56
+ connectorsLinked: 0,
57
+ });
58
+ /**
59
+ * The name a renamed skill gets: `<name>-org`, then `-org-2`, `-org-3`, … (the base shortened
60
+ * when the result would be longer than a skill name may be), the first one not in `taken`.
61
+ */
62
+ export function renamedSkillName(name, taken) {
63
+ for (let n = 1;; n++) {
64
+ const suffix = n === 1 ? "-org" : `-org-${n}`;
65
+ let base = name;
66
+ while (base !== "" && !isSkillName(`${base}${suffix}`)) {
67
+ base = base.slice(0, -1).replace(/-+$/, "");
68
+ }
69
+ const candidate = `${base === "" ? "skill" : base}${suffix}`;
70
+ if (!taken.has(candidate))
71
+ return candidate;
72
+ }
73
+ }
74
+ /**
75
+ * The platform components migration (spec §6, §13.5), a worker job (`platform-components-migrate`,
76
+ * `@LockedInterval` with `runOnStart`: once across replicas at every worker start, then daily).
77
+ * Steps, each on the rows that still need it:
78
+ * 1. every live catalog item never synced (`platform_synced_version` null) gets its platform rows
79
+ * (`syncFromVersion`, which records the version) at the highest
80
+ * version installed in an org (spec §6: "the plugin's version becomes the highest installed
81
+ * one"), else its latest version;
82
+ * 2. an org skill copy with plugin provenance (on the skill and its current version) links to the
83
+ * platform skill of its plugin and name; it is pinned to its own current version when its files
84
+ * differ from the platform version's. A copy whose platform skill is not on in its org is left
85
+ * unlinked (it keeps serving what it served) until a later run finds it on: a linked copy,
86
+ * pinned or not, follows its platform skill's availability (ruling P2-18);
87
+ * 3. one-shot (spec §5 rule 10, ruling P2-5: nothing is renamed outside the migration): only while
88
+ * no run has finished (the first run's own execution), an org skill of the org's own (no
89
+ * provenance) whose name a platform skill on in its org has stays the org's: it is renamed (`<name>-org`, `-org-2`, …), the org admins get an inbox notice
90
+ * (`skill_renamed`) and that platform skill is switched off in the org (a switch the org already
91
+ * has is kept). Agents select skills by id, so they keep it; the name changes in new runs. Once a
92
+ * run has finished, a clash is only logged as a warning and left alone (the org's skill wins);
93
+ * 4. an org agent template links to the platform template of its plugin and name, pinned like
94
+ * skills (definitions compared as canonical JSON). Templates are never renamed: an org template
95
+ * always has its plugin's type, which is the platform template's;
96
+ * 5. a connector made from a connector template (the install ledger's `template_id`) links to that
97
+ * platform connector template (ruling E2).
98
+ * Plugin switches exist since phase 1 and new platform rows follow the plugin's scope, so nothing
99
+ * else is written. Writes run per org under its row lock and re-check each row; nothing is deleted
100
+ * or overwritten except the renamed skill's name. Each run is recorded in `platform_migration_runs`
101
+ * (rows older than 30 days are pruned, except the first finished run: it marks the renames done).
102
+ */
103
+ let PlatformMigration = class PlatformMigration {
104
+ kdb;
105
+ orgLock;
106
+ platform;
107
+ txHost;
108
+ config;
109
+ lockService;
110
+ log;
111
+ constructor(kdb, orgLock, platform, txHost, config, lockService, log) {
112
+ this.kdb = kdb;
113
+ this.orgLock = orgLock;
114
+ this.platform = platform;
115
+ this.txHost = txHost;
116
+ this.config = config;
117
+ this.lockService = lockService;
118
+ this.log = log;
119
+ }
120
+ get db() {
121
+ return this.kdb.db;
122
+ }
123
+ /** The scheduled run (see the class). */
124
+ async migrate(signal) {
125
+ await this.runOnce(signal);
126
+ }
127
+ /**
128
+ * One run of every step; returns what it changed. `signal` (the stop, or a lost run lock) is
129
+ * read between items and orgs: an aborted run stops there and its row is deleted (every step is
130
+ * idempotent, so the next run carries on; an unfinished run never counts as the first one).
131
+ */
132
+ async runOnce(signal) {
133
+ const runId = randomUUID();
134
+ await this.db.insertInto("platform_migration_runs").values({ id: runId }).execute();
135
+ const first = await this.db
136
+ .selectFrom("platform_migration_runs")
137
+ .select("started_at")
138
+ .where("finished_at", "is not", null)
139
+ .orderBy("started_at")
140
+ .limit(1)
141
+ .executeTakeFirst();
142
+ const stats = emptyStats();
143
+ const steps = [
144
+ () => this.syncItems(stats, signal),
145
+ () => this.linkSkills(stats, signal),
146
+ () => this.renameClashes(stats, first === undefined, signal),
147
+ () => this.linkTemplates(stats, signal),
148
+ () => this.linkConnectors(stats),
149
+ ];
150
+ for (const step of steps) {
151
+ if (signal?.aborted) {
152
+ await this.db.deleteFrom("platform_migration_runs").where("id", "=", runId).execute();
153
+ this.log.info("platform components migration stopped early", { runId, ...stats });
154
+ return stats;
155
+ }
156
+ await step();
157
+ }
158
+ await this.db
159
+ .updateTable("platform_migration_runs")
160
+ .set({ finished_at: new Date(), stats: JSON.stringify(stats) })
161
+ .where("id", "=", runId)
162
+ .execute();
163
+ await this.pruneRuns(first?.started_at);
164
+ const changed = stats.itemsSynced.length +
165
+ stats.skillsLinked +
166
+ stats.skillsRenamed +
167
+ stats.templatesLinked +
168
+ stats.connectorsLinked >
169
+ 0;
170
+ if (changed || stats.itemsFailed.length > 0) {
171
+ this.log.info("platform components migrated", { runId, ...stats });
172
+ }
173
+ return stats;
174
+ }
175
+ /** Deletes finished runs older than {@link RUNS_KEPT_MS}, never the first one (`first`). */
176
+ async pruneRuns(first) {
177
+ let q = this.db
178
+ .deleteFrom("platform_migration_runs")
179
+ .where("finished_at", "is not", null)
180
+ .where("started_at", "<", new Date(Date.now() - RUNS_KEPT_MS));
181
+ if (first !== undefined)
182
+ q = q.where("started_at", ">", first);
183
+ await q.execute();
184
+ }
185
+ /**
186
+ * Step 1: the live catalog items whose platform components were never written
187
+ * (`platform_synced_version` null; `syncFromVersion` sets it). An item whose components were
188
+ * removed since is not synced again.
189
+ */
190
+ async syncItems(stats, signal) {
191
+ const items = await this.db
192
+ .selectFrom("catalog_items as i")
193
+ .select(["i.id", "i.name", "i.latest_version"])
194
+ .where("i.deleted_at", "is", null)
195
+ .where("i.platform_synced_version", "is", null)
196
+ // an org upload waiting for the super admin gets its components at the confirmation (P3-9)
197
+ .where("i.awaiting_confirmation", "=", false)
198
+ .orderBy("i.name")
199
+ .execute();
200
+ for (const item of items) {
201
+ if (signal?.aborted)
202
+ return;
203
+ const version = await this.platformVersion(item.id, item.latest_version);
204
+ try {
205
+ const r = await this.platform.syncFromVersion(item.id, version, { initial: false });
206
+ if (r.skills.length + r.agentTemplates.length + r.connectorTemplates.length > 0) {
207
+ stats.itemsSynced.push(`${item.name}@${version}`);
208
+ }
209
+ }
210
+ catch (err) {
211
+ stats.itemsFailed.push(`${item.name}@${version}`);
212
+ this.log.warn("platform components of a catalog item not written", {
213
+ itemId: item.id,
214
+ plugin: item.name,
215
+ version,
216
+ err,
217
+ });
218
+ }
219
+ }
220
+ }
221
+ /** The highest version of the item installed in an org (and still stored), else `latest`. */
222
+ async platformVersion(itemId, latest) {
223
+ const rows = await this.db
224
+ .selectFrom("plugin_installs as a")
225
+ .innerJoin("catalog_item_versions as v", (j) => j.onRef("v.item_id", "=", "a.item_id").onRef("v.version", "=", "a.version"))
226
+ .innerJoin("orgs as o", "o.id", "a.org_id")
227
+ .select("a.version")
228
+ .distinct()
229
+ .where("a.item_id", "=", itemId)
230
+ .where("a.status", "in", [...LIVE_INSTALL])
231
+ .where("o.deleted_at", "is", null)
232
+ .execute();
233
+ const highest = rows
234
+ .map((r) => ({ version: r.version }))
235
+ .sort((a, b) => compareVersions(b, a))[0];
236
+ return highest?.version ?? latest;
237
+ }
238
+ /** Step 2: org skill copies with plugin provenance, not linked yet. */
239
+ async linkSkills(stats, signal) {
240
+ const rows = await this.db
241
+ .selectFrom("skills as s")
242
+ .innerJoin("skill_versions as v", (j) => j.onRef("v.skill_id", "=", "s.id").onRef("v.version", "=", "s.current_version"))
243
+ .innerJoin("catalog_items as c", "c.id", "s.catalog_item_id")
244
+ .innerJoin("platform_skills as p", (j) => j.onRef("p.plugin_name", "=", "c.name").onRef("p.name", "=", "s.name"))
245
+ .innerJoin("platform_skill_versions as pv", (j) => j.onRef("pv.skill_id", "=", "p.id").onRef("pv.version", "=", "p.current_version"))
246
+ .select([
247
+ "s.id",
248
+ "s.org_id",
249
+ "s.current_version",
250
+ "v.manifest",
251
+ "p.id as platform_id",
252
+ "pv.manifest as platform_manifest",
253
+ ])
254
+ .where("s.scope", "=", "org")
255
+ .where("s.deleted_at", "is", null)
256
+ .where("s.platform_skill_id", "is", null)
257
+ .whereRef("v.catalog_item_id", "=", "s.catalog_item_id")
258
+ .where("p.deleted_at", "is", null)
259
+ .orderBy("s.org_id")
260
+ .orderBy("s.id")
261
+ .execute();
262
+ for (const [orgId, list] of groupBy(rows, (r) => r.org_id)) {
263
+ if (signal?.aborted)
264
+ return;
265
+ const on = await platformSkillsOn(this.db, orgId, list.map((r) => r.platform_id));
266
+ // a copy whose platform skill is off in its org stays the org's own until it is on: a
267
+ // linked copy, pinned or not, follows its platform skill's availability (ruling P2-18)
268
+ const links = list
269
+ .filter((r) => on.has(r.platform_id))
270
+ .map((r) => ({
271
+ id: r.id,
272
+ version: r.current_version,
273
+ platformId: r.platform_id,
274
+ pin: skillFilesDigest(r.manifest.files) !== skillFilesDigest(r.platform_manifest.files),
275
+ }));
276
+ const done = await this.linkSkillsIn(orgId, links);
277
+ stats.skillsLinked += done.length;
278
+ stats.skillsPinned += done.filter((l) => l.pin).length;
279
+ }
280
+ }
281
+ /** Links `links` of one org under its row lock (each only while it is still as read). */
282
+ async linkSkillsIn(orgId, links) {
283
+ if (!(await this.orgLock.tryLock(orgId)))
284
+ return [];
285
+ const done = [];
286
+ for (const l of links) {
287
+ const r = await this.db
288
+ .updateTable("skills")
289
+ .set({ platform_skill_id: l.platformId, pinned_version: l.pin ? l.version : null })
290
+ .where("id", "=", l.id)
291
+ .where("org_id", "=", orgId)
292
+ .where("platform_skill_id", "is", null)
293
+ .where("current_version", "=", l.version)
294
+ .where("deleted_at", "is", null)
295
+ .executeTakeFirst();
296
+ if (r.numUpdatedRows > 0n)
297
+ done.push(l);
298
+ }
299
+ if (done.length > 0) {
300
+ await audit(this.db, {
301
+ orgId,
302
+ action: "skill.platform_linked",
303
+ detail: {
304
+ skills: done.map((l) => ({
305
+ id: l.id,
306
+ platformSkillId: l.platformId,
307
+ pinnedVersion: l.pin ? l.version : null,
308
+ })),
309
+ },
310
+ });
311
+ }
312
+ return done;
313
+ }
314
+ /**
315
+ * Step 3 (one-shot): org skills of the org's own whose name a platform skill on in their org has,
316
+ * renamed only in the first run (`rename`: no run has finished yet); later ones are only logged.
317
+ */
318
+ async renameClashes(stats, rename, signal) {
319
+ const rows = await this.db
320
+ .selectFrom("skills as s")
321
+ .innerJoin("skill_versions as v", (j) => j.onRef("v.skill_id", "=", "s.id").onRef("v.version", "=", "s.current_version"))
322
+ .innerJoin("platform_skills as p", "p.name", "s.name")
323
+ .select(["s.id", "s.org_id", "s.name", "p.id as platform_id", "p.plugin_name"])
324
+ .where("s.scope", "=", "org")
325
+ .where("s.deleted_at", "is", null)
326
+ .where("s.platform_skill_id", "is", null)
327
+ .where("s.catalog_item_id", "is", null)
328
+ .where("v.catalog_item_id", "is", null)
329
+ .where("p.deleted_at", "is", null)
330
+ .where("p.disabled", "=", false)
331
+ .orderBy("s.org_id")
332
+ .orderBy("s.id")
333
+ .orderBy("p.id")
334
+ .execute();
335
+ for (const [orgId, list] of groupBy(rows, (r) => r.org_id)) {
336
+ if (signal?.aborted)
337
+ return;
338
+ const on = await platformSkillsOn(this.db, orgId, list.map((r) => r.platform_id));
339
+ const clashes = [];
340
+ for (const [skillId, pairs] of groupBy(list.filter((r) => on.has(r.platform_id)), (r) => r.id)) {
341
+ const first = pairs[0];
342
+ if (!rename) {
343
+ this.log.warn("org skill shares its name with a platform skill; not renamed after the migration", {
344
+ orgId,
345
+ skillId,
346
+ name: first.name,
347
+ platformSkillIds: pairs.map((r) => r.platform_id),
348
+ });
349
+ continue;
350
+ }
351
+ clashes.push({
352
+ skillId,
353
+ name: pairs[0].name,
354
+ platform: pairs.map((r) => ({ id: r.platform_id, plugin: r.plugin_name })),
355
+ });
356
+ }
357
+ if (clashes.length > 0)
358
+ stats.skillsRenamed += await this.renameIn(orgId, clashes);
359
+ }
360
+ }
361
+ /**
362
+ * Renames the clashing skills of one org under its row lock (each only while it still has the
363
+ * name and no provenance), switches the clashing platform skills off in the org (unless the org
364
+ * has a switch for them already), and writes one inbox notice and one audit event per skill.
365
+ */
366
+ async renameIn(orgId, clashes) {
367
+ if (!(await this.orgLock.tryLock(orgId)))
368
+ return 0;
369
+ // Names the new one must avoid: the org's live skills, and every live platform skill (one the
370
+ // org cannot see yet may be switched on later)
371
+ const taken = new Set([
372
+ ...(await this.db
373
+ .selectFrom("skills")
374
+ .select("name")
375
+ .where("org_id", "=", orgId)
376
+ .where("scope", "=", "org")
377
+ .where("deleted_at", "is", null)
378
+ .execute()),
379
+ ...(await this.db
380
+ .selectFrom("platform_skills")
381
+ .select("name")
382
+ .where("deleted_at", "is", null)
383
+ .execute()),
384
+ ].map((r) => r.name));
385
+ let renamed = 0;
386
+ for (const c of clashes) {
387
+ const to = renamedSkillName(c.name, taken);
388
+ const r = await this.db
389
+ .updateTable("skills")
390
+ .set({ name: to, updated_at: sql `now()` })
391
+ .where("id", "=", c.skillId)
392
+ .where("org_id", "=", orgId)
393
+ .where("name", "=", c.name)
394
+ .where("platform_skill_id", "is", null)
395
+ .where("catalog_item_id", "is", null)
396
+ .where("deleted_at", "is", null)
397
+ .executeTakeFirst();
398
+ if (r.numUpdatedRows === 0n)
399
+ continue;
400
+ taken.add(to);
401
+ renamed++;
402
+ await this.db
403
+ .insertInto("component_org_switches")
404
+ .values(c.platform.map((p) => ({
405
+ kind: "skill",
406
+ component_id: p.id,
407
+ org_id: orgId,
408
+ enabled: false,
409
+ })))
410
+ .onConflict((oc) => oc.columns(["kind", "component_id", "org_id"]).doNothing())
411
+ .execute();
412
+ const first = c.platform[0];
413
+ const detail = {
414
+ skillId: c.skillId,
415
+ from: c.name,
416
+ to,
417
+ platformSkillId: first.id,
418
+ plugin: first.plugin,
419
+ };
420
+ await this.db
421
+ .insertInto("org_notices")
422
+ .values({
423
+ id: randomUUID(),
424
+ org_id: orgId,
425
+ kind: SKILL_RENAMED,
426
+ detail: JSON.stringify(detail),
427
+ })
428
+ .execute();
429
+ await audit(this.db, {
430
+ orgId,
431
+ action: "skill.renamed",
432
+ target: c.skillId,
433
+ detail: { ...detail, platformSkillIds: c.platform.map((p) => p.id) },
434
+ });
435
+ }
436
+ return renamed;
437
+ }
438
+ /** Step 4: org agent templates not linked yet, by plugin and name. */
439
+ async linkTemplates(stats, signal) {
440
+ const rows = await this.db
441
+ .selectFrom("agent_templates as a")
442
+ .innerJoin("agent_template_versions as v", (j) => j.onRef("v.template_id", "=", "a.id").onRef("v.version", "=", "a.current_version"))
443
+ .innerJoin("platform_agent_templates as p", (j) => j.onRef("p.plugin_name", "=", "a.plugin_name").onRef("p.name", "=", "a.name"))
444
+ .innerJoin("platform_agent_template_versions as pv", (j) => j.onRef("pv.template_id", "=", "p.id").onRef("pv.version", "=", "p.current_version"))
445
+ .select([
446
+ "a.id",
447
+ "a.org_id",
448
+ "a.current_version",
449
+ "v.definition",
450
+ "p.id as platform_id",
451
+ "pv.definition as platform_definition",
452
+ ])
453
+ .where("a.deleted_at", "is", null)
454
+ .where("a.platform_template_id", "is", null)
455
+ .where("p.deleted_at", "is", null)
456
+ // an org's own template it promoted (ruling P3-3) is no plugin's: other orgs' copies of a
457
+ // plugin template of the same type never link to it
458
+ .where((eb) => eb.or([eb("p.catalog_item_id", "is not", null), eb("p.origin_org_id", "is", null)]))
459
+ .orderBy("a.org_id")
460
+ .orderBy("a.id")
461
+ .execute();
462
+ for (const [orgId, list] of groupBy(rows, (r) => r.org_id)) {
463
+ if (signal?.aborted)
464
+ return;
465
+ const on = await platformTemplatesOn(this.db, orgId, list.map((r) => r.platform_id));
466
+ // as skills: a copy whose platform template is off in its org stays unlinked (P2-18)
467
+ const links = list
468
+ .filter((r) => on.has(r.platform_id))
469
+ .map((r) => ({
470
+ id: r.id,
471
+ version: r.current_version,
472
+ platformId: r.platform_id,
473
+ pin: canonicalJson(r.definition) !== canonicalJson(r.platform_definition),
474
+ }));
475
+ const done = await this.linkTemplatesIn(orgId, links);
476
+ stats.templatesLinked += done.length;
477
+ stats.templatesPinned += done.filter((l) => l.pin).length;
478
+ }
479
+ }
480
+ /** Links `links` of one org under its row lock (each only while it is still as read). */
481
+ async linkTemplatesIn(orgId, links) {
482
+ if (!(await this.orgLock.tryLock(orgId)))
483
+ return [];
484
+ const done = [];
485
+ for (const l of links) {
486
+ const r = await this.db
487
+ .updateTable("agent_templates")
488
+ .set({ platform_template_id: l.platformId, pinned_version: l.pin ? l.version : null })
489
+ .where("id", "=", l.id)
490
+ .where("org_id", "=", orgId)
491
+ .where("platform_template_id", "is", null)
492
+ .where("current_version", "=", l.version)
493
+ .where("deleted_at", "is", null)
494
+ .executeTakeFirst();
495
+ if (r.numUpdatedRows > 0n)
496
+ done.push(l);
497
+ }
498
+ if (done.length > 0) {
499
+ await audit(this.db, {
500
+ orgId,
501
+ action: "agent_template.platform_linked",
502
+ detail: {
503
+ templates: done.map((l) => ({
504
+ id: l.id,
505
+ platformTemplateId: l.platformId,
506
+ pinnedVersion: l.pin ? l.version : null,
507
+ })),
508
+ },
509
+ });
510
+ }
511
+ return done;
512
+ }
513
+ /**
514
+ * Step 5: connectors not linked yet whose install ledger row names the connector template they
515
+ * were made from; one statement (a connector only gains a link, nothing else changes).
516
+ */
517
+ async linkConnectors(stats) {
518
+ const made = this.db
519
+ .selectFrom("plugin_install_components as k")
520
+ .innerJoin("plugin_installs as i", "i.id", "k.install_id")
521
+ .innerJoin("platform_connector_templates as p", (j) => j
522
+ .onRef("p.catalog_item_id", "=", "i.item_id")
523
+ .onRef("p.template_id", "=", "k.template_id")
524
+ .on("p.deleted_at", "is", null))
525
+ .distinctOn("k.ref")
526
+ .select(["k.ref as connector_id", "p.id as platform_id"])
527
+ .where("k.kind", "=", "connector")
528
+ .where("k.template_id", "is not", null)
529
+ .orderBy("k.ref")
530
+ .orderBy("i.installed_at", "desc")
531
+ .orderBy("p.id")
532
+ .as("m");
533
+ const r = await this.db
534
+ .updateTable("connectors as c")
535
+ .from(made)
536
+ .set((eb) => ({ platform_template_id: eb.ref("m.platform_id") }))
537
+ .whereRef("c.id", "=", "m.connector_id")
538
+ .where("c.platform_template_id", "is", null)
539
+ .returning("c.id")
540
+ .execute();
541
+ stats.connectorsLinked += r.length;
542
+ }
543
+ };
544
+ __decorate([
545
+ LockedInterval(PLATFORM_MIGRATION_JOB, () => PERIOD_MS, {
546
+ runOnStart: true,
547
+ ttl: LOCK_TTL_MS,
548
+ })
549
+ ], PlatformMigration.prototype, "migrate", null);
550
+ __decorate([
551
+ Transactional()
552
+ ], PlatformMigration.prototype, "linkSkillsIn", null);
553
+ __decorate([
554
+ Transactional()
555
+ ], PlatformMigration.prototype, "renameIn", null);
556
+ __decorate([
557
+ Transactional()
558
+ ], PlatformMigration.prototype, "linkTemplatesIn", null);
559
+ PlatformMigration = __decorate([
560
+ Injectable(),
561
+ __param(0, Inject(KernelDb)),
562
+ __param(1, Inject(OrgLock)),
563
+ __param(2, Inject(PlatformComponents)),
564
+ __param(3, Inject(TransactionHost)),
565
+ __param(4, Inject(KernelConfigService)),
566
+ __param(5, Inject(LockService)),
567
+ __param(6, Inject(KERNEL_LOGGER))
568
+ ], PlatformMigration);
569
+ export { PlatformMigration };
570
+ /** `rows` grouped by `key`, in their order. */
571
+ function groupBy(rows, key) {
572
+ const out = new Map();
573
+ for (const r of rows) {
574
+ const k = key(r);
575
+ const list = out.get(k);
576
+ if (list)
577
+ list.push(r);
578
+ else
579
+ out.set(k, [r]);
580
+ }
581
+ return out;
582
+ }