@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,227 @@
1
+ import { createHash } from "node:crypto";
2
+ import { parseSkillMd, SKILL_ENTRY_FILE, SKILL_LIMITS, skillInvocation, validateSkillPackage, } from "@capybara-hq/plugin-sdk";
3
+ import yauzl from "yauzl";
4
+ import { ApiError } from "../errors.js";
5
+ import { cleanInvocationKeys } from "./invocation-keys.js";
6
+ /**
7
+ * 技能包(zip)解包与校验。zip 一律当作恶意输入:
8
+ *
9
+ * - 解析用 yauzl(3.4.0,固定版本):只信中央目录、按条目随机读取(不按本地头顺序猜),自带
10
+ * `validateEntrySizes`(实际解压出的字节数必须等于声明值)与文件名检查(绝对路径、盘符、`..`、
11
+ * `strictFileNames` 下的反斜杠)。不选 fflate:它的同步解压会先把整个条目解到内存,流式解压又按本地头顺序走,
12
+ * 遇到声明与实际不一致的恶意包更难兜住。
13
+ * - 此外自己再按**实际**解压出的字节数计数:单文件超过 {@link SKILL_LIMITS.fileBytes}、累计超过
14
+ * {@link SKILL_LIMITS.totalBytes} 立即中止;条目数上限 {@link SKILL_PACKAGE_MAX_ENTRIES};声明的压缩比
15
+ * 超过 {@link MAX_COMPRESSION_RATIO}(且解压后超过 1 MiB)视为 zip 炸弹,提前拒绝、不做解压
16
+ * (deflate 的理论上限约 1032:1,正常文本即使高度重复也远低于 1000:1;真正兜底的是按实际字节的上限);拒绝符号链接与其他非普通文件
17
+ * (外部属性里的 Unix mode)、加密条目、stored / deflate 之外的压缩方法。
18
+ * - 路径与清单规则(必须有 SKILL.md、去重、大小写冲突、控制字符、沙箱路径)见 plugin-sdk `validateSkillPackage`。
19
+ *
20
+ * 整个 zip(≤ {@link SKILL_PACKAGE_MAX_BYTES})与解出的文件(≤ 50MB)都在内存里处理。
21
+ */
22
+ /** 技能包 zip 本身的大小上限(字节)。 */
23
+ export const SKILL_PACKAGE_MAX_BYTES = 50 * 1024 * 1024;
24
+ /** zip 中央目录的条目数上限(含目录项与被忽略的条目)。 */
25
+ export const SKILL_PACKAGE_MAX_ENTRIES = 1000;
26
+ /** 单个条目声明的「解压后 / 压缩后」比值上限(只挡近乎单一字节重复的炸弹,正常文本不会触发)。 */
27
+ export const MAX_COMPRESSION_RATIO = 1000;
28
+ /** 解压后不超过这么大的条目不看压缩比(小文本本来就能压得很小)。 */
29
+ const RATIO_MIN_BYTES = 1024 * 1024;
30
+ const S_IFMT = 0o170000;
31
+ const S_IFREG = 0o100000;
32
+ const S_IFDIR = 0o040000;
33
+ const S_IFLNK = 0o120000;
34
+ /**
35
+ * The `invocation` to store in a version's manifest: undefined for the defaults (a skill both the
36
+ * model and a person can invoke, with no fork, hint or named arguments), so ordinary skills keep
37
+ * their manifest unchanged.
38
+ */
39
+ export function storedInvocation(i) {
40
+ const plain = i.model &&
41
+ i.user &&
42
+ i.fork === undefined &&
43
+ i.argumentHint === undefined &&
44
+ i.arguments === undefined;
45
+ return plain ? undefined : i;
46
+ }
47
+ /** 打包工具顺手带上的垃圾文件:macOS 的资源分支目录与 Finder 的 `.DS_Store`,直接跳过。 */
48
+ const ignored = (path) => path.startsWith("__MACOSX/") || path === ".DS_Store" || path.endsWith("/.DS_Store");
49
+ /**
50
+ * Invalid zip or skill content (`problems` lists each one, in English). Independent of HTTP: a
51
+ * skill upload maps it to `skill.invalid_package`, an enterprise catalog import to
52
+ * `catalog.invalid_manifest`.
53
+ */
54
+ export class SkillArchiveError extends Error {
55
+ problems;
56
+ constructor(problems) {
57
+ super(problems[0] ?? "unknown problem");
58
+ this.name = "SkillArchiveError";
59
+ this.problems = problems;
60
+ }
61
+ }
62
+ const problem = (problems) => new SkillArchiveError(problems);
63
+ const invalid = (problems) => new ApiError("skill.invalid_package", `Invalid skill package: ${problems[0] ?? "unknown problem"}`, problems.map((message) => ({ path: "package", message })));
64
+ /** 读一个条目的全部字节:按实际字节数计数,超过 `max` 立即中止。 */
65
+ async function readEntry(zip, entry, max, onTooBig) {
66
+ const stream = await zip.openReadStreamPromise(entry);
67
+ const hash = createHash("sha256");
68
+ const chunks = [];
69
+ let n = 0;
70
+ try {
71
+ for await (const chunk of stream) {
72
+ n += chunk.length;
73
+ if (n > max)
74
+ throw onTooBig();
75
+ hash.update(chunk);
76
+ chunks.push(chunk);
77
+ }
78
+ }
79
+ finally {
80
+ stream.destroy();
81
+ }
82
+ return { data: new Uint8Array(Buffer.concat(chunks)), sha256: hash.digest("hex") };
83
+ }
84
+ /**
85
+ * 外层目录规则:根目录有 SKILL.md → 原样使用;否则当且仅当全部文件都在同一个顶层目录 `D/` 下、且 `D/SKILL.md`
86
+ * 存在时,去掉 `D/`(如 GitHub 下载的 `repo-main/`;目录名不必等于技能名,技能名只取 SKILL.md 的 name,
87
+ * 沙箱路径用 `/skills/<name>/`)。其他情况(多个顶层条目、SKILL.md 只在更深的目录里)不猜,按缺少 SKILL.md 拒绝。
88
+ */
89
+ export function stripWrapper(files, entryFile = SKILL_ENTRY_FILE) {
90
+ if (files.some((f) => f.path === entryFile))
91
+ return files;
92
+ if (!files.every((f) => f.path.includes("/")))
93
+ return files;
94
+ const tops = new Set(files.map((f) => f.path.slice(0, f.path.indexOf("/"))));
95
+ const top = tops.size === 1 ? [...tops][0] : undefined;
96
+ if (top === undefined || !files.some((f) => f.path === `${top}/${entryFile}`)) {
97
+ return files;
98
+ }
99
+ return files.map((f) => ({ ...f, path: f.path.slice(top.length + 1) }));
100
+ }
101
+ /**
102
+ * 解包并校验技能包:返回 SKILL.md 里的 name / description 与全部文件(含 sha256)。
103
+ * 外层目录按 {@link stripWrapper} 的规则去掉。
104
+ * 任何问题 → `skill.invalid_package`(400),details 逐条列出。
105
+ */
106
+ export async function readSkillPackage(bytes) {
107
+ try {
108
+ const files = stripWrapper(await readZipFiles(bytes, SKILL_PACKAGE_MAX_BYTES));
109
+ return { ...checkSkillFiles(files), files };
110
+ }
111
+ catch (e) {
112
+ if (e instanceof SkillArchiveError)
113
+ throw invalid(e.problems);
114
+ throw e;
115
+ }
116
+ }
117
+ /**
118
+ * Checks a set of skill files (paths relative to the skill root): the rules of plugin-sdk
119
+ * `validateSkillPackage`, SKILL.md strict UTF-8 with valid frontmatter. Returns its name,
120
+ * description and invocation metadata. Invalid → {@link SkillArchiveError}. `invocationKeys: false`
121
+ * (files stored before phase D, Claude Code imports) skips the invocation key checks and leaves out
122
+ * of the invocation every key they would refuse ({@link cleanInvocationKeys}).
123
+ */
124
+ export function checkSkillFiles(files, opts = {}) {
125
+ const problems = validateSkillPackage(files);
126
+ if (problems.length > 0)
127
+ throw problem(problems);
128
+ const entryFile = files.find((f) => f.path === SKILL_ENTRY_FILE);
129
+ let text;
130
+ try {
131
+ text = new TextDecoder("utf-8", { fatal: true }).decode(entryFile.data);
132
+ }
133
+ catch {
134
+ throw problem([`${SKILL_ENTRY_FILE} is not valid UTF-8 text`]);
135
+ }
136
+ const parsed = parseSkillMd(text, opts);
137
+ if ("errors" in parsed)
138
+ throw problem(parsed.errors.map((m) => `${SKILL_ENTRY_FILE}: ${m}`));
139
+ // Lenient: the keys the strict checks would refuse are dropped, so no reader stores an
140
+ // invocation nobody can use or over-long display text (batch 1 review M2)
141
+ const fm = opts.invocationKeys === false
142
+ ? cleanInvocationKeys(parsed.frontmatter).frontmatter
143
+ : parsed.frontmatter;
144
+ return {
145
+ name: parsed.name,
146
+ description: parsed.description,
147
+ invocation: skillInvocation(fm),
148
+ };
149
+ }
150
+ /**
151
+ * 读 zip 里的全部普通文件(规则与上限见文件头;`maxBytes` 为 zip 本身的上限),不去外层目录、不看内容。
152
+ * 不合法 → {@link SkillArchiveError}。
153
+ */
154
+ export async function readZipFiles(bytes, maxBytes) {
155
+ const invalid = problem;
156
+ if (bytes.byteLength > maxBytes) {
157
+ throw invalid([`the zip file is larger than ${maxBytes} bytes`]);
158
+ }
159
+ const buf = Buffer.from(bytes.buffer, bytes.byteOffset, bytes.byteLength);
160
+ let zip;
161
+ try {
162
+ zip = await yauzl.fromBufferPromise(buf, {
163
+ lazyEntries: true,
164
+ autoClose: true,
165
+ decodeStrings: true,
166
+ strictFileNames: true,
167
+ validateEntrySizes: true,
168
+ });
169
+ }
170
+ catch {
171
+ throw invalid(["the file is not a valid zip archive"]);
172
+ }
173
+ if (zip.entryCount > SKILL_PACKAGE_MAX_ENTRIES) {
174
+ zip.close();
175
+ throw invalid([`the zip archive has more than ${SKILL_PACKAGE_MAX_ENTRIES} entries`]);
176
+ }
177
+ const raw = [];
178
+ let total = 0;
179
+ let current = "";
180
+ try {
181
+ for await (const entry of zip.eachEntry()) {
182
+ const name = entry.fileName;
183
+ current = name;
184
+ if (ignored(name))
185
+ continue;
186
+ const type = (entry.externalFileAttributes >>> 16) & 0xffff & S_IFMT;
187
+ if (type === S_IFLNK)
188
+ throw invalid([`${name}: symbolic links are not allowed`]);
189
+ if (name.endsWith("/")) {
190
+ if (type !== 0 && type !== S_IFDIR)
191
+ throw invalid([`${name}: not a regular file`]);
192
+ continue;
193
+ }
194
+ if (type !== 0 && type !== S_IFREG) {
195
+ throw invalid([`${name}: only regular files are allowed (not a regular file)`]);
196
+ }
197
+ if (entry.isEncrypted())
198
+ throw invalid([`${name}: encrypted entries are not supported`]);
199
+ if (entry.compressionMethod !== 0 && entry.compressionMethod !== 8) {
200
+ throw invalid([`${name}: unsupported compression method ${entry.compressionMethod}`]);
201
+ }
202
+ const tooBig = () => invalid([`${name}: file is larger than ${SKILL_LIMITS.fileBytes} bytes`]);
203
+ const tooMuch = () => invalid([`package is larger than ${SKILL_LIMITS.totalBytes} bytes in total`]);
204
+ if (entry.uncompressedSize > SKILL_LIMITS.fileBytes)
205
+ throw tooBig();
206
+ if (total + entry.uncompressedSize > SKILL_LIMITS.totalBytes)
207
+ throw tooMuch();
208
+ if (entry.uncompressedSize > RATIO_MIN_BYTES &&
209
+ entry.uncompressedSize > Math.max(1, entry.compressedSize) * MAX_COMPRESSION_RATIO) {
210
+ throw invalid([`${name}: suspicious compression ratio (possible zip bomb)`]);
211
+ }
212
+ const remaining = SKILL_LIMITS.totalBytes - total;
213
+ const max = Math.min(SKILL_LIMITS.fileBytes, remaining);
214
+ const { data, sha256 } = await readEntry(zip, entry, max, () => max < SKILL_LIMITS.fileBytes ? tooMuch() : tooBig());
215
+ total += data.byteLength;
216
+ raw.push({ path: name, size: data.byteLength, sha256, data });
217
+ }
218
+ }
219
+ catch (e) {
220
+ zip.close();
221
+ if (e instanceof SkillArchiveError)
222
+ throw e;
223
+ const msg = e instanceof Error ? e.message : String(e);
224
+ throw invalid([current ? `${current}: ${msg}` : `the zip archive is malformed: ${msg}`]);
225
+ }
226
+ return raw;
227
+ }
@@ -0,0 +1,40 @@
1
+ import { z } from "zod";
2
+ import { type CreatedAttachment } from "../conversations/attachments.service.js";
3
+ import { type Principal } from "../identity/principal.js";
4
+ import { type OrgContext } from "../orgs/org.guard.js";
5
+ import type { SkillDetail, SkillSummary, SkillsService, UploadedSkill } from "./skills.service.js";
6
+ declare const UploadBody: z.ZodObject<{
7
+ name: z.ZodString;
8
+ size: z.ZodNumber;
9
+ }, z.core.$strict>;
10
+ declare const CreateBody: z.ZodObject<{
11
+ uploadId: z.ZodString;
12
+ }, z.core.$strict>;
13
+ /**
14
+ * The org skill library (`/api/v1/orgs/:orgId/skills`, human users only):
15
+ * - read: `skills.read` (member and up) — `GET /` list, `GET /:id` detail (versions and file
16
+ * lists);
17
+ * - write: `skills.manage` (admin and up) —
18
+ * 1. `POST /uploads` registers a skill package upload (`application/zip`, ≤ 50MB, returns a
19
+ * presigned form, used like chat attachments);
20
+ * 2. the browser uploads straight to object storage (it may call
21
+ * `POST /attachments/:id/finalize`, or skip it and let the next step finalize);
22
+ * 3. `POST /` `{ uploadId }` unpacks and checks it, creating a skill or adding a version to the
23
+ * skill with the same name;
24
+ * `DELETE /:id` soft-deletes (the web asks for confirmation, R3).
25
+ * When the deployment setting `customSkills` is deny, registering an upload and creating both
26
+ * return 403 `catalog.custom_disabled` (decided in the service, re-checked inside the org row lock
27
+ * on create); installing skills from the enterprise catalog is unaffected.
28
+ */
29
+ export declare class SkillsController {
30
+ private readonly skills;
31
+ constructor(skills: SkillsService);
32
+ createUpload(principal: Principal, org: OrgContext, body: z.infer<typeof UploadBody>): Promise<CreatedAttachment>;
33
+ create(principal: Principal, org: OrgContext, body: z.infer<typeof CreateBody>): Promise<UploadedSkill>;
34
+ list(principal: Principal, org: OrgContext): Promise<{
35
+ skills: SkillSummary[];
36
+ }>;
37
+ get(principal: Principal, org: OrgContext, id: string): Promise<SkillDetail>;
38
+ remove(principal: Principal, org: OrgContext, id: string): Promise<void>;
39
+ }
40
+ export {};
@@ -0,0 +1,110 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
8
+ return function (target, key) { decorator(target, key, paramIndex); }
9
+ };
10
+ import { hasControlChars, MEDIA_NAME_MAX_CHARS } from "@capybara-hq/plugin-sdk";
11
+ import { Body, Controller, Delete, Get, HttpCode, Inject, Param, Post } from "@nestjs/common";
12
+ import { z } from "zod";
13
+ import { SKILL_PACKAGE_UPLOAD_MAX_BYTES, } from "../conversations/attachments.service.js";
14
+ import { SKILLS } from "../http/tokens.js";
15
+ import { ZodPipe } from "../http/zod.pipe.js";
16
+ import { CurrentPrincipal, patTokenId, requireUser, } from "../identity/principal.js";
17
+ import { CurrentOrg, OrgAction } from "../orgs/org.guard.js";
18
+ const UploadBody = z
19
+ .object({
20
+ name: z
21
+ .string()
22
+ .min(1)
23
+ .max(MEDIA_NAME_MAX_CHARS)
24
+ .refine((s) => !hasControlChars(s), "name must not contain control characters"),
25
+ size: z.number().int().min(1).max(SKILL_PACKAGE_UPLOAD_MAX_BYTES),
26
+ })
27
+ .strict();
28
+ const CreateBody = z.object({ uploadId: z.string().min(1).max(100) }).strict();
29
+ /**
30
+ * The org skill library (`/api/v1/orgs/:orgId/skills`, human users only):
31
+ * - read: `skills.read` (member and up) — `GET /` list, `GET /:id` detail (versions and file
32
+ * lists);
33
+ * - write: `skills.manage` (admin and up) —
34
+ * 1. `POST /uploads` registers a skill package upload (`application/zip`, ≤ 50MB, returns a
35
+ * presigned form, used like chat attachments);
36
+ * 2. the browser uploads straight to object storage (it may call
37
+ * `POST /attachments/:id/finalize`, or skip it and let the next step finalize);
38
+ * 3. `POST /` `{ uploadId }` unpacks and checks it, creating a skill or adding a version to the
39
+ * skill with the same name;
40
+ * `DELETE /:id` soft-deletes (the web asks for confirmation, R3).
41
+ * When the deployment setting `customSkills` is deny, registering an upload and creating both
42
+ * return 403 `catalog.custom_disabled` (decided in the service, re-checked inside the org row lock
43
+ * on create); installing skills from the enterprise catalog is unaffected.
44
+ */
45
+ let SkillsController = class SkillsController {
46
+ skills;
47
+ constructor(skills) {
48
+ this.skills = skills;
49
+ }
50
+ async createUpload(principal, org, body) {
51
+ const p = requireUser(principal);
52
+ return this.skills.createUpload(org.orgId, p.account.id, body);
53
+ }
54
+ async create(principal, org, body) {
55
+ const p = requireUser(principal);
56
+ return this.skills.upload(org.orgId, p.account.id, body.uploadId, patTokenId(p));
57
+ }
58
+ async list(principal, org) {
59
+ requireUser(principal);
60
+ return { skills: await this.skills.list(org.orgId) };
61
+ }
62
+ async get(principal, org, id) {
63
+ requireUser(principal);
64
+ return this.skills.get(org.orgId, id);
65
+ }
66
+ async remove(principal, org, id) {
67
+ const p = requireUser(principal);
68
+ await this.skills.softDelete(org.orgId, id, p.account.id, patTokenId(p));
69
+ }
70
+ };
71
+ __decorate([
72
+ Post("uploads"),
73
+ OrgAction("skills.manage"),
74
+ __param(0, CurrentPrincipal()),
75
+ __param(1, CurrentOrg()),
76
+ __param(2, Body(new ZodPipe(UploadBody)))
77
+ ], SkillsController.prototype, "createUpload", null);
78
+ __decorate([
79
+ Post(),
80
+ OrgAction("skills.manage"),
81
+ __param(0, CurrentPrincipal()),
82
+ __param(1, CurrentOrg()),
83
+ __param(2, Body(new ZodPipe(CreateBody)))
84
+ ], SkillsController.prototype, "create", null);
85
+ __decorate([
86
+ Get(),
87
+ OrgAction("skills.read"),
88
+ __param(0, CurrentPrincipal()),
89
+ __param(1, CurrentOrg())
90
+ ], SkillsController.prototype, "list", null);
91
+ __decorate([
92
+ Get(":id"),
93
+ OrgAction("skills.read"),
94
+ __param(0, CurrentPrincipal()),
95
+ __param(1, CurrentOrg()),
96
+ __param(2, Param("id"))
97
+ ], SkillsController.prototype, "get", null);
98
+ __decorate([
99
+ Delete(":id"),
100
+ HttpCode(204),
101
+ OrgAction("skills.manage"),
102
+ __param(0, CurrentPrincipal()),
103
+ __param(1, CurrentOrg()),
104
+ __param(2, Param("id"))
105
+ ], SkillsController.prototype, "remove", null);
106
+ SkillsController = __decorate([
107
+ Controller("api/v1/orgs/:orgId/skills"),
108
+ __param(0, Inject(SKILLS))
109
+ ], SkillsController);
110
+ export { SkillsController };
@@ -0,0 +1,192 @@
1
+ import { type SkillInvocation } from "@capybara-hq/plugin-sdk";
2
+ import { type Transaction } from "kysely";
3
+ import type { AgentDefinition } from "../agents/definition.js";
4
+ import { type AttachmentsService, type CreatedAttachment } from "../conversations/attachments.service.js";
5
+ import type { KernelDatabase, KernelDb, SkillManifest, SourceFormat } from "../db/kernel-schema.js";
6
+ import { ApiError } from "../errors.js";
7
+ import type { StorageService } from "../storage/storage.service.js";
8
+ import { type SkillPackageFile } from "./package.js";
9
+ type Trx = Transaction<KernelDatabase>;
10
+ /** Where an org skill came from (spec §9.2): the org's own, or a catalog plugin at a version. */
11
+ export type SkillSource = {
12
+ kind: "org";
13
+ } | {
14
+ kind: "plugin";
15
+ name: string;
16
+ version: string;
17
+ };
18
+ /** An org skill that a plugin install would overwrite. */
19
+ export interface SkillConflict {
20
+ skill: string;
21
+ source: SkillSource;
22
+ }
23
+ /**
24
+ * The live org skills named in `skillNames` whose provenance is not catalog item `itemId` (spec
25
+ * §9.2, Decision 8): the org's own skills (`catalog_item_id` null: uploaded or written by an
26
+ * agent) and the skills of other catalog items. A skill of the same item (a reinstall or upgrade)
27
+ * is not a conflict. In the order of `skillNames`.
28
+ */
29
+ export declare function skillConflicts(db: KernelDb | Trx, orgId: string, itemId: string, skillNames: readonly string[]): Promise<SkillConflict[]>;
30
+ /** One line of the conflict message (spec §9.2). */
31
+ export declare function skillConflictLine(c: SkillConflict): string;
32
+ /** 409 `plugin.skill_conflict`: one message line and one detail per conflicting skill. */
33
+ export declare function skillConflictError(conflicts: readonly SkillConflict[]): ApiError;
34
+ /** 技能列表项。 */
35
+ export interface SkillSummary {
36
+ id: string;
37
+ scope: "org" | "agent";
38
+ agentId: string | null;
39
+ name: string;
40
+ description: string;
41
+ currentVersion: number;
42
+ createdBy: string;
43
+ createdAt: Date;
44
+ updatedAt: Date;
45
+ /** The catalog item name the skill came from; null for the org's own (uploaded or written). */
46
+ plugin: string | null;
47
+ /** The format of the plugin the current version came from. */
48
+ sourceFormat: SourceFormat;
49
+ /** The plugin suggests pinning the current version (spec §9.1). */
50
+ suggestPinned: boolean;
51
+ /** SKILL.md size of the current version, in bytes (0 when the manifest has none). */
52
+ entryBytes: number;
53
+ /** Token estimate of the SKILL.md of the current version (ASCII rule: bytes / 4). */
54
+ tokenEstimate: number;
55
+ /** Phase D: the current version is manual-only (not in the model's catalog). */
56
+ manual: boolean;
57
+ /** Phase D: the current version runs as a sub-agent when a person invokes it. */
58
+ fork: boolean;
59
+ }
60
+ /** 技能的一个版本(含文件清单)。 */
61
+ export interface SkillVersionView {
62
+ version: number;
63
+ files: SkillManifest["files"];
64
+ description: string;
65
+ createdBy: string;
66
+ createdAt: Date;
67
+ }
68
+ /** 技能详情:各版本新的在前。 */
69
+ export interface SkillDetail extends SkillSummary {
70
+ versions: SkillVersionView[];
71
+ /**
72
+ * 当前版本 SKILL.md 的正文(去掉 frontmatter;网页按纯文本显示)。超过 {@link SKILL_BODY_MAX_BYTES}、
73
+ * 读不到(对象缺失、存储不可用)或不是 UTF-8 时为 null。
74
+ */
75
+ body: string | null;
76
+ }
77
+ /** 详情里读取 SKILL.md 正文的上限。 */
78
+ export declare const SKILL_BODY_MAX_BYTES: number;
79
+ /** `POST /skills` 的结果:`created` 为 true 表示新技能,否则是已有技能的新版本。 */
80
+ export interface UploadedSkill {
81
+ skill: SkillSummary;
82
+ version: number;
83
+ created: boolean;
84
+ }
85
+ export interface SkillsDeps {
86
+ db: KernelDb;
87
+ storage: StorageService;
88
+ attachments: Pick<AttachmentsService, "create" | "readSkillPackage" | "consumeSkillPackage">;
89
+ }
90
+ /**
91
+ * 在调用方事务里核对 agent 定义引用的组织技能:每个 id 都必须是该组织未删除的 `scope=org` 技能,
92
+ * 否则 `validation_failed`(path `skills.orgSkills.<i>`);不可重复。调用方须已锁组织行(技能删除同样锁组织行,二者串行)。
93
+ * `kept`:当前版本里已有的引用(保存时合法),修改时不再核对——技能之后被删也不挡住其他改动(运行时由 T14 忽略已删除的技能)。
94
+ */
95
+ export declare function assertOrgSkills(t: Trx, orgId: string, ids: readonly string[], kept?: ReadonlySet<string>): Promise<void>;
96
+ /** Why a pinned skill reference is refused (`agent.pinned_invalid` details). */
97
+ export type PinnedSkillProblem = "not_selected" | "not_found" | "duplicate" | "too_many" | "too_large"
98
+ /** Phase D: the skill's current version is manual-only (not in the model's catalog). */
99
+ | "manual_only";
100
+ /**
101
+ * Checks `skills.pinned` of an agent definition in the caller's transaction (the org row is locked,
102
+ * like {@link assertOrgSkills}); throws 400 `agent.pinned_invalid` with one detail per problem
103
+ * (`{ skill, reason, totalBytes? }`):
104
+ * - `duplicate`: an id listed twice; `too_many`: every id past {@link PINNED_SKILLS_LIMITS}.count;
105
+ * - each newly added id (not in `kept`, the current definition's pinned ids) must be a live org
106
+ * skill listed in `skills.orgSkills` (else `not_selected`) or a live skill of this agent
107
+ * (`agentId`; null when creating), else `not_found`. Kept ids are not re-checked: a pinned skill
108
+ * deleted later does not block other edits (the run ignores it);
109
+ * - `manual_only` (phase D): a newly added id whose current version is manual-only
110
+ * (`invocation.model === false`); a kept one that became manual-only is dropped at run time;
111
+ * - `too_large`: the current SKILL.md sizes of the live pinned skills total more than
112
+ * {@link PINNED_SKILLS_LIMITS}.totalBytes (named by the first skill past the limit). Checked only
113
+ * when the pinned list changed: a pinned skill's new version never blocks an unrelated edit (the
114
+ * run keeps what fits).
115
+ */
116
+ export declare function assertPinnedSkills(t: Trx, orgId: string, agentId: string | null, skills: AgentDefinition["skills"], kept?: readonly string[]): Promise<void>;
117
+ /**
118
+ * 技能库(M5 T13):组织技能的上传(新技能或新版本)、列表、详情与软删除。
119
+ * 字节在对象存储 `kernel/<orgId>/skills/<uploadId>/<path>`,元数据在 PG;无进程内状态,可多副本共用。
120
+ */
121
+ export declare class SkillsService {
122
+ private readonly d;
123
+ constructor(d: SkillsDeps);
124
+ /** 登记一个技能包上传(预签名 POST,`application/zip`,≤ 50MB);角色由路由的 `skills.manage` 把关。 */
125
+ createUpload(orgId: string, accountId: string, input: {
126
+ name: string;
127
+ size: number;
128
+ }): Promise<CreatedAttachment>;
129
+ /**
130
+ * 用一个技能包上传创建技能或新增版本:
131
+ * 1. 取上传的 zip(只有上传者;未 finalize 的先 finalize),解包校验(`skill.invalid_package`);
132
+ * 2. 把文件写到 `skills/<uploadId>/`(键只取决于上传 id 与包内路径:重试幂等);
133
+ * 3. 一个事务里:锁组织行并复核 `skills.manage`,把上传标记为已用掉(并发的同一上传只有一个成功),
134
+ * 同名未删除的组织技能存在则 `current_version + 1`,否则新建(组织行锁串行化,版本号不会重复),写版本与审计。
135
+ * 第 3 步之前中断不会留下可见的版本;已写的文件由清理任务在上传过期后删除(未被任何版本引用时)。
136
+ * 同一上传已经产生过版本(上次提交了、响应丢了而重试)→ 直接返回那个版本(同组织、同一发起人)。
137
+ */
138
+ upload(orgId: string, actorAccountId: string, uploadId: string, actorTokenId?: string): Promise<UploadedSkill>;
139
+ /**
140
+ * 用一组已校验的技能文件创建组织技能或给同名技能新增版本(上传与企业目录安装共用):
141
+ * 1. 把文件写到 `kernel/<orgId>/<prefix>`(缺省 `skills/<新 id>/`);
142
+ * 2. 一个事务里:锁组织行并复核 `skills.manage`,执行 `inTransaction`(上传:标记上传已用;目录:按条目策略复核),
143
+ * 同名未删除的组织技能存在则 `current_version + 1`,否则新建;技能与版本都记下 `directory` 来源(没有则清空:
144
+ * 自定义上传盖在目录技能上就不再算目录安装),写版本与审计
145
+ * (`skill.created` / `skill.version_created`,目录安装时 detail 带 directory)。
146
+ */
147
+ createVersionFromFiles(orgId: string, actorAccountId: string, pkg: {
148
+ name: string;
149
+ description: string;
150
+ files: SkillPackageFile[];
151
+ /** Phase D: stored in the manifest when it is not the default. */
152
+ invocation?: SkillInvocation;
153
+ }, opts?: {
154
+ prefix?: string;
155
+ actorTokenId?: string;
156
+ inTransaction?: (t: Trx) => Promise<void>;
157
+ /** Catalog provenance; `approvedBy` is the item whose policy approves it (default `itemId`). */
158
+ catalog?: {
159
+ itemId: string;
160
+ version: string;
161
+ approvedBy?: string;
162
+ /** The catalog version's source format (default capybara). */
163
+ format?: SourceFormat;
164
+ /** The plugin manifest suggests pinning this skill (spec §9.1). */
165
+ suggestPinned?: boolean;
166
+ };
167
+ }): Promise<UploadedSkill>;
168
+ /**
169
+ * 在调用方事务里撤销应用安装给已有技能加的版本(调用方已锁组织行):只有当前版本仍是 `version` 时才退回上一版本并删掉
170
+ * 该版本行(之后又有新版本则不动,返回 false),技能的描述与目录来源也退回上一版本的。审计 `skill.version_reverted`。
171
+ */
172
+ revertVersionIn(t: Trx, orgId: string, skillId: string, version: number, actorAccountId: string, reason: string): Promise<boolean>;
173
+ /**
174
+ * 在调用方事务里软删除组织技能(调用方已锁组织行;应用安装的回滚与卸载用)。审计 `skill.deleted`(带 reason)。
175
+ * 已删除 / 不存在时返回 false。
176
+ */
177
+ softDeleteIn(t: Trx, orgId: string, skillId: string, actorAccountId: string, reason: string): Promise<boolean>;
178
+ /** 组织技能库(`scope=org`、未删除),按名字排序。 */
179
+ list(orgId: string): Promise<SkillSummary[]>;
180
+ /** 对该 agent 自动生效的技能(`scope=agent`、未删除),按名字排序。 */
181
+ listForAgent(orgId: string, agentId: string): Promise<SkillSummary[]>;
182
+ /** 组织技能详情:各版本与文件清单。不存在 / 已删除 / 不是组织技能 → `skill.not_found`。 */
183
+ get(orgId: string, skillId: string): Promise<SkillDetail>;
184
+ /** 读某版本 SKILL.md 的正文(见 {@link SkillDetail.body});任何读取问题都返回 null,不让详情失败。 */
185
+ private readBody;
186
+ /**
187
+ * 软删除组织技能(`skills.manage`,在组织行锁内复核)。之后同名可重新上传为新技能;引用它的 agent 定义
188
+ * 保存时会被拒绝(运行时由 T14 忽略已删除的技能)。不存在 / 已删除 → `skill.not_found`。
189
+ */
190
+ softDelete(orgId: string, skillId: string, actorAccountId: string, actorTokenId?: string): Promise<void>;
191
+ }
192
+ export {};