@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
@@ -0,0 +1,81 @@
1
+ import type { Logger, ObjectStore } from "@capybara-hq/plugin-sdk";
2
+ import type { KernelSchemaDb, SkillManifest, SourceFormat } from "../db/kernel-schema.js";
3
+ /** The `source` prefix of a platform skill version in a snapshot or an invocation record. */
4
+ export declare const PLATFORM_SOURCE = "platform:";
5
+ /** The snapshot `source` of a platform skill version stored at `prefix` (in `deployment/`). */
6
+ export declare const platformSource: (prefix: string) => string;
7
+ /**
8
+ * Where the files of a skill version with snapshot `source` live: `deployment/` for a platform
9
+ * version (`platform:<prefix>`), else the org's `kernel/<orgId>/`; `prefix` is the key prefix in
10
+ * that store.
11
+ */
12
+ export declare function skillFileStore(storage: {
13
+ kernel(orgId: string): ObjectStore;
14
+ deployment(): ObjectStore;
15
+ }, orgId: string, source: string): {
16
+ store: ObjectStore;
17
+ prefix: string;
18
+ };
19
+ /** A skill the org can use: one of its own, or a platform skill that is on in the org. */
20
+ export interface UsableSkill {
21
+ id: string;
22
+ name: string;
23
+ description: string;
24
+ version: number;
25
+ /** The object prefix of the version (`platform:<prefix>` for a platform version). */
26
+ source: string;
27
+ /** The plugin it came from (a platform skill's plugin, an org skill's provenance). */
28
+ plugin: string | null;
29
+ origin: "org" | "platform";
30
+ /** The platform skill whose content this is (a platform skill, or a linked org copy). */
31
+ platformSkillId?: string;
32
+ }
33
+ /** A usable or selected skill with what the resolvers need beyond {@link UsableSkill}. */
34
+ export interface SkillVersionRow extends UsableSkill {
35
+ /** `agent`: an agent's own skill (never in the org library). Platform skills are `org`. */
36
+ scope: "org" | "agent";
37
+ agentId: string | null;
38
+ manifest: SkillManifest;
39
+ format: SourceFormat;
40
+ }
41
+ /**
42
+ * The ids among `ids` of the platform skills on in the org (see {@link platformOn}), whatever the
43
+ * org's own skills are named: a skill of the org with the same name would clash with them.
44
+ */
45
+ export declare function platformSkillsOn(db: KernelSchemaDb, orgId: string, ids: readonly string[]): Promise<Set<string>>;
46
+ /**
47
+ * The ids among `ids` (platform skills that org copies are pinned to) whose pinned copies the org
48
+ * may use (ruling P2-18): the platform skill is on in the org ({@link platformSkillsOn}), or it was
49
+ * removed by a plugin update (soft-deleted, ruling P2-7: a pinned copy then keeps its own version
50
+ * as the org's).
51
+ */
52
+ export declare function pinnedSkillLinksServed(db: KernelSchemaDb, orgId: string, ids: readonly string[]): Promise<Set<string>>;
53
+ /**
54
+ * The org's live skills by id (`ids`; ids that are no usable skill are missing from the map): an
55
+ * agent's own skill or an org skill with its current version; an org copy linked to a platform
56
+ * skill without a pin (ruling B2) as that platform skill's current version under the copy's id,
57
+ * while the platform skill is on in the org; a pinned copy as its own version, while its platform
58
+ * skill is on in the org (ruling P2-18); a platform skill id while it is on in the org.
59
+ */
60
+ export declare function skillVersionsById(db: KernelSchemaDb, orgId: string, ids: readonly string[], log?: Pick<Logger, "warn">): Promise<Map<string, SkillVersionRow>>;
61
+ /**
62
+ * The skills an agent selects, sorted by id: its own skills (`scope = 'agent'`) and the ids of
63
+ * `orgSkills` that resolve ({@link skillVersionsById}: org skills, linked copies, platform skills
64
+ * on in the org). Not deduplicated by name.
65
+ */
66
+ export declare function selectedSkills(db: KernelSchemaDb, a: {
67
+ orgId: string;
68
+ agentId: string;
69
+ orgSkills: readonly string[];
70
+ }, log?: Pick<Logger, "warn">): Promise<SkillVersionRow[]>;
71
+ /**
72
+ * The org's usable skills, sorted by name: its own live org skills (`scope = 'org'`, unlinked, or
73
+ * pinned while their platform skill is on in the org, ruling P2-18) and the platform skills on in
74
+ * the org (see {@link platformOn}). An org copy linked
75
+ * without a pin is not listed: its platform skill is; except the org's own skill it promoted
76
+ * (ruling P3-3), listed once under its own id instead of the platform skill.
77
+ * `log` receives the name-clash warnings.
78
+ */
79
+ export declare function usableSkills(db: KernelSchemaDb, orgId: string, log?: Pick<Logger, "warn">): Promise<UsableSkill[]>;
80
+ /** {@link usableSkills} with each skill's manifest and format. */
81
+ export declare function usableSkillVersions(db: KernelSchemaDb, orgId: string, log?: Pick<Logger, "warn">): Promise<SkillVersionRow[]>;
@@ -0,0 +1,379 @@
1
+ import { componentOn } from "../catalog/component-state.js";
2
+ /** The `source` prefix of a platform skill version in a snapshot or an invocation record. */
3
+ export const PLATFORM_SOURCE = "platform:";
4
+ /** The snapshot `source` of a platform skill version stored at `prefix` (in `deployment/`). */
5
+ export const platformSource = (prefix) => `${PLATFORM_SOURCE}${prefix}`;
6
+ /**
7
+ * Where the files of a skill version with snapshot `source` live: `deployment/` for a platform
8
+ * version (`platform:<prefix>`), else the org's `kernel/<orgId>/`; `prefix` is the key prefix in
9
+ * that store.
10
+ */
11
+ export function skillFileStore(storage, orgId, source) {
12
+ return source.startsWith(PLATFORM_SOURCE)
13
+ ? { store: storage.deployment(), prefix: source.slice(PLATFORM_SOURCE.length) }
14
+ : { store: storage.kernel(orgId), prefix: source };
15
+ }
16
+ /** Plugin install statuses that make a plugin on in the org (phase 1, org catalog state). */
17
+ const LIVE_INSTALL = ["installing", "installed", "upgrading"];
18
+ const byNameThenId = (a, b) => a.name < b.name ? -1 : a.name > b.name ? 1 : a.id < b.id ? -1 : a.id > b.id ? 1 : 0;
19
+ /** The live platform skill rows on in the org (`ids`: only those), before any name clash. */
20
+ async function platformRowsOn(db, orgId, ids) {
21
+ if (ids !== undefined && ids.length === 0)
22
+ return [];
23
+ let q = db
24
+ .selectFrom("platform_skills as p")
25
+ .innerJoin("platform_skill_versions as v", (j) => j.onRef("v.skill_id", "=", "p.id").onRef("v.version", "=", "p.current_version"))
26
+ .leftJoin("catalog_items as c", (j) => j.onRef("c.id", "=", "p.catalog_item_id").on("c.deleted_at", "is", null))
27
+ .select((eb) => [
28
+ "p.id",
29
+ "p.name",
30
+ "p.plugin_name",
31
+ "p.catalog_item_id",
32
+ "p.current_version",
33
+ "p.scope_mode",
34
+ "p.scope",
35
+ "v.manifest",
36
+ "v.object_prefix",
37
+ "v.source_format",
38
+ "c.id as item_id",
39
+ "c.disabled as item_disabled",
40
+ "c.builtin as item_builtin",
41
+ eb
42
+ .exists(eb
43
+ .selectFrom("plugin_installs as a")
44
+ .select("a.id")
45
+ .whereRef("a.item_id", "=", "p.catalog_item_id")
46
+ .where("a.org_id", "=", orgId)
47
+ .where("a.status", "in", [...LIVE_INSTALL]))
48
+ .as("installed"),
49
+ eb
50
+ .exists(eb
51
+ .selectFrom("component_scope_orgs as l")
52
+ .select("l.org_id")
53
+ .where("l.kind", "=", "skill")
54
+ .whereRef("l.component_id", "=", "p.id")
55
+ .where("l.org_id", "=", orgId))
56
+ .as("listed"),
57
+ eb
58
+ .selectFrom("component_org_switches as w")
59
+ .select("w.enabled")
60
+ .where("w.kind", "=", "skill")
61
+ .whereRef("w.component_id", "=", "p.id")
62
+ .where("w.org_id", "=", orgId)
63
+ .as("switch"),
64
+ ])
65
+ .where("p.deleted_at", "is", null)
66
+ .where("p.disabled", "=", false);
67
+ if (ids !== undefined)
68
+ q = q.where("p.id", "in", [...ids]);
69
+ // the predicate of component scope (catalog/component-state.ts); `disabled` is filtered above
70
+ return (await q.execute()).filter((r) => componentOn({ scopeMode: r.scope_mode, scope: r.scope, disabled: false, itemId: r.catalog_item_id }, r.catalog_item_id === null
71
+ ? null
72
+ : {
73
+ live: r.item_id !== null,
74
+ disabled: r.item_disabled === true,
75
+ builtin: r.item_builtin === true,
76
+ // the plugin's own scope and list do not decide whether a component is on
77
+ scope: "optional",
78
+ listed: false,
79
+ installed: Boolean(r.installed),
80
+ }, Boolean(r.listed), r.switch ?? null));
81
+ }
82
+ /**
83
+ * The ids among `ids` of the platform skills on in the org (see {@link platformOn}), whatever the
84
+ * org's own skills are named: a skill of the org with the same name would clash with them.
85
+ */
86
+ export async function platformSkillsOn(db, orgId, ids) {
87
+ return new Set((await platformRowsOn(db, orgId, ids)).map((r) => r.id));
88
+ }
89
+ /**
90
+ * The ids among `ids` (platform skills that org copies are pinned to) whose pinned copies the org
91
+ * may use (ruling P2-18): the platform skill is on in the org ({@link platformSkillsOn}), or it was
92
+ * removed by a plugin update (soft-deleted, ruling P2-7: a pinned copy then keeps its own version
93
+ * as the org's).
94
+ */
95
+ export async function pinnedSkillLinksServed(db, orgId, ids) {
96
+ if (ids.length === 0)
97
+ return new Set();
98
+ const removed = await db
99
+ .selectFrom("platform_skills")
100
+ .select("id")
101
+ .where("id", "in", [...ids])
102
+ .where("deleted_at", "is not", null)
103
+ .execute();
104
+ return new Set([...(await platformSkillsOn(db, orgId, ids)), ...removed.map((r) => r.id)]);
105
+ }
106
+ /**
107
+ * The platform skills on in the org (`ids`: only those), minus the ones whose name an org skill of
108
+ * its own already uses (rule 10: the org's wins; logged unless that skill is a copy of the same
109
+ * component: linked to it, or carrying the same plugin's provenance before the migration linked
110
+ * it). On in the org:
111
+ * - never when the skill or its plugin is disabled (or its plugin is deleted);
112
+ * - `follow`: its plugin is on in the org (a live install, or builtin) and no component switch of
113
+ * the org says off;
114
+ * - `own`: `wantedOn` over the skill's own scope, the org's list membership and its switch.
115
+ * One query for the skills with their plugin and org state, one for the org's names.
116
+ */
117
+ async function platformOn(db, orgId, ids, log) {
118
+ const rows = await platformRowsOn(db, orgId, ids);
119
+ if (rows.length === 0)
120
+ return [];
121
+ const own = await db
122
+ .selectFrom("skills")
123
+ .select(["id", "name", "platform_skill_id", "catalog_item_id"])
124
+ .where("org_id", "=", orgId)
125
+ .where("scope", "=", "org")
126
+ .where("deleted_at", "is", null)
127
+ .where((eb) => eb.or([eb("platform_skill_id", "is", null), eb("pinned_version", "is not", null)]))
128
+ .where("name", "in", [...new Set(rows.map((r) => r.name))])
129
+ .execute();
130
+ const ownByName = new Map(own.map((r) => [r.name, r]));
131
+ const out = [];
132
+ const taken = new Map();
133
+ rows.sort((a, b) => (a.plugin_name ?? "") < (b.plugin_name ?? "")
134
+ ? -1
135
+ : (a.plugin_name ?? "") > (b.plugin_name ?? "")
136
+ ? 1
137
+ : a.id < b.id
138
+ ? -1
139
+ : 1);
140
+ for (const r of rows) {
141
+ const o = ownByName.get(r.name);
142
+ if (o) {
143
+ const sameComponent = o.platform_skill_id === r.id ||
144
+ (o.catalog_item_id !== null && o.catalog_item_id === r.catalog_item_id);
145
+ if (!sameComponent) {
146
+ log?.warn("platform skill shadowed by an org skill of the same name", {
147
+ orgId,
148
+ name: r.name,
149
+ platformSkillId: r.id,
150
+ skillId: o.id,
151
+ });
152
+ }
153
+ continue;
154
+ }
155
+ const first = taken.get(r.name);
156
+ if (first !== undefined) {
157
+ log?.warn("platform skills share a name in one org", {
158
+ orgId,
159
+ name: r.name,
160
+ kept: first,
161
+ dropped: r.id,
162
+ });
163
+ continue;
164
+ }
165
+ taken.set(r.name, r.id);
166
+ out.push({
167
+ id: r.id,
168
+ name: r.name,
169
+ description: r.manifest.description,
170
+ version: r.current_version,
171
+ source: platformSource(r.object_prefix),
172
+ plugin: r.plugin_name,
173
+ origin: "platform",
174
+ platformSkillId: r.id,
175
+ scope: "org",
176
+ agentId: null,
177
+ manifest: r.manifest,
178
+ format: r.source_format,
179
+ });
180
+ }
181
+ return out;
182
+ }
183
+ /**
184
+ * The org's live skills by id (`ids`; ids that are no usable skill are missing from the map): an
185
+ * agent's own skill or an org skill with its current version; an org copy linked to a platform
186
+ * skill without a pin (ruling B2) as that platform skill's current version under the copy's id,
187
+ * while the platform skill is on in the org; a pinned copy as its own version, while its platform
188
+ * skill is on in the org (ruling P2-18); a platform skill id while it is on in the org.
189
+ */
190
+ export async function skillVersionsById(db, orgId, ids, log) {
191
+ const unique = [...new Set(ids)];
192
+ const out = new Map();
193
+ if (unique.length === 0)
194
+ return out;
195
+ const rows = await db
196
+ .selectFrom("skills as s")
197
+ .innerJoin("skill_versions as v", (j) => j.onRef("v.skill_id", "=", "s.id").onRef("v.version", "=", "s.current_version"))
198
+ .leftJoin("catalog_items as c", "c.id", "s.catalog_item_id")
199
+ .select([
200
+ "s.id",
201
+ "s.scope",
202
+ "s.agent_id",
203
+ "s.name",
204
+ "s.current_version",
205
+ "s.platform_skill_id",
206
+ "s.pinned_version",
207
+ "v.manifest",
208
+ "v.object_prefix",
209
+ "v.source_format",
210
+ "c.name as item_name",
211
+ ])
212
+ .where("s.org_id", "=", orgId)
213
+ .where("s.deleted_at", "is", null)
214
+ .where("s.id", "in", unique)
215
+ .execute();
216
+ const linked = rows.filter((r) => r.scope === "org" && r.platform_skill_id !== null && r.pinned_version === null);
217
+ const pinned = rows.filter((r) => r.scope === "org" && r.platform_skill_id !== null && r.pinned_version !== null);
218
+ const known = new Set(rows.map((r) => r.id));
219
+ const platformIds = [
220
+ ...new Set([
221
+ ...unique.filter((id) => !known.has(id)),
222
+ ...linked.map((r) => r.platform_skill_id),
223
+ ]),
224
+ ];
225
+ const platform = new Map((await platformOn(db, orgId, platformIds, log)).map((p) => [p.id, p]));
226
+ const owned = await ownedPlatformIds(db, orgId, linked.map((r) => r.platform_skill_id));
227
+ // ruling P2-18: a pinned copy serves its own version while its platform skill is on in the org
228
+ const pinnedOn = await pinnedSkillLinksServed(db, orgId, pinned.map((r) => r.platform_skill_id));
229
+ for (const r of rows) {
230
+ if (linked.includes(r)) {
231
+ const p = platform.get(r.platform_skill_id);
232
+ if (!p)
233
+ continue;
234
+ if (!owned.has(p.id)) {
235
+ out.set(r.id, { ...p, id: r.id });
236
+ continue;
237
+ }
238
+ // the org's own skill, promoted (ruling P3-3): promotion copied its current version to the
239
+ // platform under the same number, so while that is still the platform's current version it
240
+ // serves its own stored version (its snapshot source stays); a newer platform version (the
241
+ // owner's later upload, ruling P3-4) serves under its id. Either way it is the org's own.
242
+ if (r.current_version !== p.version) {
243
+ out.set(r.id, { ...p, id: r.id, origin: "org", plugin: r.item_name });
244
+ continue;
245
+ }
246
+ }
247
+ if (pinned.includes(r) && !pinnedOn.has(r.platform_skill_id))
248
+ continue;
249
+ out.set(r.id, {
250
+ id: r.id,
251
+ name: r.name,
252
+ description: r.manifest.description,
253
+ version: r.current_version,
254
+ source: r.object_prefix,
255
+ plugin: r.item_name,
256
+ origin: "org",
257
+ ...(r.platform_skill_id !== null && { platformSkillId: r.platform_skill_id }),
258
+ scope: r.scope,
259
+ agentId: r.agent_id,
260
+ manifest: r.manifest,
261
+ format: r.source_format,
262
+ });
263
+ }
264
+ for (const id of unique) {
265
+ const p = platform.get(id);
266
+ if (p && !known.has(id))
267
+ out.set(id, p);
268
+ }
269
+ return out;
270
+ }
271
+ /**
272
+ * The ids among `platformIds` of the live platform skills owned by `orgId` (promoted from its own
273
+ * skills, ruling P3-3).
274
+ */
275
+ async function ownedPlatformIds(db, orgId, platformIds) {
276
+ if (platformIds.length === 0)
277
+ return new Set();
278
+ const rows = await db
279
+ .selectFrom("platform_skills")
280
+ .select("id")
281
+ .where("id", "in", [...new Set(platformIds)])
282
+ .where("owner_org_id", "=", orgId)
283
+ .where("deleted_at", "is", null)
284
+ .execute();
285
+ return new Set(rows.map((r) => r.id));
286
+ }
287
+ /**
288
+ * The skills an agent selects, sorted by id: its own skills (`scope = 'agent'`) and the ids of
289
+ * `orgSkills` that resolve ({@link skillVersionsById}: org skills, linked copies, platform skills
290
+ * on in the org). Not deduplicated by name.
291
+ */
292
+ export async function selectedSkills(db, a, log) {
293
+ const agentOwn = await db
294
+ .selectFrom("skills")
295
+ .select("id")
296
+ .where("org_id", "=", a.orgId)
297
+ .where("scope", "=", "agent")
298
+ .where("agent_id", "=", a.agentId)
299
+ .where("deleted_at", "is", null)
300
+ .execute();
301
+ const orgSkills = new Set(a.orgSkills);
302
+ const byId = await skillVersionsById(db, a.orgId, [...agentOwn.map((r) => r.id), ...orgSkills], log);
303
+ return [...byId.values()]
304
+ .filter((r) => (r.scope === "agent" ? r.agentId === a.agentId : orgSkills.has(r.id)))
305
+ .sort((x, y) => (x.id < y.id ? -1 : x.id > y.id ? 1 : 0));
306
+ }
307
+ /**
308
+ * The org's usable skills, sorted by name: its own live org skills (`scope = 'org'`, unlinked, or
309
+ * pinned while their platform skill is on in the org, ruling P2-18) and the platform skills on in
310
+ * the org (see {@link platformOn}). An org copy linked
311
+ * without a pin is not listed: its platform skill is; except the org's own skill it promoted
312
+ * (ruling P3-3), listed once under its own id instead of the platform skill.
313
+ * `log` receives the name-clash warnings.
314
+ */
315
+ export async function usableSkills(db, orgId, log) {
316
+ return (await usableSkillVersions(db, orgId, log)).map(({ scope: _s, agentId: _a, manifest: _m, format: _f, ...u }) => u);
317
+ }
318
+ /** {@link usableSkills} with each skill's manifest and format. */
319
+ export async function usableSkillVersions(db, orgId, log) {
320
+ const own = await db
321
+ .selectFrom("skills as s")
322
+ .innerJoin("skill_versions as v", (j) => j.onRef("v.skill_id", "=", "s.id").onRef("v.version", "=", "s.current_version"))
323
+ .leftJoin("catalog_items as c", "c.id", "s.catalog_item_id")
324
+ .select([
325
+ "s.id",
326
+ "s.name",
327
+ "s.current_version",
328
+ "s.platform_skill_id",
329
+ "v.manifest",
330
+ "v.object_prefix",
331
+ "v.source_format",
332
+ "c.name as item_name",
333
+ ])
334
+ .where("s.org_id", "=", orgId)
335
+ .where("s.scope", "=", "org")
336
+ .where("s.deleted_at", "is", null)
337
+ .where((eb) => eb.or([eb("s.platform_skill_id", "is", null), eb("s.pinned_version", "is not", null)]))
338
+ .execute();
339
+ // ruling P2-18: a pinned copy follows its platform skill's availability (the pin fixes the
340
+ // version only)
341
+ const pinnedOn = await pinnedSkillLinksServed(db, orgId, [
342
+ ...new Set(own.flatMap((r) => (r.platform_skill_id === null ? [] : [r.platform_skill_id]))),
343
+ ]);
344
+ const rows = own
345
+ .filter((r) => r.platform_skill_id === null || pinnedOn.has(r.platform_skill_id))
346
+ .map((r) => ({
347
+ id: r.id,
348
+ name: r.name,
349
+ description: r.manifest.description,
350
+ version: r.current_version,
351
+ source: r.object_prefix,
352
+ plugin: r.item_name,
353
+ origin: "org",
354
+ ...(r.platform_skill_id !== null && { platformSkillId: r.platform_skill_id }),
355
+ scope: "org",
356
+ agentId: null,
357
+ manifest: r.manifest,
358
+ format: r.source_format,
359
+ }));
360
+ // the org's own skills it promoted: under their own ids, instead of their platform skills
361
+ const promoted = await db
362
+ .selectFrom("skills as s")
363
+ .innerJoin("platform_skills as p", "p.id", "s.platform_skill_id")
364
+ .select(["s.id", "s.platform_skill_id"])
365
+ .where("s.org_id", "=", orgId)
366
+ .where("s.scope", "=", "org")
367
+ .where("s.deleted_at", "is", null)
368
+ .where("s.pinned_version", "is", null)
369
+ .where("p.owner_org_id", "=", orgId)
370
+ .where("p.deleted_at", "is", null)
371
+ .execute();
372
+ const promotedTo = new Set(promoted.map((r) => r.platform_skill_id));
373
+ if (promoted.length > 0) {
374
+ const served = await skillVersionsById(db, orgId, promoted.map((r) => r.id), log);
375
+ rows.push(...served.values());
376
+ }
377
+ rows.push(...(await platformOn(db, orgId, undefined, log)).filter((p) => !promotedTo.has(p.id)));
378
+ return rows.sort(byNameThenId);
379
+ }
@@ -32,6 +32,16 @@ export interface ApprovalRecord {
32
32
  decidedAt: string | null;
33
33
  /** The reason given with a denial (null otherwise). */
34
34
  denyReason: string | null;
35
+ /** The kernel-rendered summary of the call (a per-call policy's; null otherwise). */
36
+ summary: {
37
+ zh: string;
38
+ en: string;
39
+ } | null;
40
+ /**
41
+ * The scopes the decider may choose: stored with the approval (a per-call policy that may not
42
+ * be remembered stores `["once"]`), else derived: only "once" for a role escalation.
43
+ */
44
+ scopes: ApprovalScope[];
35
45
  expiresAt: string;
36
46
  createdAt: string;
37
47
  }
