@capybara-hq/kernel 0.1.0-rc.2 → 0.1.0-rc.21

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 (1039) hide show
  1. package/bootstrap.json +94 -5
  2. package/dist/admin/admin-agents.controller.d.ts +28 -0
  3. package/dist/admin/admin-agents.controller.js +79 -0
  4. package/dist/admin/admin-connectors.controller.d.ts +29 -0
  5. package/dist/admin/admin-connectors.controller.js +79 -0
  6. package/dist/admin/admin-items.schemas.d.ts +42 -0
  7. package/dist/admin/admin-items.schemas.js +48 -0
  8. package/dist/admin/admin.controller.d.ts +52 -80
  9. package/dist/admin/admin.controller.js +112 -81
  10. package/dist/admin/admin.module.d.ts +4 -1
  11. package/dist/admin/admin.module.js +50 -4
  12. package/dist/admin/admin.schemas.d.ts +69 -0
  13. package/dist/admin/admin.schemas.js +53 -0
  14. package/dist/admin/audit.controller.d.ts +14 -0
  15. package/dist/admin/audit.controller.js +42 -0
  16. package/dist/admin/audit.schemas.d.ts +8 -0
  17. package/dist/admin/audit.schemas.js +17 -0
  18. package/dist/admin/extensions.controller.d.ts +34 -3
  19. package/dist/admin/extensions.controller.js +66 -8
  20. package/dist/admin/extensions.schemas.d.ts +7 -0
  21. package/dist/admin/extensions.schemas.js +10 -0
  22. package/dist/admin/health.service.d.ts +104 -0
  23. package/dist/admin/health.service.js +246 -0
  24. package/dist/admin/limit-defaults.d.ts +20 -0
  25. package/dist/admin/limit-defaults.js +10 -0
  26. package/dist/admin/overview.controller.d.ts +31 -0
  27. package/dist/admin/overview.controller.js +78 -0
  28. package/dist/admin/overview.schemas.d.ts +8 -0
  29. package/dist/admin/overview.schemas.js +13 -0
  30. package/dist/admin/overview.service.d.ts +112 -0
  31. package/dist/admin/overview.service.js +223 -0
  32. package/dist/admin/platform-audit.service.d.ts +41 -0
  33. package/dist/admin/platform-audit.service.js +70 -0
  34. package/dist/admin/setup-lock.d.ts +1 -1
  35. package/dist/admin/setup-lock.js +1 -1
  36. package/dist/admin/setup.controller.d.ts +1 -1
  37. package/dist/admin/setup.controller.js +1 -1
  38. package/dist/admin/setup.service.d.ts +4 -4
  39. package/dist/admin/setup.service.js +8 -8
  40. package/dist/admin/usage.service.d.ts +149 -0
  41. package/dist/admin/usage.service.js +321 -0
  42. package/dist/agents/admin-agents.d.ts +92 -0
  43. package/dist/agents/admin-agents.js +170 -0
  44. package/dist/agents/agent-lookup.d.ts +24 -0
  45. package/dist/agents/agent-lookup.js +46 -2
  46. package/dist/agents/agent-profile.service.d.ts +31 -0
  47. package/dist/agents/agent-profile.service.js +122 -0
  48. package/dist/agents/agents.controller.d.ts +53 -168
  49. package/dist/agents/agents.controller.js +163 -34
  50. package/dist/agents/agents.module.d.ts +6 -2
  51. package/dist/agents/agents.module.js +41 -7
  52. package/dist/agents/agents.schemas.d.ts +392 -0
  53. package/dist/agents/agents.schemas.js +126 -0
  54. package/dist/agents/agents.service.d.ts +121 -36
  55. package/dist/agents/agents.service.js +411 -121
  56. package/dist/agents/definition.d.ts +142 -21
  57. package/dist/agents/definition.js +389 -43
  58. package/dist/agents/from-template.d.ts +106 -0
  59. package/dist/agents/from-template.js +680 -0
  60. package/dist/agents/from-template.service.d.ts +72 -0
  61. package/dist/agents/from-template.service.js +178 -0
  62. package/dist/agents/instruction-files.d.ts +60 -0
  63. package/dist/agents/instruction-files.js +111 -0
  64. package/dist/agents/models.controller.d.ts +44 -6
  65. package/dist/agents/models.controller.js +84 -8
  66. package/dist/agents/org-templates.d.ts +186 -0
  67. package/dist/agents/org-templates.js +876 -0
  68. package/dist/agents/pending-connector-requests.d.ts +79 -0
  69. package/dist/agents/pending-connector-requests.js +215 -0
  70. package/dist/agents/pending-connectors.controller.d.ts +39 -0
  71. package/dist/agents/pending-connectors.controller.js +91 -0
  72. package/dist/agents/pending-connectors.service.d.ts +62 -0
  73. package/dist/agents/pending-connectors.service.js +282 -0
  74. package/dist/agents/profile.d.ts +114 -0
  75. package/dist/agents/profile.js +55 -0
  76. package/dist/agents/readiness.controller.d.ts +26 -0
  77. package/dist/agents/readiness.controller.js +56 -0
  78. package/dist/agents/templates.controller.d.ts +77 -5
  79. package/dist/agents/templates.controller.js +153 -7
  80. package/dist/agents/templates.d.ts +127 -23
  81. package/dist/agents/templates.js +482 -44
  82. package/dist/agents/templates.schemas.d.ts +20 -0
  83. package/dist/agents/templates.schemas.js +45 -0
  84. package/dist/background/background.controller.d.ts +38 -0
  85. package/dist/background/background.controller.js +88 -0
  86. package/dist/background/background.module.d.ts +10 -0
  87. package/dist/background/background.module.js +39 -0
  88. package/dist/background/background.schemas.d.ts +10 -0
  89. package/dist/background/background.schemas.js +16 -0
  90. package/dist/background/finish.d.ts +44 -0
  91. package/dist/background/finish.js +95 -0
  92. package/dist/background/launch-lock.d.ts +15 -0
  93. package/dist/background/launch-lock.js +40 -0
  94. package/dist/background/launch.d.ts +42 -0
  95. package/dist/background/launch.js +77 -0
  96. package/dist/background/poll.job.d.ts +56 -0
  97. package/dist/background/poll.job.js +195 -0
  98. package/dist/background/render.d.ts +23 -0
  99. package/dist/background/render.js +48 -0
  100. package/dist/background/session.d.ts +48 -0
  101. package/dist/background/session.js +80 -0
  102. package/dist/background/status.d.ts +35 -0
  103. package/dist/background/status.js +57 -0
  104. package/dist/background/stop.d.ts +68 -0
  105. package/dist/background/stop.js +244 -0
  106. package/dist/background/store.d.ts +167 -0
  107. package/dist/background/store.js +361 -0
  108. package/dist/background/store.module.d.ts +6 -0
  109. package/dist/background/store.module.js +22 -0
  110. package/dist/background/tasks.service.d.ts +109 -0
  111. package/dist/background/tasks.service.js +271 -0
  112. package/dist/background/wake-rules.d.ts +66 -0
  113. package/dist/background/wake-rules.js +113 -0
  114. package/dist/background/wake.d.ts +30 -0
  115. package/dist/background/wake.js +63 -0
  116. package/dist/catalog/admin-catalog.controller.d.ts +136 -52
  117. package/dist/catalog/admin-catalog.controller.js +275 -65
  118. package/dist/catalog/admin-catalog.schemas.d.ts +82 -0
  119. package/dist/catalog/admin-catalog.schemas.js +99 -0
  120. package/dist/catalog/appearance.schemas.d.ts +10 -0
  121. package/dist/catalog/appearance.schemas.js +20 -0
  122. package/dist/catalog/appearance.service.d.ts +105 -0
  123. package/dist/catalog/appearance.service.js +306 -0
  124. package/dist/catalog/catalog-content.d.ts +122 -35
  125. package/dist/catalog/catalog-content.js +122 -14
  126. package/dist/catalog/catalog-files.d.ts +42 -0
  127. package/dist/catalog/catalog-files.js +89 -0
  128. package/dist/catalog/catalog-import.module.d.ts +7 -0
  129. package/dist/catalog/catalog-import.module.js +63 -0
  130. package/dist/catalog/catalog-items.d.ts +122 -7
  131. package/dist/catalog/catalog-items.js +301 -13
  132. package/dist/catalog/catalog-scope.service.d.ts +293 -0
  133. package/dist/catalog/catalog-scope.service.js +1236 -0
  134. package/dist/catalog/catalog.module.d.ts +7 -9
  135. package/dist/catalog/catalog.module.js +47 -31
  136. package/dist/catalog/catalog.service.d.ts +122 -31
  137. package/dist/catalog/catalog.service.js +177 -105
  138. package/dist/catalog/claude/agents.js +15 -10
  139. package/dist/catalog/claude/translate.js +3 -0
  140. package/dist/catalog/cli.d.ts +11 -1
  141. package/dist/catalog/cli.js +29 -1
  142. package/dist/catalog/component-promotion.d.ts +96 -0
  143. package/dist/catalog/component-promotion.js +395 -0
  144. package/dist/catalog/component-scope.controller.d.ts +102 -0
  145. package/dist/catalog/component-scope.controller.js +257 -0
  146. package/dist/catalog/component-scope.schemas.d.ts +118 -0
  147. package/dist/catalog/component-scope.schemas.js +97 -0
  148. package/dist/catalog/component-scope.service.d.ts +394 -0
  149. package/dist/catalog/component-scope.service.js +1133 -0
  150. package/dist/catalog/component-state.d.ts +207 -0
  151. package/dist/catalog/component-state.js +484 -0
  152. package/dist/catalog/git-source.d.ts +9 -1
  153. package/dist/catalog/git-source.js +29 -2
  154. package/dist/catalog/job-ids.d.ts +30 -0
  155. package/dist/catalog/job-ids.js +25 -0
  156. package/dist/catalog/marketplace-fetch.d.ts +1 -1
  157. package/dist/catalog/marketplace-icons.d.ts +64 -0
  158. package/dist/catalog/marketplace-icons.js +131 -0
  159. package/dist/catalog/marketplaces.controller.d.ts +50 -41
  160. package/dist/catalog/marketplaces.controller.js +130 -46
  161. package/dist/catalog/marketplaces.schemas.d.ts +48 -0
  162. package/dist/catalog/marketplaces.schemas.js +53 -0
  163. package/dist/catalog/marketplaces.service.d.ts +110 -17
  164. package/dist/catalog/marketplaces.service.js +337 -29
  165. package/dist/catalog/org-catalog.controller.d.ts +114 -62
  166. package/dist/catalog/org-catalog.controller.js +191 -98
  167. package/dist/catalog/org-catalog.schemas.d.ts +104 -0
  168. package/dist/catalog/org-catalog.schemas.js +107 -0
  169. package/dist/catalog/org-catalog.service.d.ts +72 -33
  170. package/dist/catalog/org-catalog.service.js +367 -158
  171. package/dist/catalog/org-extension-switch.d.ts +41 -0
  172. package/dist/catalog/org-extension-switch.js +115 -0
  173. package/dist/catalog/org-extension.controller.d.ts +133 -0
  174. package/dist/catalog/org-extension.controller.js +313 -0
  175. package/dist/catalog/org-extension.schemas.d.ts +15 -0
  176. package/dist/catalog/org-extension.schemas.js +22 -0
  177. package/dist/catalog/org-plugin-uploads.controller.d.ts +77 -0
  178. package/dist/catalog/org-plugin-uploads.controller.js +200 -0
  179. package/dist/catalog/org-plugin-uploads.d.ts +71 -0
  180. package/dist/catalog/org-plugin-uploads.js +122 -0
  181. package/dist/catalog/org-plugin-uploads.schemas.d.ts +20 -0
  182. package/dist/catalog/org-plugin-uploads.schemas.js +32 -0
  183. package/dist/catalog/owned-items.d.ts +188 -0
  184. package/dist/catalog/owned-items.js +808 -0
  185. package/dist/catalog/owned-plugin-cleanup.d.ts +56 -0
  186. package/dist/catalog/owned-plugin-cleanup.js +194 -0
  187. package/dist/catalog/ownership.d.ts +172 -0
  188. package/dist/catalog/ownership.js +326 -0
  189. package/dist/catalog/platform-components.d.ts +243 -0
  190. package/dist/catalog/platform-components.js +872 -0
  191. package/dist/catalog/platform-migration.d.ts +115 -0
  192. package/dist/catalog/platform-migration.js +583 -0
  193. package/dist/catalog/plugin-import.d.ts +254 -47
  194. package/dist/catalog/plugin-import.js +810 -112
  195. package/dist/catalog/plugin-install.d.ts +205 -42
  196. package/dist/catalog/plugin-install.js +828 -126
  197. package/dist/catalog/plugin-package.d.ts +43 -4
  198. package/dist/catalog/plugin-package.js +194 -7
  199. package/dist/catalog/plugin-upgrade.d.ts +308 -225
  200. package/dist/catalog/plugin-upgrade.js +1325 -1131
  201. package/dist/catalog/request-rules.d.ts +65 -0
  202. package/dist/catalog/request-rules.js +217 -0
  203. package/dist/catalog/requests.service.d.ts +194 -118
  204. package/dist/catalog/requests.service.js +530 -343
  205. package/dist/catalog/reserved-names.d.ts +8 -0
  206. package/dist/catalog/reserved-names.js +42 -0
  207. package/dist/catalog/scope-orgs.d.ts +21 -0
  208. package/dist/catalog/scope-orgs.js +67 -0
  209. package/dist/catalog/scope-state.d.ts +35 -0
  210. package/dist/catalog/scope-state.js +87 -0
  211. package/dist/catalog/scope-sync-workers.d.ts +7 -0
  212. package/dist/catalog/scope-sync-workers.js +29 -0
  213. package/dist/catalog/scope-sync.d.ts +176 -0
  214. package/dist/catalog/scope-sync.js +576 -0
  215. package/dist/catalog/scope.d.ts +42 -0
  216. package/dist/catalog/scope.js +42 -0
  217. package/dist/catalog/unshare.d.ts +22 -0
  218. package/dist/catalog/unshare.js +119 -0
  219. package/dist/channels/actions.js +10 -3
  220. package/dist/channels/cards.d.ts +36 -10
  221. package/dist/channels/cards.js +100 -25
  222. package/dist/channels/channels.module.js +13 -2
  223. package/dist/channels/channels.schemas.d.ts +41 -0
  224. package/dist/channels/channels.schemas.js +40 -0
  225. package/dist/channels/connections.controller.d.ts +46 -37
  226. package/dist/channels/connections.controller.js +76 -34
  227. package/dist/channels/connections.service.d.ts +102 -10
  228. package/dist/channels/connections.service.js +271 -24
  229. package/dist/channels/inbound.d.ts +11 -1
  230. package/dist/channels/inbound.js +87 -7
  231. package/dist/channels/outbound.d.ts +14 -1
  232. package/dist/channels/outbound.js +64 -15
  233. package/dist/channels/phrases.d.ts +33 -2
  234. package/dist/channels/phrases.js +29 -1
  235. package/dist/channels/supervisor.d.ts +2 -0
  236. package/dist/channels/supervisor.js +4 -0
  237. package/dist/channels/threads.d.ts +5 -0
  238. package/dist/channels/threads.js +8 -0
  239. package/dist/channels/webhook.d.ts +21 -1
  240. package/dist/channels/webhook.js +39 -4
  241. package/dist/client/client-access.service.d.ts +102 -0
  242. package/dist/client/client-access.service.js +303 -0
  243. package/dist/client/client-builds.service.d.ts +109 -0
  244. package/dist/client/client-builds.service.js +229 -0
  245. package/dist/client/client-delivery.controller.d.ts +25 -0
  246. package/dist/client/client-delivery.controller.js +66 -0
  247. package/dist/client/client-files.d.ts +48 -0
  248. package/dist/client/client-files.js +136 -0
  249. package/dist/client/client-reports.cron.d.ts +13 -0
  250. package/dist/client/client-reports.cron.js +42 -0
  251. package/dist/client/client-reports.service.d.ts +30 -0
  252. package/dist/client/client-reports.service.js +102 -0
  253. package/dist/client/client-sign-in.service.d.ts +21 -0
  254. package/dist/client/client-sign-in.service.js +49 -0
  255. package/dist/client/client.controller.d.ts +49 -0
  256. package/dist/client/client.controller.js +129 -0
  257. package/dist/client/client.module.d.ts +8 -0
  258. package/dist/client/client.module.js +28 -0
  259. package/dist/client/client.schemas.d.ts +61 -0
  260. package/dist/client/client.schemas.js +27 -0
  261. package/dist/config/docs.js +5 -1
  262. package/dist/config/schema.d.ts +35 -2
  263. package/dist/config/schema.js +216 -21
  264. package/dist/conversations/access.d.ts +6 -4
  265. package/dist/conversations/access.js +29 -5
  266. package/dist/conversations/agent-tree.d.ts +46 -0
  267. package/dist/conversations/agent-tree.js +92 -0
  268. package/dist/conversations/artifacts.d.ts +1 -1
  269. package/dist/conversations/artifacts.js +1 -1
  270. package/dist/conversations/attachments.service.d.ts +30 -0
  271. package/dist/conversations/attachments.service.js +130 -5
  272. package/dist/conversations/conversations.controller.d.ts +79 -44
  273. package/dist/conversations/conversations.controller.js +133 -82
  274. package/dist/conversations/conversations.module.d.ts +1 -1
  275. package/dist/conversations/conversations.module.js +10 -7
  276. package/dist/conversations/conversations.schemas.d.ts +52 -0
  277. package/dist/conversations/conversations.schemas.js +79 -0
  278. package/dist/conversations/conversations.service.d.ts +161 -13
  279. package/dist/conversations/conversations.service.js +329 -57
  280. package/dist/conversations/device-status.d.ts +24 -0
  281. package/dist/conversations/device-status.js +71 -0
  282. package/dist/conversations/event-log.d.ts +45 -9
  283. package/dist/conversations/event-log.js +113 -6
  284. package/dist/conversations/events.d.ts +255 -9
  285. package/dist/conversations/events.js +250 -34
  286. package/dist/conversations/message-context.d.ts +79 -0
  287. package/dist/conversations/message-context.js +145 -0
  288. package/dist/conversations/queue.d.ts +5 -2
  289. package/dist/conversations/queue.js +24 -4
  290. package/dist/conversations/queue.service.d.ts +2 -2
  291. package/dist/conversations/queue.service.js +21 -3
  292. package/dist/conversations/titles.d.ts +12 -3
  293. package/dist/conversations/titles.js +40 -16
  294. package/dist/conversations/tree.d.ts +17 -0
  295. package/dist/conversations/tree.js +42 -0
  296. package/dist/ctx/create-ctx.d.ts +48 -5
  297. package/dist/ctx/create-ctx.js +174 -34
  298. package/dist/db/kernel-schema.d.ts +668 -27
  299. package/dist/db/pool.d.ts +5 -0
  300. package/dist/db/pool.js +3 -0
  301. package/dist/devices/access.d.ts +66 -0
  302. package/dist/devices/access.js +113 -0
  303. package/dist/devices/conversation-devices.d.ts +75 -0
  304. package/dist/devices/conversation-devices.js +230 -0
  305. package/dist/devices/devices.controller.d.ts +36 -0
  306. package/dist/devices/devices.controller.js +124 -0
  307. package/dist/devices/devices.module.d.ts +8 -0
  308. package/dist/devices/devices.module.js +34 -0
  309. package/dist/devices/devices.schemas.d.ts +3 -0
  310. package/dist/devices/devices.schemas.js +14 -0
  311. package/dist/devices/devices.service.d.ts +251 -0
  312. package/dist/devices/devices.service.js +791 -0
  313. package/dist/devices/dto.d.ts +25 -0
  314. package/dist/devices/dto.js +12 -0
  315. package/dist/devices/label.d.ts +11 -0
  316. package/dist/devices/label.js +25 -0
  317. package/dist/devices/legacy-cleanup.job.d.ts +34 -0
  318. package/dist/devices/legacy-cleanup.job.js +141 -0
  319. package/dist/errors.d.ts +215 -3
  320. package/dist/errors.js +215 -3
  321. package/dist/evals/evals.module.js +11 -2
  322. package/dist/evals/evals.schemas.d.ts +110 -0
  323. package/dist/evals/evals.schemas.js +107 -0
  324. package/dist/evals/reconstruct.d.ts +18 -9
  325. package/dist/evals/reconstruct.js +36 -10
  326. package/dist/evals/recorded-tools.d.ts +37 -1
  327. package/dist/evals/recorded-tools.js +120 -10
  328. package/dist/evals/run-replay.d.ts +20 -3
  329. package/dist/evals/run-replay.js +78 -14
  330. package/dist/evals/runs.controller.d.ts +2 -57
  331. package/dist/evals/runs.controller.js +1 -42
  332. package/dist/evals/runs.service.d.ts +8 -7
  333. package/dist/evals/runs.service.js +45 -30
  334. package/dist/evals/sets.controller.d.ts +2 -28
  335. package/dist/evals/sets.controller.js +1 -31
  336. package/dist/evals/sets.service.d.ts +7 -7
  337. package/dist/evals/sets.service.js +23 -17
  338. package/dist/evals/snapshot.d.ts +3 -2
  339. package/dist/evals/snapshot.js +17 -4
  340. package/dist/evals/step-replay.d.ts +4 -6
  341. package/dist/evals/step-replay.js +16 -9
  342. package/dist/evals/trajectory.d.ts +5 -3
  343. package/dist/evals/trajectory.js +4 -1
  344. package/dist/evals/trajectory.service.d.ts +8 -3
  345. package/dist/evals/trajectory.service.js +26 -14
  346. package/dist/evals/worker.d.ts +5 -5
  347. package/dist/evals/worker.js +9 -3
  348. package/dist/extensions/admin-ops.d.ts +81 -14
  349. package/dist/extensions/admin-ops.js +181 -47
  350. package/dist/extensions/admin-view.d.ts +57 -10
  351. package/dist/extensions/admin-view.js +249 -27
  352. package/dist/extensions/approvals.d.ts +12 -2
  353. package/dist/extensions/blobs.d.ts +14 -1
  354. package/dist/extensions/blobs.js +49 -5
  355. package/dist/extensions/bootstrap.d.ts +85 -10
  356. package/dist/extensions/bootstrap.js +215 -36
  357. package/dist/extensions/cli.d.ts +12 -0
  358. package/dist/extensions/cli.js +11 -2
  359. package/dist/extensions/config-hash.d.ts +10 -0
  360. package/dist/extensions/config-hash.js +38 -0
  361. package/dist/extensions/config-issues.d.ts +13 -1
  362. package/dist/extensions/config-issues.js +22 -5
  363. package/dist/extensions/config-json-schema.d.ts +43 -7
  364. package/dist/extensions/config-json-schema.js +124 -58
  365. package/dist/extensions/deployment-config-store.d.ts +6 -0
  366. package/dist/extensions/deployment-config.d.ts +94 -9
  367. package/dist/extensions/deployment-config.js +255 -34
  368. package/dist/extensions/display-name.d.ts +22 -0
  369. package/dist/extensions/display-name.js +77 -0
  370. package/dist/extensions/effective-config.d.ts +133 -0
  371. package/dist/extensions/effective-config.js +379 -0
  372. package/dist/extensions/extensions.module.js +31 -12
  373. package/dist/extensions/guide-places.d.ts +68 -0
  374. package/dist/extensions/guide-places.js +152 -0
  375. package/dist/extensions/hooks.d.ts +37 -4
  376. package/dist/extensions/hooks.js +82 -16
  377. package/dist/extensions/host.d.ts +105 -12
  378. package/dist/extensions/host.js +372 -87
  379. package/dist/extensions/installs.d.ts +30 -9
  380. package/dist/extensions/installs.js +57 -16
  381. package/dist/extensions/instance.d.ts +17 -2
  382. package/dist/extensions/instance.js +21 -0
  383. package/dist/extensions/ledger.d.ts +1 -1
  384. package/dist/extensions/locks.d.ts +12 -0
  385. package/dist/extensions/locks.js +26 -0
  386. package/dist/extensions/org-config.d.ts +97 -7
  387. package/dist/extensions/org-config.js +215 -45
  388. package/dist/extensions/org-levels.d.ts +37 -0
  389. package/dist/extensions/org-levels.js +71 -0
  390. package/dist/extensions/org-overrides.d.ts +151 -0
  391. package/dist/extensions/org-overrides.js +524 -0
  392. package/dist/extensions/package.d.ts +18 -4
  393. package/dist/extensions/package.js +56 -3
  394. package/dist/extensions/permission-set.d.ts +35 -5
  395. package/dist/extensions/permission-set.js +36 -5
  396. package/dist/extensions/permission-view.d.ts +106 -13
  397. package/dist/extensions/permission-view.js +33 -15
  398. package/dist/extensions/plugin-guides.d.ts +282 -0
  399. package/dist/extensions/plugin-guides.js +554 -0
  400. package/dist/extensions/plugin-icons.d.ts +54 -0
  401. package/dist/extensions/plugin-icons.js +125 -0
  402. package/dist/extensions/plugin-items.d.ts +21 -0
  403. package/dist/extensions/plugin-items.js +42 -0
  404. package/dist/extensions/point-defaults.controller.d.ts +28 -0
  405. package/dist/extensions/point-defaults.controller.js +69 -0
  406. package/dist/extensions/point-defaults.d.ts +73 -0
  407. package/dist/extensions/point-defaults.js +236 -0
  408. package/dist/extensions/point-defaults.schemas.d.ts +9 -0
  409. package/dist/extensions/point-defaults.schemas.js +14 -0
  410. package/dist/extensions/registry.d.ts +1 -1
  411. package/dist/extensions/registry.js +2 -0
  412. package/dist/extensions/resolve.d.ts +51 -1
  413. package/dist/extensions/resolve.js +85 -3
  414. package/dist/extensions/single-provider.d.ts +92 -0
  415. package/dist/extensions/single-provider.js +180 -0
  416. package/dist/extensions/sources.d.ts +13 -2
  417. package/dist/extensions/sources.js +2 -0
  418. package/dist/extensions/state.module.d.ts +9 -0
  419. package/dist/extensions/state.module.js +46 -0
  420. package/dist/extensions/unavailable.d.ts +50 -0
  421. package/dist/extensions/unavailable.js +115 -0
  422. package/dist/files/previewers.controller.js +2 -3
  423. package/dist/files/previewers.d.ts +10 -3
  424. package/dist/files/previewers.js +40 -11
  425. package/dist/files/previewers.schemas.d.ts +10 -0
  426. package/dist/files/previewers.schemas.js +9 -0
  427. package/dist/http/api.module.js +76 -4
  428. package/dist/http/app.d.ts +11 -2
  429. package/dist/http/app.js +31 -5
  430. package/dist/http/gateway-routes.d.ts +7 -3
  431. package/dist/http/gateway-routes.js +6 -3
  432. package/dist/http/nest-logger.d.ts +6 -5
  433. package/dist/http/nest-logger.js +24 -10
  434. package/dist/http/plugin-dispatch.d.ts +4 -1
  435. package/dist/http/plugin-dispatch.js +14 -2
  436. package/dist/identity/accounts.d.ts +77 -31
  437. package/dist/identity/accounts.js +133 -52
  438. package/dist/identity/audit.d.ts +2 -1
  439. package/dist/identity/auth.controller.js +9 -5
  440. package/dist/identity/auth.guard.d.ts +13 -5
  441. package/dist/identity/auth.guard.js +35 -9
  442. package/dist/identity/cookies.d.ts +26 -5
  443. package/dist/identity/cookies.js +58 -6
  444. package/dist/identity/identity.module.d.ts +1 -1
  445. package/dist/identity/identity.module.js +7 -4
  446. package/dist/identity/initial-passwords.controller.d.ts +22 -0
  447. package/dist/identity/initial-passwords.controller.js +49 -0
  448. package/dist/identity/initial-passwords.d.ts +61 -0
  449. package/dist/identity/initial-passwords.job.d.ts +16 -0
  450. package/dist/identity/initial-passwords.job.js +46 -0
  451. package/dist/identity/initial-passwords.js +159 -0
  452. package/dist/identity/me.controller.d.ts +17 -1
  453. package/dist/identity/me.controller.js +45 -4
  454. package/dist/identity/me.schemas.d.ts +24 -0
  455. package/dist/identity/me.schemas.js +25 -0
  456. package/dist/identity/principal.d.ts +11 -3
  457. package/dist/identity/principal.js +11 -3
  458. package/dist/identity/sessions.d.ts +12 -0
  459. package/dist/identity/sessions.js +45 -0
  460. package/dist/identity/settings.d.ts +99 -12
  461. package/dist/identity/settings.js +234 -25
  462. package/dist/identity/{enterprise-admin.d.ts → super-admin.d.ts} +5 -5
  463. package/dist/identity/{enterprise-admin.js → super-admin.js} +24 -24
  464. package/dist/identity/write-actor.d.ts +11 -0
  465. package/dist/identity/write-actor.js +7 -0
  466. package/dist/inbox/inbox.module.d.ts +4 -1
  467. package/dist/inbox/inbox.module.js +7 -3
  468. package/dist/inbox/inbox.schemas.d.ts +8 -0
  469. package/dist/inbox/inbox.schemas.js +11 -0
  470. package/dist/inbox/inbox.service.d.ts +64 -4
  471. package/dist/inbox/inbox.service.js +74 -4
  472. package/dist/inbox/org-notices.d.ts +63 -0
  473. package/dist/inbox/org-notices.js +91 -0
  474. package/dist/inbox/platform-inbox.controller.d.ts +23 -0
  475. package/dist/inbox/platform-inbox.controller.js +58 -0
  476. package/dist/inbox/platform-inbox.service.d.ts +157 -0
  477. package/dist/inbox/platform-inbox.service.js +281 -0
  478. package/dist/inbox/platform-notices.d.ts +19 -0
  479. package/dist/inbox/platform-notices.js +9 -0
  480. package/dist/index.d.ts +6 -2
  481. package/dist/index.js +7 -1
  482. package/dist/infra/cli/kernel-cli.module.js +9 -1
  483. package/dist/infra/config/kernel-config.service.js +32 -1
  484. package/dist/infra/database/database.module.js +1 -0
  485. package/dist/infra/database/xact-lock.d.ts +1 -1
  486. package/dist/infra/database/xact-lock.js +1 -1
  487. package/dist/infra/events/kernel-events.d.ts +31 -3
  488. package/dist/infra/lifecycle/process-guards.js +4 -0
  489. package/dist/infra/lock/lock.service.d.ts +8 -0
  490. package/dist/infra/lock/lock.service.js +27 -0
  491. package/dist/infra/logging/logging.module.d.ts +4 -2
  492. package/dist/infra/logging/logging.module.js +24 -6
  493. package/dist/infra/presence/presence.module.d.ts +6 -0
  494. package/dist/infra/presence/presence.module.js +22 -0
  495. package/dist/infra/presence/replica-presence.d.ts +87 -0
  496. package/dist/infra/presence/replica-presence.js +189 -0
  497. package/dist/infra/queue/add-job-once.d.ts +14 -0
  498. package/dist/infra/queue/add-job-once.js +16 -0
  499. package/dist/infra/queue/redis-connection.d.ts +6 -0
  500. package/dist/infra/queue/redis-connection.js +7 -0
  501. package/dist/infra/redis/redis.module.js +6 -2
  502. package/dist/infra/throttler/named-throttlers.d.ts +12 -0
  503. package/dist/infra/throttler/named-throttlers.js +67 -0
  504. package/dist/infra/throttler/throttler.guard.js +1 -1
  505. package/dist/infra/tokens.d.ts +6 -1
  506. package/dist/infra/tokens.js +6 -1
  507. package/dist/kernel.module.js +15 -0
  508. package/dist/lifecycle/kernel-lifecycle.d.ts +9 -3
  509. package/dist/lifecycle/kernel-lifecycle.js +51 -11
  510. package/dist/local-devices/device-auth.controller.d.ts +42 -0
  511. package/dist/local-devices/device-auth.controller.js +116 -0
  512. package/dist/local-devices/device-auth.d.ts +119 -0
  513. package/dist/local-devices/device-auth.js +401 -0
  514. package/dist/local-devices/device-auth.module.d.ts +7 -0
  515. package/dist/local-devices/device-auth.module.js +25 -0
  516. package/dist/local-devices/device-routes.d.ts +36 -0
  517. package/dist/local-devices/device-routes.js +90 -0
  518. package/dist/local-devices/dto.d.ts +66 -0
  519. package/dist/local-devices/dto.js +44 -0
  520. package/dist/local-devices/keys.d.ts +25 -0
  521. package/dist/local-devices/keys.js +25 -0
  522. package/dist/local-devices/local-device-gateway.d.ts +134 -0
  523. package/dist/local-devices/local-device-gateway.js +542 -0
  524. package/dist/local-devices/local-device-provider.d.ts +89 -0
  525. package/dist/local-devices/local-device-provider.js +151 -0
  526. package/dist/local-devices/local-devices.module.d.ts +16 -0
  527. package/dist/local-devices/local-devices.module.js +44 -0
  528. package/dist/local-devices/machines.d.ts +118 -0
  529. package/dist/local-devices/machines.js +366 -0
  530. package/dist/local-devices/relay.d.ts +100 -0
  531. package/dist/local-devices/relay.js +373 -0
  532. package/dist/local-devices/targets.d.ts +28 -0
  533. package/dist/local-devices/targets.js +73 -0
  534. package/dist/log.d.ts +13 -1
  535. package/dist/log.js +93 -17
  536. package/dist/models/embeddings.d.ts +82 -0
  537. package/dist/models/embeddings.js +326 -0
  538. package/dist/models/enablement.controller.d.ts +40 -0
  539. package/dist/models/enablement.controller.js +74 -0
  540. package/dist/models/enablement.d.ts +101 -0
  541. package/dist/models/enablement.js +264 -0
  542. package/dist/models/models.module.d.ts +5 -1
  543. package/dist/models/models.module.js +16 -4
  544. package/dist/models/org-models.schemas.d.ts +8 -0
  545. package/dist/models/org-models.schemas.js +22 -0
  546. package/dist/models/prices.d.ts +8 -6
  547. package/dist/models/prices.js +11 -9
  548. package/dist/models/purposes.controller.d.ts +6 -4
  549. package/dist/models/purposes.controller.js +13 -7
  550. package/dist/models/purposes.d.ts +72 -14
  551. package/dist/models/purposes.js +115 -34
  552. package/dist/orgs/directory-sync.d.ts +14 -5
  553. package/dist/orgs/directory-sync.js +41 -17
  554. package/dist/orgs/offboarding.d.ts +12 -8
  555. package/dist/orgs/offboarding.js +54 -33
  556. package/dist/orgs/org-lock.d.ts +5 -0
  557. package/dist/orgs/org-lock.js +13 -0
  558. package/dist/orgs/org.guard.d.ts +10 -0
  559. package/dist/orgs/org.guard.js +43 -32
  560. package/dist/orgs/orgs.controller.d.ts +2 -5
  561. package/dist/orgs/orgs.controller.js +3 -6
  562. package/dist/orgs/orgs.module.js +3 -0
  563. package/dist/orgs/orgs.schemas.d.ts +8 -0
  564. package/dist/orgs/orgs.schemas.js +16 -0
  565. package/dist/orgs/orgs.service.d.ts +23 -8
  566. package/dist/orgs/orgs.service.js +38 -16
  567. package/dist/orgs/roles.d.ts +1 -1
  568. package/dist/orgs/roles.js +5 -1
  569. package/dist/orgs/settings.controller.d.ts +1 -1
  570. package/dist/orgs/settings.service.d.ts +66 -6
  571. package/dist/orgs/settings.service.js +89 -10
  572. package/dist/overrides.d.ts +16 -1
  573. package/dist/overrides.js +10 -0
  574. package/dist/platform/actor.d.ts +48 -0
  575. package/dist/platform/actor.js +100 -0
  576. package/dist/platform/agent-docs.d.ts +18 -0
  577. package/dist/platform/agent-docs.js +59 -0
  578. package/dist/platform/availability.d.ts +14 -0
  579. package/dist/platform/availability.js +43 -0
  580. package/dist/platform/errors.d.ts +28 -0
  581. package/dist/platform/errors.js +65 -0
  582. package/dist/platform/exclusions.d.ts +11 -0
  583. package/dist/platform/exclusions.js +774 -0
  584. package/dist/platform/method.d.ts +6 -0
  585. package/dist/platform/method.js +15 -0
  586. package/dist/platform/operation.d.ts +169 -0
  587. package/dist/platform/operation.js +102 -0
  588. package/dist/platform/ops/accounts.ops.d.ts +32 -0
  589. package/dist/platform/ops/accounts.ops.js +291 -0
  590. package/dist/platform/ops/admin-items.ops.d.ts +37 -0
  591. package/dist/platform/ops/admin-items.ops.js +278 -0
  592. package/dist/platform/ops/admin.ops.d.ts +38 -0
  593. package/dist/platform/ops/admin.ops.js +497 -0
  594. package/dist/platform/ops/agent-skills.ops.d.ts +50 -0
  595. package/dist/platform/ops/agent-skills.ops.js +509 -0
  596. package/dist/platform/ops/agent-templates.ops.d.ts +17 -0
  597. package/dist/platform/ops/agent-templates.ops.js +272 -0
  598. package/dist/platform/ops/agents.ops.d.ts +37 -0
  599. package/dist/platform/ops/agents.ops.js +730 -0
  600. package/dist/platform/ops/approvals.ops.d.ts +30 -0
  601. package/dist/platform/ops/approvals.ops.js +116 -0
  602. package/dist/platform/ops/background.ops.d.ts +14 -0
  603. package/dist/platform/ops/background.ops.js +134 -0
  604. package/dist/platform/ops/catalog-admin.ops.d.ts +92 -0
  605. package/dist/platform/ops/catalog-admin.ops.js +682 -0
  606. package/dist/platform/ops/channels.ops.d.ts +16 -0
  607. package/dist/platform/ops/channels.ops.js +195 -0
  608. package/dist/platform/ops/components.ops.d.ts +46 -0
  609. package/dist/platform/ops/components.ops.js +854 -0
  610. package/dist/platform/ops/connectors.ops.d.ts +17 -0
  611. package/dist/platform/ops/connectors.ops.js +190 -0
  612. package/dist/platform/ops/conversations.ops.d.ts +30 -0
  613. package/dist/platform/ops/conversations.ops.js +470 -0
  614. package/dist/platform/ops/devices.ops.d.ts +26 -0
  615. package/dist/platform/ops/devices.ops.js +311 -0
  616. package/dist/platform/ops/errors.d.ts +16 -0
  617. package/dist/platform/ops/errors.js +30 -0
  618. package/dist/platform/ops/evals.ops.d.ts +28 -0
  619. package/dist/platform/ops/evals.ops.js +783 -0
  620. package/dist/platform/ops/extensions-admin.ops.d.ts +25 -0
  621. package/dist/platform/ops/extensions-admin.ops.js +372 -0
  622. package/dist/platform/ops/extensions.ops.d.ts +25 -0
  623. package/dist/platform/ops/extensions.ops.js +347 -0
  624. package/dist/platform/ops/inbox.ops.d.ts +25 -0
  625. package/dist/platform/ops/inbox.ops.js +381 -0
  626. package/dist/platform/ops/marketplaces.ops.d.ts +22 -0
  627. package/dist/platform/ops/marketplaces.ops.js +466 -0
  628. package/dist/platform/ops/models.ops.d.ts +25 -0
  629. package/dist/platform/ops/models.ops.js +232 -0
  630. package/dist/platform/ops/org-plugins.ops.d.ts +35 -0
  631. package/dist/platform/ops/org-plugins.ops.js +388 -0
  632. package/dist/platform/ops/org-settings.ops.d.ts +18 -0
  633. package/dist/platform/ops/org-settings.ops.js +127 -0
  634. package/dist/platform/ops/orgs.ops.d.ts +28 -0
  635. package/dist/platform/ops/orgs.ops.js +298 -0
  636. package/dist/platform/ops/other-orgs.d.ts +20 -0
  637. package/dist/platform/ops/other-orgs.js +72 -0
  638. package/dist/platform/ops/paging.d.ts +14 -0
  639. package/dist/platform/ops/paging.js +20 -0
  640. package/dist/platform/ops/platform.ops.d.ts +30 -0
  641. package/dist/platform/ops/platform.ops.js +231 -0
  642. package/dist/platform/ops/plugins.ops.d.ts +35 -0
  643. package/dist/platform/ops/plugins.ops.js +476 -0
  644. package/dist/platform/ops/previewers.ops.d.ts +14 -0
  645. package/dist/platform/ops/previewers.ops.js +109 -0
  646. package/dist/platform/ops/requests.ops.d.ts +14 -0
  647. package/dist/platform/ops/requests.ops.js +191 -0
  648. package/dist/platform/ops/role.d.ts +4 -0
  649. package/dist/platform/ops/role.js +10 -0
  650. package/dist/platform/ops/setup.ops.d.ts +24 -0
  651. package/dist/platform/ops/setup.ops.js +212 -0
  652. package/dist/platform/ops/skills.ops.d.ts +17 -0
  653. package/dist/platform/ops/skills.ops.js +160 -0
  654. package/dist/platform/ops/summary.d.ts +10 -0
  655. package/dist/platform/ops/summary.js +18 -0
  656. package/dist/platform/ops/themes.ops.d.ts +14 -0
  657. package/dist/platform/ops/themes.ops.js +47 -0
  658. package/dist/platform/ops/ui.ops.d.ts +8 -0
  659. package/dist/platform/ops/ui.ops.js +41 -0
  660. package/dist/platform/ops/unavailable.d.ts +23 -0
  661. package/dist/platform/ops/unavailable.js +118 -0
  662. package/dist/platform/parity.d.ts +33 -0
  663. package/dist/platform/parity.js +272 -0
  664. package/dist/platform/platform-ops.module.d.ts +43 -0
  665. package/dist/platform/platform-ops.module.js +142 -0
  666. package/dist/platform/platform.module.d.ts +8 -0
  667. package/dist/platform/platform.module.js +25 -0
  668. package/dist/platform/registry.d.ts +30 -0
  669. package/dist/platform/registry.js +111 -0
  670. package/dist/platform/route-schemas.d.ts +18 -0
  671. package/dist/platform/route-schemas.js +85 -0
  672. package/dist/roles/gateway-role.d.ts +18 -3
  673. package/dist/roles/gateway-role.js +33 -5
  674. package/dist/roles/gateway.module.d.ts +2 -1
  675. package/dist/roles/gateway.module.js +6 -3
  676. package/dist/roles/worker-role.d.ts +6 -4
  677. package/dist/roles/worker-role.js +14 -7
  678. package/dist/roles/worker.module.d.ts +1 -1
  679. package/dist/roles/worker.module.js +21 -1
  680. package/dist/runtime/context/build.d.ts +21 -13
  681. package/dist/runtime/context/build.js +106 -29
  682. package/dist/runtime/context/claude-tools.d.ts +4 -1
  683. package/dist/runtime/context/claude-tools.js +13 -12
  684. package/dist/runtime/context/compaction.js +24 -1
  685. package/dist/runtime/context/device-paths.d.ts +40 -0
  686. package/dist/runtime/context/device-paths.js +48 -0
  687. package/dist/runtime/context/legacy-text.d.ts +22 -0
  688. package/dist/runtime/context/legacy-text.js +37 -0
  689. package/dist/runtime/context/reminders.d.ts +2 -0
  690. package/dist/runtime/context/reminders.js +2 -0
  691. package/dist/runtime/context/run-context.d.ts +65 -0
  692. package/dist/runtime/context/run-context.js +215 -0
  693. package/dist/runtime/context/skills.d.ts +29 -11
  694. package/dist/runtime/context/skills.js +46 -32
  695. package/dist/runtime/context/tool-changes.d.ts +27 -0
  696. package/dist/runtime/context/tool-changes.js +60 -0
  697. package/dist/runtime/hook-calls.d.ts +8 -1
  698. package/dist/runtime/hook-calls.js +40 -7
  699. package/dist/runtime/langgraph-loop.d.ts +3 -1
  700. package/dist/runtime/langgraph-loop.js +36 -17
  701. package/dist/runtime/loop.d.ts +35 -6
  702. package/dist/runtime/maintenance.d.ts +9 -4
  703. package/dist/runtime/maintenance.js +35 -8
  704. package/dist/runtime/model-call.d.ts +54 -11
  705. package/dist/runtime/model-call.js +105 -28
  706. package/dist/runtime/providers.d.ts +149 -29
  707. package/dist/runtime/providers.js +332 -63
  708. package/dist/runtime/run-context.service.d.ts +65 -0
  709. package/dist/runtime/run-context.service.js +236 -0
  710. package/dist/runtime/run-control.d.ts +11 -1
  711. package/dist/runtime/run-control.js +12 -0
  712. package/dist/runtime/run-drafts.d.ts +85 -0
  713. package/dist/runtime/run-drafts.js +230 -0
  714. package/dist/runtime/run-finish.d.ts +1 -1
  715. package/dist/runtime/run-jobs.d.ts +3 -5
  716. package/dist/runtime/run-jobs.js +7 -9
  717. package/dist/runtime/run-queue.d.ts +62 -5
  718. package/dist/runtime/run-queue.js +313 -40
  719. package/dist/runtime/run-worker.d.ts +19 -8
  720. package/dist/runtime/run-worker.js +105 -44
  721. package/dist/runtime/runtime.module.js +13 -3
  722. package/dist/runtime/step-log.d.ts +15 -4
  723. package/dist/runtime/step-log.js +24 -7
  724. package/dist/runtime/stream.controller.d.ts +23 -1
  725. package/dist/runtime/stream.controller.js +60 -3
  726. package/dist/runtime/stream.d.ts +4 -1
  727. package/dist/runtime/stream.js +27 -3
  728. package/dist/runtime/subagents/child.d.ts +55 -7
  729. package/dist/runtime/subagents/child.js +105 -7
  730. package/dist/runtime/subagents/definition.d.ts +31 -26
  731. package/dist/runtime/subagents/definition.js +89 -142
  732. package/dist/runtime/subagents/deliveries.d.ts +71 -0
  733. package/dist/runtime/subagents/deliveries.js +228 -0
  734. package/dist/runtime/subagents/dispatch.d.ts +116 -27
  735. package/dist/runtime/subagents/dispatch.js +213 -142
  736. package/dist/runtime/subagents/limits.d.ts +24 -5
  737. package/dist/runtime/subagents/limits.js +40 -6
  738. package/dist/runtime/subagents/messages.d.ts +95 -0
  739. package/dist/runtime/subagents/messages.js +328 -0
  740. package/dist/runtime/subagents/org-agents.js +2 -1
  741. package/dist/runtime/subagents/preamble.d.ts +4 -4
  742. package/dist/runtime/subagents/preamble.js +9 -7
  743. package/dist/runtime/subagents/progress.d.ts +8 -6
  744. package/dist/runtime/subagents/progress.js +11 -6
  745. package/dist/runtime/subagents/render.d.ts +30 -0
  746. package/dist/runtime/subagents/render.js +53 -0
  747. package/dist/runtime/subagents/roster.d.ts +25 -8
  748. package/dist/runtime/subagents/roster.js +48 -12
  749. package/dist/runtime/subagents/skill-fork.d.ts +4 -3
  750. package/dist/runtime/subagents/skill-fork.js +9 -5
  751. package/dist/runtime/subagents/status.d.ts +14 -0
  752. package/dist/runtime/subagents/status.js +23 -0
  753. package/dist/runtime/subagents/subagents.service.d.ts +9 -6
  754. package/dist/runtime/subagents/subagents.service.js +13 -8
  755. package/dist/runtime/usage-report-jobs.d.ts +88 -0
  756. package/dist/runtime/usage-report-jobs.js +158 -0
  757. package/dist/runtime/usage-report.d.ts +35 -39
  758. package/dist/runtime/usage-report.js +171 -97
  759. package/dist/runtime/waits.d.ts +148 -39
  760. package/dist/runtime/waits.js +426 -112
  761. package/dist/sandbox/jobs.d.ts +40 -13
  762. package/dist/sandbox/jobs.js +57 -20
  763. package/dist/sandbox/leases.d.ts +37 -54
  764. package/dist/sandbox/leases.js +71 -115
  765. package/dist/sandbox/providers.d.ts +34 -7
  766. package/dist/sandbox/providers.js +54 -9
  767. package/dist/sandbox/sandbox-file-reader.d.ts +35 -0
  768. package/dist/sandbox/sandbox-file-reader.js +98 -0
  769. package/dist/sandbox/sandbox.module.d.ts +3 -2
  770. package/dist/sandbox/sandbox.module.js +10 -4
  771. package/dist/sandbox/sandbox.service.d.ts +345 -132
  772. package/dist/sandbox/sandbox.service.js +883 -399
  773. package/dist/sandbox/unreachable.d.ts +30 -0
  774. package/dist/sandbox/unreachable.js +108 -0
  775. package/dist/setup/kernel-checks.d.ts +91 -0
  776. package/dist/setup/kernel-checks.js +295 -0
  777. package/dist/setup/oauth-token-probe.d.ts +47 -0
  778. package/dist/setup/oauth-token-probe.js +108 -0
  779. package/dist/setup/redact-check.d.ts +18 -0
  780. package/dist/setup/redact-check.js +46 -0
  781. package/dist/setup/setup-check-registry.d.ts +86 -0
  782. package/dist/setup/setup-check-registry.js +75 -0
  783. package/dist/setup/setup-checks.controller.d.ts +28 -0
  784. package/dist/setup/setup-checks.controller.js +78 -0
  785. package/dist/setup/setup-checks.schemas.d.ts +38 -0
  786. package/dist/setup/setup-checks.schemas.js +43 -0
  787. package/dist/setup/setup-checks.service.d.ts +144 -0
  788. package/dist/setup/setup-checks.service.js +683 -0
  789. package/dist/setup/setup-guides.controller.d.ts +18 -0
  790. package/dist/setup/setup-guides.controller.js +48 -0
  791. package/dist/setup/setup-guides.schemas.d.ts +10 -0
  792. package/dist/setup/setup-guides.schemas.js +6 -0
  793. package/dist/setup/setup-guides.service.d.ts +126 -0
  794. package/dist/setup/setup-guides.service.js +315 -0
  795. package/dist/setup/setup.module.d.ts +8 -0
  796. package/dist/setup/setup.module.js +31 -0
  797. package/dist/skills/agent-skills.controller.d.ts +48 -0
  798. package/dist/skills/agent-skills.controller.js +131 -0
  799. package/dist/skills/agent-skills.service.d.ts +262 -0
  800. package/dist/skills/agent-skills.service.js +996 -0
  801. package/dist/skills/catalog.d.ts +14 -11
  802. package/dist/skills/catalog.js +32 -50
  803. package/dist/skills/changes.controller.d.ts +12 -22
  804. package/dist/skills/changes.controller.js +27 -56
  805. package/dist/skills/changes.service.d.ts +69 -115
  806. package/dist/skills/changes.service.js +249 -598
  807. package/dist/skills/conversation-catalog.d.ts +53 -0
  808. package/dist/skills/conversation-catalog.js +149 -0
  809. package/dist/skills/invocable.controller.d.ts +1 -1
  810. package/dist/skills/invocable.controller.js +2 -2
  811. package/dist/skills/invocation-keys.d.ts +1 -1
  812. package/dist/skills/invocation-keys.js +1 -1
  813. package/dist/skills/invoke.d.ts +3 -3
  814. package/dist/skills/invoke.js +21 -8
  815. package/dist/skills/package.d.ts +15 -1
  816. package/dist/skills/package.js +14 -1
  817. package/dist/skills/skills.controller.d.ts +32 -6
  818. package/dist/skills/skills.controller.js +64 -11
  819. package/dist/skills/skills.module.js +25 -3
  820. package/dist/skills/skills.schemas.d.ts +44 -0
  821. package/dist/skills/skills.schemas.js +68 -0
  822. package/dist/skills/skills.service.d.ts +123 -26
  823. package/dist/skills/skills.service.js +493 -76
  824. package/dist/skills/usable.d.ts +82 -0
  825. package/dist/skills/usable.js +388 -0
  826. package/dist/themes/render-css.d.ts +13 -0
  827. package/dist/themes/render-css.js +135 -0
  828. package/dist/themes/theme-delivery.service.d.ts +36 -0
  829. package/dist/themes/theme-delivery.service.js +116 -0
  830. package/dist/themes/theme-state.d.ts +116 -0
  831. package/dist/themes/theme-state.js +221 -0
  832. package/dist/themes/theme-usage.d.ts +61 -0
  833. package/dist/themes/theme-usage.js +98 -0
  834. package/dist/themes/themes-public.controller.d.ts +33 -0
  835. package/dist/themes/themes-public.controller.js +98 -0
  836. package/dist/themes/themes.controller.d.ts +13 -0
  837. package/dist/themes/themes.controller.js +38 -0
  838. package/dist/themes/themes.module.d.ts +3 -0
  839. package/dist/themes/themes.module.js +21 -0
  840. package/dist/themes/themes.schemas.d.ts +3 -0
  841. package/dist/themes/themes.schemas.js +2 -0
  842. package/dist/themes/themes.service.d.ts +50 -0
  843. package/dist/themes/themes.service.js +99 -0
  844. package/dist/time-zone.d.ts +5 -0
  845. package/dist/time-zone.js +19 -0
  846. package/dist/tools/admin-connectors.d.ts +69 -0
  847. package/dist/tools/admin-connectors.js +135 -0
  848. package/dist/tools/approvals.controller.js +2 -3
  849. package/dist/tools/approvals.schemas.d.ts +21 -0
  850. package/dist/tools/approvals.schemas.js +15 -0
  851. package/dist/tools/approvals.service.d.ts +26 -2
  852. package/dist/tools/approvals.service.js +44 -5
  853. package/dist/tools/builtin-names.d.ts +104 -0
  854. package/dist/tools/builtin-names.js +164 -0
  855. package/dist/tools/builtins/agent.d.ts +27 -25
  856. package/dist/tools/builtins/agent.js +66 -63
  857. package/dist/tools/builtins/ask-user.d.ts +1 -1
  858. package/dist/tools/builtins/ask-user.js +5 -4
  859. package/dist/tools/builtins/builtin-tools.d.ts +23 -4
  860. package/dist/tools/builtins/builtin-tools.js +78 -12
  861. package/dist/tools/builtins/current-time.d.ts +26 -0
  862. package/dist/tools/builtins/current-time.js +99 -0
  863. package/dist/tools/builtins/handback.d.ts +28 -0
  864. package/dist/tools/builtins/handback.js +53 -0
  865. package/dist/tools/builtins/platform.d.ts +51 -0
  866. package/dist/tools/builtins/platform.js +451 -0
  867. package/dist/tools/builtins/read-tool-output.d.ts +1 -1
  868. package/dist/tools/builtins/read-tool-output.js +2 -2
  869. package/dist/tools/builtins/sandbox/bash.d.ts +5 -5
  870. package/dist/tools/builtins/sandbox/bash.js +291 -39
  871. package/dist/tools/builtins/sandbox/common.d.ts +135 -36
  872. package/dist/tools/builtins/sandbox/common.js +222 -62
  873. package/dist/tools/builtins/sandbox/deliver.d.ts +1 -1
  874. package/dist/tools/builtins/sandbox/deliver.js +19 -16
  875. package/dist/tools/builtins/sandbox/edit.d.ts +1 -1
  876. package/dist/tools/builtins/sandbox/edit.js +64 -50
  877. package/dist/tools/builtins/sandbox/file-state.d.ts +34 -0
  878. package/dist/tools/builtins/sandbox/file-state.js +34 -0
  879. package/dist/tools/builtins/sandbox/glob-match.d.ts +1 -1
  880. package/dist/tools/builtins/sandbox/glob-match.js +1 -1
  881. package/dist/tools/builtins/sandbox/glob.d.ts +1 -1
  882. package/dist/tools/builtins/sandbox/glob.js +17 -12
  883. package/dist/tools/builtins/sandbox/grep.d.ts +7 -4
  884. package/dist/tools/builtins/sandbox/grep.js +153 -34
  885. package/dist/tools/builtins/sandbox/index.d.ts +9 -5
  886. package/dist/tools/builtins/sandbox/index.js +13 -5
  887. package/dist/tools/builtins/sandbox/read.d.ts +2 -2
  888. package/dist/tools/builtins/sandbox/read.js +29 -19
  889. package/dist/tools/builtins/sandbox/task-output.d.ts +79 -0
  890. package/dist/tools/builtins/sandbox/task-output.js +334 -0
  891. package/dist/tools/builtins/sandbox/task-stop.d.ts +10 -0
  892. package/dist/tools/builtins/sandbox/task-stop.js +113 -0
  893. package/dist/tools/builtins/sandbox/write.d.ts +1 -1
  894. package/dist/tools/builtins/sandbox/write.js +51 -44
  895. package/dist/tools/builtins/send-message.d.ts +56 -0
  896. package/dist/tools/builtins/send-message.js +100 -0
  897. package/dist/tools/builtins/skill-load.d.ts +29 -18
  898. package/dist/tools/builtins/skill-load.js +125 -73
  899. package/dist/tools/builtins/tool-search.d.ts +13 -9
  900. package/dist/tools/builtins/tool-search.js +25 -14
  901. package/dist/tools/builtins/web/errors.d.ts +8 -0
  902. package/dist/tools/builtins/web/errors.js +53 -0
  903. package/dist/tools/builtins/web/extract.d.ts +62 -0
  904. package/dist/tools/builtins/web/extract.js +271 -0
  905. package/dist/tools/builtins/web/fetch.d.ts +55 -0
  906. package/dist/tools/builtins/web/fetch.js +175 -0
  907. package/dist/tools/builtins/web/index.d.ts +13 -0
  908. package/dist/tools/builtins/web/index.js +12 -0
  909. package/dist/tools/builtins/web/page-cache.d.ts +25 -0
  910. package/dist/tools/builtins/web/page-cache.js +77 -0
  911. package/dist/tools/builtins/web/search.d.ts +25 -0
  912. package/dist/tools/builtins/web/search.js +210 -0
  913. package/dist/tools/builtins/web/url.d.ts +17 -0
  914. package/dist/tools/builtins/web/url.js +43 -0
  915. package/dist/tools/connector-account-policies.d.ts +51 -0
  916. package/dist/tools/connector-account-policies.js +165 -0
  917. package/dist/tools/connectors.controller.d.ts +74 -9
  918. package/dist/tools/connectors.controller.js +133 -16
  919. package/dist/tools/connectors.schemas.d.ts +27 -0
  920. package/dist/tools/connectors.schemas.js +34 -0
  921. package/dist/tools/connectors.service.d.ts +101 -8
  922. package/dist/tools/connectors.service.js +266 -28
  923. package/dist/tools/credentials.d.ts +23 -0
  924. package/dist/tools/credentials.js +90 -1
  925. package/dist/tools/display-names.d.ts +9 -0
  926. package/dist/tools/display-names.js +24 -0
  927. package/dist/tools/drift.js +5 -5
  928. package/dist/tools/elicitation.js +1 -1
  929. package/dist/tools/extension-tools.controller.d.ts +14 -0
  930. package/dist/tools/extension-tools.controller.js +37 -0
  931. package/dist/tools/info.d.ts +61 -4
  932. package/dist/tools/info.js +119 -33
  933. package/dist/tools/legacy-data.d.ts +34 -0
  934. package/dist/tools/legacy-data.js +76 -0
  935. package/dist/tools/legacy-keys.d.ts +51 -0
  936. package/dist/tools/legacy-keys.js +114 -0
  937. package/dist/tools/naming.d.ts +1 -5
  938. package/dist/tools/naming.js +1 -7
  939. package/dist/tools/oauth/flow-paths.d.ts +1 -1
  940. package/dist/tools/oauth/flow-paths.js +1 -1
  941. package/dist/tools/oauth/flow.js +1 -1
  942. package/dist/tools/oauth/tokens.d.ts +54 -7
  943. package/dist/tools/oauth/tokens.js +87 -17
  944. package/dist/tools/org-tool-switches.d.ts +89 -0
  945. package/dist/tools/org-tool-switches.js +201 -0
  946. package/dist/tools/outputs.js +1 -1
  947. package/dist/tools/pipeline.d.ts +67 -47
  948. package/dist/tools/pipeline.js +319 -380
  949. package/dist/tools/policy.d.ts +30 -23
  950. package/dist/tools/policy.js +142 -64
  951. package/dist/tools/questions.controller.d.ts +1 -1
  952. package/dist/tools/questions.controller.js +1 -1
  953. package/dist/tools/questions.service.d.ts +23 -2
  954. package/dist/tools/questions.service.js +104 -2
  955. package/dist/tools/registry.d.ts +189 -68
  956. package/dist/tools/registry.js +318 -236
  957. package/dist/tools/resources.d.ts +1 -1
  958. package/dist/tools/resources.js +1 -1
  959. package/dist/tools/tools.module.js +31 -3
  960. package/dist/tools/validate.js +1 -1
  961. package/dist/ui/admin-ui.controller.d.ts +56 -0
  962. package/dist/ui/admin-ui.controller.js +192 -0
  963. package/dist/ui/arrangement.d.ts +65 -0
  964. package/dist/ui/arrangement.js +171 -0
  965. package/dist/ui/embed-token.d.ts +2 -2
  966. package/dist/ui/embed-token.js +30 -5
  967. package/dist/ui/registry.d.ts +42 -17
  968. package/dist/ui/registry.js +46 -14
  969. package/dist/ui/slots.controller.d.ts +11 -0
  970. package/dist/ui/slots.controller.js +25 -0
  971. package/dist/ui/ui-stream.d.ts +20 -3
  972. package/dist/ui/ui-stream.js +25 -7
  973. package/dist/ui/ui.schemas.d.ts +70 -0
  974. package/dist/ui/ui.schemas.js +65 -0
  975. package/dist/ui/views.controller.d.ts +35 -49
  976. package/dist/ui/views.controller.js +48 -70
  977. package/dist/ui/views.d.ts +112 -18
  978. package/dist/ui/views.js +254 -47
  979. package/package.json +6 -3
  980. package/src/migrations/0063_tool_keys_claude_code.sql +220 -0
  981. package/src/migrations/0064_account_last_org.sql +7 -0
  982. package/src/migrations/0065_conversation_archive.sql +8 -0
  983. package/src/migrations/0066_extension_display_name.sql +4 -0
  984. package/src/migrations/0067_agent_profiles.sql +20 -0
  985. package/src/migrations/0068_agent_avatar_uploads.sql +7 -0
  986. package/src/migrations/0069_attachments_agent_idx.sql +3 -0
  987. package/src/migrations/0070_background_tasks.sql +37 -0
  988. package/src/migrations/0071_background_tasks_reserve.sql +6 -0
  989. package/src/migrations/0072_background_tasks_stopping.sql +5 -0
  990. package/src/migrations/0073_org_extension_point_defaults.sql +11 -0
  991. package/src/migrations/0074_subagent_tree.sql +50 -0
  992. package/src/migrations/0075_plugin_scope.sql +61 -0
  993. package/src/migrations/0076_skills_created_by_nullable.sql +6 -0
  994. package/src/migrations/0077_scope_requests.sql +52 -0
  995. package/src/migrations/0078_scope_grant_switches.sql +18 -0
  996. package/src/migrations/0079_scope_live_install_switches.sql +19 -0
  997. package/src/migrations/0080_rename_enterprise_admin.sql +18 -0
  998. package/src/migrations/0081_platform_components.sql +129 -0
  999. package/src/migrations/0082_platform_migration.sql +33 -0
  1000. package/src/migrations/0083_plugin_scope_sync_failures.sql +15 -0
  1001. package/src/migrations/0084_org_owned_items.sql +85 -0
  1002. package/src/migrations/0085_agent_templates_phase4.sql +45 -0
  1003. package/src/migrations/0086_org_layering.sql +30 -0
  1004. package/src/migrations/0087_approval_summary.sql +6 -0
  1005. package/src/migrations/0088_environments.sql +80 -0
  1006. package/src/migrations/0089_model_kinds_usage.sql +38 -0
  1007. package/src/migrations/0090_initial_passwords.sql +27 -0
  1008. package/src/migrations/0091_account_time_zone.sql +4 -0
  1009. package/src/migrations/0092_tools_default_on.sql +27 -0
  1010. package/src/migrations/0093_connected_environments.sql +37 -0
  1011. package/src/migrations/0094_environment_paths_idx.sql +7 -0
  1012. package/src/migrations/0095_environment_files_resets.sql +5 -0
  1013. package/src/migrations/0096_environment_demoted_default.sql +18 -0
  1014. package/src/migrations/0097_extension_installs_enabled_at.sql +16 -0
  1015. package/src/migrations/0098_single_provider_running_first.sql +41 -0
  1016. package/src/migrations/0099_channel_connection_guide_ack.sql +6 -0
  1017. package/src/migrations/0100_catalog_files.sql +13 -0
  1018. package/src/migrations/0101_marketplace_icons.sql +32 -0
  1019. package/src/migrations/0102_themes.sql +64 -0
  1020. package/src/migrations/0103_ui_theme_setting.sql +7 -0
  1021. package/src/migrations/0104_connector_tool_account_policies.sql +16 -0
  1022. package/src/migrations/0105_devices_rename.sql +136 -0
  1023. package/src/migrations/0106_setup_guides_v2.sql +10 -0
  1024. package/src/migrations/0107_extension_client_builds.sql +50 -0
  1025. package/src/migrations/0108_question_skipped.sql +6 -0
  1026. package/src/migrations/0109_audit_platform_idx.sql +5 -0
  1027. package/src/migrations/0110_usage_time_idx.sql +8 -0
  1028. package/src/migrations/0111_agent_skill_sharing.sql +22 -0
  1029. package/src/migrations/0112_skill_share_requests.sql +4 -0
  1030. package/dist/catalog/upgrade-targets.d.ts +0 -56
  1031. package/dist/catalog/upgrade-targets.js +0 -90
  1032. package/dist/conversations/sandbox-status.d.ts +0 -24
  1033. package/dist/conversations/sandbox-status.js +0 -52
  1034. package/dist/extensions/org-config.controller.d.ts +0 -24
  1035. package/dist/extensions/org-config.controller.js +0 -62
  1036. package/dist/tools/builtins/sandbox/names.d.ts +0 -7
  1037. package/dist/tools/builtins/sandbox/names.js +0 -20
  1038. package/dist/tools/builtins/skill-write.d.ts +0 -59
  1039. package/dist/tools/builtins/skill-write.js +0 -244
