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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (507) hide show
  1. package/bootstrap.json +61 -5
  2. package/dist/admin/admin.controller.d.ts +39 -13
  3. package/dist/admin/admin.controller.js +33 -17
  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 +51 -22
  19. package/dist/agents/agents.service.js +172 -70
  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/org-templates.d.ts +176 -0
  27. package/dist/agents/org-templates.js +827 -0
  28. package/dist/agents/pending-connector-requests.d.ts +77 -0
  29. package/dist/agents/pending-connector-requests.js +215 -0
  30. package/dist/agents/pending-connectors.controller.d.ts +39 -0
  31. package/dist/agents/pending-connectors.controller.js +91 -0
  32. package/dist/agents/pending-connectors.service.d.ts +62 -0
  33. package/dist/agents/pending-connectors.service.js +282 -0
  34. package/dist/agents/templates.controller.d.ts +86 -5
  35. package/dist/agents/templates.controller.js +171 -7
  36. package/dist/agents/templates.d.ts +127 -23
  37. package/dist/agents/templates.js +475 -52
  38. package/dist/background/background.module.js +8 -1
  39. package/dist/background/finish.d.ts +3 -2
  40. package/dist/background/launch-lock.d.ts +4 -3
  41. package/dist/background/launch-lock.js +4 -3
  42. package/dist/background/poll.job.d.ts +9 -6
  43. package/dist/background/poll.job.js +30 -22
  44. package/dist/background/session.d.ts +13 -2
  45. package/dist/background/session.js +13 -0
  46. package/dist/background/stop.d.ts +12 -6
  47. package/dist/background/stop.js +57 -39
  48. package/dist/background/store.d.ts +18 -6
  49. package/dist/background/store.js +12 -6
  50. package/dist/background/tasks.service.d.ts +15 -5
  51. package/dist/background/tasks.service.js +42 -17
  52. package/dist/background/wake-rules.d.ts +27 -18
  53. package/dist/background/wake-rules.js +52 -22
  54. package/dist/background/wake.d.ts +13 -11
  55. package/dist/background/wake.js +20 -14
  56. package/dist/catalog/admin-catalog.controller.d.ts +129 -30
  57. package/dist/catalog/admin-catalog.controller.js +213 -42
  58. package/dist/catalog/catalog-content.d.ts +58 -32
  59. package/dist/catalog/catalog-content.js +34 -8
  60. package/dist/catalog/catalog-import.module.d.ts +7 -0
  61. package/dist/catalog/catalog-import.module.js +60 -0
  62. package/dist/catalog/catalog-items.d.ts +111 -7
  63. package/dist/catalog/catalog-items.js +279 -13
  64. package/dist/catalog/catalog-scope.service.d.ts +260 -0
  65. package/dist/catalog/catalog-scope.service.js +1116 -0
  66. package/dist/catalog/catalog.module.d.ts +7 -9
  67. package/dist/catalog/catalog.module.js +41 -31
  68. package/dist/catalog/catalog.service.d.ts +101 -29
  69. package/dist/catalog/catalog.service.js +104 -106
  70. package/dist/catalog/cli.d.ts +11 -1
  71. package/dist/catalog/cli.js +26 -1
  72. package/dist/catalog/component-promotion.d.ts +96 -0
  73. package/dist/catalog/component-promotion.js +395 -0
  74. package/dist/catalog/component-scope.controller.d.ts +152 -0
  75. package/dist/catalog/component-scope.controller.js +287 -0
  76. package/dist/catalog/component-scope.service.d.ts +303 -0
  77. package/dist/catalog/component-scope.service.js +936 -0
  78. package/dist/catalog/component-state.d.ts +174 -0
  79. package/dist/catalog/component-state.js +437 -0
  80. package/dist/catalog/job-ids.d.ts +30 -0
  81. package/dist/catalog/job-ids.js +25 -0
  82. package/dist/catalog/marketplace-fetch.d.ts +1 -1
  83. package/dist/catalog/marketplaces.controller.d.ts +22 -5
  84. package/dist/catalog/marketplaces.controller.js +56 -7
  85. package/dist/catalog/marketplaces.service.d.ts +54 -14
  86. package/dist/catalog/marketplaces.service.js +71 -22
  87. package/dist/catalog/org-catalog.controller.d.ts +125 -34
  88. package/dist/catalog/org-catalog.controller.js +181 -65
  89. package/dist/catalog/org-catalog.service.d.ts +65 -33
  90. package/dist/catalog/org-catalog.service.js +324 -157
  91. package/dist/catalog/org-extension-switch.d.ts +41 -0
  92. package/dist/catalog/org-extension-switch.js +115 -0
  93. package/dist/catalog/org-extension.controller.d.ts +119 -0
  94. package/dist/catalog/org-extension.controller.js +266 -0
  95. package/dist/catalog/org-plugin-uploads.controller.d.ts +98 -0
  96. package/dist/catalog/org-plugin-uploads.controller.js +213 -0
  97. package/dist/catalog/org-plugin-uploads.d.ts +63 -0
  98. package/dist/catalog/org-plugin-uploads.js +116 -0
  99. package/dist/catalog/owned-items.d.ts +184 -0
  100. package/dist/catalog/owned-items.js +789 -0
  101. package/dist/catalog/owned-plugin-cleanup.d.ts +56 -0
  102. package/dist/catalog/owned-plugin-cleanup.js +194 -0
  103. package/dist/catalog/ownership.d.ts +172 -0
  104. package/dist/catalog/ownership.js +326 -0
  105. package/dist/catalog/platform-components.d.ts +221 -0
  106. package/dist/catalog/platform-components.js +761 -0
  107. package/dist/catalog/platform-migration.d.ts +115 -0
  108. package/dist/catalog/platform-migration.js +582 -0
  109. package/dist/catalog/plugin-import.d.ts +178 -34
  110. package/dist/catalog/plugin-import.js +622 -82
  111. package/dist/catalog/plugin-install.d.ts +185 -41
  112. package/dist/catalog/plugin-install.js +758 -126
  113. package/dist/catalog/plugin-upgrade.d.ts +260 -225
  114. package/dist/catalog/plugin-upgrade.js +1147 -1136
  115. package/dist/catalog/request-rules.d.ts +65 -0
  116. package/dist/catalog/request-rules.js +217 -0
  117. package/dist/catalog/requests.service.d.ts +193 -118
  118. package/dist/catalog/requests.service.js +526 -343
  119. package/dist/catalog/reserved-names.d.ts +8 -0
  120. package/dist/catalog/reserved-names.js +42 -0
  121. package/dist/catalog/scope-orgs.d.ts +21 -0
  122. package/dist/catalog/scope-orgs.js +67 -0
  123. package/dist/catalog/scope-state.d.ts +35 -0
  124. package/dist/catalog/scope-state.js +87 -0
  125. package/dist/catalog/scope-sync-workers.d.ts +7 -0
  126. package/dist/catalog/scope-sync-workers.js +29 -0
  127. package/dist/catalog/scope-sync.d.ts +176 -0
  128. package/dist/catalog/scope-sync.js +576 -0
  129. package/dist/catalog/scope.d.ts +42 -0
  130. package/dist/catalog/scope.js +42 -0
  131. package/dist/catalog/unshare.d.ts +22 -0
  132. package/dist/catalog/unshare.js +118 -0
  133. package/dist/channels/actions.js +1 -0
  134. package/dist/channels/cards.js +20 -2
  135. package/dist/channels/channels.module.js +2 -0
  136. package/dist/channels/inbound.d.ts +9 -1
  137. package/dist/channels/inbound.js +67 -5
  138. package/dist/channels/phrases.d.ts +35 -0
  139. package/dist/channels/phrases.js +29 -0
  140. package/dist/config/docs.js +3 -1
  141. package/dist/config/schema.d.ts +6 -2
  142. package/dist/config/schema.js +46 -22
  143. package/dist/conversations/access.d.ts +6 -4
  144. package/dist/conversations/access.js +27 -5
  145. package/dist/conversations/agent-tree.d.ts +46 -0
  146. package/dist/conversations/agent-tree.js +92 -0
  147. package/dist/conversations/conversations.controller.d.ts +43 -18
  148. package/dist/conversations/conversations.controller.js +79 -38
  149. package/dist/conversations/conversations.module.d.ts +1 -1
  150. package/dist/conversations/conversations.module.js +7 -7
  151. package/dist/conversations/conversations.service.d.ts +69 -12
  152. package/dist/conversations/conversations.service.js +106 -27
  153. package/dist/conversations/environment-status.d.ts +24 -0
  154. package/dist/conversations/environment-status.js +71 -0
  155. package/dist/conversations/event-log.d.ts +20 -5
  156. package/dist/conversations/event-log.js +60 -0
  157. package/dist/conversations/events.d.ts +84 -2
  158. package/dist/conversations/events.js +91 -17
  159. package/dist/conversations/queue.service.d.ts +1 -1
  160. package/dist/conversations/queue.service.js +5 -0
  161. package/dist/conversations/titles.d.ts +5 -3
  162. package/dist/conversations/titles.js +21 -8
  163. package/dist/conversations/tree.d.ts +17 -0
  164. package/dist/conversations/tree.js +42 -0
  165. package/dist/ctx/create-ctx.d.ts +5 -0
  166. package/dist/ctx/create-ctx.js +15 -5
  167. package/dist/db/kernel-schema.d.ts +362 -18
  168. package/dist/environments/access.d.ts +41 -0
  169. package/dist/environments/access.js +77 -0
  170. package/dist/environments/conversation-environments.d.ts +61 -0
  171. package/dist/environments/conversation-environments.js +170 -0
  172. package/dist/environments/dto.d.ts +25 -0
  173. package/dist/environments/dto.js +12 -0
  174. package/dist/environments/environments.controller.d.ts +33 -0
  175. package/dist/environments/environments.controller.js +110 -0
  176. package/dist/environments/environments.module.d.ts +8 -0
  177. package/dist/environments/environments.module.js +27 -0
  178. package/dist/environments/environments.service.d.ts +153 -0
  179. package/dist/environments/environments.service.js +541 -0
  180. package/dist/environments/legacy-cleanup.job.d.ts +34 -0
  181. package/dist/environments/legacy-cleanup.job.js +141 -0
  182. package/dist/errors.d.ts +82 -2
  183. package/dist/errors.js +82 -2
  184. package/dist/evals/reconstruct.d.ts +18 -9
  185. package/dist/evals/reconstruct.js +26 -7
  186. package/dist/evals/run-replay.d.ts +4 -2
  187. package/dist/evals/run-replay.js +16 -4
  188. package/dist/evals/step-replay.d.ts +2 -5
  189. package/dist/evals/step-replay.js +1 -1
  190. package/dist/evals/trajectory.service.d.ts +8 -3
  191. package/dist/evals/trajectory.service.js +26 -14
  192. package/dist/evals/worker.d.ts +5 -5
  193. package/dist/evals/worker.js +9 -3
  194. package/dist/extensions/admin-ops.d.ts +36 -10
  195. package/dist/extensions/admin-ops.js +65 -42
  196. package/dist/extensions/admin-view.d.ts +37 -10
  197. package/dist/extensions/admin-view.js +103 -20
  198. package/dist/extensions/bootstrap.d.ts +17 -4
  199. package/dist/extensions/bootstrap.js +70 -9
  200. package/dist/extensions/cli.d.ts +12 -0
  201. package/dist/extensions/cli.js +11 -2
  202. package/dist/extensions/deployment-config.d.ts +28 -5
  203. package/dist/extensions/deployment-config.js +48 -7
  204. package/dist/extensions/effective-config.d.ts +127 -0
  205. package/dist/extensions/effective-config.js +368 -0
  206. package/dist/extensions/extensions.module.js +8 -2
  207. package/dist/extensions/hooks.d.ts +37 -4
  208. package/dist/extensions/hooks.js +82 -16
  209. package/dist/extensions/host.d.ts +19 -1
  210. package/dist/extensions/host.js +30 -7
  211. package/dist/extensions/installs.d.ts +20 -8
  212. package/dist/extensions/installs.js +37 -15
  213. package/dist/extensions/org-config.d.ts +75 -6
  214. package/dist/extensions/org-config.js +184 -32
  215. package/dist/extensions/org-levels.d.ts +37 -0
  216. package/dist/extensions/org-levels.js +71 -0
  217. package/dist/extensions/org-overrides.d.ts +151 -0
  218. package/dist/extensions/org-overrides.js +524 -0
  219. package/dist/extensions/permission-view.d.ts +16 -4
  220. package/dist/extensions/permission-view.js +4 -4
  221. package/dist/extensions/plugin-items.d.ts +21 -0
  222. package/dist/extensions/plugin-items.js +42 -0
  223. package/dist/extensions/point-defaults.d.ts +12 -5
  224. package/dist/extensions/point-defaults.js +37 -9
  225. package/dist/extensions/resolve.d.ts +5 -1
  226. package/dist/extensions/resolve.js +15 -2
  227. package/dist/files/previewers.d.ts +8 -1
  228. package/dist/files/previewers.js +35 -6
  229. package/dist/http/api.module.js +23 -3
  230. package/dist/http/app.d.ts +11 -2
  231. package/dist/http/app.js +31 -5
  232. package/dist/identity/accounts.d.ts +29 -29
  233. package/dist/identity/accounts.js +47 -47
  234. package/dist/identity/audit.d.ts +2 -1
  235. package/dist/identity/auth.guard.d.ts +13 -5
  236. package/dist/identity/auth.guard.js +26 -9
  237. package/dist/identity/identity.module.d.ts +1 -1
  238. package/dist/identity/identity.module.js +4 -4
  239. package/dist/identity/me.controller.js +1 -1
  240. package/dist/identity/principal.d.ts +3 -3
  241. package/dist/identity/principal.js +3 -3
  242. package/dist/identity/settings.d.ts +22 -11
  243. package/dist/identity/settings.js +53 -18
  244. package/dist/identity/{enterprise-admin.d.ts → super-admin.d.ts} +5 -5
  245. package/dist/identity/{enterprise-admin.js → super-admin.js} +24 -24
  246. package/dist/inbox/inbox.module.d.ts +4 -1
  247. package/dist/inbox/inbox.module.js +7 -3
  248. package/dist/inbox/inbox.service.d.ts +62 -3
  249. package/dist/inbox/inbox.service.js +74 -4
  250. package/dist/inbox/org-notices.d.ts +63 -0
  251. package/dist/inbox/org-notices.js +91 -0
  252. package/dist/inbox/platform-inbox.controller.d.ts +23 -0
  253. package/dist/inbox/platform-inbox.controller.js +58 -0
  254. package/dist/inbox/platform-inbox.service.d.ts +151 -0
  255. package/dist/inbox/platform-inbox.service.js +263 -0
  256. package/dist/inbox/platform-notices.d.ts +19 -0
  257. package/dist/inbox/platform-notices.js +9 -0
  258. package/dist/index.d.ts +1 -1
  259. package/dist/index.js +1 -1
  260. package/dist/infra/cli/kernel-cli.module.js +9 -1
  261. package/dist/infra/config/kernel-config.service.js +21 -1
  262. package/dist/infra/database/xact-lock.d.ts +1 -1
  263. package/dist/infra/database/xact-lock.js +1 -1
  264. package/dist/infra/events/kernel-events.d.ts +11 -2
  265. package/dist/infra/queue/add-job-once.d.ts +14 -0
  266. package/dist/infra/queue/add-job-once.js +16 -0
  267. package/dist/kernel.module.js +6 -0
  268. package/dist/lifecycle/kernel-lifecycle.d.ts +1 -1
  269. package/dist/lifecycle/kernel-lifecycle.js +4 -4
  270. package/dist/models/prices.d.ts +5 -5
  271. package/dist/models/prices.js +4 -4
  272. package/dist/models/purposes.controller.d.ts +6 -4
  273. package/dist/models/purposes.controller.js +13 -7
  274. package/dist/models/purposes.d.ts +20 -9
  275. package/dist/models/purposes.js +17 -8
  276. package/dist/orgs/directory-sync.d.ts +14 -5
  277. package/dist/orgs/directory-sync.js +41 -17
  278. package/dist/orgs/offboarding.d.ts +9 -7
  279. package/dist/orgs/offboarding.js +28 -17
  280. package/dist/orgs/org-lock.d.ts +5 -0
  281. package/dist/orgs/org-lock.js +13 -0
  282. package/dist/orgs/org.guard.d.ts +10 -0
  283. package/dist/orgs/org.guard.js +43 -32
  284. package/dist/orgs/orgs.module.js +3 -0
  285. package/dist/orgs/orgs.service.d.ts +20 -7
  286. package/dist/orgs/orgs.service.js +32 -12
  287. package/dist/orgs/roles.d.ts +1 -1
  288. package/dist/orgs/roles.js +5 -1
  289. package/dist/orgs/settings.controller.d.ts +1 -1
  290. package/dist/orgs/settings.service.d.ts +15 -3
  291. package/dist/orgs/settings.service.js +6 -2
  292. package/dist/overrides.d.ts +3 -0
  293. package/dist/overrides.js +2 -0
  294. package/dist/platform/actor.d.ts +48 -0
  295. package/dist/platform/actor.js +100 -0
  296. package/dist/platform/agent-docs.d.ts +18 -0
  297. package/dist/platform/agent-docs.js +59 -0
  298. package/dist/platform/availability.d.ts +14 -0
  299. package/dist/platform/availability.js +43 -0
  300. package/dist/platform/errors.d.ts +11 -0
  301. package/dist/platform/errors.js +26 -0
  302. package/dist/platform/exclusions.d.ts +12 -0
  303. package/dist/platform/exclusions.js +1387 -0
  304. package/dist/platform/method.d.ts +6 -0
  305. package/dist/platform/method.js +15 -0
  306. package/dist/platform/operation.d.ts +92 -0
  307. package/dist/platform/operation.js +35 -0
  308. package/dist/platform/ops/agent-templates.ops.d.ts +14 -0
  309. package/dist/platform/ops/agent-templates.ops.js +92 -0
  310. package/dist/platform/ops/agents.ops.d.ts +19 -0
  311. package/dist/platform/ops/agents.ops.js +294 -0
  312. package/dist/platform/ops/connectors.ops.d.ts +15 -0
  313. package/dist/platform/ops/connectors.ops.js +126 -0
  314. package/dist/platform/ops/errors.d.ts +11 -0
  315. package/dist/platform/ops/errors.js +22 -0
  316. package/dist/platform/ops/extensions.ops.d.ts +19 -0
  317. package/dist/platform/ops/extensions.ops.js +116 -0
  318. package/dist/platform/ops/marketplaces.ops.d.ts +16 -0
  319. package/dist/platform/ops/marketplaces.ops.js +157 -0
  320. package/dist/platform/ops/paging.d.ts +14 -0
  321. package/dist/platform/ops/paging.js +20 -0
  322. package/dist/platform/ops/platform.ops.d.ts +23 -0
  323. package/dist/platform/ops/platform.ops.js +158 -0
  324. package/dist/platform/ops/plugins.ops.d.ts +33 -0
  325. package/dist/platform/ops/plugins.ops.js +377 -0
  326. package/dist/platform/ops/requests.ops.d.ts +14 -0
  327. package/dist/platform/ops/requests.ops.js +153 -0
  328. package/dist/platform/ops/role.d.ts +4 -0
  329. package/dist/platform/ops/role.js +10 -0
  330. package/dist/platform/ops/skills.ops.d.ts +13 -0
  331. package/dist/platform/ops/skills.ops.js +98 -0
  332. package/dist/platform/ops/summary.d.ts +10 -0
  333. package/dist/platform/ops/summary.js +18 -0
  334. package/dist/platform/platform-ops.module.d.ts +7 -0
  335. package/dist/platform/platform-ops.module.js +55 -0
  336. package/dist/platform/platform.module.d.ts +8 -0
  337. package/dist/platform/platform.module.js +25 -0
  338. package/dist/platform/redact-orgs.d.ts +7 -0
  339. package/dist/platform/redact-orgs.js +52 -0
  340. package/dist/platform/registry.d.ts +30 -0
  341. package/dist/platform/registry.js +111 -0
  342. package/dist/roles/worker-role.d.ts +6 -4
  343. package/dist/roles/worker-role.js +14 -7
  344. package/dist/roles/worker.module.d.ts +1 -1
  345. package/dist/roles/worker.module.js +9 -1
  346. package/dist/runtime/context/build.d.ts +6 -4
  347. package/dist/runtime/context/build.js +26 -7
  348. package/dist/runtime/context/claude-tools.d.ts +2 -1
  349. package/dist/runtime/context/claude-tools.js +5 -4
  350. package/dist/runtime/context/compaction.js +9 -0
  351. package/dist/runtime/context/reminders.d.ts +2 -0
  352. package/dist/runtime/context/reminders.js +2 -0
  353. package/dist/runtime/context/skills.js +9 -2
  354. package/dist/runtime/context/tool-changes.d.ts +27 -0
  355. package/dist/runtime/context/tool-changes.js +60 -0
  356. package/dist/runtime/hook-calls.js +2 -0
  357. package/dist/runtime/langgraph-loop.d.ts +3 -1
  358. package/dist/runtime/langgraph-loop.js +35 -17
  359. package/dist/runtime/loop.d.ts +32 -4
  360. package/dist/runtime/maintenance.d.ts +7 -4
  361. package/dist/runtime/maintenance.js +23 -8
  362. package/dist/runtime/model-call.d.ts +30 -8
  363. package/dist/runtime/model-call.js +69 -19
  364. package/dist/runtime/run-control.d.ts +11 -1
  365. package/dist/runtime/run-control.js +12 -0
  366. package/dist/runtime/run-drafts.d.ts +85 -0
  367. package/dist/runtime/run-drafts.js +230 -0
  368. package/dist/runtime/run-jobs.d.ts +3 -5
  369. package/dist/runtime/run-jobs.js +3 -7
  370. package/dist/runtime/run-queue.d.ts +37 -3
  371. package/dist/runtime/run-queue.js +188 -11
  372. package/dist/runtime/run-worker.d.ts +11 -5
  373. package/dist/runtime/run-worker.js +54 -31
  374. package/dist/runtime/runtime.module.js +3 -0
  375. package/dist/runtime/step-log.d.ts +9 -4
  376. package/dist/runtime/step-log.js +8 -5
  377. package/dist/runtime/stream.controller.d.ts +23 -1
  378. package/dist/runtime/stream.controller.js +60 -3
  379. package/dist/runtime/stream.d.ts +4 -1
  380. package/dist/runtime/stream.js +27 -3
  381. package/dist/runtime/subagents/child.d.ts +55 -7
  382. package/dist/runtime/subagents/child.js +105 -7
  383. package/dist/runtime/subagents/definition.d.ts +12 -3
  384. package/dist/runtime/subagents/definition.js +43 -29
  385. package/dist/runtime/subagents/deliveries.d.ts +71 -0
  386. package/dist/runtime/subagents/deliveries.js +228 -0
  387. package/dist/runtime/subagents/dispatch.d.ts +115 -26
  388. package/dist/runtime/subagents/dispatch.js +212 -141
  389. package/dist/runtime/subagents/limits.d.ts +24 -5
  390. package/dist/runtime/subagents/limits.js +40 -6
  391. package/dist/runtime/subagents/messages.d.ts +95 -0
  392. package/dist/runtime/subagents/messages.js +328 -0
  393. package/dist/runtime/subagents/preamble.d.ts +4 -4
  394. package/dist/runtime/subagents/preamble.js +9 -7
  395. package/dist/runtime/subagents/progress.d.ts +8 -6
  396. package/dist/runtime/subagents/progress.js +11 -6
  397. package/dist/runtime/subagents/render.d.ts +30 -0
  398. package/dist/runtime/subagents/render.js +53 -0
  399. package/dist/runtime/subagents/roster.d.ts +24 -7
  400. package/dist/runtime/subagents/roster.js +47 -11
  401. package/dist/runtime/subagents/skill-fork.d.ts +3 -2
  402. package/dist/runtime/subagents/skill-fork.js +8 -4
  403. package/dist/runtime/subagents/status.d.ts +14 -0
  404. package/dist/runtime/subagents/status.js +23 -0
  405. package/dist/runtime/subagents/subagents.service.d.ts +7 -4
  406. package/dist/runtime/subagents/subagents.service.js +11 -6
  407. package/dist/runtime/usage-report.js +17 -12
  408. package/dist/runtime/waits.d.ts +140 -37
  409. package/dist/runtime/waits.js +394 -106
  410. package/dist/sandbox/jobs.d.ts +40 -13
  411. package/dist/sandbox/jobs.js +57 -20
  412. package/dist/sandbox/leases.d.ts +37 -54
  413. package/dist/sandbox/leases.js +71 -115
  414. package/dist/sandbox/providers.d.ts +2 -2
  415. package/dist/sandbox/providers.js +1 -1
  416. package/dist/sandbox/sandbox.module.d.ts +3 -2
  417. package/dist/sandbox/sandbox.module.js +4 -3
  418. package/dist/sandbox/sandbox.service.d.ts +229 -134
  419. package/dist/sandbox/sandbox.service.js +630 -409
  420. package/dist/skills/catalog.d.ts +3 -2
  421. package/dist/skills/catalog.js +21 -43
  422. package/dist/skills/changes.controller.d.ts +7 -0
  423. package/dist/skills/changes.controller.js +19 -1
  424. package/dist/skills/invoke.js +8 -3
  425. package/dist/skills/package.d.ts +20 -1
  426. package/dist/skills/package.js +28 -1
  427. package/dist/skills/skills.controller.d.ts +39 -4
  428. package/dist/skills/skills.controller.js +88 -10
  429. package/dist/skills/skills.module.js +10 -1
  430. package/dist/skills/skills.service.d.ts +106 -26
  431. package/dist/skills/skills.service.js +421 -75
  432. package/dist/skills/usable.d.ts +81 -0
  433. package/dist/skills/usable.js +379 -0
  434. package/dist/tools/approvals.service.d.ts +20 -2
  435. package/dist/tools/approvals.service.js +23 -4
  436. package/dist/tools/builtin-names.d.ts +21 -5
  437. package/dist/tools/builtin-names.js +30 -5
  438. package/dist/tools/builtins/agent.d.ts +23 -21
  439. package/dist/tools/builtins/agent.js +62 -55
  440. package/dist/tools/builtins/builtin-tools.d.ts +6 -2
  441. package/dist/tools/builtins/builtin-tools.js +37 -12
  442. package/dist/tools/builtins/handback.d.ts +28 -0
  443. package/dist/tools/builtins/handback.js +53 -0
  444. package/dist/tools/builtins/platform.d.ts +34 -0
  445. package/dist/tools/builtins/platform.js +362 -0
  446. package/dist/tools/builtins/sandbox/bash.js +13 -3
  447. package/dist/tools/builtins/sandbox/common.d.ts +43 -24
  448. package/dist/tools/builtins/sandbox/common.js +80 -45
  449. package/dist/tools/builtins/sandbox/edit.js +2 -2
  450. package/dist/tools/builtins/sandbox/glob.js +2 -2
  451. package/dist/tools/builtins/sandbox/grep.js +2 -4
  452. package/dist/tools/builtins/sandbox/index.d.ts +1 -1
  453. package/dist/tools/builtins/sandbox/index.js +1 -1
  454. package/dist/tools/builtins/sandbox/read.js +1 -1
  455. package/dist/tools/builtins/sandbox/task-output.d.ts +14 -3
  456. package/dist/tools/builtins/sandbox/task-output.js +30 -5
  457. package/dist/tools/builtins/sandbox/task-stop.js +2 -1
  458. package/dist/tools/builtins/sandbox/write.js +2 -2
  459. package/dist/tools/builtins/send-message.d.ts +56 -0
  460. package/dist/tools/builtins/send-message.js +100 -0
  461. package/dist/tools/builtins/skill-load.d.ts +22 -14
  462. package/dist/tools/builtins/skill-load.js +86 -57
  463. package/dist/tools/builtins/skill-write.js +1 -1
  464. package/dist/tools/builtins/web/extract.js +5 -1
  465. package/dist/tools/builtins/web/fetch.js +1 -0
  466. package/dist/tools/builtins/web/search.js +1 -0
  467. package/dist/tools/connectors.controller.d.ts +10 -0
  468. package/dist/tools/connectors.controller.js +12 -0
  469. package/dist/tools/connectors.service.d.ts +46 -5
  470. package/dist/tools/connectors.service.js +94 -15
  471. package/dist/tools/extension-tools.controller.d.ts +14 -0
  472. package/dist/tools/extension-tools.controller.js +37 -0
  473. package/dist/tools/info.d.ts +42 -1
  474. package/dist/tools/info.js +64 -1
  475. package/dist/tools/org-tool-switches.d.ts +74 -0
  476. package/dist/tools/org-tool-switches.js +184 -0
  477. package/dist/tools/pipeline.d.ts +46 -40
  478. package/dist/tools/pipeline.js +187 -364
  479. package/dist/tools/policy.d.ts +1 -1
  480. package/dist/tools/policy.js +36 -16
  481. package/dist/tools/registry.d.ts +98 -5
  482. package/dist/tools/registry.js +87 -9
  483. package/dist/tools/tools.module.js +12 -2
  484. package/dist/ui/views.d.ts +2 -1
  485. package/dist/ui/views.js +17 -3
  486. package/package.json +3 -3
  487. package/src/migrations/0074_subagent_tree.sql +50 -0
  488. package/src/migrations/0075_plugin_scope.sql +61 -0
  489. package/src/migrations/0076_skills_created_by_nullable.sql +6 -0
  490. package/src/migrations/0077_scope_requests.sql +52 -0
  491. package/src/migrations/0078_scope_grant_switches.sql +18 -0
  492. package/src/migrations/0079_scope_live_install_switches.sql +19 -0
  493. package/src/migrations/0080_rename_enterprise_admin.sql +18 -0
  494. package/src/migrations/0081_platform_components.sql +129 -0
  495. package/src/migrations/0082_platform_migration.sql +33 -0
  496. package/src/migrations/0083_plugin_scope_sync_failures.sql +15 -0
  497. package/src/migrations/0084_org_owned_items.sql +85 -0
  498. package/src/migrations/0085_agent_templates_phase4.sql +45 -0
  499. package/src/migrations/0086_org_layering.sql +30 -0
  500. package/src/migrations/0087_approval_summary.sql +6 -0
  501. package/src/migrations/0088_environments.sql +80 -0
  502. package/dist/catalog/upgrade-targets.d.ts +0 -56
  503. package/dist/catalog/upgrade-targets.js +0 -90
  504. package/dist/conversations/sandbox-status.d.ts +0 -24
  505. package/dist/conversations/sandbox-status.js +0 -52
  506. package/dist/extensions/org-config.controller.d.ts +0 -32
  507. package/dist/extensions/org-config.controller.js +0 -70
