@capybara-hq/kernel 0.0.0-stage → 0.1.0-rc.0

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 (631) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +2 -0
  3. package/README.md +20 -2
  4. package/bootstrap.json +22 -0
  5. package/dist/admin/admin.controller.d.ts +139 -0
  6. package/dist/admin/admin.controller.js +238 -0
  7. package/dist/admin/extensions.controller.d.ts +100 -0
  8. package/dist/admin/extensions.controller.js +226 -0
  9. package/dist/admin/setup.controller.d.ts +36 -0
  10. package/dist/admin/setup.controller.js +106 -0
  11. package/dist/admin/setup.service.d.ts +47 -0
  12. package/dist/admin/setup.service.js +90 -0
  13. package/dist/agents/agents.controller.d.ts +205 -0
  14. package/dist/agents/agents.controller.js +144 -0
  15. package/dist/agents/agents.service.d.ts +177 -0
  16. package/dist/agents/agents.service.js +677 -0
  17. package/dist/agents/definition.d.ts +198 -0
  18. package/dist/agents/definition.js +152 -0
  19. package/dist/agents/models.controller.d.ts +13 -0
  20. package/dist/agents/models.controller.js +31 -0
  21. package/dist/agents/templates.controller.d.ts +15 -0
  22. package/dist/agents/templates.controller.js +37 -0
  23. package/dist/agents/templates.d.ts +83 -0
  24. package/dist/agents/templates.js +173 -0
  25. package/dist/catalog/admin-catalog.controller.d.ts +143 -0
  26. package/dist/catalog/admin-catalog.controller.js +245 -0
  27. package/dist/catalog/catalog.service.d.ts +430 -0
  28. package/dist/catalog/catalog.service.js +882 -0
  29. package/dist/catalog/claude/agents.d.ts +27 -0
  30. package/dist/catalog/claude/agents.js +270 -0
  31. package/dist/catalog/claude/commands.d.ts +50 -0
  32. package/dist/catalog/claude/commands.js +179 -0
  33. package/dist/catalog/claude/manifest.d.ts +69 -0
  34. package/dist/catalog/claude/manifest.js +134 -0
  35. package/dist/catalog/claude/marketplace.d.ts +35 -0
  36. package/dist/catalog/claude/marketplace.js +194 -0
  37. package/dist/catalog/claude/mcp.d.ts +33 -0
  38. package/dist/catalog/claude/mcp.js +226 -0
  39. package/dist/catalog/claude/report.d.ts +86 -0
  40. package/dist/catalog/claude/report.js +121 -0
  41. package/dist/catalog/claude/translate.d.ts +56 -0
  42. package/dist/catalog/claude/translate.js +857 -0
  43. package/dist/catalog/cli.d.ts +46 -0
  44. package/dist/catalog/cli.js +211 -0
  45. package/dist/catalog/git-source.d.ts +127 -0
  46. package/dist/catalog/git-source.js +520 -0
  47. package/dist/catalog/marketplace-fetch.d.ts +99 -0
  48. package/dist/catalog/marketplace-fetch.js +203 -0
  49. package/dist/catalog/marketplaces.controller.d.ts +97 -0
  50. package/dist/catalog/marketplaces.controller.js +197 -0
  51. package/dist/catalog/marketplaces.service.d.ts +340 -0
  52. package/dist/catalog/marketplaces.service.js +1217 -0
  53. package/dist/catalog/org-catalog.controller.d.ts +128 -0
  54. package/dist/catalog/org-catalog.controller.js +277 -0
  55. package/dist/catalog/org-catalog.service.d.ts +246 -0
  56. package/dist/catalog/org-catalog.service.js +625 -0
  57. package/dist/catalog/plugin-import.d.ts +436 -0
  58. package/dist/catalog/plugin-import.js +1069 -0
  59. package/dist/catalog/plugin-install.d.ts +447 -0
  60. package/dist/catalog/plugin-install.js +1333 -0
  61. package/dist/catalog/plugin-package.d.ts +143 -0
  62. package/dist/catalog/plugin-package.js +382 -0
  63. package/dist/catalog/plugin-upgrade.d.ts +222 -0
  64. package/dist/catalog/plugin-upgrade.js +1219 -0
  65. package/dist/catalog/requests.service.d.ts +162 -0
  66. package/dist/catalog/requests.service.js +504 -0
  67. package/dist/catalog/schema-path.d.ts +7 -0
  68. package/dist/catalog/schema-path.js +63 -0
  69. package/dist/catalog/upgrade-targets.d.ts +59 -0
  70. package/dist/catalog/upgrade-targets.js +90 -0
  71. package/dist/catalog/versions.d.ts +31 -0
  72. package/dist/catalog/versions.js +44 -0
  73. package/dist/channels/actions.d.ts +37 -0
  74. package/dist/channels/actions.js +121 -0
  75. package/dist/channels/cards.d.ts +44 -0
  76. package/dist/channels/cards.js +156 -0
  77. package/dist/channels/connections.controller.d.ts +59 -0
  78. package/dist/channels/connections.controller.js +115 -0
  79. package/dist/channels/connections.service.d.ts +187 -0
  80. package/dist/channels/connections.service.js +534 -0
  81. package/dist/channels/features.d.ts +12 -0
  82. package/dist/channels/features.js +22 -0
  83. package/dist/channels/inbound.d.ts +120 -0
  84. package/dist/channels/inbound.js +332 -0
  85. package/dist/channels/outbound.d.ts +140 -0
  86. package/dist/channels/outbound.js +1125 -0
  87. package/dist/channels/phrases.d.ts +100 -0
  88. package/dist/channels/phrases.js +81 -0
  89. package/dist/channels/supervisor.d.ts +182 -0
  90. package/dist/channels/supervisor.js +625 -0
  91. package/dist/channels/threads.d.ts +29 -0
  92. package/dist/channels/threads.js +104 -0
  93. package/dist/channels/webhook-url.d.ts +16 -0
  94. package/dist/channels/webhook-url.js +34 -0
  95. package/dist/channels/webhook.controller.d.ts +19 -0
  96. package/dist/channels/webhook.controller.js +72 -0
  97. package/dist/channels/webhook.d.ts +73 -0
  98. package/dist/channels/webhook.js +274 -0
  99. package/dist/config/docs.d.ts +9 -0
  100. package/dist/config/docs.js +85 -0
  101. package/dist/config/env.d.ts +6 -0
  102. package/dist/config/env.js +73 -0
  103. package/dist/config/fields.d.ts +42 -0
  104. package/dist/config/fields.js +214 -0
  105. package/dist/config/file-source.d.ts +3 -0
  106. package/dist/config/file-source.js +31 -0
  107. package/dist/config/load.d.ts +20 -0
  108. package/dist/config/load.js +98 -0
  109. package/dist/config/nacos-source.d.ts +31 -0
  110. package/dist/config/nacos-source.js +229 -0
  111. package/dist/config/schema.d.ts +223 -0
  112. package/dist/config/schema.js +1151 -0
  113. package/dist/config/sources.d.ts +18 -0
  114. package/dist/config/sources.js +59 -0
  115. package/dist/config/types.d.ts +9 -0
  116. package/dist/config/types.js +7 -0
  117. package/dist/conversations/artifacts.d.ts +52 -0
  118. package/dist/conversations/artifacts.js +137 -0
  119. package/dist/conversations/attachments.controller.d.ts +28 -0
  120. package/dist/conversations/attachments.controller.js +96 -0
  121. package/dist/conversations/attachments.service.d.ts +180 -0
  122. package/dist/conversations/attachments.service.js +578 -0
  123. package/dist/conversations/conversations.controller.d.ts +288 -0
  124. package/dist/conversations/conversations.controller.js +607 -0
  125. package/dist/conversations/conversations.service.d.ts +321 -0
  126. package/dist/conversations/conversations.service.js +754 -0
  127. package/dist/conversations/event-log.d.ts +122 -0
  128. package/dist/conversations/event-log.js +259 -0
  129. package/dist/conversations/events.d.ts +856 -0
  130. package/dist/conversations/events.js +639 -0
  131. package/dist/conversations/files.d.ts +92 -0
  132. package/dist/conversations/files.js +213 -0
  133. package/dist/conversations/outputs-read.d.ts +34 -0
  134. package/dist/conversations/outputs-read.js +37 -0
  135. package/dist/conversations/queue.d.ts +169 -0
  136. package/dist/conversations/queue.js +527 -0
  137. package/dist/conversations/sandbox-status.d.ts +21 -0
  138. package/dist/conversations/sandbox-status.js +24 -0
  139. package/dist/conversations/selection.d.ts +46 -0
  140. package/dist/conversations/selection.js +75 -0
  141. package/dist/conversations/titles.d.ts +93 -0
  142. package/dist/conversations/titles.js +422 -0
  143. package/dist/ctx/bus.d.ts +16 -0
  144. package/dist/ctx/bus.js +101 -0
  145. package/dist/ctx/create-ctx.d.ts +109 -0
  146. package/dist/ctx/create-ctx.js +592 -0
  147. package/dist/ctx/kv.d.ts +4 -0
  148. package/dist/ctx/kv.js +31 -0
  149. package/dist/ctx/lock.d.ts +4 -0
  150. package/dist/ctx/lock.js +39 -0
  151. package/dist/ctx/namespace.d.ts +6 -0
  152. package/dist/ctx/namespace.js +12 -0
  153. package/dist/ctx/queue.d.ts +25 -0
  154. package/dist/ctx/queue.js +150 -0
  155. package/dist/ctx/secrets.d.ts +45 -0
  156. package/dist/ctx/secrets.js +175 -0
  157. package/dist/db/kernel-schema.d.ts +1122 -0
  158. package/dist/db/kernel-schema.js +5 -0
  159. package/dist/db/migrator.d.ts +28 -0
  160. package/dist/db/migrator.js +140 -0
  161. package/dist/db/pool.d.ts +21 -0
  162. package/dist/db/pool.js +28 -0
  163. package/dist/db/sql-statements.d.ts +34 -0
  164. package/dist/db/sql-statements.js +168 -0
  165. package/dist/errors.d.ts +210 -0
  166. package/dist/errors.js +212 -0
  167. package/dist/evals/budget.d.ts +61 -0
  168. package/dist/evals/budget.js +181 -0
  169. package/dist/evals/diff.d.ts +55 -0
  170. package/dist/evals/diff.js +133 -0
  171. package/dist/evals/judge.d.ts +53 -0
  172. package/dist/evals/judge.js +149 -0
  173. package/dist/evals/plan.d.ts +47 -0
  174. package/dist/evals/plan.js +77 -0
  175. package/dist/evals/reconstruct.d.ts +137 -0
  176. package/dist/evals/reconstruct.js +322 -0
  177. package/dist/evals/recorded-tools.d.ts +54 -0
  178. package/dist/evals/recorded-tools.js +167 -0
  179. package/dist/evals/run-replay.d.ts +86 -0
  180. package/dist/evals/run-replay.js +502 -0
  181. package/dist/evals/runs.controller.d.ts +100 -0
  182. package/dist/evals/runs.controller.js +199 -0
  183. package/dist/evals/runs.service.d.ts +275 -0
  184. package/dist/evals/runs.service.js +836 -0
  185. package/dist/evals/sets.controller.d.ts +61 -0
  186. package/dist/evals/sets.controller.js +183 -0
  187. package/dist/evals/sets.service.d.ts +128 -0
  188. package/dist/evals/sets.service.js +558 -0
  189. package/dist/evals/snapshot.d.ts +76 -0
  190. package/dist/evals/snapshot.js +207 -0
  191. package/dist/evals/step-replay.d.ts +113 -0
  192. package/dist/evals/step-replay.js +181 -0
  193. package/dist/evals/trajectory.controller.d.ts +41 -0
  194. package/dist/evals/trajectory.controller.js +88 -0
  195. package/dist/evals/trajectory.d.ts +144 -0
  196. package/dist/evals/trajectory.js +338 -0
  197. package/dist/evals/trajectory.service.d.ts +108 -0
  198. package/dist/evals/trajectory.service.js +323 -0
  199. package/dist/evals/worker.d.ts +101 -0
  200. package/dist/evals/worker.js +789 -0
  201. package/dist/extensions/admin-ops.d.ts +105 -0
  202. package/dist/extensions/admin-ops.js +353 -0
  203. package/dist/extensions/admin-view.d.ts +79 -0
  204. package/dist/extensions/admin-view.js +327 -0
  205. package/dist/extensions/approvals.d.ts +119 -0
  206. package/dist/extensions/approvals.js +205 -0
  207. package/dist/extensions/blobs.d.ts +45 -0
  208. package/dist/extensions/blobs.js +160 -0
  209. package/dist/extensions/bootstrap.d.ts +149 -0
  210. package/dist/extensions/bootstrap.js +441 -0
  211. package/dist/extensions/cli.d.ts +61 -0
  212. package/dist/extensions/cli.js +165 -0
  213. package/dist/extensions/config-json-schema.d.ts +9 -0
  214. package/dist/extensions/config-json-schema.js +73 -0
  215. package/dist/extensions/deployment-config.d.ts +138 -0
  216. package/dist/extensions/deployment-config.js +394 -0
  217. package/dist/extensions/enabled.d.ts +31 -0
  218. package/dist/extensions/enabled.js +55 -0
  219. package/dist/extensions/hooks.d.ts +161 -0
  220. package/dist/extensions/hooks.js +425 -0
  221. package/dist/extensions/host.d.ts +577 -0
  222. package/dist/extensions/host.js +2071 -0
  223. package/dist/extensions/inflight.d.ts +69 -0
  224. package/dist/extensions/inflight.js +277 -0
  225. package/dist/extensions/installs.d.ts +166 -0
  226. package/dist/extensions/installs.js +253 -0
  227. package/dist/extensions/instance.d.ts +167 -0
  228. package/dist/extensions/instance.js +329 -0
  229. package/dist/extensions/ledger.d.ts +30 -0
  230. package/dist/extensions/ledger.js +50 -0
  231. package/dist/extensions/lifecycle.d.ts +80 -0
  232. package/dist/extensions/lifecycle.js +152 -0
  233. package/dist/extensions/migrate-lock.d.ts +51 -0
  234. package/dist/extensions/migrate-lock.js +100 -0
  235. package/dist/extensions/org-config.controller.d.ts +24 -0
  236. package/dist/extensions/org-config.controller.js +59 -0
  237. package/dist/extensions/org-config.d.ts +169 -0
  238. package/dist/extensions/org-config.js +520 -0
  239. package/dist/extensions/package.d.ts +115 -0
  240. package/dist/extensions/package.js +246 -0
  241. package/dist/extensions/permission-set.d.ts +117 -0
  242. package/dist/extensions/permission-set.js +184 -0
  243. package/dist/extensions/permission-view.d.ts +194 -0
  244. package/dist/extensions/permission-view.js +284 -0
  245. package/dist/extensions/registry.d.ts +24 -0
  246. package/dist/extensions/registry.js +56 -0
  247. package/dist/extensions/resolve.d.ts +12 -0
  248. package/dist/extensions/resolve.js +71 -0
  249. package/dist/extensions/sources.d.ts +69 -0
  250. package/dist/extensions/sources.js +120 -0
  251. package/dist/extensions/sync.d.ts +40 -0
  252. package/dist/extensions/sync.js +242 -0
  253. package/dist/files/previewers.controller.d.ts +46 -0
  254. package/dist/files/previewers.controller.js +105 -0
  255. package/dist/files/previewers.d.ts +100 -0
  256. package/dist/files/previewers.js +250 -0
  257. package/dist/http/api.module.d.ts +114 -0
  258. package/dist/http/api.module.js +448 -0
  259. package/dist/http/app.d.ts +77 -0
  260. package/dist/http/app.js +170 -0
  261. package/dist/http/error.filter.d.ts +21 -0
  262. package/dist/http/error.filter.js +85 -0
  263. package/dist/http/gateway.module.d.ts +15 -0
  264. package/dist/http/gateway.module.js +13 -0
  265. package/dist/http/health.controller.d.ts +26 -0
  266. package/dist/http/health.controller.js +79 -0
  267. package/dist/http/nest-logger.d.ts +20 -0
  268. package/dist/http/nest-logger.js +28 -0
  269. package/dist/http/plugin-dispatch.d.ts +68 -0
  270. package/dist/http/plugin-dispatch.js +200 -0
  271. package/dist/http/tokens.d.ts +131 -0
  272. package/dist/http/tokens.js +131 -0
  273. package/dist/http/zod.pipe.d.ts +8 -0
  274. package/dist/http/zod.pipe.js +14 -0
  275. package/dist/identity/accounts.d.ts +93 -0
  276. package/dist/identity/accounts.js +367 -0
  277. package/dist/identity/api-tokens.d.ts +73 -0
  278. package/dist/identity/api-tokens.js +197 -0
  279. package/dist/identity/audit.d.ts +23 -0
  280. package/dist/identity/audit.js +41 -0
  281. package/dist/identity/auth.controller.d.ts +40 -0
  282. package/dist/identity/auth.controller.js +130 -0
  283. package/dist/identity/auth.guard.d.ts +41 -0
  284. package/dist/identity/auth.guard.js +162 -0
  285. package/dist/identity/binding.d.ts +47 -0
  286. package/dist/identity/binding.js +84 -0
  287. package/dist/identity/cookies.d.ts +16 -0
  288. package/dist/identity/cookies.js +32 -0
  289. package/dist/identity/credential-check.d.ts +17 -0
  290. package/dist/identity/credential-check.js +24 -0
  291. package/dist/identity/enterprise-admin.d.ts +14 -0
  292. package/dist/identity/enterprise-admin.js +27 -0
  293. package/dist/identity/external.d.ts +106 -0
  294. package/dist/identity/external.js +337 -0
  295. package/dist/identity/hash.d.ts +2 -0
  296. package/dist/identity/hash.js +3 -0
  297. package/dist/identity/login.d.ts +6 -0
  298. package/dist/identity/login.js +20 -0
  299. package/dist/identity/me.controller.d.ts +61 -0
  300. package/dist/identity/me.controller.js +159 -0
  301. package/dist/identity/passwords.d.ts +6 -0
  302. package/dist/identity/passwords.js +37 -0
  303. package/dist/identity/principal.d.ts +56 -0
  304. package/dist/identity/principal.js +38 -0
  305. package/dist/identity/rate-limit.d.ts +55 -0
  306. package/dist/identity/rate-limit.js +121 -0
  307. package/dist/identity/sessions.d.ts +84 -0
  308. package/dist/identity/sessions.js +306 -0
  309. package/dist/identity/settings.d.ts +121 -0
  310. package/dist/identity/settings.js +248 -0
  311. package/dist/identity/sso.controller.d.ts +59 -0
  312. package/dist/identity/sso.controller.js +192 -0
  313. package/dist/identity/sso.d.ts +83 -0
  314. package/dist/identity/sso.js +202 -0
  315. package/dist/inbox/inbox.service.d.ts +43 -0
  316. package/dist/inbox/inbox.service.js +57 -0
  317. package/dist/index.d.ts +67 -0
  318. package/dist/index.js +65 -0
  319. package/dist/kernel.d.ts +256 -0
  320. package/dist/kernel.js +1326 -0
  321. package/dist/log.d.ts +48 -0
  322. package/dist/log.js +229 -0
  323. package/dist/models/prices.d.ts +53 -0
  324. package/dist/models/prices.js +121 -0
  325. package/dist/models/purposes.controller.d.ts +19 -0
  326. package/dist/models/purposes.controller.js +56 -0
  327. package/dist/models/purposes.d.ts +140 -0
  328. package/dist/models/purposes.js +267 -0
  329. package/dist/net/proxy.d.ts +44 -0
  330. package/dist/net/proxy.js +162 -0
  331. package/dist/net/public-address.d.ts +60 -0
  332. package/dist/net/public-address.js +271 -0
  333. package/dist/net/safe-fetch.d.ts +38 -0
  334. package/dist/net/safe-fetch.js +140 -0
  335. package/dist/orgs/directory-sync.controller.d.ts +14 -0
  336. package/dist/orgs/directory-sync.controller.js +40 -0
  337. package/dist/orgs/directory-sync.d.ts +166 -0
  338. package/dist/orgs/directory-sync.js +558 -0
  339. package/dist/orgs/invitations.controller.d.ts +58 -0
  340. package/dist/orgs/invitations.controller.js +137 -0
  341. package/dist/orgs/invitations.service.d.ts +80 -0
  342. package/dist/orgs/invitations.service.js +217 -0
  343. package/dist/orgs/members.service.d.ts +63 -0
  344. package/dist/orgs/members.service.js +234 -0
  345. package/dist/orgs/offboarding.d.ts +141 -0
  346. package/dist/orgs/offboarding.js +398 -0
  347. package/dist/orgs/org-lock.d.ts +32 -0
  348. package/dist/orgs/org-lock.js +46 -0
  349. package/dist/orgs/org.guard.d.ts +35 -0
  350. package/dist/orgs/org.guard.js +95 -0
  351. package/dist/orgs/orgs.controller.d.ts +78 -0
  352. package/dist/orgs/orgs.controller.js +192 -0
  353. package/dist/orgs/orgs.service.d.ts +61 -0
  354. package/dist/orgs/orgs.service.js +209 -0
  355. package/dist/orgs/roles.d.ts +13 -0
  356. package/dist/orgs/roles.js +58 -0
  357. package/dist/orgs/settings.controller.d.ts +20 -0
  358. package/dist/orgs/settings.controller.js +53 -0
  359. package/dist/orgs/settings.service.d.ts +120 -0
  360. package/dist/orgs/settings.service.js +178 -0
  361. package/dist/packages/npm.d.ts +50 -0
  362. package/dist/packages/npm.js +218 -0
  363. package/dist/packages/provenance.d.ts +47 -0
  364. package/dist/packages/provenance.js +147 -0
  365. package/dist/packages/tgz.d.ts +76 -0
  366. package/dist/packages/tgz.js +225 -0
  367. package/dist/runtime/abort.d.ts +32 -0
  368. package/dist/runtime/abort.js +71 -0
  369. package/dist/runtime/checkpointer.d.ts +32 -0
  370. package/dist/runtime/checkpointer.js +243 -0
  371. package/dist/runtime/context/build.d.ts +254 -0
  372. package/dist/runtime/context/build.js +693 -0
  373. package/dist/runtime/context/claude-tools.d.ts +11 -0
  374. package/dist/runtime/context/claude-tools.js +24 -0
  375. package/dist/runtime/context/compaction.d.ts +26 -0
  376. package/dist/runtime/context/compaction.js +195 -0
  377. package/dist/runtime/context/pairing.d.ts +11 -0
  378. package/dist/runtime/context/pairing.js +82 -0
  379. package/dist/runtime/context/reminders.d.ts +5 -0
  380. package/dist/runtime/context/reminders.js +11 -0
  381. package/dist/runtime/context/skills.d.ts +105 -0
  382. package/dist/runtime/context/skills.js +283 -0
  383. package/dist/runtime/context/tokens.d.ts +19 -0
  384. package/dist/runtime/context/tokens.js +104 -0
  385. package/dist/runtime/conversation-lock.d.ts +40 -0
  386. package/dist/runtime/conversation-lock.js +97 -0
  387. package/dist/runtime/hook-calls.d.ts +84 -0
  388. package/dist/runtime/hook-calls.js +136 -0
  389. package/dist/runtime/langgraph-loop.d.ts +52 -0
  390. package/dist/runtime/langgraph-loop.js +247 -0
  391. package/dist/runtime/loop.d.ts +93 -0
  392. package/dist/runtime/loop.js +7 -0
  393. package/dist/runtime/maintenance.d.ts +80 -0
  394. package/dist/runtime/maintenance.js +147 -0
  395. package/dist/runtime/media-cache.d.ts +21 -0
  396. package/dist/runtime/media-cache.js +51 -0
  397. package/dist/runtime/model-call.d.ts +176 -0
  398. package/dist/runtime/model-call.js +1049 -0
  399. package/dist/runtime/providers.d.ts +86 -0
  400. package/dist/runtime/providers.js +224 -0
  401. package/dist/runtime/quota.d.ts +29 -0
  402. package/dist/runtime/quota.js +70 -0
  403. package/dist/runtime/run-finish.d.ts +45 -0
  404. package/dist/runtime/run-finish.js +69 -0
  405. package/dist/runtime/run-queue.d.ts +121 -0
  406. package/dist/runtime/run-queue.js +493 -0
  407. package/dist/runtime/run-worker.d.ts +138 -0
  408. package/dist/runtime/run-worker.js +805 -0
  409. package/dist/runtime/stream.controller.d.ts +34 -0
  410. package/dist/runtime/stream.controller.js +122 -0
  411. package/dist/runtime/stream.d.ts +63 -0
  412. package/dist/runtime/stream.js +262 -0
  413. package/dist/runtime/subagents/child.d.ts +80 -0
  414. package/dist/runtime/subagents/child.js +225 -0
  415. package/dist/runtime/subagents/definition.d.ts +103 -0
  416. package/dist/runtime/subagents/definition.js +392 -0
  417. package/dist/runtime/subagents/dispatch.d.ts +69 -0
  418. package/dist/runtime/subagents/dispatch.js +502 -0
  419. package/dist/runtime/subagents/limits.d.ts +23 -0
  420. package/dist/runtime/subagents/limits.js +34 -0
  421. package/dist/runtime/subagents/org-agents.d.ts +50 -0
  422. package/dist/runtime/subagents/org-agents.js +70 -0
  423. package/dist/runtime/subagents/preamble.d.ts +7 -0
  424. package/dist/runtime/subagents/preamble.js +11 -0
  425. package/dist/runtime/subagents/progress.d.ts +26 -0
  426. package/dist/runtime/subagents/progress.js +36 -0
  427. package/dist/runtime/subagents/roster.d.ts +55 -0
  428. package/dist/runtime/subagents/roster.js +111 -0
  429. package/dist/runtime/subagents/skill-fork.d.ts +123 -0
  430. package/dist/runtime/subagents/skill-fork.js +259 -0
  431. package/dist/runtime/usage-report.d.ts +163 -0
  432. package/dist/runtime/usage-report.js +550 -0
  433. package/dist/runtime/waits.d.ts +233 -0
  434. package/dist/runtime/waits.js +883 -0
  435. package/dist/sandbox/leases.d.ts +169 -0
  436. package/dist/sandbox/leases.js +515 -0
  437. package/dist/sandbox/lifecycle.d.ts +21 -0
  438. package/dist/sandbox/lifecycle.js +68 -0
  439. package/dist/sandbox/sandbox.service.d.ts +249 -0
  440. package/dist/sandbox/sandbox.service.js +908 -0
  441. package/dist/skills/catalog.d.ts +149 -0
  442. package/dist/skills/catalog.js +405 -0
  443. package/dist/skills/changes.controller.d.ts +56 -0
  444. package/dist/skills/changes.controller.js +136 -0
  445. package/dist/skills/changes.service.d.ts +175 -0
  446. package/dist/skills/changes.service.js +805 -0
  447. package/dist/skills/invocable.controller.d.ts +23 -0
  448. package/dist/skills/invocable.controller.js +50 -0
  449. package/dist/skills/invocation-keys.d.ts +23 -0
  450. package/dist/skills/invocation-keys.js +44 -0
  451. package/dist/skills/invoke.d.ts +135 -0
  452. package/dist/skills/invoke.js +286 -0
  453. package/dist/skills/package.d.ts +87 -0
  454. package/dist/skills/package.js +227 -0
  455. package/dist/skills/skills.controller.d.ts +40 -0
  456. package/dist/skills/skills.controller.js +110 -0
  457. package/dist/skills/skills.service.d.ts +192 -0
  458. package/dist/skills/skills.service.js +567 -0
  459. package/dist/storage/prefix.d.ts +36 -0
  460. package/dist/storage/prefix.js +104 -0
  461. package/dist/storage/purge.d.ts +27 -0
  462. package/dist/storage/purge.js +75 -0
  463. package/dist/storage/storage.service.d.ts +44 -0
  464. package/dist/storage/storage.service.js +145 -0
  465. package/dist/text.d.ts +13 -0
  466. package/dist/text.js +13 -0
  467. package/dist/tools/approvals.controller.d.ts +53 -0
  468. package/dist/tools/approvals.controller.js +128 -0
  469. package/dist/tools/approvals.service.d.ts +172 -0
  470. package/dist/tools/approvals.service.js +568 -0
  471. package/dist/tools/breaker.d.ts +28 -0
  472. package/dist/tools/breaker.js +72 -0
  473. package/dist/tools/builtins/agent.d.ts +81 -0
  474. package/dist/tools/builtins/agent.js +223 -0
  475. package/dist/tools/builtins/ask-user.d.ts +28 -0
  476. package/dist/tools/builtins/ask-user.js +139 -0
  477. package/dist/tools/builtins/read-tool-output.d.ts +18 -0
  478. package/dist/tools/builtins/read-tool-output.js +108 -0
  479. package/dist/tools/builtins/sandbox/bash.d.ts +16 -0
  480. package/dist/tools/builtins/sandbox/bash.js +137 -0
  481. package/dist/tools/builtins/sandbox/common.d.ts +114 -0
  482. package/dist/tools/builtins/sandbox/common.js +304 -0
  483. package/dist/tools/builtins/sandbox/deliver.d.ts +5 -0
  484. package/dist/tools/builtins/sandbox/deliver.js +180 -0
  485. package/dist/tools/builtins/sandbox/edit.d.ts +4 -0
  486. package/dist/tools/builtins/sandbox/edit.js +98 -0
  487. package/dist/tools/builtins/sandbox/glob-match.d.ts +25 -0
  488. package/dist/tools/builtins/sandbox/glob-match.js +240 -0
  489. package/dist/tools/builtins/sandbox/glob.d.ts +4 -0
  490. package/dist/tools/builtins/sandbox/glob.js +104 -0
  491. package/dist/tools/builtins/sandbox/grep.d.ts +9 -0
  492. package/dist/tools/builtins/sandbox/grep.js +133 -0
  493. package/dist/tools/builtins/sandbox/index.d.ts +12 -0
  494. package/dist/tools/builtins/sandbox/index.js +27 -0
  495. package/dist/tools/builtins/sandbox/names.d.ts +7 -0
  496. package/dist/tools/builtins/sandbox/names.js +20 -0
  497. package/dist/tools/builtins/sandbox/read.d.ts +8 -0
  498. package/dist/tools/builtins/sandbox/read.js +121 -0
  499. package/dist/tools/builtins/sandbox/write.d.ts +4 -0
  500. package/dist/tools/builtins/sandbox/write.js +88 -0
  501. package/dist/tools/builtins/skill-load.d.ts +53 -0
  502. package/dist/tools/builtins/skill-load.js +446 -0
  503. package/dist/tools/builtins/skill-write.d.ts +59 -0
  504. package/dist/tools/builtins/skill-write.js +244 -0
  505. package/dist/tools/builtins/tool-search.d.ts +31 -0
  506. package/dist/tools/builtins/tool-search.js +171 -0
  507. package/dist/tools/connector-content.controller.d.ts +34 -0
  508. package/dist/tools/connector-content.controller.js +78 -0
  509. package/dist/tools/connector-content.d.ts +104 -0
  510. package/dist/tools/connector-content.js +267 -0
  511. package/dist/tools/connectors.controller.d.ts +210 -0
  512. package/dist/tools/connectors.controller.js +234 -0
  513. package/dist/tools/connectors.service.d.ts +303 -0
  514. package/dist/tools/connectors.service.js +1102 -0
  515. package/dist/tools/credentials.d.ts +139 -0
  516. package/dist/tools/credentials.js +351 -0
  517. package/dist/tools/drift.d.ts +141 -0
  518. package/dist/tools/drift.js +539 -0
  519. package/dist/tools/elicitation.d.ts +81 -0
  520. package/dist/tools/elicitation.js +266 -0
  521. package/dist/tools/endpoint.d.ts +18 -0
  522. package/dist/tools/endpoint.js +115 -0
  523. package/dist/tools/info.d.ts +67 -0
  524. package/dist/tools/info.js +113 -0
  525. package/dist/tools/naming.d.ts +27 -0
  526. package/dist/tools/naming.js +47 -0
  527. package/dist/tools/oauth/discovery.d.ts +65 -0
  528. package/dist/tools/oauth/discovery.js +307 -0
  529. package/dist/tools/oauth/flow.d.ts +63 -0
  530. package/dist/tools/oauth/flow.js +237 -0
  531. package/dist/tools/oauth/oauth.controller.d.ts +31 -0
  532. package/dist/tools/oauth/oauth.controller.js +95 -0
  533. package/dist/tools/oauth/tokens.d.ts +111 -0
  534. package/dist/tools/oauth/tokens.js +258 -0
  535. package/dist/tools/outputs.d.ts +61 -0
  536. package/dist/tools/outputs.js +156 -0
  537. package/dist/tools/pipeline.d.ts +322 -0
  538. package/dist/tools/pipeline.js +1236 -0
  539. package/dist/tools/policy.d.ts +60 -0
  540. package/dist/tools/policy.js +236 -0
  541. package/dist/tools/questions.controller.d.ts +24 -0
  542. package/dist/tools/questions.controller.js +58 -0
  543. package/dist/tools/questions.service.d.ts +103 -0
  544. package/dist/tools/questions.service.js +295 -0
  545. package/dist/tools/redact.d.ts +20 -0
  546. package/dist/tools/redact.js +60 -0
  547. package/dist/tools/registry.d.ts +246 -0
  548. package/dist/tools/registry.js +481 -0
  549. package/dist/tools/resources.d.ts +16 -0
  550. package/dist/tools/resources.js +76 -0
  551. package/dist/tools/specs.d.ts +14 -0
  552. package/dist/tools/specs.js +31 -0
  553. package/dist/tools/validate.d.ts +20 -0
  554. package/dist/tools/validate.js +183 -0
  555. package/dist/tools/view.d.ts +43 -0
  556. package/dist/tools/view.js +225 -0
  557. package/dist/ui/embed-token.d.ts +31 -0
  558. package/dist/ui/embed-token.js +132 -0
  559. package/dist/ui/registry.d.ts +58 -0
  560. package/dist/ui/registry.js +90 -0
  561. package/dist/ui/ui-stream.d.ts +37 -0
  562. package/dist/ui/ui-stream.js +162 -0
  563. package/dist/ui/views.controller.d.ts +81 -0
  564. package/dist/ui/views.controller.js +261 -0
  565. package/dist/ui/views.d.ts +155 -0
  566. package/dist/ui/views.js +306 -0
  567. package/dist/version.d.ts +5 -0
  568. package/dist/version.js +6 -0
  569. package/package.json +67 -3
  570. package/src/migrations/0001_init.sql +8 -0
  571. package/src/migrations/0002_secrets.sql +8 -0
  572. package/src/migrations/0003_identity.sql +117 -0
  573. package/src/migrations/0004_plugin_org_config_nullable.sql +3 -0
  574. package/src/migrations/0005_agents.sql +27 -0
  575. package/src/migrations/0006_conversations.sql +37 -0
  576. package/src/migrations/0007_checkpoints.sql +26 -0
  577. package/src/migrations/0008_runs_trigger_seq.sql +3 -0
  578. package/src/migrations/0009_runs_active_unique.sql +4 -0
  579. package/src/migrations/0010_tools.sql +125 -0
  580. package/src/migrations/0011_approvals_spec.sql +10 -0
  581. package/src/migrations/0012_run_waits.sql +24 -0
  582. package/src/migrations/0013_app_tools_source.sql +4 -0
  583. package/src/migrations/0014_tool_specs.sql +8 -0
  584. package/src/migrations/0015_tool_drift.sql +20 -0
  585. package/src/migrations/0016_plugin_permissions.sql +11 -0
  586. package/src/migrations/0017_identity_sources.sql +6 -0
  587. package/src/migrations/0018_channels.sql +74 -0
  588. package/src/migrations/0019_identity_trust.sql +17 -0
  589. package/src/migrations/0020_channel_card_lookup.sql +10 -0
  590. package/src/migrations/0021_org_storage_purge.sql +9 -0
  591. package/src/migrations/0022_attachments.sql +29 -0
  592. package/src/migrations/0023_sandboxes.sql +37 -0
  593. package/src/migrations/0024_skills.sql +46 -0
  594. package/src/migrations/0025_skills_catalog_idx.sql +6 -0
  595. package/src/migrations/0026_skill_changes.sql +34 -0
  596. package/src/migrations/0027_model_prices.sql +18 -0
  597. package/src/migrations/0028_evals.sql +105 -0
  598. package/src/migrations/0029_model_purposes.sql +18 -0
  599. package/src/migrations/0030_plugin_installs.sql +73 -0
  600. package/src/migrations/0031_plugin_snapshot_source.sql +6 -0
  601. package/src/migrations/0032_plugin_deployment_configs.sql +10 -0
  602. package/src/migrations/0033_rename_apps_to_connectors.sql +25 -0
  603. package/src/migrations/0034_directory.sql +49 -0
  604. package/src/migrations/0035_catalogs.sql +40 -0
  605. package/src/migrations/0036_app_import_staging.sql +17 -0
  606. package/src/migrations/0037_directory_installs.sql +92 -0
  607. package/src/migrations/0038_channel_inbound_mode.sql +6 -0
  608. package/src/migrations/0039_channel_card_pending.sql +8 -0
  609. package/src/migrations/0040_usage_report_sweep.sql +10 -0
  610. package/src/migrations/0041_rename_plugins_to_extensions.sql +38 -0
  611. package/src/migrations/0042_rename_directory_to_catalog.sql +80 -0
  612. package/src/migrations/0043_rename_app_installs_to_plugin_installs.sql +20 -0
  613. package/src/migrations/0044_catalog_one_kind.sql +90 -0
  614. package/src/migrations/0045_plugin_dependencies.sql +9 -0
  615. package/src/migrations/0046_git_sources.sql +25 -0
  616. package/src/migrations/0047_marketplace_entry_heads.sql +7 -0
  617. package/src/migrations/0048_marketplace_entry_trees.sql +8 -0
  618. package/src/migrations/0049_plugin_upgrades.sql +37 -0
  619. package/src/migrations/0050_bootstrap.sql +53 -0
  620. package/src/migrations/0051_claude_compat.sql +26 -0
  621. package/src/migrations/0052_conversations_account_agent_idx.sql +5 -0
  622. package/src/migrations/0053_subagents.sql +73 -0
  623. package/src/migrations/0054_subagent_wait_expiry.sql +7 -0
  624. package/src/migrations/0055_subagent_parent_indexes.sql +10 -0
  625. package/src/migrations/0056_approval_reason.sql +3 -0
  626. package/src/migrations/0057_conversation_titles.sql +11 -0
  627. package/src/migrations/0058_conversation_selection.sql +4 -0
  628. package/src/migrations/0059_conversation_queue.sql +22 -0
  629. package/src/migrations/0060_file_previewers.sql +10 -0
  630. package/src/migrations/0061_queue_selection.sql +5 -0
  631. package/src/migrations/0062_queued_skill.sql +8 -0