@@ -7,64 +7,45 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
7
7
  var __param = (this && this.__param) || function (paramIndex, decorator) {
8
8
  return function (target, key) { decorator(target, key, paramIndex); }
9
9
  };
10
- import { randomUUID } from "node:crypto";
11
- import { parseSkillMd, SKILL_ENTRY_FILE, ToolError } from "@capybara-hq/plugin-sdk";
12
10
  import { Inject, Injectable } from "@nestjs/common";
13
11
  import { sql } from "kysely";
14
- import { visibleTo } from "../agents/agent-lookup.js";
15
- import { skillFilesPrefix } from "../conversations/attachments.service.js";
16
12
  import { EventLog } from "../conversations/event-log.js";
17
13
  import { ApiError } from "../errors.js";
18
14
  import { audit } from "../identity/audit.js";
15
+ import { assertCustomAllowed } from "../identity/settings.js";
19
16
  import { KernelDb } from "../infra/database/kernel-db.js";
20
17
  import { TransactionHost } from "../infra/database/transaction-host.js";
21
18
  import { Transactional } from "../infra/database/transactional.decorator.js";
22
19
  import { KERNEL_LOGGER } from "../infra/tokens.js";
23
- import { sameSnapshot, } from "../runtime/context/skills.js";
20
+ import { OrgLock } from "../orgs/org-lock.js";
24
21
  import { StorageService } from "../storage/storage.service.js";