@@ -12,7 +12,8 @@ import { connectorToolKey, ToolError, } from "@capybara-hq/plugin-sdk";
12
12
  import { Inject, Injectable } from "@nestjs/common";
13
13
  import { sql } from "kysely";
14
14
  import { z } from "zod";
15
- import { assertItemInstallable } from "../catalog/requests.service.js";
15
+ import { connectorTemplateState } from "../catalog/component-state.js";
16
+ import { assertItemInstallable } from "../catalog/request-rules.js";
16
17
  import { ApiError } from "../errors.js";
17
18
  import { ExtensionRegistry } from "../extensions/registry.js";
18
19
  import { audit } from "../identity/audit.js";
@@ -142,6 +143,34 @@ let ConnectorsService = class ConnectorsService {
142
143
  .executeTakeFirst();
143
144
  return row !== undefined;
144
145
  }
146
+ /**
147
+ * The first free default name and slug ({@link CreateConnectorInput.slugDefault}), read in the
148
+ * caller's transaction under the org lock.
149
+ */
150
+ async freeName(t, orgId, d) {
151
+ const base = deriveSlug(d.name ?? d.display) ?? deriveSlug(d.display);
152
+ if (base === null) {
153
+ throw fail("slug", `Cannot derive a slug from the name; provide one. ${SLUG_RULE}`);
154
+ }
155
+ const taken = new Set((await t
156
+ .selectFrom("connectors")
157
+ .select("slug")
158
+ .where("org_id", "=", orgId)
159
+ .where("deleted_at", "is", null)
160
+ .execute()).map((r) => r.slug));
161
+ for (const m of this.extensions.manifests())
162
+ taken.add(m.name);
163
+ for (let n = 1;; n++) {
164
+ const suffix = n === 1 ? "" : `_${n}`;
165
+ const slug = `${base.slice(0, 24 - suffix.length).replace(/_+$/, "")}${suffix}`;
166
+ if (!isValidSlug(slug) || taken.has(slug))
167
+ continue;
168
+ const nth = ` ${n}`;
169
+ const name = d.name ??
170
+ (n === 1 ? d.display : `${[...d.display].slice(0, 80 - nth.length).join("")}${nth}`);
171
+ return { name: [...name].slice(0, 80).join(""), slug };
172
+ }
173
+ }
145
174
  resolveSlug(input) {
146
175
  if (input.slug !== undefined) {
147
176
  if (!isValidSlug(input.slug))
@@ -253,7 +282,8 @@ let ConnectorsService = class ConnectorsService {
253
282
  checkCreateInput(actorAccountId, input) {
254
283
  const slug = this.resolveSlug(input);
255
284
  const endpoint = this.parseEndpoint(input.connector, input.endpoint);
256
- if (this.extensions.manifests().some((m) => m.name === slug)) {
285
+ // a defaulted slug skips plugin names itself (`freeName`)
286
+ if (!input.slugDefault && this.extensions.manifests().some((m) => m.name === slug)) {
257
287
  throw fail("slug", `Slug "${slug}" is the name of an installed plugin; choose another`);
258
288
  }
259
289
  const auth = input.auth;
@@ -311,21 +341,21 @@ let ConnectorsService = class ConnectorsService {
311
341
  // 自建被禁止时先拒绝(事务里再复核一次):不该为此触发外连
312
342
  if (!input.template)
313
343
  await assertCustomAllowed(this.db, "customConnectors");
344
+ await this.assertKindAvailable(orgId, input.connector);
314
345
  const { slug, endpoint, owner, secret } = this.checkCreateInput(actorAccountId, input);
315
346
  const id = randomUUID();
316
347
  const auth = input.auth;
317
348
  const publicUrl = this.config.get().http.publicUrl;
318
- // 先做不需要连接的检查:冲突的 slug 不该触发一次外连
319
- if (await this.slugTaken(this.db, orgId, slug)) {
349
+ // 先做不需要连接的检查:冲突的 slug 不该触发一次外连 (a defaulted slug is chosen under the lock)
350
+ if (!input.slugDefault && (await this.slugTaken(this.db, orgId, slug))) {
320
351
  throw new ApiError("connector.slug_taken", "Connector slug is already taken");
321
352
  }
322
353
  const oauth = isOAuth(auth)
323
354
  ? await this.prepareOAuth(auth, endpoint, input.credential, publicUrl)
324
355
  : undefined;
325
- let rows = [];
326
- let issues = [];
356
+ let listed;
327
357
  if (auth.type !== "oauth_code") {
328
- const listed = await this.drift.listTools(input.connector, endpoint, async () => {
358
+ listed = await this.drift.listTools(input.connector, endpoint, async () => {
329
359
  if (auth.type === "none")
330
360
  return { headers: {} };
331
361
  if (oauth?.tokens) {
@@ -335,7 +365,6 @@ let ConnectorsService = class ConnectorsService {
335
365
  throw new CredentialMissing(id, auth.ownership);
336
366
  return this.credentials.injectionFor(id, auth, secret);
337
367
  }, { orgId, slug });
338
- ({ rows, issues } = snapshot(slug, listed.specs, listed.resources));
339
368
  }
340
369
  return this.createIn(orgId, actorAccountId, input, actorTokenId, {
341
370
  id,
@@ -344,13 +373,12 @@ let ConnectorsService = class ConnectorsService {
344
373
  owner,
345
374
  secret,
346
375
  oauth,
347
- rows,
348
- issues,
376
+ listed,
349
377
  });
350
378
  }
351
379
  /** The org-locked, re-checked insert of {@link create} (the outbound checks ran before). */
352
380
  async createIn(orgId, actorAccountId, input, actorTokenId, c) {
353
- const { id, slug, endpoint, owner, secret, oauth, rows, issues } = c;
381
+ const { id, endpoint, owner, secret, oauth } = c;
354
382
  const auth = input.auth;
355
383
  const t = this.db;
356
384
  await this.orgLock.lockAndAuthorize(orgId, actorAccountId, "connectors.manage");
@@ -359,22 +387,53 @@ let ConnectorsService = class ConnectorsService {
359
387
  }
360
388
  else
361
389
  await assertCustomAllowed(t, "customConnectors");
362
- if (await this.slugTaken(t, orgId, slug)) {
390
+ let slug = c.slug;
391
+ let name = input.name;
392
+ if (input.slugDefault)
393
+ ({ slug, name } = await this.freeName(t, orgId, input.slugDefault));
394
+ else if (await this.slugTaken(t, orgId, slug)) {
363
395
  throw new ApiError("connector.slug_taken", "Connector slug is already taken");
364
396
  }
397
+ // the snapshot's keys name the final slug
398
+ const { rows, issues } = c.listed === undefined
399
+ ? { rows: [], issues: [] }
400
+ : snapshot(slug, c.listed.specs, c.listed.resources);
401
+ // A connector made from a platform connector template stays linked to it (ruling E2)
402
+ const tpl = input.template;
403
+ const platformTemplate = tpl?.templateId !== undefined
404
+ ? await t
405
+ .selectFrom("platform_connector_templates")
406
+ .select("id")
407
+ .where("catalog_item_id", "=", tpl.itemId)
408
+ .where("template_id", "=", tpl.templateId)
409
+ .where("deleted_at", "is", null)
410
+ .executeTakeFirst()
411
+ : undefined;
412
+ if (tpl?.mustBeOn) {
413
+ const state = platformTemplate === undefined
414
+ ? "absent"
415
+ : await connectorTemplateState(t, orgId, platformTemplate.id);
416
+ if (state === "absent") {
417
+ throw new ApiError("component.not_found", "The connector template does not exist or is not available in this organization");
418
+ }
419
+ if (state === "off") {
420
+ throw new ApiError("component.off", "This connector template is off in this organization; switch it (or its plugin) on first");
421
+ }
422
+ }
365
423
  await t
366
424
  .insertInto("connectors")
367
425
  .values({
368
426
  id,
369
427
  org_id: orgId,
370
428
  slug,
371
- name: input.name,
429
+ name,
372
430
  connector: input.connector,
373
431
  endpoint: JSON.stringify(endpoint),
374
432
  auth: JSON.stringify(auth),
375
433
  created_by: actorAccountId,
376
434
  catalog_item_id: input.template?.itemId ?? null,
377
435
  catalog_version: input.template?.version ?? null,
436
+ platform_template_id: platformTemplate?.id ?? null,
378
437
  // 授权码连接器安装时没有快照:模板的默认策略留到首个快照时应用
379
438
  template_tool_policies: input.template?.defaultToolPolicies
380
439
  ? JSON.stringify(input.template.defaultToolPolicies)
@@ -418,7 +477,7 @@ let ConnectorsService = class ConnectorsService {
418
477
  return { connector: await this.detail(t, orgId, id, actorAccountId), issues };
419
478
  }
420
479
  /**
421
- * Checks a template update before anything is written (an org plugin upgrade): the endpoint
480
+ * Checks a template update before anything is written (the platform plugin update): the endpoint
422
481
  * against the connector's schema, and with `resetCredentials` the new credential's shape, or for
423
482
  * OAuth the client setup (discovery, dynamic registration or the client credentials token; an
424
483
  * outbound failure -> 502 `connector.connect_failed`). Writes nothing.
@@ -534,6 +593,21 @@ let ConnectorsService = class ConnectorsService {
534
593
  },
535
594
  });
536
595
  }
596
+ /** Refuses a loaded kind whose extension is not enabled in the org (the same notion as {@link kinds}). */
597
+ async assertKindAvailable(orgId, kind) {
598
+ if (!this.registry.findConnector(kind))
599
+ return; // unknown kinds fail in parseEndpoint
600
+ if (!(await this.registry.connectorKindAvailable(orgId, kind))) {
601
+ throw new ApiError("connector.kind_unavailable", `Connector kind "${kind}" is not enabled for this organization; enable its plugin first`);
602
+ }
603
+ }
604
+ /**
605
+ * The connector kinds the org can create connectors of (the install wizard's protocol step): a
606
+ * kind is listed when its `connector@1` extension is loaded and enabled in the org.
607
+ */
608
+ kinds(orgId) {
609
+ return this.registry.connectorKindsFor(orgId);
610
+ }
537
611
  /**
538
612
  * Previews a connector (Ruling A20, for the install wizard): after checking the connector, the
539
613
  * endpoint (credential pattern check included) and the credential shape, reads the endpoint
@@ -548,6 +622,7 @@ let ConnectorsService = class ConnectorsService {
548
622
  async preview(orgId, input) {
549
623
  // 部署禁止组织自建连接器时也不替组织去连任意端点(目录安装不走预览)
550
624
  await assertCustomAllowed(this.db, "customConnectors");
625
+ await this.assertKindAvailable(orgId, input.connector);
551
626
  const endpoint = this.parseEndpoint(input.connector, input.endpoint);
552
627
  const connector = this.registry.findConnector(input.connector);
553
628
  if (!connector)
@@ -684,6 +759,7 @@ let ConnectorsService = class ConnectorsService {
684
759
  endpoint: endpointView(r.endpoint),
685
760
  auth: r.auth,
686
761
  status: r.status,
762
+ platformTemplateId: r.platform_template_id ?? null,
687
763
  createdBy: r.created_by,
688
764
  createdAt: r.created_at,
689
765
  updatedAt: r.updated_at,
@@ -721,6 +797,7 @@ let ConnectorsService = class ConnectorsService {
721
797
  return {
722
798
  name: t.name,
723
799
  key: connectorToolKey(r.slug, t.name),
800
+ title: typeof spec.title === "string" ? spec.title : null,
724
801
  description: spec.description,
725
802
  inputSchema: spec.inputSchema,
726
803
  annotations: spec.annotations ?? null,
@@ -891,7 +968,9 @@ let ConnectorsService = class ConnectorsService {
891
968
  * 在调用方事务里软删除连接器(调用方已锁组织行并按需复核角色;应用安装的回滚与卸载用):删全部凭据与授权,
892
969
  * 审计 `connector.deleted`(`reason` 并进 detail)。已删除 / 不存在 → `connector.not_found`。
893
970
  */
894
- async removeIn(orgId, connectorId, actorAccountId, actorTokenId, reason) {
971
+ async removeIn(orgId, connectorId,
972
+ /** null: the kernel itself (the plugin scope sync uninstalling a plugin). */
973
+ actorAccountId, actorTokenId, reason) {
895
974
  const t = this.db;
896
975
  const app = await this.row(t, orgId, connectorId, true);
897
976
  await t
@@ -0,0 +1,14 @@
1
+ import { type OrgContext } from "../orgs/org.guard.js";
2
+ import { type ExtensionToolsOffer, OrgExtensionTools } from "./info.js";
3
+ /**
4
+ * `GET /api/v1/orgs/:orgId/tools/extensions` (`agents.use`) → `{ extensions }`: the tools of the
5
+ * extensions enabled in the org, grouped by extension, for the agent form's Tools section (it adds
6
+ * or removes `{kind:"plugin",plugin,name}` references). Display only; nothing here is model-visible.
7
+ */
8
+ export declare class ExtensionToolsController {
9
+ private readonly tools;
10
+ constructor(tools: OrgExtensionTools);
11
+ extensions(org: OrgContext): Promise<{
12
+ extensions: ExtensionToolsOffer[];
13
+ }>;
14
+ }
@@ -0,0 +1,37 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
8
+ return function (target, key) { decorator(target, key, paramIndex); }
9
+ };
10
+ import { Controller, Get, Header, Inject } from "@nestjs/common";
11
+ import { CurrentOrg, OrgAction } from "../orgs/org.guard.js";
12
+ import { OrgExtensionTools } from "./info.js";
13
+ /**
14
+ * `GET /api/v1/orgs/:orgId/tools/extensions` (`agents.use`) → `{ extensions }`: the tools of the
15
+ * extensions enabled in the org, grouped by extension, for the agent form's Tools section (it adds
16
+ * or removes `{kind:"plugin",plugin,name}` references). Display only; nothing here is model-visible.
17
+ */
18
+ let ExtensionToolsController = class ExtensionToolsController {
19
+ tools;
20
+ constructor(tools) {
21
+ this.tools = tools;
22
+ }
23
+ async extensions(org) {
24
+ return { extensions: await this.tools.list(org.orgId) };
25
+ }
26
+ };
27
+ __decorate([
28
+ Get("extensions"),
29
+ Header("cache-control", "private, no-store"),
30
+ OrgAction("agents.use"),
31
+ __param(0, CurrentOrg())
32
+ ], ExtensionToolsController.prototype, "extensions", null);
33
+ ExtensionToolsController = __decorate([
34
+ Controller("api/v1/orgs/:orgId/tools"),
35
+ __param(0, Inject(OrgExtensionTools))
36
+ ], ExtensionToolsController);
37
+ export { ExtensionToolsController };
@@ -1,7 +1,8 @@
1
- import { type LocalizedName } from "@capybara-hq/plugin-sdk";
1
+ import { type LocalizedName, type ToolAnnotations } from "@capybara-hq/plugin-sdk";
2
2
  import { ConversationAccess } from "../conversations/access.js";
3
3
  import type { KernelSchemaDb } from "../db/kernel-schema.js";
4
4
  import { KernelDb } from "../infra/database/kernel-db.js";
5
+ import { OrgToolSwitches } from "./org-tool-switches.js";
5
6
  import { ToolRegistry } from "./registry.js";
6
7
  /**
7
8
  * Tool presentation metadata for the conversation page (UI refresh B, design spec §6.16.9): the
@@ -84,3 +85,43 @@ export declare class ConversationToolInfo {
84
85
  access: Pick<ConversationAccess, "isAccessible">);
85
86
  get(orgId: string, conversationId: string, viewerAccountId: string, keys: readonly string[]): Promise<ToolInfo[]>;
86
87
  }
88
+ /** One tool of {@link OrgExtensionTools}. Display only, for the agent form. */
89
+ export interface ExtensionToolOffer {
90
+ /** The tool's registered name (the `name` of a `{kind:"plugin"}` reference). */
91
+ name: string;
92
+ /** The model-visible key, `plugin__<plugin>__<name>` (the `toolPolicies` key). */
93
+ key: string;
94
+ /** The declared display title (`ToolSpec.title`), or null. */
95
+ title: string | null;
96
+ /** The first non-empty line of the tool's description (English, model-facing text). */
97
+ description: string;
98
+ annotations: ToolAnnotations;
99
+ /** The tool's default policy: its `defaultPolicy`, else derived from the annotations. */
100
+ defaultPolicy: "allow" | "ask";
101
+ /**
102
+ * The org turned this tool off (layering spec A §7): still listed, so the form shows it as
103
+ * unavailable in the agents that selected it.
104
+ */
105
+ switchedOff: boolean;
106
+ }
107
+ /** One extension of {@link OrgExtensionTools} with its tools, in registration order. */
108
+ export interface ExtensionToolsOffer {
109
+ plugin: string;
110
+ /** The plugin's catalog display name, else its name. */
111
+ displayName: LocalizedName;
112
+ tools: ExtensionToolOffer[];
113
+ }
114
+ /**
115
+ * `GET /orgs/:orgId/tools/extensions`: the tools an agent of this org can reference by
116
+ * `{kind:"plugin"}` and get at run time, grouped by extension: the extensions loaded on this
117
+ * replica and enabled in the org (`enabled.ts`, through the host), each with the tools it
118
+ * registered whose key is valid (`ToolRegistry.forAgent` reports the others unavailable); a tool
119
+ * the org turned off is listed with `switchedOff`.
120
+ */
121
+ export declare class OrgExtensionTools {
122
+ private readonly db;
123
+ private readonly registry;
124
+ private readonly switches;
125
+ constructor(db: KernelDb, registry: Pick<ToolRegistry, "extensionToolSpecs" | "enabledExtensions">, switches: Pick<OrgToolSwitches, "offKeys">);
126
+ list(orgId: string): Promise<ExtensionToolsOffer[]>;
127
+ }
@@ -16,7 +16,9 @@ import { UUID_RE } from "../ui/registry.js";
16
16
  import { BUILTIN_TOOL_KINDS, SANDBOX_TOOL_NAMES } from "./builtin-names.js";
17
17
  import { pluginDisplayNames } from "./display-names.js";
18
18
  import { isLegacyBuiltinKey, LEGACY_BUILTINS } from "./legacy-keys.js";
19
- import { ToolRegistry } from "./registry.js";
19
+ import { toolKeyIssue } from "./naming.js";
20
+ import { OrgToolSwitches } from "./org-tool-switches.js";
21
+ import { policyFromAnnotations, ToolRegistry } from "./registry.js";
20
22
  export { BUILTIN_TOOL_KINDS } from "./builtin-names.js";
21
23
  /** At most this many keys per request, each at most {@link TOOL_INFO_KEY_MAX} characters. */
22
24
  export const TOOL_INFO_MAX_KEYS = 100;
@@ -160,3 +162,64 @@ ConversationToolInfo = __decorate([
160
162
  __param(2, Inject(ConversationAccess))
161
163
  ], ConversationToolInfo);
162
164
  export { ConversationToolInfo };
165
+ /**
166
+ * `GET /orgs/:orgId/tools/extensions`: the tools an agent of this org can reference by
167
+ * `{kind:"plugin"}` and get at run time, grouped by extension: the extensions loaded on this
168
+ * replica and enabled in the org (`enabled.ts`, through the host), each with the tools it
169
+ * registered whose key is valid (`ToolRegistry.forAgent` reports the others unavailable); a tool
170
+ * the org turned off is listed with `switchedOff`.
171
+ */
172
+ let OrgExtensionTools = class OrgExtensionTools {
173
+ db;
174
+ registry;
175
+ switches;
176
+ constructor(db, registry, switches) {
177
+ this.db = db;
178
+ this.registry = registry;
179
+ this.switches = switches;
180
+ }
181
+ async list(orgId) {
182
+ const [enabled, off] = await Promise.all([
183
+ this.registry.enabledExtensions(orgId),
184
+ this.switches.offKeys(orgId),
185
+ ]);
186
+ const groups = new Map();
187
+ for (const t of this.registry.extensionToolSpecs()) {
188
+ if (!enabled.has(t.plugin))
189
+ continue;
190
+ const key = extensionToolKey(t.plugin, t.spec.name);
191
+ if (toolKeyIssue(key) !== null)
192
+ continue;
193
+ const tools = groups.get(t.plugin) ?? [];
194
+ if (tools.some((x) => x.name === t.spec.name))
195
+ continue;
196
+ tools.push({
197
+ name: t.spec.name,
198
+ key,
199
+ title: display(t.spec).title,
200
+ description: firstLine(t.spec.description),
201
+ annotations: { ...(t.spec.annotations ?? {}) },
202
+ defaultPolicy: t.spec.defaultPolicy ?? policyFromAnnotations(t.spec.annotations),
203
+ switchedOff: off.has(key),
204
+ });
205
+ groups.set(t.plugin, tools);
206
+ }
207
+ const names = await pluginDisplayNames(this.db.db, [...groups.keys()]);
208
+ return [...groups].map(([plugin, tools]) => ({
209
+ plugin,
210
+ displayName: names.get(plugin) ?? { zh: plugin, en: plugin },
211
+ tools,
212
+ }));
213
+ }
214
+ };
215
+ OrgExtensionTools = __decorate([
216
+ Injectable(),
217
+ __param(0, Inject(KernelDb)),
218
+ __param(1, Inject(ToolRegistry)),
219
+ __param(2, Inject(OrgToolSwitches))
220
+ ], OrgExtensionTools);
221
+ export { OrgExtensionTools };
222
+ const firstLine = (s) => (typeof s === "string" ? s : "")
223
+ .split("\n")
224
+ .map((l) => l.trim())
225
+ .find((l) => l !== "") ?? "";
@@ -0,0 +1,74 @@
1
+ import { ExtensionHost } from "../extensions/host.js";
2
+ import { KernelDb } from "../infra/database/kernel-db.js";
3
+ import { TransactionHost } from "../infra/database/transaction-host.js";
4
+ import { OrgLock } from "../orgs/org-lock.js";
5
+ /** One tool of an extension with its switch in the org. */
6
+ export interface OrgToolSwitch {
7
+ tool: string;
8
+ enabled: boolean;
9
+ }
10
+ /** An org agent whose current version selects the tool being switched off. */
11
+ export interface AffectedAgent {
12
+ id: string;
13
+ name: string;
14
+ }
15
+ /**
16
+ * The result of {@link OrgToolSwitches.set}: the PCM §5 rule 8 preview of a switch-off (the org's
17
+ * agents that selected the tool and the hash to confirm it with), or the switch applied.
18
+ */
19
+ export type OrgToolSwitchResult = {
20
+ applied: false;
21
+ affectedAgents: AffectedAgent[];
22
+ confirm: string;
23
+ } | {
24
+ applied: true;
25
+ };
26
+ /** Model-visible (English): why a turned-off extension tool is not offered. */
27
+ export declare const toolTurnedOffReason: (key: string) => string;
28
+ /**
29
+ * Per-org switches of single extension tools (layering spec A §7, table `org_tool_switches`): an
30
+ * org admin turns off one tool an extension registers (`ctx.tools.register`); it is then not
31
+ * offered to any agent of the org (`ToolRegistry.forAgent`) and refused if called
32
+ * (`ToolPipeline`). No row means on. A row of a tool the extension stops registering is kept and
33
+ * applies again if the tool comes back. Builtin and connector tools are out of scope. Read from PG
34
+ * on every use, no in-process state.
35
+ */
36
+ export declare class OrgToolSwitches {
37
+ private readonly kdb;
38
+ readonly txHost: TransactionHost;
39
+ private readonly host;
40
+ /** The org row lock: re-checks `org.extensions.manage` under the lock. */
41
+ private readonly orgLock;
42
+ constructor(kdb: KernelDb, txHost: TransactionHost, host: Pick<ExtensionHost, "tools">,
43
+ /** The org row lock: re-checks `org.extensions.manage` under the lock. */
44
+ orgLock: Pick<OrgLock, "lockAndAuthorize">);
45
+ private get db();
46
+ /** The tool names `plugin` registers on this replica, in registration order. */
47
+ private registered;
48
+ /**
49
+ * The tools of an extension the org sees: running here and visible under plugin scope, else 404
50
+ * `extension.not_found` (an invisible one is answered like an unknown one).
51
+ */
52
+ private toolsFor;
53
+ /** The stored switches of the org (all extensions, or one), `false` ones only matter. */
54
+ private offRows;
55
+ /** Every tool the extension registers on this replica with its switch (default on). */
56
+ list(orgId: string, plugin: string): Promise<OrgToolSwitch[]>;
57
+ /** The model-visible keys (`plugin__<extension>__<tool>`) of the tools turned off in the org. */
58
+ offKeys(orgId: string): Promise<Set<string>>;
59
+ /** Whether the org turned off this tool. */
60
+ isToolOff(orgId: string, plugin: string, tool: string): Promise<boolean>;
61
+ /**
62
+ * Switches one tool in the org. On applies at once. Off, while the tool is on: without
63
+ * `confirm` the preview (the org's agents whose current version selects the tool) and its hash,
64
+ * with the current hash the switch is written (a changed preview -> 409 `plugin.switch_stale`).
65
+ * A tool the extension does not register -> 404 `extension.tool_not_found`. A change writes the
66
+ * audit row `extension.tool_switched`.
67
+ */
68
+ set(orgId: string, plugin: string, tool: string, enabled: boolean, actor: {
69
+ accountId: string;
70
+ tokenId?: string | undefined;
71
+ }, confirm?: string): Promise<OrgToolSwitchResult>;
72
+ /** The org's live agents whose current version selects `{kind:"plugin", plugin, name: tool}`. */
73
+ private agentsSelecting;
74
+ }
@@ -0,0 +1,184 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
8
+ return function (target, key) { decorator(target, key, paramIndex); }
9
+ };
10
+ import { createHash } from "node:crypto";
11
+ import { extensionToolKey } from "@capybara-hq/plugin-sdk";
12
+ import { Inject, Injectable } from "@nestjs/common";
13
+ import { sql } from "kysely";
14
+ import { ApiError } from "../errors.js";
15
+ import { ExtensionHost } from "../extensions/host.js";
16
+ import { extensionVisibleTo } from "../extensions/org-config.js";
17
+ import { audit } from "../identity/audit.js";
18
+ import { KernelDb } from "../infra/database/kernel-db.js";
19
+ import { TransactionHost } from "../infra/database/transaction-host.js";
20
+ import { Transactional } from "../infra/database/transactional.decorator.js";
21
+ import { OrgLock } from "../orgs/org-lock.js";
22
+ /** Model-visible (English): why a turned-off extension tool is not offered. */
23
+ export const toolTurnedOffReason = (key) => `Tool ${key} is turned off in this organization`;
24
+ /** The confirm hash of a switch-off preview. */
25
+ function switchOffHash(orgId, plugin, tool, agents) {
26
+ return createHash("sha256")
27
+ .update(JSON.stringify({ orgId, plugin, tool, agents: agents.map((a) => a.id) }))
28
+ .digest("hex");
29
+ }
30
+ /**
31
+ * Per-org switches of single extension tools (layering spec A §7, table `org_tool_switches`): an
32
+ * org admin turns off one tool an extension registers (`ctx.tools.register`); it is then not
33
+ * offered to any agent of the org (`ToolRegistry.forAgent`) and refused if called
34
+ * (`ToolPipeline`). No row means on. A row of a tool the extension stops registering is kept and
35
+ * applies again if the tool comes back. Builtin and connector tools are out of scope. Read from PG
36
+ * on every use, no in-process state.
37
+ */
38
+ let OrgToolSwitches = class OrgToolSwitches {
39
+ kdb;
40
+ txHost;
41
+ host;
42
+ orgLock;
43
+ constructor(kdb, txHost, host,
44
+ /** The org row lock: re-checks `org.extensions.manage` under the lock. */
45
+ orgLock) {
46
+ this.kdb = kdb;
47
+ this.txHost = txHost;
48
+ this.host = host;
49
+ this.orgLock = orgLock;
50
+ }
51
+ get db() {
52
+ return this.kdb.db;
53
+ }
54
+ /** The tool names `plugin` registers on this replica, in registration order. */
55
+ registered(plugin) {
56
+ return [
57
+ ...new Set(this.host
58
+ .tools()
59
+ .filter((t) => t.plugin === plugin)
60
+ .map((t) => t.spec.name)),
61
+ ];
62
+ }
63
+ /**
64
+ * The tools of an extension the org sees: running here and visible under plugin scope, else 404
65
+ * `extension.not_found` (an invisible one is answered like an unknown one).
66
+ */
67
+ async toolsFor(orgId, plugin) {
68
+ const tools = this.registered(plugin);
69
+ if (tools.length === 0 || !(await extensionVisibleTo(this.db, orgId, plugin))) {
70
+ throw new ApiError("extension.not_found", `Extension ${plugin} is not installed`);
71
+ }
72
+ return tools;
73
+ }
74
+ /** The stored switches of the org (all extensions, or one), `false` ones only matter. */
75
+ async offRows(orgId, plugin) {
76
+ let q = this.db
77
+ .selectFrom("org_tool_switches")
78
+ .select(["plugin", "tool"])
79
+ .where("org_id", "=", orgId)
80
+ .where("enabled", "=", false);
81
+ if (plugin !== undefined)
82
+ q = q.where("plugin", "=", plugin);
83
+ return q.execute();
84
+ }
85
+ /** Every tool the extension registers on this replica with its switch (default on). */
86
+ async list(orgId, plugin) {
87
+ const tools = await this.toolsFor(orgId, plugin);
88
+ const off = new Set((await this.offRows(orgId, plugin)).map((r) => r.tool));
89
+ return tools.map((tool) => ({ tool, enabled: !off.has(tool) }));
90
+ }
91
+ /** The model-visible keys (`plugin__<extension>__<tool>`) of the tools turned off in the org. */
92
+ async offKeys(orgId) {
93
+ return new Set((await this.offRows(orgId)).map((r) => extensionToolKey(r.plugin, r.tool)));
94
+ }
95
+ /** Whether the org turned off this tool. */
96
+ async isToolOff(orgId, plugin, tool) {
97
+ const row = await this.db
98
+ .selectFrom("org_tool_switches")
99
+ .select("enabled")
100
+ .where("org_id", "=", orgId)
101
+ .where("plugin", "=", plugin)
102
+ .where("tool", "=", tool)
103
+ .executeTakeFirst();
104
+ return row?.enabled === false;
105
+ }
106
+ /**
107
+ * Switches one tool in the org. On applies at once. Off, while the tool is on: without
108
+ * `confirm` the preview (the org's agents whose current version selects the tool) and its hash,
109
+ * with the current hash the switch is written (a changed preview -> 409 `plugin.switch_stale`).
110
+ * A tool the extension does not register -> 404 `extension.tool_not_found`. A change writes the
111
+ * audit row `extension.tool_switched`.
112
+ */
113
+ async set(orgId, plugin, tool, enabled, actor, confirm) {
114
+ await this.orgLock.lockAndAuthorize(orgId, actor.accountId, "org.extensions.manage");
115
+ const tools = await this.toolsFor(orgId, plugin);
116
+ if (!tools.includes(tool)) {
117
+ throw new ApiError("extension.tool_not_found", `Extension ${plugin} does not register a tool named ${tool}`);
118
+ }
119
+ const from = !(await this.isToolOff(orgId, plugin, tool));
120
+ if (from === enabled)
121
+ return { applied: true };
122
+ if (!enabled) {
123
+ const affectedAgents = await this.agentsSelecting(orgId, plugin, tool);
124
+ const hash = switchOffHash(orgId, plugin, tool, affectedAgents);
125
+ if (confirm === undefined)
126
+ return { applied: false, affectedAgents, confirm: hash };
127
+ if (confirm !== hash) {
128
+ throw new ApiError("plugin.switch_stale", "What switching this tool off affects has changed; review it and confirm again");
129
+ }
130
+ }
131
+ await this.db
132
+ .insertInto("org_tool_switches")
133
+ .values({ org_id: orgId, plugin, tool, enabled, updated_by: actor.accountId })
134
+ .onConflict((oc) => oc.columns(["org_id", "plugin", "tool"]).doUpdateSet({
135
+ enabled,
136
+ updated_by: actor.accountId,
137
+ updated_at: sql `now()`,
138
+ }))
139
+ .execute();
140
+ await audit(this.db, {
141
+ actorAccountId: actor.accountId,
142
+ ...(actor.tokenId !== undefined && { actorTokenId: actor.tokenId }),
143
+ orgId,
144
+ action: "extension.tool_switched",
145
+ target: extensionToolKey(plugin, tool),
146
+ detail: { plugin, tool, from, to: enabled },
147
+ });
148
+ return { applied: true };
149
+ }
150
+ /** The org's live agents whose current version selects `{kind:"plugin", plugin, name: tool}`. */
151
+ async agentsSelecting(orgId, plugin, tool) {
152
+ const rows = await this.db
153
+ .selectFrom("agents as a")
154
+ .innerJoin("agent_versions as v", (j) => j.onRef("v.agent_id", "=", "a.id").onRef("v.version", "=", "a.current_version"))
155
+ .select(["a.id", "v.definition"])
156
+ .where("a.org_id", "=", orgId)
157
+ .where("a.deleted_at", "is", null)
158
+ .orderBy("a.id")
159
+ .execute();
160
+ const out = [];
161
+ for (const r of rows) {
162
+ const def = r.definition;
163
+ const refs = Array.isArray(def?.tools) ? def.tools : [];
164
+ const selects = refs.some((x) => {
165
+ const ref = x;
166
+ return ref?.kind === "plugin" && ref.plugin === plugin && ref.name === tool;
167
+ });
168
+ if (selects)
169
+ out.push({ id: r.id, name: typeof def?.name === "string" ? def.name : r.id });
170
+ }
171
+ return out;
172
+ }
173
+ };
174
+ __decorate([
175
+ Transactional()
176
+ ], OrgToolSwitches.prototype, "set", null);
177
+ OrgToolSwitches = __decorate([
178
+ Injectable(),
179
+ __param(0, Inject(KernelDb)),
180
+ __param(1, Inject(TransactionHost)),
181
+ __param(2, Inject(ExtensionHost)),
182
+ __param(3, Inject(OrgLock))
183
+ ], OrgToolSwitches);
184
+ export { OrgToolSwitches };