@@ -54,8 +64,9 @@ export interface ApprovalView extends ApprovalRecord {
54
64
  name: string;
55
65
  };
56
66
  /**
57
- * 网页中该会话的路径(不含语言前缀)。A sub-agent's approval links to its parent conversation
58
- * with the sub-agent open: `/chat/<parent>?subagent=<child>`.
67
+ * 网页中该会话的路径(不含语言前缀)。A sub-agent's approval, at any depth, links to the root
68
+ * conversation of its tree with the sub-agent open: `/chat/<root>?subagent=<child>` (agent map
69
+ * spec §7).
59
70
  */
60
71
  conversationPath: string;
61
72
  /** Set when the approval belongs to a sub-agent: the conversation it was dispatched from. */
@@ -82,6 +93,13 @@ export interface ApprovalRequestInput {
82
93
  attempt?: number;
83
94
  /** Which rule asked (written to `approval_requested.policy`; display only). */
84
95
  policy?: ApprovalPolicySource;
96
+ /** The kernel-rendered summary of the call (per-call policies). */
97
+ summary?: {
98
+ zh: string;
99
+ en: string;
100
+ };
101
+ /** The scopes the decider may choose; unset: derived (see {@link ApprovalRecord.scopes}). */
102
+ scopes?: ApprovalScope[];
85
103
  }