25
- import { fitPinned, invocationOf, lockLatestCatalog } from "./catalog.js";
22
+ import { assertShareableName, isOrgAdmin, shareSkillIn } from "./agent-skills.service.js";
23
+ import { cancelRequestIn, revertTrialCatalog, } from "./conversation-catalog.js";
24
+ import { SkillsService } from "./skills.service.js";
26
25
  /**
27
- * 每个 agent 自己的技能(`scope = agent`)上限,含待批准的新技能。远低于目录快照的上限(`SKILLS_CATALOG_MAX`),
28
- * 正常使用不会让目录被截断。
26
+ * The cap on file contents read for one detail (a package may hold up to 50 MB; the inbox shows
27
+ * text for review, so files past the cap read as no content).
29
28
  */
30
- export const AGENT_SKILLS_MAX = 50;
31
- /** 写技能文件时的并发数。 */
32
- const PUT_CONCURRENCY = 4;
33
- /** 详情里读取文件内容的上限(草稿 ≤ 1MB,留余量)。 */
34
29
  const DETAIL_MAX_BYTES = 2 * 1024 * 1024;
35
- /** 收件箱一次最多返回的技能变更数。 */
30
+ /** The most skill changes one inbox read returns. */
36
31
  export const SKILL_CHANGES_LIST_MAX = 100;