@@ -0,0 +1,567 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { parseSkillMd, SKILL_ENTRY_FILE } from "@capybara-hq/plugin-sdk";
3
+ import { sql } from "kysely";
4
+ import { assertItemInstallable } from "../catalog/requests.service.js";
5
+ import { SKILL_PACKAGE_CONTENT_TYPE, skillFilesPrefix, } from "../conversations/attachments.service.js";
6
+ import { ApiError } from "../errors.js";
7
+ import { audit } from "../identity/audit.js";
8
+ import { assertCustomAllowed } from "../identity/settings.js";
9
+ import { lockOrgAndAuthorize } from "../orgs/org-lock.js";
10
+ import { textBytesTokens } from "../runtime/context/tokens.js";
11
+ import { invocationOf, PINNED_SKILLS_LIMITS } from "./catalog.js";
12
+ import { readSkillPackage, storedInvocation } from "./package.js";
13
+ /**
14
+ * The live org skills named in `skillNames` whose provenance is not catalog item `itemId` (spec
15
+ * §9.2, Decision 8): the org's own skills (`catalog_item_id` null: uploaded or written by an
16
+ * agent) and the skills of other catalog items. A skill of the same item (a reinstall or upgrade)
17
+ * is not a conflict. In the order of `skillNames`.
18
+ */
19
+ export async function skillConflicts(db, orgId, itemId, skillNames) {
20
+ if (skillNames.length === 0)
21
+ return [];
22
+ const rows = await db
23
+ .selectFrom("skills as s")
24
+ .leftJoin("catalog_items as i", "i.id", "s.catalog_item_id")
25
+ .select(["s.name", "s.catalog_item_id", "s.catalog_version", "i.name as item_name"])
26
+ .where("s.org_id", "=", orgId)
27
+ .where("s.scope", "=", "org")
28
+ .where("s.deleted_at", "is", null)
29
+ .where("s.name", "in", [...skillNames])
30
+ .where((eb) => eb.or([eb("s.catalog_item_id", "is", null), eb("s.catalog_item_id", "<>", itemId)]))
31
+ .execute();
32
+ const byName = new Map(rows.map((r) => [r.name, r]));
33
+ const out = [];
34
+ for (const name of new Set(skillNames)) {
35
+ const r = byName.get(name);
36
+ if (!r)
37
+ continue;
38
+ out.push({
39
+ skill: name,
40
+ source: r.catalog_item_id === null
41
+ ? { kind: "org" }
42
+ : {
43
+ kind: "plugin",
44
+ name: r.item_name ?? r.catalog_item_id,
45
+ version: r.catalog_version ?? "",
46
+ },
47
+ });
48
+ }
49
+ return out;
50
+ }
51
+ /** One line of the conflict message (spec §9.2). */
52
+ export function skillConflictLine(c) {
53
+ const source = c.source.kind === "org"
54
+ ? "the org's own skill"
55
+ : `plugin "${c.source.name}" ${c.source.version}`.trimEnd();
56
+ return `Skill "${c.skill}" already exists in this org (source: ${source}). Remove or rename it, then install again.`;
57
+ }
58
+ /** 409 `plugin.skill_conflict`: one message line and one detail per conflicting skill. */
59
+ export function skillConflictError(conflicts) {
60
+ return new ApiError("plugin.skill_conflict", conflicts.map(skillConflictLine).join("\n"), conflicts.map((c) => ({ skill: c.skill, source: c.source })));
61
+ }
62
+ /** 写技能文件时的并发数。 */
63
+ const PUT_CONCURRENCY = 4;
64
+ /** 详情里读取 SKILL.md 正文的上限。 */
65
+ export const SKILL_BODY_MAX_BYTES = 1024 * 1024;
66
+ const notFound = () => new ApiError("skill.not_found", "Skill not found");
67
+ /**
68
+ * 在调用方事务里核对 agent 定义引用的组织技能:每个 id 都必须是该组织未删除的 `scope=org` 技能,
69
+ * 否则 `validation_failed`(path `skills.orgSkills.<i>`);不可重复。调用方须已锁组织行(技能删除同样锁组织行,二者串行)。
70
+ * `kept`:当前版本里已有的引用(保存时合法),修改时不再核对——技能之后被删也不挡住其他改动(运行时由 T14 忽略已删除的技能)。
71
+ */
72
+ export async function assertOrgSkills(t, orgId, ids, kept = new Set()) {
73
+ const details = [];
74
+ const seen = new Set();
75
+ ids.forEach((id, i) => {
76
+ if (seen.has(id))
77
+ details.push({ path: `skills.orgSkills.${i}`, message: "Duplicate skill" });
78
+ seen.add(id);
79
+ });
80
+ const toCheck = [...seen].filter((id) => !kept.has(id));
81
+ if (toCheck.length > 0) {
82
+ const found = await t
83
+ .selectFrom("skills")
84
+ .select("id")
85
+ .where("org_id", "=", orgId)
86
+ .where("scope", "=", "org")
87
+ .where("deleted_at", "is", null)
88
+ .where("id", "in", toCheck)
89
+ .execute();
90
+ const live = new Set([...kept, ...found.map((r) => r.id)]);
91
+ ids.forEach((id, i) => {
92
+ if (!live.has(id)) {
93
+ details.push({
94
+ path: `skills.orgSkills.${i}`,
95
+ message: `Skill ${id} does not exist in this organization or has been deleted`,
96
+ });
97
+ }
98
+ });
99
+ }
100
+ if (details.length > 0) {
101
+ throw new ApiError("validation_failed", "Invalid skill references", details);
102
+ }
103
+ }
104
+ /**
105
+ * Checks `skills.pinned` of an agent definition in the caller's transaction (the org row is locked,
106
+ * like {@link assertOrgSkills}); throws 400 `agent.pinned_invalid` with one detail per problem
107
+ * (`{ skill, reason, totalBytes? }`):
108
+ * - `duplicate`: an id listed twice; `too_many`: every id past {@link PINNED_SKILLS_LIMITS}.count;
109
+ * - each newly added id (not in `kept`, the current definition's pinned ids) must be a live org
110
+ * skill listed in `skills.orgSkills` (else `not_selected`) or a live skill of this agent
111
+ * (`agentId`; null when creating), else `not_found`. Kept ids are not re-checked: a pinned skill
112
+ * deleted later does not block other edits (the run ignores it);
113
+ * - `manual_only` (phase D): a newly added id whose current version is manual-only
114
+ * (`invocation.model === false`); a kept one that became manual-only is dropped at run time;
115
+ * - `too_large`: the current SKILL.md sizes of the live pinned skills total more than
116
+ * {@link PINNED_SKILLS_LIMITS}.totalBytes (named by the first skill past the limit). Checked only
117
+ * when the pinned list changed: a pinned skill's new version never blocks an unrelated edit (the
118
+ * run keeps what fits).
119
+ */
120
+ export async function assertPinnedSkills(t, orgId, agentId, skills, kept = []) {
121
+ const pinned = skills?.pinned;
122
+ if (pinned === undefined)
123
+ return;
124
+ const details = [];
125
+ const seen = new Set();
126
+ const unique = [];
127
+ for (const id of pinned) {
128
+ if (seen.has(id)) {
129
+ details.push({ skill: id, reason: "duplicate" });
130
+ continue;
131
+ }
132
+ seen.add(id);
133
+ if (unique.length >= PINNED_SKILLS_LIMITS.count) {
134
+ details.push({ skill: id, reason: "too_many" });
135
+ continue;
136
+ }
137
+ unique.push(id);
138
+ }
139
+ const rows = unique.length === 0
140
+ ? []
141
+ : await t
142
+ .selectFrom("skills as s")
143
+ .innerJoin("skill_versions as v", (j) => j.onRef("v.skill_id", "=", "s.id").onRef("v.version", "=", "s.current_version"))
144
+ .select(["s.id", "s.scope", "s.agent_id", "v.manifest"])
145
+ .where("s.org_id", "=", orgId)
146
+ .where("s.deleted_at", "is", null)
147
+ .where("s.id", "in", unique)
148
+ .execute();
149
+ const byId = new Map(rows.map((r) => [r.id, r]));
150
+ const keptSet = new Set(kept);
151
+ const selected = new Set(skills?.orgSkills ?? []);
152
+ for (const id of unique) {
153
+ if (keptSet.has(id))
154
+ continue;
155
+ const r = byId.get(id);
156
+ const own = r?.scope === "agent" && agentId !== null && r.agent_id === agentId;
157
+ if (!r || (r.scope === "agent" && !own))
158
+ details.push({ skill: id, reason: "not_found" });
159
+ else if (r.scope === "org" && !selected.has(id))
160
+ details.push({ skill: id, reason: "not_selected" });
161
+ else if (!invocationOf(r.manifest).model)
162
+ details.push({ skill: id, reason: "manual_only" });
163
+ }
164
+ const changed = pinned.length !== kept.length || pinned.some((id, i) => kept[i] !== id);
165
+ if (details.length === 0 && changed) {
166
+ let total = 0;
167
+ let over;
168
+ for (const id of unique) {
169
+ const size = byId.get(id)?.manifest.files.find((f) => f.path === SKILL_ENTRY_FILE)?.size ?? 0;
170
+ total += size;
171
+ if (over === undefined && total > PINNED_SKILLS_LIMITS.totalBytes)
172
+ over = id;
173
+ }
174
+ if (over !== undefined)
175
+ details.push({ skill: over, reason: "too_large", totalBytes: total });
176
+ }
177
+ if (details.length > 0) {
178
+ throw new ApiError("agent.pinned_invalid", `Invalid pinned skills: ${details.map((d) => `${d.skill} (${d.reason})`).join(", ")}`, details);
179
+ }
180
+ }
181
+ const summary = (r) => {
182
+ const entryBytes = r.manifest?.files.find((f) => f.path === SKILL_ENTRY_FILE)?.size ?? 0;
183
+ const inv = r.manifest ? invocationOf(r.manifest) : { model: true, user: true };
184
+ return {
185
+ id: r.id,
186
+ scope: r.scope,
187
+ agentId: r.agent_id,
188
+ name: r.name,
189
+ description: r.description,
190
+ currentVersion: r.current_version,
191
+ createdBy: r.created_by,
192
+ createdAt: r.created_at,
193
+ updatedAt: r.updated_at,
194
+ plugin: r.item_name,
195
+ sourceFormat: r.source_format ?? "capybara",
196
+ suggestPinned: r.suggest_pinned ?? false,
197
+ entryBytes,
198
+ tokenEstimate: textBytesTokens(entryBytes),
199
+ manual: inv.model === false,
200
+ fork: inv.fork !== undefined,
201
+ };
202
+ };
203
+ /**
204
+ * Skills with their summary columns: the catalog item name (provenance) and the current version's
205
+ * source format, pinned suggestion and manifest.
206
+ */
207
+ const summaryQuery = (db) => db
208
+ .selectFrom("skills as s")
209
+ .leftJoin("catalog_items as i", "i.id", "s.catalog_item_id")
210
+ .leftJoin("skill_versions as v", (j) => j.onRef("v.skill_id", "=", "s.id").onRef("v.version", "=", "s.current_version"))
211
+ .select([
212
+ "s.id",
213
+ "s.scope",
214
+ "s.agent_id",
215
+ "s.name",
216
+ "s.description",
217
+ "s.current_version",
218
+ "s.created_by",
219
+ "s.created_at",
220
+ "s.updated_at",
221
+ "i.name as item_name",
222
+ "v.source_format",
223
+ "v.suggest_pinned",
224
+ "v.manifest",
225
+ ]);
226
+ /**
227
+ * 技能库(M5 T13):组织技能的上传(新技能或新版本)、列表、详情与软删除。
228
+ * 字节在对象存储 `kernel/<orgId>/skills/<uploadId>/<path>`,元数据在 PG;无进程内状态,可多副本共用。
229
+ */
230
+ export class SkillsService {
231
+ d;
232
+ constructor(d) {
233
+ this.d = d;
234
+ }
235
+ /** 登记一个技能包上传(预签名 POST,`application/zip`,≤ 50MB);角色由路由的 `skills.manage` 把关。 */
236
+ async createUpload(orgId, accountId, input) {
237
+ // 部署设置 customSkills 为 deny:组织只能从企业目录安装技能(C22)
238
+ await assertCustomAllowed(this.d.db, "customSkills");
239
+ return this.d.attachments.create(orgId, accountId, { name: input.name, contentType: SKILL_PACKAGE_CONTENT_TYPE, size: input.size }, "skill-package");
240
+ }
241
+ /**
242
+ * 用一个技能包上传创建技能或新增版本:
243
+ * 1. 取上传的 zip(只有上传者;未 finalize 的先 finalize),解包校验(`skill.invalid_package`);
244
+ * 2. 把文件写到 `skills/<uploadId>/`(键只取决于上传 id 与包内路径:重试幂等);
245
+ * 3. 一个事务里:锁组织行并复核 `skills.manage`,把上传标记为已用掉(并发的同一上传只有一个成功),
246
+ * 同名未删除的组织技能存在则 `current_version + 1`,否则新建(组织行锁串行化,版本号不会重复),写版本与审计。
247
+ * 第 3 步之前中断不会留下可见的版本;已写的文件由清理任务在上传过期后删除(未被任何版本引用时)。
248
+ * 同一上传已经产生过版本(上次提交了、响应丢了而重试)→ 直接返回那个版本(同组织、同一发起人)。
249
+ */
250
+ async upload(orgId, actorAccountId, uploadId, actorTokenId) {
251
+ this.d.storage.assertAvailable();
252
+ const prefix = skillFilesPrefix(uploadId);
253
+ // 重试(上次已提交、响应丢了):同一上传已产生的版本直接返回,不再要求上传仍可用
254
+ const done = await this.d.db
255
+ .selectFrom("skill_versions")
256
+ .innerJoin("skills", "skills.id", "skill_versions.skill_id")
257
+ .select(["skills.id", "skill_versions.version"])
258
+ .where("skill_versions.object_prefix", "=", prefix)
259
+ .where("skills.org_id", "=", orgId)
260
+ .where("skill_versions.created_by", "=", actorAccountId)
261
+ .where("skills.deleted_at", "is", null)
262
+ .executeTakeFirst();
263
+ if (done) {
264
+ const row = await summaryQuery(this.d.db)
265
+ .where("s.id", "=", done.id)
266
+ .executeTakeFirstOrThrow();
267
+ return { skill: summary(row), version: done.version, created: done.version === 1 };
268
+ }
269
+ // 自建被禁止时先拒绝(事务里再复核一次)
270
+ await assertCustomAllowed(this.d.db, "customSkills");
271
+ const zip = await this.d.attachments.readSkillPackage(orgId, actorAccountId, uploadId);
272
+ const pkg = await readSkillPackage(zip);
273
+ return this.createVersionFromFiles(orgId, actorAccountId, pkg, {
274
+ prefix,
275
+ ...(actorTokenId !== undefined && { actorTokenId }),
276
+ inTransaction: async (t) => {
277
+ await assertCustomAllowed(t, "customSkills");
278
+ await this.d.attachments.consumeSkillPackage(t, orgId, actorAccountId, uploadId);
279
+ },
280
+ });
281
+ }
282
+ /**
283
+ * 用一组已校验的技能文件创建组织技能或给同名技能新增版本(上传与企业目录安装共用):
284
+ * 1. 把文件写到 `kernel/<orgId>/<prefix>`(缺省 `skills/<新 id>/`);
285
+ * 2. 一个事务里:锁组织行并复核 `skills.manage`,执行 `inTransaction`(上传:标记上传已用;目录:按条目策略复核),
286
+ * 同名未删除的组织技能存在则 `current_version + 1`,否则新建;技能与版本都记下 `directory` 来源(没有则清空:
287
+ * 自定义上传盖在目录技能上就不再算目录安装),写版本与审计
288
+ * (`skill.created` / `skill.version_created`,目录安装时 detail 带 directory)。
289
+ */
290
+ async createVersionFromFiles(orgId, actorAccountId, pkg, opts = {}) {
291
+ this.d.storage.assertAvailable();
292
+ const prefix = opts.prefix ?? skillFilesPrefix(randomUUID());
293
+ const store = this.d.storage.kernel(orgId);
294
+ const queue = [...pkg.files];
295
+ await Promise.all(Array.from({ length: Math.min(PUT_CONCURRENCY, queue.length) }, async () => {
296
+ for (let f = queue.shift(); f; f = queue.shift()) {
297
+ await store.put(`${prefix}${f.path}`, f.data, {
298
+ contentType: "application/octet-stream",
299
+ size: f.size,
300
+ });
301
+ }
302
+ }));
303
+ const invocation = pkg.invocation && storedInvocation(pkg.invocation);
304
+ const manifest = {
305
+ name: pkg.name,
306
+ description: pkg.description,
307
+ files: pkg.files.map(({ path, size, sha256 }) => ({ path, size, sha256 })),
308
+ ...(invocation !== undefined && { invocation }),
309
+ };
310
+ const actorTokenId = opts.actorTokenId;
311
+ return this.d.db.transaction().execute(async (t) => {
312
+ await lockOrgAndAuthorize(t, orgId, actorAccountId, "skills.manage");
313
+ if (opts.catalog) {
314
+ const c = opts.catalog;
315
+ await assertItemInstallable(t, orgId, c.itemId, c.approvedBy ?? c.itemId);
316
+ }
317
+ await opts.inTransaction?.(t);
318
+ const existing = await t
319
+ .selectFrom("skills")
320
+ .select(["id", "current_version", "catalog_item_id"])
321
+ .where("org_id", "=", orgId)
322
+ .where("scope", "=", "org")
323
+ .where("name", "=", pkg.name)
324
+ .where("deleted_at", "is", null)
325
+ .forUpdate()
326
+ .executeTakeFirst();
327
+ // A catalog install never overwrites a skill of other provenance (spec §9.2; planning checks
328
+ // it first, this closes the race with a skill created since)
329
+ if (existing && opts.catalog && existing.catalog_item_id !== opts.catalog.itemId) {
330
+ const conflicts = await skillConflicts(t, orgId, opts.catalog.itemId, [pkg.name]);
331
+ if (conflicts.length > 0)
332
+ throw skillConflictError(conflicts);
333
+ }
334
+ const id = existing?.id ?? randomUUID();
335
+ const version = (existing?.current_version ?? 0) + 1;
336
+ // 来源跟着最新版本走:目录安装记条目与版本,自定义上传清掉(内容已不是目录里的那份)
337
+ const provenance = {
338
+ catalog_item_id: opts.catalog?.itemId ?? null,
339
+ catalog_version: opts.catalog?.version ?? null,
340
+ };
341
+ if (existing) {
342
+ await t
343
+ .updateTable("skills")
344
+ .set({
345
+ current_version: version,
346
+ description: pkg.description,
347
+ ...provenance,
348
+ updated_at: sql `now()`,
349
+ })
350
+ .where("id", "=", id)
351
+ .execute();
352
+ }
353
+ else {
354
+ await t
355
+ .insertInto("skills")
356
+ .values({
357
+ id,
358
+ org_id: orgId,
359
+ scope: "org",
360
+ agent_id: null,
361
+ name: pkg.name,
362
+ description: pkg.description,
363
+ current_version: 1,
364
+ created_by: actorAccountId,
365
+ ...provenance,
366
+ })
367
+ .execute();
368
+ }
369
+ await t
370
+ .insertInto("skill_versions")
371
+ .values({
372
+ skill_id: id,
373
+ version,
374
+ manifest: JSON.stringify(manifest),
375
+ object_prefix: prefix,
376
+ created_by: actorAccountId,
377
+ ...provenance,
378
+ source_format: opts.catalog?.format ?? "capybara",
379
+ suggest_pinned: opts.catalog?.suggestPinned ?? false,
380
+ })
381
+ .execute();
382
+ await audit(t, {
383
+ actorAccountId,
384
+ ...(actorTokenId !== undefined && { actorTokenId }),
385
+ orgId,
386
+ action: existing ? "skill.version_created" : "skill.created",
387
+ target: id,
388
+ detail: {
389
+ name: pkg.name,
390
+ version,
391
+ files: manifest.files.length,
392
+ ...(opts.catalog && { catalog: opts.catalog }),
393
+ },
394
+ });
395
+ const row = await summaryQuery(t).where("s.id", "=", id).executeTakeFirstOrThrow();
396
+ return { skill: summary(row), version, created: !existing };
397
+ });
398
+ }
399
+ /**
400
+ * 在调用方事务里撤销应用安装给已有技能加的版本(调用方已锁组织行):只有当前版本仍是 `version` 时才退回上一版本并删掉
401
+ * 该版本行(之后又有新版本则不动,返回 false),技能的描述与目录来源也退回上一版本的。审计 `skill.version_reverted`。
402
+ */
403
+ async revertVersionIn(t, orgId, skillId, version, actorAccountId, reason) {
404
+ const row = await t
405
+ .selectFrom("skills")
406
+ .select(["current_version", "name"])
407
+ .where("id", "=", skillId)
408
+ .where("org_id", "=", orgId)
409
+ .where("deleted_at", "is", null)
410
+ .forUpdate()
411
+ .executeTakeFirst();
412
+ if (!row || row.current_version !== version || version <= 1)
413
+ return false;
414
+ const prev = await t
415
+ .selectFrom("skill_versions")
416
+ .select(["manifest", "catalog_item_id", "catalog_version"])
417
+ .where("skill_id", "=", skillId)
418
+ .where("version", "=", version - 1)
419
+ .executeTakeFirst();
420
+ await t
421
+ .updateTable("skills")
422
+ .set({
423
+ current_version: version - 1,
424
+ ...(prev && {
425
+ description: prev.manifest.description,
426
+ catalog_item_id: prev.catalog_item_id,
427
+ catalog_version: prev.catalog_version,
428
+ }),
429
+ updated_at: sql `now()`,
430
+ })
431
+ .where("id", "=", skillId)
432
+ .execute();
433
+ await t
434
+ .deleteFrom("skill_versions")
435
+ .where("skill_id", "=", skillId)
436
+ .where("version", "=", version)
437
+ .execute();
438
+ await audit(t, {
439
+ actorAccountId,
440
+ orgId,
441
+ action: "skill.version_reverted",
442
+ target: skillId,
443
+ detail: { name: row.name, version, reason },
444
+ });
445
+ return true;
446
+ }
447
+ /**
448
+ * 在调用方事务里软删除组织技能(调用方已锁组织行;应用安装的回滚与卸载用)。审计 `skill.deleted`(带 reason)。
449
+ * 已删除 / 不存在时返回 false。
450
+ */
451
+ async softDeleteIn(t, orgId, skillId, actorAccountId, reason) {
452
+ const r = await t
453
+ .updateTable("skills")
454
+ .set({ deleted_at: sql `now()`, updated_at: sql `now()` })
455
+ .where("id", "=", skillId)
456
+ .where("org_id", "=", orgId)
457
+ .where("scope", "=", "org")
458
+ .where("deleted_at", "is", null)
459
+ .returning(["name"])
460
+ .executeTakeFirst();
461
+ if (!r)
462
+ return false;
463
+ await audit(t, {
464
+ actorAccountId,
465
+ orgId,
466
+ action: "skill.deleted",
467
+ target: skillId,
468
+ detail: { name: r.name, reason },
469
+ });
470
+ return true;
471
+ }
472
+ /** 组织技能库(`scope=org`、未删除),按名字排序。 */
473
+ async list(orgId) {
474
+ const rows = await summaryQuery(this.d.db)
475
+ .where("s.org_id", "=", orgId)
476
+ .where("s.scope", "=", "org")
477
+ .where("s.deleted_at", "is", null)
478
+ .orderBy("s.name")
479
+ .execute();
480
+ return rows.map(summary);
481
+ }
482
+ /** 对该 agent 自动生效的技能(`scope=agent`、未删除),按名字排序。 */
483
+ async listForAgent(orgId, agentId) {
484
+ const rows = await summaryQuery(this.d.db)
485
+ .where("s.org_id", "=", orgId)
486
+ .where("s.scope", "=", "agent")
487
+ .where("s.agent_id", "=", agentId)
488
+ .where("s.deleted_at", "is", null)
489
+ .orderBy("s.name")
490
+ .execute();
491
+ return rows.map(summary);
492
+ }
493
+ /** 组织技能详情:各版本与文件清单。不存在 / 已删除 / 不是组织技能 → `skill.not_found`。 */
494
+ async get(orgId, skillId) {
495
+ const row = await summaryQuery(this.d.db)
496
+ .where("s.id", "=", skillId)
497
+ .where("s.org_id", "=", orgId)
498
+ .where("s.scope", "=", "org")
499
+ .where("s.deleted_at", "is", null)
500
+ .executeTakeFirst();
501
+ if (!row)
502
+ throw notFound();
503
+ const versions = await this.d.db
504
+ .selectFrom("skill_versions")
505
+ .select(["version", "manifest", "created_by", "created_at", "object_prefix"])
506
+ .where("skill_id", "=", skillId)
507
+ .orderBy("version", "desc")
508
+ .execute();
509
+ const current = versions.find((v) => v.version === row.current_version);
510
+ return {
511
+ ...summary(row),
512
+ body: current ? await this.readBody(orgId, current) : null,
513
+ versions: versions.map((v) => ({
514
+ version: v.version,
515
+ description: v.manifest.description,
516
+ files: v.manifest.files,
517
+ createdBy: v.created_by,
518
+ createdAt: v.created_at,
519
+ })),
520
+ };
521
+ }
522
+ /** 读某版本 SKILL.md 的正文(见 {@link SkillDetail.body});任何读取问题都返回 null,不让详情失败。 */
523
+ async readBody(orgId, v) {
524
+ const entry = v.manifest.files.find((f) => f.path === SKILL_ENTRY_FILE);
525
+ if (!entry || entry.size > SKILL_BODY_MAX_BYTES)
526
+ return null;
527
+ try {
528
+ const got = await this.d.storage.kernel(orgId).get(`${v.object_prefix}${SKILL_ENTRY_FILE}`);
529
+ if (!got)
530
+ return null;
531
+ const text = new TextDecoder("utf-8", { fatal: true }).decode(await new Response(got.body).arrayBuffer());
532
+ const parsed = parseSkillMd(text, { invocationKeys: false });
533
+ return "errors" in parsed ? text : parsed.body;
534
+ }
535
+ catch {
536
+ return null;
537
+ }
538
+ }
539
+ /**
540
+ * 软删除组织技能(`skills.manage`,在组织行锁内复核)。之后同名可重新上传为新技能;引用它的 agent 定义
541
+ * 保存时会被拒绝(运行时由 T14 忽略已删除的技能)。不存在 / 已删除 → `skill.not_found`。
542
+ */
543
+ async softDelete(orgId, skillId, actorAccountId, actorTokenId) {
544
+ await this.d.db.transaction().execute(async (t) => {
545
+ await lockOrgAndAuthorize(t, orgId, actorAccountId, "skills.manage");
546
+ const r = await t
547
+ .updateTable("skills")
548
+ .set({ deleted_at: sql `now()`, updated_at: sql `now()` })
549
+ .where("id", "=", skillId)
550
+ .where("org_id", "=", orgId)
551
+ .where("scope", "=", "org")
552
+ .where("deleted_at", "is", null)
553
+ .returning(["name"])
554
+ .executeTakeFirst();
555
+ if (!r)
556
+ throw notFound();
557
+ await audit(t, {
558
+ actorAccountId,
559
+ ...(actorTokenId !== undefined && { actorTokenId }),
560
+ orgId,
561
+ action: "skill.deleted",
562
+ target: skillId,
563
+ detail: { name: r.name },
564
+ });
565
+ });
566
+ }
567
+ }
@@ -0,0 +1,36 @@
1
+ /**
2
+ * 对象存储的键前缀与校验(扩展模型 §5):插件 `plugins/<插件名>/<orgId>/`,内核 `kernel/<orgId>/`。
3
+ * 任何拼出来会落到前缀之外的键一律拒绝;校验发生在调用提供方之前。
4
+ */
5
+ /** 加前缀后的键长度上限(S3 的键上限是 1024 字节,这里按 UTF-8 字节计)。 */
6
+ export declare const MAX_STORAGE_KEY_BYTES = 1024;
7
+ /** 键或前缀不合法(越出前缀、组织 id 不是 UUID 等)。消息为英文、不含键之外的内部信息。 */
8
+ export declare class StorageKeyError extends Error {
9
+ constructor(message: string);
10
+ }
11
+ /**
12
+ * 组织 id 必须是 UUID;统一转成小写,同一组织不论大小写都落到同一个前缀
13
+ * (内核生成的组织 id 本来就是小写)。
14
+ */
15
+ export declare function normalizeOrgId(orgId: string): string;
16
+ /** 插件名必须符合清单规则(不含 `/`、`..`)。 */
17
+ export declare function assertPluginName(plugin: string): void;
18
+ /** 一个组织下的键空间:把相对键拼成完整键,把完整键还原成相对键。 */
19
+ export declare class KeySpace {
20
+ readonly prefix: string;
21
+ /** @param prefix 以 `/` 结尾的完整前缀(如 `plugins/x/<orgId>/`)。 */
22
+ constructor(prefix: string);
23
+ /** 对象键:非空,拼接后不超过 {@link MAX_STORAGE_KEY_BYTES}。 */
24
+ key(key: string): string;
25
+ /** 列举 / 批量删除的前缀:可以为空(表示该组织下的全部)。 */
26
+ listPrefix(prefix: string): string;
27
+ /** 完整键是否在本前缀下。 */
28
+ owns(full: string): boolean;
29
+ /** 去掉前缀(调用方先用 {@link owns} 过滤)。 */
30
+ strip(full: string): string;
31
+ private checkLength;
32
+ }
33
+ /** 插件在某组织下的前缀 `plugins/<插件>/<orgId>/`。 */
34
+ export declare function pluginPrefix(plugin: string, orgId: string): string;
35
+ /** 内核在某组织下的前缀 `kernel/<orgId>/`。 */
36
+ export declare function kernelPrefix(orgId: string): string;