86
104
  export interface DecisionInput {
87
105
  decision: "approve" | "deny";
@@ -20,6 +20,7 @@ import { TransactionHost } from "../infra/database/transaction-host.js";
20
20
  import { Transactional } from "../infra/database/transactional.decorator.js";
21
21
  import { KernelEvents } from "../infra/events/kernel-events.js";
22
22
  import { ORG_ROLES, roleAtLeast } from "../orgs/roles.js";
23
+ import { rootConversationOf } from "../runtime/subagents/child.js";
23
24
  import { pluginDisplayNames } from "./display-names.js";
24
25
  export { APPROVAL_DENY_REASON_MAX_CHARS } from "../conversations/events.js";
25
26
  /** `list` 一次最多返回的审批数(收件箱据此判断这个来源是否取满)。 */
@@ -27,6 +28,8 @@ export const APPROVALS_LIST_MAX = 100;
27
28
  const notFound = () => new ApiError("approval.not_found", "Approval not found");
28
29
  const iso = (v) => new Date(v).toISOString();
29
30
  const isRole = (v) => v !== null && ORG_ROLES.includes(v);
31
+ /** The scopes of an approval without stored ones: a role escalation is approved only once. */
32
+ const derivedScopes = (requestedFor) => requestedFor === null ? ["once"] : ["once", "session", "always"];
30
33
  function toRecord(r) {
31
34
  return {
32
35
  id: r.id,
@@ -46,6 +49,8 @@ function toRecord(r) {
46
49
  decidedBy: r.decided_by,
47
50
  decidedAt: r.decided_at === null ? null : iso(r.decided_at),
48
51
  denyReason: r.deny_reason,
52
+ summary: r.summary ?? null,
53
+ scopes: r.scopes ?? derivedScopes(r.requested_for),
49
54
  expiresAt: iso(r.expires_at),
50
55
  createdAt: iso(r.created_at),
51
56
  };
@@ -125,6 +130,8 @@ let ApprovalsService = class ApprovalsService {
125
130
  input: JSON.stringify(input.input ?? {}),
126
131
  requested_for: input.requestedFor,
127
132
  approver_role: input.approverRole,
133
+ summary: input.summary === undefined ? null : JSON.stringify(input.summary),
134
+ scopes: input.scopes ?? null,
128
135
  scope: null,
129
136
  decided_by: null,
130
137
  expires_at: sql `now() + ${hours}::integer * interval '1 hour'`,
@@ -267,6 +274,11 @@ let ApprovalsService = class ApprovalsService {
267
274
  if (scope !== null && scope !== "once" && before.requestedFor === null) {
268
275
  throw new ApiError("validation_failed", 'Only scope "once" is allowed for role-escalated approvals', [{ path: "scope", message: 'Only "once" is allowed for role-escalated approvals' }]);
269
276
  }
277
+ // the scopes stored with the approval (an org / platform operation: "once" only), whatever
278
+ // the client offered
279
+ if (scope !== null && !before.scopes.includes(scope)) {
280
+ throw new ApiError("approval.scope_not_allowed", `Scope "${scope}" is not allowed for this approval; allowed: ${before.scopes.join(", ")}`);
281
+ }
270
282
  const updated = await t
271
283
  .updateTable("approvals")
272
284
  .set({
@@ -283,12 +295,14 @@ let ApprovalsService = class ApprovalsService {
283
295
  const hash = before.specHash;
284
296
  const connectorId = before.connectorId;
285
297
  if (scope === "session") {
286
- // a sub-agent's grant is its parent conversation's (sub-agents spec §9): its siblings and
287
- // the parent itself are not asked again for the same call
298
+ // a sub-agent's grant is the root conversation's (agent map spec §7): the root and every
299
+ // agent of its tree, at any depth, are not asked again for the same call
288
300
  await t
289
301
  .insertInto("conversation_tool_grants")
290
302
  .values({
291
- conversation_id: ctx.parent_conversation_id ?? before.conversationId,
303
+ conversation_id: ctx.parent_conversation_id === null
304
+ ? before.conversationId
305
+ : await rootConversationOf(t, ctx.parent_conversation_id),
292
306
  tool_key: before.toolKey,
293
307
  spec_hash: hash,
294
308
  connector_id: connectorId,
@@ -571,6 +585,11 @@ let ApprovalsService = class ApprovalsService {
571
585
  .where("runs.id", "in", [...new Set(recs.map((r) => r.runId))])
572
586
  .execute();
573
587
  const ctx = new Map(ctxRows.map((r) => [r.id, r]));
588
+ // a sub-agent's approval links to the root conversation of its tree (agent map spec §7)
589
+ const roots = new Map();
590
+ for (const p of new Set(ctxRows.flatMap((r) => r.parent_conversation_id ?? []))) {
591
+ roots.set(p, await rootConversationOf(db.db, p));
592
+ }
574
593
  const names = await this.agentNames([...new Set(ctxRows.map((r) => r.agent_id))]);
575
594
  const connectorIds = [
576
595
  ...new Set(recs.flatMap((r) => (r.connectorId === null ? [] : [r.connectorId]))),
@@ -615,7 +634,7 @@ let ApprovalsService = class ApprovalsService {
615
634
  agent: { id: c.agent_id, name: names.get(c.agent_id) ?? "" },
616
635
  ...(c.parent_conversation_id !== null
617
636
  ? {
618
- conversationPath: `/chat/${c.parent_conversation_id}?subagent=${r.conversationId}`,
637
+ conversationPath: `/chat/${roots.get(c.parent_conversation_id) ?? c.parent_conversation_id}?subagent=${r.conversationId}`,
619
638
  parentConversationId: c.parent_conversation_id,
620
639
  }
621
640
  : { conversationPath: `/chat/${r.conversationId}` }),
@@ -21,10 +21,13 @@ export declare const BUILTIN: {
21
21
  readonly ReadToolOutput: "ReadToolOutput";
22
22
  readonly ToolSearch: "ToolSearch";
23
23
  readonly Agent: "Agent";
24
+ readonly SendMessage: "SendMessage";
25
+ readonly SubagentHandback: "SubagentHandback";
24
26
  readonly TaskOutput: "TaskOutput";
25
27
  readonly TaskStop: "TaskStop";
26
28
  readonly WebSearch: "WebSearch";
27
29
  readonly WebFetch: "WebFetch";
30
+ readonly Platform: "Platform";
28
31
  };
29
32
  export type BuiltinName = (typeof BUILTIN)[keyof typeof BUILTIN];
30
33
  /**
@@ -49,7 +52,9 @@ export declare const SANDBOX_ASK_TOOL_NAMES: ReadonlySet<string>;
49
52
  * Every builtin name. Saving an agent checks builtin refs against this list, not against what is
50
53
  * registered now, so the order the implementations land in never affects a saved definition.
51
54
  * `SkillWrite` is available only when a definition names it; `ToolSearch` and `Skill` are added
52
- * by the registry; `Agent` dispatches sub-agents and its description is built per agent.
55
+ * by the registry; `Agent` dispatches sub-agents and its description is built per agent;
56
+ * `SendMessage` and `SubagentHandback` are added by the registry ({@link SUBAGENT_MESSAGE_TOOLS}).
57
+ * `Platform` calls the platform's own operations as the run's person (Platform tool spec).
53
58
  */
54
59
  export declare const BUILTIN_TOOL_NAMES: readonly BuiltinName[];
55
60
  /** The builtin that loads a skill (added by the registry when the log has a skills catalog). */
@@ -58,6 +63,16 @@ export declare const SKILL_LOAD: "Skill";
58
63
  export declare const TOOL_SEARCH: "ToolSearch";
59
64
  /** The builtin that dispatches sub-agents. */
60
65
  export declare const AGENT_TOOL: "Agent";
66
+ /** The builtin that sends a message to one of the caller's sub-agents or to its parent. */
67
+ export declare const SEND_MESSAGE: "SendMessage";
68
+ /** The builtin that hands a sub-agent's report back to its parent (sub-agents only). */
69
+ export declare const SUBAGENT_HANDBACK: "SubagentHandback";
70
+ /**
71
+ * The tools between the agents of one tree (agent map spec §4.2, §4.3), added by the registry
72
+ * whatever a definition names: `SendMessage` to an agent that has `Agent` or a parent, and
73
+ * `SubagentHandback` to a sub-agent. A definition's ref to either is ignored.
74
+ */
75
+ export declare const SUBAGENT_MESSAGE_TOOLS: ReadonlySet<string>;
61
76
  /**
62
77
  * Tool keys on the spec 3.6 R3 fixed list ("allowed is not confirmed"): their policy is at least
63
78
  * `ask` and remembered grants never let them through. `SkillWrite` changes shared skills.
@@ -70,14 +85,15 @@ export declare const R3_FIXED_ASK_TOOL_KEYS: ReadonlySet<string>;
70
85
  */
71
86
  export declare const R3_SHARED_AGENT_ONLY_TOOL_KEYS: ReadonlySet<string>;
72
87
  /**
73
- * Tools a sub-agent never gets (sub-agents spec §5.3, §5.5): `Agent` (depth 1), `AskUserQuestion`
74
- * (the person does not see the child), `Deliver` (delivering files is the parent's job) and
75
- * `SkillWrite`.
88
+ * Tools a sub-agent never gets (sub-agents spec §5.3, §5.5): `AskUserQuestion` (the person does
89
+ * not see the child), `Deliver` (delivering files is the parent's job) and `SkillWrite`. `Agent`
90
+ * is removed only from a child at `subagents.maxDepth` (agent map spec §4.1, `effectiveDefinition`).
76
91
  */
77
- export declare const CHILD_REMOVED_TOOLS: readonly ["Agent", "AskUserQuestion", "Deliver", "SkillWrite"];
92
+ export declare const CHILD_REMOVED_TOOLS: readonly ["AskUserQuestion", "Deliver", "SkillWrite"];
78
93
  /**
79
94
  * The tools of a new agent created without `tools` (`ToolSearch` is added by the registry, never
80
95
  * by a definition). Only for create requests; updates and stored versions get no defaults.
96
+ * `Platform` is on by default (Platform tool spec §3: reads are harmless, every write confirmed).
81
97
  */
82
98
  export declare const DEFAULT_AGENT_TOOLS: AgentToolRef[];
83
99
  /** Kinds of the builtin tools (display only); a builtin missing here is a plain `tool`. */