37
- // ---- 模型可见文案(英文) ----
38
- const STORAGE_UNAVAILABLE_TEXT = "File storage is temporarily unavailable, so the skill could not be saved; retry later.";
39
- const pendingElsewhereText = (name) => `Skill "${name}" already has a change awaiting the owner's approval (requested in another conversation), so it cannot be changed now; ask the user to have the owner decide that change first, or use a different skill name.`;
40
- const capText = () => `This agent already has ${AGENT_SKILLS_MAX} skills (including changes awaiting approval), the maximum; update an existing skill instead, or ask the agent's owner to delete one of this agent's skills.`;
41
- const AGENT_GONE_TEXT = "This agent no longer exists, so the skill cannot be saved; ask the user to start a conversation with another agent.";
42
32
  const iso = (v) => new Date(v).toISOString();
43
- const byName = (a, b) => a.name < b.name ? -1 : a.name > b.name ? 1 : 0;
44
33
  const notFound = () => new ApiError("skill_change.not_found", "Skill change not found");
45
- /** The body of the SKILL.md a skill_write just stored (as run start would read it); null if unparsable. */
46
- function writtenBody(pkg) {
47
- const md = pkg.files.find((f) => f.path === SKILL_ENTRY_FILE);
48
- if (!md)
49
- return null;
50
- try {
51
- const parsed = parseSkillMd(new TextDecoder("utf-8", { fatal: true }).decode(md.data));
52
- return "errors" in parsed ? null : parsed.body;
53
- }
54
- catch {
55
- return null;
56
- }
57
- }
34
+ const forbidden = () => new ApiError("forbidden", "Insufficient organization role");
58
35
  /**
59
- * agent 自写技能与共享 agent 的技能变更审批(M5 T15,R4):
60
- * - `write`(工具 `skill_write` 调用):私有 agent 直接生成新版本;共享 agent 生成一条待负责人批准的申请,
61
- * 期间只有发起对话试用(`resolveEffectiveSkills` 按对话合并);两种情况都在同一事务里往发起对话追加一份
62
- * 技能目录快照(Ruling M17:日志是唯一事实源),同一运行的下一步即可 `skill_load`;
63
- * - `decide`(HTTP,只有该 agent 当前的负责人):批准 → 版本对所有对话生效(各对话下一次运行开始时写新快照);
64
- * 拒绝 → 删除草稿对象,发起对话下一次运行开始时目录回到当前版本;
65
- * - 同一 agent 的同名技能最多一条待处理申请:同一对话再写取代旧的(旧的 cancelled、草稿删除、技能 id 不变),
66
- * 别的对话再写被拒绝(英文说明)。
67
- * 状态都在 PG(agent 行锁串行化同一 agent 的写与决定),文件在对象存储 `kernel/<orgId>/skills/<id>/`;无进程内状态。
36
+ * Skill change requests decided by org admins (spec §5.4, §5.5): an agent's owner asks to share
37
+ * one of its skills with the org (`kind = 'share'`, created by `AgentSkillsService.share`), and
38
+ * the maintainer of a shared skill proposes a new version of it (`kind = 'version'`, created by
39
+ * `AgentSkillsService.register`).
40
+ * - `decide` (HTTP, human only; org admins, role read live under the org row lock): approving a
41
+ * share makes the skill an org skill with the requester as maintainer; approving a version
42
+ * writes it as the org skill's next version (`SkillsService.createVersionFromFiles`, the draft
43
+ * prefix becomes the version's) so every agent using it gets it at its next run start;
44
+ * rejecting a version deletes its draft and reverts the proposing conversation's trial; a share
45
+ * keeps its files whatever happens. A request that no longer applies (its agent deleted or
46
+ * transferred, its skill deleted or already moved) is cancelled instead.
47
+ * State is in PG (the org row lock serializes decisions), files in object storage
48
+ * `kernel/<orgId>/skills/<id>/`; no in-process state.
68
49
  */
69
50
  let SkillChangesService = class SkillChangesService {
70
51
  db;
@@ -72,300 +53,209 @@ let SkillChangesService = class SkillChangesService {
72
53
  eventLog;
73
54
  log;
74
55
  txHost;
75
- constructor(db, storage, eventLog, log, txHost) {
56
+ orgLock;
57
+ skills;
58
+ catalogDeps;
59
+ constructor(db, storage, eventLog, log, txHost, orgLock,
60
+ /** An approved version is an org skill version. */
61
+ skills) {
76
62
  this.db = db;
77
63
  this.storage = storage;
78
64
  this.eventLog = eventLog;
79
65
  this.log = log;
80
66
  this.txHost = txHost;
81
- }
82
- /** 写技能(见类注释)。模型可见的失败抛 `ToolError`。 */
83
- async write(ctx, pkg) {
84
- let store;
85
- try {
86
- this.storage.assertAvailable();
87
- store = this.storage.kernel(ctx.orgId);
88
- }
89
- catch (e) {
90
- throw storageError(e);
91
- }
92
- const id = randomUUID();
93
- const prefix = skillFilesPrefix(id);
94
- try {
95
- await putAll(store, prefix, pkg.files);
96
- }
97
- catch (e) {
98
- await this.deletePrefix(ctx.orgId, prefix);
99
- throw storageError(e);
100
- }
101
- let committed;
102
- try {
103
- committed = await this.writeIn(ctx, pkg, id, prefix);
104
- }
105
- catch (e) {
106
- await this.deletePrefix(ctx.orgId, prefix);
107
- throw e;
108
- }
109
- if (committed.toSeq !== null) {
110
- await this.eventLog.notify(ctx.conversationId, committed.toSeq);
111
- }
112
- for (const p of committed.drop)
113
- await this.deletePrefix(ctx.orgId, p);
114
- return committed.outcome;
67
+ this.orgLock = orgLock;
68
+ this.skills = skills;
69
+ this.catalogDeps = { db, log, eventLog };
115
70
  }
116
71
  /**
117
- * 负责人决定一条申请:只有该 agent 当前的负责人(实时读)能决定,其他人 → 403 `skill_change.not_owner`;
118
- * 已处理 → 409 `skill_change.already_decided`;agent 已删除或申请不在本组织 → 404。
119
- * 批准:在同一事务里新增版本(技能不存在则用预先分配的 id 新建)、`current_version` 指向它,草稿对象原样成为版本文件;
120
- * 拒绝:提交后删除草稿对象。审计 `skill.change_decided`。
72
+ * An org admin decides a request (see the class comment): not an org admin -> 403 `forbidden`;
73
+ * already decided -> 409 `skill_change.already_decided`; not in this org -> 404. Approving
74
+ * re-checks `customSkills` (403 `catalog.custom_disabled`) and, for a share, the name (409
75
+ * `skill.name_exists`; the request stays pending). A share whose skill has a newer version than
76
+ * the one reviewed is cancelled, never shared. Audit `skill.change_decided` (and
77
+ * `skill.shared`). Of concurrent decisions one wins, the others get `already_decided`.
121
78
  */
122
79
  async decide(orgId, id, accountId, body, actorTokenId) {
123
80
  const head = await this.db
124
81
  .selectFrom("skill_change_requests")
125
- .select("agent_id")
82
+ .selectAll()
126
83
  .where("id", "=", id)
127
84
  .where("org_id", "=", orgId)
128
85
  .executeTakeFirst();
129
86
  if (!head)
130
87
  throw notFound();
131
- const done = await this.decideIn(orgId, id, accountId, body, actorTokenId, head.agent_id);
132
- const row = done.updated;
133
- if (done.revertSeq !== null) {
134
- await this.eventLog.notify(row.requested_in_conversation, done.revertSeq);
88
+ // Refused before any file is read; re-checked under the org row lock
89
+ if (!(await isOrgAdmin(this.db.db, orgId, accountId)))
90
+ throw forbidden();
91
+ // An approved version needs its files as a package (read before the transaction) and, for a
92
+ // skill the org promoted, written as the platform row's next version: no storage writes run
93
+ // inside the transaction
94
+ let pkg;
95
+ let owner;
96
+ if (body.decision === "approve" && head.kind === "version" && head.status === "pending") {
97
+ await assertCustomAllowed(this.db.db, "customSkills");
98
+ pkg = await this.readDraft(orgId, head);
99
+ owner = await this.skills.prepareStoredVersion(orgId, pkg);
135
100
  }
136
- if (row.status === "rejected")
137
- await this.deletePrefix(orgId, row.object_prefix);
138
- const [view] = await this.views([row]);
101
+ let done;
102
+ try {
103
+ done = await this.decideIn(orgId, id, accountId, body, actorTokenId, head, pkg, owner);
104
+ }
105
+ catch (e) {
106
+ if (owner !== undefined)
107
+ await this.skills.discardStoredVersion(owner);
108
+ throw e;
109
+ }
110
+ if (owner !== undefined && !done.usedOwner)
111
+ await this.skills.discardStoredVersion(owner);
112
+ for (const [conv, seq] of done.drafts.seqs)
113
+ await this.eventLog.notify(conv, seq);
114
+ for (const p of done.drafts.prefixes)
115
+ await this.deletePrefix(orgId, p);
116
+ const [view] = await this.views([done.updated]);
139
117
  if (!view)
140
118
  throw notFound();
141
119
  return view;
142
120
  }
143
- /**
144
- * 软删除 agent 自己的一个技能(只有该 agent 当前的负责人;其他人 403 `forbidden`):技能不存在 / 已删除 / 不属于该
145
- * agent → `skill.not_found`。同名的待处理改动一并取消(发起对话追加回退快照,提交后删草稿)。审计 `skill.deleted`。
146
- * 各对话下一次运行开始时目录里去掉它;之后同名可再写为新技能。
147
- */
148
- async deleteAgentSkill(orgId, agentId, skillId, accountId, actorTokenId) {
149
- const cancelled = await this.deleteAgentSkillIn(orgId, agentId, skillId, accountId, actorTokenId);
150
- await this.finishCancel(orgId, cancelled);
151
- }
152
- /** The transaction of {@link write}. */
153
- async writeIn(ctx, pkg, id, prefix) {
154
- await this.keyShareOrg(ctx.orgId);
155
- // NO KEY UPDATE, not UPDATE (here, in decide and in deleteAgentSkill): it still serializes
156
- // the writes and decisions of one agent, but not the foreign key check (FOR KEY SHARE) of a
157
- // transaction that already holds the conversation row this one locks last, e.g. an event
158
- // log append updating that row a second time (the title job): FOR UPDATE made that 40P01
159
- const agent = await this.db
160
- .selectFrom("agents")
161
- .select(["visibility", "deleted_at"])
162
- .where("id", "=", ctx.agentId)
163
- .where("org_id", "=", ctx.orgId)
164
- .forNoKeyUpdate()
165
- .executeTakeFirst();
166
- if (!agent || agent.deleted_at !== null)
167
- throw new ToolError(AGENT_GONE_TEXT);
168
- // Then the conversation row (appendCatalog's lock, still after the agent row like decide),
169
- // before the change request insert: its foreign key check takes FOR KEY SHARE on that row,
170
- // and upgrading to FOR UPDATE afterwards deadlocked with another writer doing the same
171
- await this.db
172
- .selectFrom("conversations")
173
- .select("id")
174
- .where("id", "=", ctx.conversationId)
175
- .forUpdate()
176
- .execute();
177
- const existing = await this.db
178
- .selectFrom("skills")
179
- .select(["id", "current_version"])
180
- .where("org_id", "=", ctx.orgId)
181
- .where("scope", "=", "agent")
182
- .where("agent_id", "=", ctx.agentId)
183
- .where("name", "=", pkg.name)
184
- .where("deleted_at", "is", null)
185
- .forUpdate()
186
- .executeTakeFirst();
187
- const pend = await this.db
188
- .selectFrom("skill_change_requests")
189
- .selectAll()
190
- .where("agent_id", "=", ctx.agentId)
191
- .where("status", "=", "pending")
192
- .where(sql `proposed_version -> 'manifest' ->> 'name'`, "=", pkg.name)
193
- .forUpdate()
194
- .executeTakeFirst();
195
- const drop = [];
196
- if (pend) {
197
- if (pend.requested_in_conversation !== ctx.conversationId) {
198
- throw new ToolError(pendingElsewhereText(pkg.name));
121
+ /** A version draft's files as a package (as registered), or 503 when one cannot be read. */
122
+ async readDraft(orgId, req) {
123
+ const store = this.storage.kernel(orgId);
124
+ const m = req.proposed_version.manifest;
125
+ const files = [];
126
+ for (const f of m.files) {
127
+ const got = await store.get(`${req.object_prefix}${f.path}`);
128
+ if (!got) {
129
+ throw new ApiError("storage.unavailable", "The proposed version's files cannot be read; try again later");
199
130
  }
200
- // 同一对话再写:取代旧申请
201
- await this.db
202
- .updateTable("skill_change_requests")
203
- .set({ status: "cancelled", decided_at: sql `now()` })
204
- .where("id", "=", pend.id)
205
- .execute();
206
- drop.push(pend.object_prefix);
207
- await audit(this.db.db, {
208
- actorAccountId: ctx.accountId,
209
- orgId: ctx.orgId,
210
- action: "skill.change_decided",
211
- target: pend.id,
212
- detail: {
213
- decision: "cancelled",
214
- reason: "superseded",
215
- supersededBy: id,
216
- agentId: ctx.agentId,
217
- name: pkg.name,
218
- },
219
- });
220
- }
221
- if (!existing)
222
- await this.assertBelowCap(ctx.agentId, pend?.id);
223
- const version = (existing?.current_version ?? 0) + 1;
224
- const skillId = existing?.id ?? pend?.proposed_version.skillId ?? randomUUID();
225
- let outcome;
226
- if (agent.visibility === "private") {
227
- await this.createVersion({
228
- orgId: ctx.orgId,
229
- agentId: ctx.agentId,
230
- skillId,
231
- exists: existing !== undefined,
232
- version,
233
- manifest: pkg.manifest,
234
- prefix,
235
- createdBy: ctx.accountId,
236
- });
237
- await audit(this.db.db, {
238
- actorAccountId: ctx.accountId,
239
- orgId: ctx.orgId,
240
- action: existing ? "skill.version_created" : "skill.created",
241
- target: skillId,
242
- detail: {
243
- name: pkg.name,
244
- version,
245
- files: pkg.manifest.files.length,
246
- agentId: ctx.agentId,
247
- conversationId: ctx.conversationId,
248
- via: "skill_write",
249
- },
250
- });
251
- outcome = { kind: "version", skillId, version, created: !existing };
131
+ const data = new Uint8Array(await new Response(got.body).arrayBuffer());
132
+ files.push({ path: f.path, size: f.size, sha256: f.sha256, data });
252
133
  }
253
- else {
254
- const proposed = { skillId, version, manifest: pkg.manifest };
255
- await this.db
256
- .insertInto("skill_change_requests")
257
- .values({
258
- id,
259
- org_id: ctx.orgId,
260
- agent_id: ctx.agentId,
261
- skill_id: existing?.id ?? null,
262
- proposed_version: JSON.stringify(proposed),
263
- object_prefix: prefix,
264
- requested_by_account: ctx.accountId,
265
- requested_in_conversation: ctx.conversationId,
266
- decided_by: null,
267
- })
268
- .execute();
269
- await audit(this.db.db, {
270
- actorAccountId: ctx.accountId,
271
- orgId: ctx.orgId,
272
- action: "skill.change_requested",
273
- target: id,
274
- detail: {
275
- agentId: ctx.agentId,
276
- skillId: existing?.id ?? null,
277
- name: pkg.name,
278
- version,
279
- files: pkg.manifest.files.length,
280
- conversationId: ctx.conversationId,
281
- },
282
- });
283
- outcome = { kind: "requested", requestId: id, skillId, version };
284
- }
285
- // 本对话立即看到新版本:在上一份快照上替换 / 加入这个技能(确定、来自日志;来源 = 本次的对象前缀)
286
- // A pinned entry of this skill gets the version, source and body just written (phase B)
287
- // A manual-only version (phase D) is never in the model's catalog: it removes the skill from
288
- // the snapshot instead, and appendCatalog drops its pinned entry with it (no longer live)
289
- const forModel = invocationOf(pkg.manifest).model;
290
- const pinnedBody = writtenBody(pkg);
291
- const toSeq = await this.appendCatalog(ctx.conversationId, (base) => ({
292
- ...base,
293
- skills: [
294
- ...base.skills.filter((s) => s.name !== pkg.name),
295
- ...(forModel
296
- ? [
297
- {
298
- id: skillId,
299
- name: pkg.name,
300
- description: pkg.description,
301
- version,
302
- source: prefix,
303
- },
304
- ]
305
- : []),
306
- ],
307
- ...(base.pinned && {
308
- pinned: base.pinned.map((p) => p.id === skillId && pinnedBody !== null
309
- ? { id: skillId, version, name: pkg.name, source: prefix, body: pinnedBody }
310
- : p),
311
- }),
312
- }), `skills_catalog:write:${id}`, ctx.runId);
313
- return { outcome, drop, toSeq };
134
+ return {
135
+ name: m.name,
136
+ description: m.description,
137
+ files,
138
+ ...(m.invocation !== undefined && { invocation: m.invocation }),
139
+ };
314
140
  }
315
- /** The transaction of {@link decide}. */
316
- async decideIn(orgId, id, accountId, body, actorTokenId, agentId) {
317
- // 加锁顺序与 write 一致:组织行(KEY SHARE)→ agent 行 → 申请行 → 会话行
318
- await this.keyShareOrg(orgId);
141
+ /**
142
+ * The transaction of {@link decide}. Lock order: org row (FOR NO KEY UPDATE, role re-checked) -> agent
143
+ * row -> the proposing conversation (a version's revert appends there) -> skill row -> request
144
+ * row, the order registration and sharing use.
145
+ */
146
+ async decideIn(orgId, id, accountId, body, actorTokenId, head, pkg, owner) {
147
+ await this.orgLock.lockAndAuthorize(orgId, accountId, "skills.manage");
319
148
  const agent = await this.db
320
149
  .selectFrom("agents")
321
150
  .select(["owner_account_id", "deleted_at"])
322
- .where("id", "=", agentId)
151
+ .where("id", "=", head.agent_id)
323
152
  .forNoKeyUpdate()
324
153
  .executeTakeFirst();
325
- if (!agent || agent.deleted_at !== null)
326
- throw notFound();
154
+ if (head.kind === "version" && head.requested_in_conversation !== null) {
155
+ await this.db
156
+ .selectFrom("conversations")
157
+ .select("id")
158
+ .where("id", "=", head.requested_in_conversation)
159
+ .forUpdate()
160
+ .executeTakeFirst();
161
+ }
162
+ const skill = head.skill_id === null
163
+ ? undefined
164
+ : await this.db
165
+ .selectFrom("skills")
166
+ .select(["id", "scope", "agent_id", "name", "deleted_at", "current_version"])
167
+ .where("id", "=", head.skill_id)
168
+ .forUpdate()
169
+ .executeTakeFirst();
327
170
  const req = await this.db
328
171
  .selectFrom("skill_change_requests")
329
172
  .selectAll()
330
173
  .where("id", "=", id)
331
174
  .forUpdate()
332
175
  .executeTakeFirst();
333
- // 首次读与加锁重读之间行被删了(agent / 组织被硬删除)→ 404,不是 500
176
+ // the row went between the first read and the lock (agent / org hard-deleted) -> 404, not 500
334
177
  if (!req)
335
178
  throw notFound();
336
- if (agent.owner_account_id !== accountId) {
337
- throw new ApiError("skill_change.not_owner", "Only the agent's owner can decide on its skill changes");
338
- }
339
179
  if (req.status !== "pending") {
340
180
  throw new ApiError("skill_change.already_decided", "This skill change has already been decided");
341
181
  }
182
+ const drafts = { prefixes: [], seqs: [] };
183
+ // A share applies only to the version the admin reviewed; a version proposal only to the skill
184
+ // of its name
185
+ const applies = agent !== undefined &&
186
+ agent.deleted_at === null &&
187
+ skill !== undefined &&
188
+ skill.deleted_at === null &&
189
+ (req.kind === "share"
190
+ ? skill.scope === "agent" &&
191
+ skill.agent_id === req.agent_id &&
192
+ skill.current_version === req.proposed_version.version &&
193
+ agent.owner_account_id === req.requested_by_account
194
+ : skill.scope === "org" && skill.name === req.proposed_version.manifest.name);
195
+ if (!applies) {
196
+ await cancelRequestIn(this.catalogDeps, req, drafts, {
197
+ actorAccountId: accountId,
198
+ ...(actorTokenId !== undefined && { actorTokenId }),
199
+ reason: "stale",
200
+ });
201
+ return { updated: await this.reread(id), drafts, usedOwner: false };
202
+ }
342
203
  const p = req.proposed_version;
343
204
  const approved = body.decision === "approve";
344
- let skillId = req.skill_id;
345
205
  let version = p.version;
346
- if (approved) {
347
- const existing = await this.db
348
- .selectFrom("skills")
349
- .select(["id", "current_version"])
350
- .where("org_id", "=", orgId)
351
- .where("scope", "=", "agent")
352
- .where("agent_id", "=", req.agent_id)
353
- .where("name", "=", p.manifest.name)
354
- .where("deleted_at", "is", null)
355
- .forUpdate()
356
- .executeTakeFirst();
357
- skillId = existing?.id ?? p.skillId;
358
- version = (existing?.current_version ?? 0) + 1;
359
- await this.createVersion({
360
- orgId,
206
+ if (approved && req.kind === "share") {
207
+ await assertCustomAllowed(this.db.db, "customSkills");
208
+ await assertShareableName(this.db, orgId, skill.name);
209
+ await shareSkillIn(this.db, {
210
+ skillId: skill.id,
361
211
  agentId: req.agent_id,
362
- skillId,
363
- exists: existing !== undefined,
364
- version,
365
- manifest: p.manifest,
212
+ maintainerAccountId: req.requested_by_account,
213
+ });
214
+ await audit(this.db.db, {
215
+ actorAccountId: accountId,
216
+ ...(actorTokenId !== undefined && { actorTokenId }),
217
+ orgId,
218
+ action: "skill.shared",
219
+ target: skill.id,
220
+ detail: {
221
+ name: skill.name,
222
+ agentId: req.agent_id,
223
+ maintainer: req.requested_by_account,
224
+ requestId: id,
225
+ },
226
+ });
227
+ }
228
+ else if (approved) {
229
+ if (pkg === undefined)
230
+ throw new Error("an approved version needs its files");
231
+ await assertCustomAllowed(this.db.db, "customSkills");
232
+ // Joins this transaction without storage I/O: the version is the org skill's next one, the
233
+ // draft prefix its files; a skill the org promoted gets the platform version prepared before
234
+ const out = await this.skills.createVersionFromFiles(orgId, accountId, pkg, {
366
235
  prefix: req.object_prefix,
367
- createdBy: req.requested_by_account,
236
+ stored: owner !== undefined ? { owner } : {},
237
+ ...(actorTokenId !== undefined && { actorTokenId }),
238
+ auditDetail: {
239
+ requestId: id,
240
+ agentId: req.agent_id,
241
+ requestedBy: req.requested_by_account,
242
+ },
368
243
  });
244
+ version = out.version;
245
+ const own = await this.db
246
+ .selectFrom("skill_versions")
247
+ .select("object_prefix")
248
+ .where("skill_id", "=", skill.id)
249
+ .where("version", "=", out.version)
250
+ .executeTakeFirst();
251
+ if (own?.object_prefix !== req.object_prefix) {
252
+ // Served from elsewhere (the platform row): the draft is not a version's files
253
+ const seq = await revertTrialCatalog(this.catalogDeps, req);
254
+ if (seq !== null && req.requested_in_conversation !== null) {
255
+ drafts.seqs.push([req.requested_in_conversation, seq]);
256
+ }
257
+ drafts.prefixes.push(req.object_prefix);
258
+ }
369
259
  }
370
260
  const updated = await this.db
371
261
  .updateTable("skill_change_requests")
@@ -373,7 +263,6 @@ let SkillChangesService = class SkillChangesService {
373
263
  status: approved ? "approved" : "rejected",
374
264
  decided_by: accountId,
375
265
  decided_at: sql `now()`,
376
- ...(approved && { skill_id: skillId }),
377
266
  })
378
267
  .where("id", "=", id)
379
268
  .returningAll()
@@ -386,136 +275,83 @@ let SkillChangesService = class SkillChangesService {
386
275
  target: id,
387
276
  detail: {
388
277
  decision: approved ? "approved" : "rejected",
278
+ kind: req.kind,
389
279
  agentId: req.agent_id,
390
- skillId,
280
+ skillId: skill.id,
391
281
  name: p.manifest.name,
392
- version: approved ? version : p.version,
282
+ version,
393
283
  requestedBy: req.requested_by_account,
394
- conversationId: req.requested_in_conversation,
284
+ ...(req.requested_in_conversation !== null && {
285
+ conversationId: req.requested_in_conversation,
286
+ }),
395
287
  ...(body.note !== undefined && { note: body.note }),
396
288
  },
397
289
  });
398
- // 拒绝:发起对话立即回退到正式版本(或移除),模型在当前位置看到提醒
399
- const revertSeq = approved ? null : await this.revertTrial(req);
400
- return { updated, revertSeq };
401
- }
402
- /** The transaction of {@link deleteAgentSkill}. */
403
- async deleteAgentSkillIn(orgId, agentId, skillId, accountId, actorTokenId) {
404
- await this.keyShareOrg(orgId);
405
- const agent = await this.db
406
- .selectFrom("agents")
407
- .select(["owner_account_id", "deleted_at"])
408
- .where("id", "=", agentId)
409
- .where("org_id", "=", orgId)
410
- .forNoKeyUpdate()
411
- .executeTakeFirst();
412
- const agentNotFound = () => new ApiError("agent.not_found", "Agent not found");
413
- if (!agent || agent.deleted_at !== null)
414
- throw agentNotFound();
415
- if (agent.owner_account_id !== accountId) {
416
- // 与 AgentsService 一致:看不到的 agent → 404,看得到但不是负责人 → 403
417
- const visible = await this.db
418
- .selectFrom("agents")
419
- .select("id")
420
- .where("id", "=", agentId)
421
- .where(visibleTo(accountId))
422
- .executeTakeFirst();
423
- if (!visible)
424
- throw agentNotFound();
425
- throw new ApiError("forbidden", "Only the agent's owner can delete its skills");
290
+ // A rejected version: the proposing conversation goes back to the current version at once
291
+ // and the draft is deleted; a rejected share changes nothing
292
+ if (!approved && req.kind === "version") {
293
+ const seq = await revertTrialCatalog(this.catalogDeps, req);
294
+ if (seq !== null && req.requested_in_conversation !== null) {
295
+ drafts.seqs.push([req.requested_in_conversation, seq]);
296
+ }
297
+ drafts.prefixes.push(req.object_prefix);
426
298
  }
427
- const r = await this.db
428
- .updateTable("skills")
429
- .set({ deleted_at: sql `now()`, updated_at: sql `now()` })
430
- .where("id", "=", skillId)
431
- .where("org_id", "=", orgId)
432
- .where("scope", "=", "agent")
433
- .where("agent_id", "=", agentId)
434
- .where("deleted_at", "is", null)
435
- .returning(["name"])
436
- .executeTakeFirst();
437
- if (!r)
438
- throw new ApiError("skill.not_found", "Skill not found");
439
- const out = { prefixes: [], seqs: [] };
440
- const pend = await this.db
299
+ return {
300
+ updated,
301
+ drafts,
302
+ usedOwner: approved && req.kind === "version" && owner !== undefined,
303
+ };
304
+ }
305
+ reread(id) {
306
+ return this.db
441
307
  .selectFrom("skill_change_requests")
442
308
  .selectAll()
443
- .where("agent_id", "=", agentId)
444
- .where("status", "=", "pending")
445
- .where(sql `proposed_version -> 'manifest' ->> 'name'`, "=", r.name)
446
- .forUpdate()
447
- .executeTakeFirst();
448
- if (pend) {
449
- await this.db
450
- .updateTable("skill_change_requests")
451
- .set({ status: "cancelled", decided_at: sql `now()` })
452
- .where("id", "=", pend.id)
453
- .execute();
454
- await audit(this.db.db, {
455
- actorAccountId: accountId,
456
- ...(actorTokenId !== undefined && { actorTokenId }),
457
- orgId,
458
- action: "skill.change_decided",
459
- target: pend.id,
460
- detail: { decision: "cancelled", reason: "skill_deleted", agentId, name: r.name },
461
- });
462
- const seq = await this.revertTrial(pend);
463
- if (seq !== null)
464
- out.seqs.push([pend.requested_in_conversation, seq]);
465
- out.prefixes.push(pend.object_prefix);
466
- }
467
- await audit(this.db.db, {
468
- actorAccountId: accountId,
469
- ...(actorTokenId !== undefined && { actorTokenId }),
470
- orgId,
471
- action: "skill.deleted",
472
- target: skillId,
473
- detail: { name: r.name, agentId },
474
- });
475
- return out;
309
+ .where("id", "=", id)
310
+ .executeTakeFirstOrThrow();
476
311
  }
477
- /** 当前用户(作为 agent 负责人)能决定的待处理申请,新的在前,最多 {@link SKILL_CHANGES_LIST_MAX} 条。 */
312
+ /**
313
+ * The org's pending requests when the account is an org admin (read live; anyone else gets
314
+ * none), newest first, at most {@link SKILL_CHANGES_LIST_MAX}.
315
+ */
478
316
  async listPending(orgId, accountId) {
317
+ if (!(await isOrgAdmin(this.db.db, orgId, accountId)))
318
+ return [];
479
319
  const rows = await this.db
480
320
  .selectFrom("skill_change_requests")
481
- .innerJoin("agents", "agents.id", "skill_change_requests.agent_id")
482
- .selectAll("skill_change_requests")
483
- .where("skill_change_requests.org_id", "=", orgId)
484
- .where("skill_change_requests.status", "=", "pending")
485
- .where("agents.owner_account_id", "=", accountId)
486
- .where("agents.deleted_at", "is", null)
487
- .orderBy("skill_change_requests.created_at", "desc")
321
+ .selectAll()
322
+ .where("org_id", "=", orgId)
323
+ .where("status", "=", "pending")
324
+ .orderBy("created_at", "desc")
488
325
  .limit(SKILL_CHANGES_LIST_MAX)
489
326
  .execute();
490
327
  return this.views(rows);
491
328
  }
492
329
  /**
493
- * 详情(含文件文本):只有该 agent 的负责人与发起人能看,其他人一律 404(不泄露存在)。
494
- * 草稿对象已删除(拒绝 / 取消)时文件内容为 null。
330
+ * The detail (with file texts): only org admins and the requester see it, anyone else 404 (the
331
+ * request's existence is not disclosed). A version draft's contents are null once it is deleted
332
+ * (rejected / cancelled); a share's files are the skill version's own and stay readable.
495
333
  */
496
334
  async get(orgId, id, accountId) {
497
335
  const row = await this.db
498
336
  .selectFrom("skill_change_requests")
499
- .innerJoin("agents", "agents.id", "skill_change_requests.agent_id")
500
- .selectAll("skill_change_requests")
501
- .select("agents.owner_account_id")
502
- .where("skill_change_requests.id", "=", id)
503
- .where("skill_change_requests.org_id", "=", orgId)
504
- .where("agents.deleted_at", "is", null)
337
+ .selectAll()
338
+ .where("id", "=", id)
339
+ .where("org_id", "=", orgId)
505
340
  .executeTakeFirst();
506
341
  if (!row)
507
342
  throw notFound();
508
- if (row.owner_account_id !== accountId && row.requested_by_account !== accountId) {
343
+ if (row.requested_by_account !== accountId &&
344
+ !(await isOrgAdmin(this.db.db, orgId, accountId))) {
509
345
  throw notFound();
510
346
  }
511
347
  const [view] = await this.views([row]);
512
348
  if (!view)
513
349
  throw notFound();
514
- const live = row.status === "pending" || row.status === "approved";
350
+ const live = row.kind === "share" || row.status === "pending" || row.status === "approved";
515
351
  const store = this.storage.kernel(orgId);
516
352
  const budget = { left: DETAIL_MAX_BYTES };
517
353
  const files = await readTexts(live ? store : undefined, row.object_prefix, row.proposed_version.manifest.files, budget);
518
- // 改动已有技能:附上当前生效版本的文件(批准后它就是上一版,差异仍按申请时的当前版本显示)
354
+ // A change of an existing skill: the version in effect, for the difference
519
355
  let current = null;
520
356
  if (row.skill_id !== null) {
521
357
  const cur = await this.db
@@ -531,7 +367,7 @@ let SkillChangesService = class SkillChangesService {
531
367
  .where("skills.id", "=", row.skill_id)
532
368
  .where("skills.deleted_at", "is", null)
533
369
  .executeTakeFirst();
534
- // 已批准的申请自己就是当前版本:没有可比的「之前」,不给
370
+ // the request is the current version itself (a share, an approved version): no "before"
535
371
  if (cur && cur.object_prefix !== row.object_prefix) {
536
372
  current = {
537
373
  version: cur.version,
@@ -542,209 +378,42 @@ let SkillChangesService = class SkillChangesService {
542
378
  return { ...view, files, current };
543
379
  }
544
380
  /**
545
- * 在事务 `t` 里由对话最新一份快照推出下一份并追加(不同才写):先锁会话行(与 `EventLog.append` 同一把锁),
546
- * 锁内读最新快照,保证「读最新 → 追加」之间没有别的快照插进来。返回写入的 seq,没写返回 null。
547
- * Phase B: `derive` gets the whole latest payload, so `pinned` and `toolMap` are carried forward;
548
- * a pinned entry is kept only while `skills` has the same id, version and source (pinned ⊆
549
- * skills), and the pinned bodies still fit the size limit. The tool map is only recomputed at run
550
- * start.
551
- */
552
- async appendCatalog(conversationId, derive, idemKey, runId) {
553
- const base = (await lockLatestCatalog(this.db.db, conversationId)) ?? { skills: [] };
554
- const derived = derive(base);
555
- if (derived === null)
556
- return null;
557
- const skills = [...derived.skills].sort(byName);
558
- const live = (p) => skills.some((s) => s.id === p.id && s.version === p.version && s.source === p.source);
559
- const pinned = fitPinned((derived.pinned ?? []).filter(live), this.log, {
560
- conversationId,
561
- });
562
- const next = {
563
- skills,
564
- ...(pinned.length > 0 && { pinned }),
565
- ...(derived.toolMap !== undefined && { toolMap: derived.toolMap }),
566
- };
567
- if (sameSnapshot(base, next))
568
- return null;
569
- const written = await this.eventLog.appendIn(conversationId, [
570
- {
571
- type: "skills_catalog",
572
- ...(runId !== undefined && { runId }),
573
- idemKey,
574
- payload: next,
575
- },
576
- ]);
577
- return Math.max(...written.map((e) => e.seq));
578
- }
579
- /**
580
- * 草稿不再生效(拒绝 / 取消)时,在事务 `t` 里给发起对话追加一份回退快照:由该对话最新一份快照推出——
581
- * 来源是这份草稿的条目换成这个 agent 技能当前的正式版本(`t` 里已是决定之后的状态),没有正式版本就移除。
582
- * 快照里已没有这份草稿 → 不写。对话正在运行时,提醒落在当前位置(构建时排在工具结果之后),下一步即生效。
583
- * 移除时不推测同名的组织技能(快照里已被替换掉),下一次运行开始的解析会把它补回来。
381
+ * In the caller's transaction (`mandatory`: `AgentsService` holds the org and agent row locks),
382
+ * cancels the agent's pending requests of the given kinds (default both): marks them
383
+ * cancelled, audits, and for version drafts appends a reverting snapshot to each proposing
384
+ * conversation. The agent's delete cancels both kinds; an ownership transfer only shares (the
385
+ * new owner did not ask). After the commit the caller runs {@link finishCancel} to delete the
386
+ * drafts and publish the events.
584
387
  */
585
- async revertTrial(req) {
586
- const name = req.proposed_version.manifest.name;
587
- const real = await this.db
588
- .selectFrom("skills")
589
- .innerJoin("skill_versions", (j) => j
590
- .onRef("skill_versions.skill_id", "=", "skills.id")
591
- .onRef("skill_versions.version", "=", "skills.current_version"))
592
- .select([
593
- "skills.id",
594
- "skills.current_version",
595
- "skill_versions.manifest",
596
- "skill_versions.object_prefix",
597
- ])
598
- .where("skills.org_id", "=", req.org_id)
599
- .where("skills.scope", "=", "agent")
600
- .where("skills.agent_id", "=", req.agent_id)
601
- .where("skills.name", "=", name)
602
- .where("skills.deleted_at", "is", null)
603
- .executeTakeFirst();
604
- return this.appendCatalog(req.requested_in_conversation, (base) => {
605
- if (!base.skills.some((s) => s.source === req.object_prefix))
606
- return null;
607
- const rest = base.skills.filter((s) => s.source !== req.object_prefix);
608
- // The draft's pinned entry goes (Decision 8): the next run start pins the real version
609
- return {
610
- ...base,
611
- // A manual-only current version (phase D) stays out of the model's catalog
612
- skills: real && invocationOf(real.manifest).model
613
- ? [
614
- ...rest,
615
- {
616
- id: real.id,
617
- name,
618
- description: real.manifest.description,
619
- version: real.current_version,
620
- source: real.object_prefix,
621
- },
622
- ]
623
- : rest,
624
- ...(base.pinned && {
625
- pinned: base.pinned.filter((p) => p.source !== req.object_prefix),
626
- }),
627
- };
628
- }, `skills_catalog:revert:${req.id}`);
629
- }
630
- /**
631
- * In the caller's transaction (`mandatory`: `AgentsService.softDelete` holds the org and agent
632
- * row locks), cancels every pending skill change of the agent: marks them cancelled, audits, and
633
- * appends a reverting snapshot to each requesting conversation. After the commit the caller runs
634
- * {@link finishCancel} to delete the drafts and publish the events.
635
- */
636
- async cancelPendingForAgent(orgId, agentId, actorAccountId, reason, actorTokenId) {
388
+ async cancelPendingForAgent(orgId, agentId, actorAccountId, reason, actorTokenId, kinds = ["share", "version"]) {
637
389
  const rows = await this.db
638
390
  .selectFrom("skill_change_requests")
639
391
  .selectAll()
640
392
  .where("org_id", "=", orgId)
641
393
  .where("agent_id", "=", agentId)
642
394
  .where("status", "=", "pending")
395
+ .where("kind", "in", [...kinds])
643
396
  .orderBy("created_at")
644
397
  .forUpdate()
645
398
  .execute();
646
399
  const out = { prefixes: [], seqs: [] };
647
400
  for (const r of rows) {
648
- await this.db
649
- .updateTable("skill_change_requests")
650
- .set({ status: "cancelled", decided_at: sql `now()` })
651
- .where("id", "=", r.id)
652
- .execute();
653
- await audit(this.db.db, {
401
+ await cancelRequestIn(this.catalogDeps, r, out, {
654
402
  actorAccountId,
655
403
  ...(actorTokenId !== undefined && { actorTokenId }),
656
- orgId,
657
- action: "skill.change_decided",
658
- target: r.id,
659
- detail: { decision: "cancelled", reason, agentId, name: r.proposed_version.manifest.name },
404
+ reason,
660
405
  });
661
- const seq = await this.revertTrial(r);
662
- if (seq !== null)
663
- out.seqs.push([r.requested_in_conversation, seq]);
664
- out.prefixes.push(r.object_prefix);
665
406
  }
666
407
  return out;
667
408
  }
668
- /** {@link cancelPendingForAgent} 提交之后:发布事件、尽力删除草稿对象。 */
409
+ /** After {@link cancelPendingForAgent} commits: publishes the events, deletes the drafts. */
669
410
  async finishCancel(orgId, c) {
670
411
  for (const [conv, seq] of c.seqs)
671
412
  await this.eventLog.notify(conv, seq);
672
413
  for (const p of c.prefixes)
673
414
  await this.deletePrefix(orgId, p);
674
415
  }
675
- /** 新技能的数量上限(含待批准的新技能;`excluding` 是将被取代的申请)。 */
676
- async assertBelowCap(agentId, excluding) {
677
- const skills = await this.db
678
- .selectFrom("skills")
679
- .select((eb) => eb.fn.countAll().as("n"))
680
- .where("scope", "=", "agent")
681
- .where("agent_id", "=", agentId)
682
- .where("deleted_at", "is", null)
683
- .executeTakeFirstOrThrow();
684
- let q = this.db
685
- .selectFrom("skill_change_requests")
686
- .select((eb) => eb.fn.countAll().as("n"))
687
- .where("agent_id", "=", agentId)
688
- .where("status", "=", "pending")
689
- .where("skill_id", "is", null);
690
- if (excluding !== undefined)
691
- q = q.where("id", "!=", excluding);
692
- const drafts = await q.executeTakeFirstOrThrow();
693
- if (Number(skills.n) + Number(drafts.n) >= AGENT_SKILLS_MAX)
694
- throw new ToolError(capText());
695
- }
696
- /** 写一个版本并让 `current_version` 指向它(技能不存在则新建)。 */
697
- async createVersion(v) {
698
- if (v.exists) {
699
- await this.db
700
- .updateTable("skills")
701
- .set({
702
- current_version: v.version,
703
- description: v.manifest.description,
704
- updated_at: sql `now()`,
705
- })
706
- .where("id", "=", v.skillId)
707
- .execute();
708
- }
709
- else {
710
- await this.db
711
- .insertInto("skills")
712
- .values({
713
- id: v.skillId,
714
- org_id: v.orgId,
715
- scope: "agent",
716
- agent_id: v.agentId,
717
- name: v.manifest.name,
718
- description: v.manifest.description,
719
- current_version: v.version,
720
- created_by: v.createdBy,
721
- })
722
- .execute();
723
- }
724
- await this.db
725
- .insertInto("skill_versions")
726
- .values({
727
- skill_id: v.skillId,
728
- version: v.version,
729
- manifest: JSON.stringify(v.manifest),
730
- object_prefix: v.prefix,
731
- created_by: v.createdBy,
732
- })
733
- .execute();
734
- }
735
- /**
736
- * 先给组织行加 KEY SHARE 锁,再锁 agent 行:与 `AgentsService`(组织行 FOR UPDATE → agent 行)同一顺序。
737
- * 不先锁的话,本事务持有 agent 行后插入引用组织的行(外键取 KEY SHARE)会与之互相等待(40P01)。
738
- */
739
- async keyShareOrg(orgId) {
740
- await this.db
741
- .selectFrom("orgs")
742
- .select("id")
743
- .where("id", "=", orgId)
744
- .forKeyShare()
745
- .executeTakeFirst();
746
- }
747
- /** 尽力删除草稿对象(失败只记日志:孤儿对象随组织数据清理删除)。 */
416
+ /** Deletes draft objects best effort (a failure is only logged: org data cleanup removes them). */
748
417
  async deletePrefix(orgId, prefix) {
749
418
  try {
750
419
  await this.storage.kernel(orgId).deletePrefix(prefix);
@@ -753,7 +422,7 @@ let SkillChangesService = class SkillChangesService {
753
422
  this.log.warn("skill draft cleanup failed", { orgId, prefix, err });
754
423
  }
755
424
  }
756
- /** 补齐 agent 名。 */
425
+ /** Adds the agent names and requester names. */
757
426
  async views(rows) {
758
427
  if (rows.length === 0)
759
428
  return [];
@@ -779,6 +448,7 @@ let SkillChangesService = class SkillChangesService {
779
448
  return rows.map((r) => ({
780
449
  id: r.id,
781
450
  orgId: r.org_id,
451
+ kind: r.kind,
782
452
  agent: { id: r.agent_id, name: names.get(r.agent_id) ?? "" },
783
453
  skillId: r.skill_id,
784
454
  name: r.proposed_version.manifest.name,
@@ -789,22 +459,16 @@ let SkillChangesService = class SkillChangesService {
789
459
  requestedBy: r.requested_by_account,
790
460
  requestedByName: requesterNames.get(r.requested_by_account) ?? "",
791
461
  requestedInConversation: r.requested_in_conversation,
792
- conversationPath: `/chat/${r.requested_in_conversation}`,
462
+ conversationPath: r.requested_in_conversation === null ? null : `/chat/${r.requested_in_conversation}`,
793
463
  decidedBy: r.decided_by,
794
464
  decidedAt: r.decided_at === null ? null : iso(r.decided_at),
795
465
  createdAt: iso(r.created_at),
796
466
  }));
797
467
  }
798
468
  };
799
- __decorate([
800
- Transactional()
801
- ], SkillChangesService.prototype, "writeIn", null);
802
469
  __decorate([
803
470
  Transactional()
804
471
  ], SkillChangesService.prototype, "decideIn", null);
805
- __decorate([
806
- Transactional()
807
- ], SkillChangesService.prototype, "deleteAgentSkillIn", null);
808
472
  __decorate([
809
473
  Transactional({ propagation: "mandatory" })
810
474
  ], SkillChangesService.prototype, "cancelPendingForAgent", null);
@@ -814,12 +478,16 @@ SkillChangesService = __decorate([
814
478
  __param(1, Inject(StorageService)),
815
479
  __param(2, Inject(EventLog)),
816
480
  __param(3, Inject(KERNEL_LOGGER)),
817
- __param(4, Inject(TransactionHost))
481
+ __param(4, Inject(TransactionHost)),
482
+ __param(5, Inject(OrgLock)),
483
+ __param(6, Inject(SkillsService))
818
484
  ], SkillChangesService);
819
485
  export { SkillChangesService };
820
486
  /**
821
- * 按清单顺序读文件文本,共用读取额度 `budget`(超出、对象缺失、存储出错时该文件内容为 null)。
822
- * `store` 为 undefined 表示不读(如草稿已删除)。
487
+ * Reads the files' text in manifest order, sharing the read budget `budget`. A file's content is
488
+ * null past the budget, when its object is missing, on a storage error, and for a binary file
489
+ * (not valid UTF-8, or holding a NUL byte), so the inbox never shows garbage. `store` undefined
490
+ * means nothing is read (e.g. the draft is deleted).
823
491
  */
824
492
  async function readTexts(store, prefix, manifest, budget) {
825
493
  const out = [];
@@ -829,8 +497,10 @@ async function readTexts(store, prefix, manifest, budget) {
829
497
  try {
830
498
  const got = await store.get(`${prefix}${f.path}`);
831
499
  if (got) {
832
- content = await new Response(got.body).text();
500
+ const bytes = await new Response(got.body).arrayBuffer();
833
501
  budget.left -= f.size;
502
+ const text = new TextDecoder("utf-8", { fatal: true }).decode(bytes);
503
+ content = text.includes("\u0000") ? null : text;
834
504
  }
835
505
  }
836
506
  catch {
@@ -841,22 +511,3 @@ async function readTexts(store, prefix, manifest, budget) {
841
511
  }
842
512
  return out;
843
513
  }
844
- /** 并发写入全部文件。 */
845
- async function putAll(store, prefix, files) {
846
- const queue = [...files];
847
- await Promise.all(Array.from({ length: Math.min(PUT_CONCURRENCY, queue.length) }, async () => {
848
- for (let f = queue.shift(); f; f = queue.shift()) {
849
- await store.put(`${prefix}${f.path}`, f.data, {
850
- contentType: "application/octet-stream",
851
- size: f.size,
852
- });
853
- }
854
- }));
855
- }
856
- /** 存储错误 → 给模型的说明(存储不可用可重试);其余原样抛出。 */
857
- function storageError(e) {
858
- if (e instanceof ApiError && e.code === "storage.unavailable") {
859
- return new ToolError(STORAGE_UNAVAILABLE_TEXT);
860
- }
861
- return e;
862
- }