@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,53 @@
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 { Body, Controller, Get, Inject, Patch } from "@nestjs/common";
11
+ import { ORG_SETTINGS } from "../http/tokens.js";
12
+ import { ZodPipe } from "../http/zod.pipe.js";
13
+ import { CurrentPrincipal, patTokenId, requireUser, } from "../identity/principal.js";
14
+ import { CurrentOrg, OrgAction } from "./org.guard.js";
15
+ import { OrgSettingsPatchSchema, } from "./settings.service.js";
16
+ let OrgSettingsController = class OrgSettingsController {
17
+ settings;
18
+ constructor(settings) {
19
+ this.settings = settings;
20
+ }
21
+ async get(org) {
22
+ return {
23
+ settings: await this.settings.get(org.orgId),
24
+ deployment: this.settings.deployment(),
25
+ sandboxLimits: await this.settings.sandboxLimits(org.orgId),
26
+ };
27
+ }
28
+ async update(principal, org, body) {
29
+ const p = requireUser(principal);
30
+ return {
31
+ settings: await this.settings.update(org.orgId, body, p.account.id, patTokenId(p)),
32
+ deployment: this.settings.deployment(),
33
+ sandboxLimits: await this.settings.sandboxLimits(org.orgId),
34
+ };
35
+ }
36
+ };
37
+ __decorate([
38
+ Get(),
39
+ OrgAction("org.read"),
40
+ __param(0, CurrentOrg())
41
+ ], OrgSettingsController.prototype, "get", null);
42
+ __decorate([
43
+ Patch(),
44
+ OrgAction("org.update"),
45
+ __param(0, CurrentPrincipal()),
46
+ __param(1, CurrentOrg()),
47
+ __param(2, Body(new ZodPipe(OrgSettingsPatchSchema)))
48
+ ], OrgSettingsController.prototype, "update", null);
49
+ OrgSettingsController = __decorate([
50
+ Controller("api/v1/orgs/:orgId/settings"),
51
+ __param(0, Inject(ORG_SETTINGS))
52
+ ], OrgSettingsController);
53
+ export { OrgSettingsController };
@@ -0,0 +1,120 @@
1
+ import { type SandboxLimits } from "@capybara-hq/plugin-sdk";
2
+ import { z } from "zod";
3
+ import type { KernelConfig } from "../config/schema.js";
4
+ import type { KernelDb } from "../db/kernel-schema.js";
5
+ /**
6
+ * 组织设置(`capybara.orgs.settings` jsonb)。读取宽松:缺失或非法的字段按默认值,未知键保留不动
7
+ * (更新时与存量合并),新版本加字段不需要迁移。
8
+ * - `toolSearch`:工具超过阈值时是否改用目录 + `tool_search`(D11,默认 on)。
9
+ * - `locale`:组织默认语言(`zh` / `en`,默认 en),机器人在 IM 里说的固定话术按它选择。
10
+ * - `sandboxToolPolicy`:沙箱工具的默认策略(M5 T8,默认 allow)。为 `ask` 时除只读的
11
+ * `sandbox_read` / `sandbox_glob` / `sandbox_grep` 外都需要审批(执行时实时读取)。
12
+ * - `sandboxEgress`:组织的沙箱出站(Ruling M19 / D6),缺省跟随部署的 `sandbox.limits.egress` + `allowHosts`。
13
+ * 见 {@link effectiveSandboxEgress}。存量值非法时按 `none` 读(宁可断网,不悄悄放宽到部署默认)。
14
+ */
15
+ /** 组织沙箱出站白名单的主机数上限。 */
16
+ export declare const ORG_SANDBOX_ALLOW_HOSTS_MAX = 200;
17
+ /**
18
+ * 组织的沙箱出站设置:`none`(只有回环),或 `allowlist`。`allowHosts` 给出时**替换**部署的白名单
19
+ * (组织可以去掉预置项、也可以加别的主机),省略时沿用部署的白名单。没有 `open`:组织不能比部署放得更开。
20
+ */
21
+ export declare const SandboxEgressSettingSchema: z.ZodObject<{
22
+ mode: z.ZodEnum<{
23
+ allowlist: "allowlist";
24
+ none: "none";
25
+ }>;
26
+ allowHosts: z.ZodOptional<z.ZodArray<z.ZodString>>;
27
+ }, z.core.$strict>;
28
+ export type SandboxEgressSetting = z.infer<typeof SandboxEgressSettingSchema>;
29
+ export declare const OrgSettingsSchema: z.ZodObject<{
30
+ toolSearch: z.ZodCatch<z.ZodDefault<z.ZodEnum<{
31
+ off: "off";
32
+ on: "on";
33
+ }>>>;
34
+ locale: z.ZodCatch<z.ZodDefault<z.ZodEnum<{
35
+ en: "en";
36
+ zh: "zh";
37
+ }>>>;
38
+ sandboxToolPolicy: z.ZodCatch<z.ZodDefault<z.ZodEnum<{
39
+ allow: "allow";
40
+ ask: "ask";
41
+ }>>>;
42
+ sandboxEgress: z.ZodCatch<z.ZodOptional<z.ZodObject<{
43
+ mode: z.ZodEnum<{
44
+ allowlist: "allowlist";
45
+ none: "none";
46
+ }>;
47
+ allowHosts: z.ZodOptional<z.ZodArray<z.ZodString>>;
48
+ }, z.core.$strict>>>;
49
+ }, z.core.$strip>;
50
+ export type OrgSettings = z.infer<typeof OrgSettingsSchema>;
51
+ /** PATCH 体:只改给出的字段;未知字段 → 400。 */
52
+ export declare const OrgSettingsPatchSchema: z.ZodObject<{
53
+ toolSearch: z.ZodOptional<z.ZodEnum<{
54
+ off: "off";
55
+ on: "on";
56
+ }>>;
57
+ locale: z.ZodOptional<z.ZodEnum<{
58
+ en: "en";
59
+ zh: "zh";
60
+ }>>;
61
+ sandboxToolPolicy: z.ZodOptional<z.ZodEnum<{
62
+ allow: "allow";
63
+ ask: "ask";
64
+ }>>;
65
+ sandboxEgress: z.ZodOptional<z.ZodNullable<z.ZodObject<{
66
+ mode: z.ZodEnum<{
67
+ allowlist: "allowlist";
68
+ none: "none";
69
+ }>;
70
+ allowHosts: z.ZodOptional<z.ZodArray<z.ZodString>>;
71
+ }, z.core.$strict>>>;
72
+ }, z.core.$strict>;
73
+ export type OrgSettingsPatch = z.infer<typeof OrgSettingsPatchSchema>;
74
+ /** 部署的沙箱出站(`sandbox.limits.egress` + `allowHosts`)。 */
75
+ export type DeploymentEgress = Pick<SandboxLimits, "egress" | "allowHosts">;
76
+ /**
77
+ * 组织实际生效的沙箱出站:没有组织设置 → 部署默认;`none` → 只有回环;`allowlist` → 组织的白名单
78
+ * (省略时用部署的),但部署是 `none` 时仍为 `none`(组织永远不比部署放得更开,部署改成 none 后存量设置也随之收紧)。
79
+ */
80
+ export declare function effectiveSandboxEgress(deployment: DeploymentEgress, org: SandboxEgressSetting | undefined): DeploymentEgress;
81
+ /**
82
+ * 组织实际生效的沙箱限额(C19 / Ruling M16):企业管理员的覆盖(部署设置 `sandboxLimitOverrides[orgId]`)
83
+ * 给出的 cpu / memoryMb 替换部署默认,未给的项、disk 与出站沿用 `deployment`。只在创建沙箱时读取。
84
+ */
85
+ export declare function effectiveSandboxLimits(deployment: SandboxLimits, override: {
86
+ cpu?: number | undefined;
87
+ memoryMb?: number | undefined;
88
+ } | undefined): SandboxLimits;
89
+ /** 组织设置 GET 带回的只读沙箱限额:实际生效值与来源(有企业管理员的覆盖为 `override`)。 */
90
+ export interface OrgSandboxLimits {
91
+ cpu: number;
92
+ memoryMb: number;
93
+ source: "deployment" | "override";
94
+ }
95
+ /** 设置页展示用的部署默认值(`GET` 一并返回)。 */
96
+ export interface OrgSettingsDeployment {
97
+ sandboxEgress: {
98
+ mode: SandboxLimits["egress"];
99
+ allowHosts: string[];
100
+ };
101
+ }
102
+ /** 把存储的 jsonb 解析为设置(宽松,见 {@link OrgSettingsSchema})。 */
103
+ export declare function parseOrgSettings(raw: unknown): OrgSettings;
104
+ /** 读组织设置(每次实时读 PG,多副本下改动立即生效);组织不存在或已删除按默认值。 */
105
+ export declare function readOrgSettings(db: KernelDb, orgId: string): Promise<OrgSettings>;
106
+ /** 组织设置服务:读取与修改(修改需 `org.update`,锁内实时复核角色,写审计)。 */
107
+ export declare class OrgSettingsService {
108
+ private readonly db;
109
+ /** 部署配置(校验 `sandboxEgress` 不超出部署);省略视为部署出站 `allowlist` + 空白名单。 */
110
+ private readonly config?;
111
+ constructor(db: KernelDb,
112
+ /** 部署配置(校验 `sandboxEgress` 不超出部署);省略视为部署出站 `allowlist` + 空白名单。 */
113
+ config?: (() => Pick<KernelConfig, "sandbox">) | undefined);
114
+ /** 部署默认值(设置页展示「跟随部署」时的实际取值)。 */
115
+ deployment(): OrgSettingsDeployment;
116
+ /** 组织实际生效的沙箱 cpu / 内存(只读;由企业管理员在部署设置里覆盖)。 */
117
+ sandboxLimits(orgId: string): Promise<OrgSandboxLimits>;
118
+ get(orgId: string): Promise<OrgSettings>;
119
+ update(orgId: string, patch: OrgSettingsPatch, actorAccountId: string, actorTokenId?: string): Promise<OrgSettings>;
120
+ }
@@ -0,0 +1,178 @@
1
+ import { validateAllowHost } from "@capybara-hq/plugin-sdk";
2
+ import { z } from "zod";
3
+ import { ApiError } from "../errors.js";
4
+ import { audit } from "../identity/audit.js";
5
+ import { readSandboxLimitOverride } from "../identity/settings.js";
6
+ import { lockOrgAndAuthorize } from "./org-lock.js";
7
+ /**
8
+ * 组织设置(`capybara.orgs.settings` jsonb)。读取宽松:缺失或非法的字段按默认值,未知键保留不动
9
+ * (更新时与存量合并),新版本加字段不需要迁移。
10
+ * - `toolSearch`:工具超过阈值时是否改用目录 + `tool_search`(D11,默认 on)。
11
+ * - `locale`:组织默认语言(`zh` / `en`,默认 en),机器人在 IM 里说的固定话术按它选择。
12
+ * - `sandboxToolPolicy`:沙箱工具的默认策略(M5 T8,默认 allow)。为 `ask` 时除只读的
13
+ * `sandbox_read` / `sandbox_glob` / `sandbox_grep` 外都需要审批(执行时实时读取)。
14
+ * - `sandboxEgress`:组织的沙箱出站(Ruling M19 / D6),缺省跟随部署的 `sandbox.limits.egress` + `allowHosts`。
15
+ * 见 {@link effectiveSandboxEgress}。存量值非法时按 `none` 读(宁可断网,不悄悄放宽到部署默认)。
16
+ */
17
+ /** 组织沙箱出站白名单的主机数上限。 */
18
+ export const ORG_SANDBOX_ALLOW_HOSTS_MAX = 200;
19
+ /**
20
+ * 组织的沙箱出站设置:`none`(只有回环),或 `allowlist`。`allowHosts` 给出时**替换**部署的白名单
21
+ * (组织可以去掉预置项、也可以加别的主机),省略时沿用部署的白名单。没有 `open`:组织不能比部署放得更开。
22
+ */
23
+ export const SandboxEgressSettingSchema = z
24
+ .object({
25
+ mode: z.enum(["none", "allowlist"]),
26
+ allowHosts: z
27
+ .array(z.string())
28
+ .max(ORG_SANDBOX_ALLOW_HOSTS_MAX)
29
+ .superRefine((hosts, ctx) => {
30
+ hosts.forEach((h, i) => {
31
+ for (const message of validateAllowHost(h)) {
32
+ ctx.addIssue({ code: "custom", path: [i], message: `${h}: ${message}` });
33
+ }
34
+ });
35
+ if (new Set(hosts).size !== hosts.length) {
36
+ ctx.addIssue({ code: "custom", message: "allowHosts must not contain duplicates" });
37
+ }
38
+ })
39
+ .optional(),
40
+ })
41
+ .strict();
42
+ export const OrgSettingsSchema = z.object({
43
+ toolSearch: z.enum(["on", "off"]).default("on").catch("on"),
44
+ locale: z.enum(["zh", "en"]).default("en").catch("en"),
45
+ sandboxToolPolicy: z.enum(["allow", "ask"]).default("allow").catch("allow"),
46
+ sandboxEgress: SandboxEgressSettingSchema.optional().catch({ mode: "none" }),
47
+ });
48
+ /** PATCH 体:只改给出的字段;未知字段 → 400。 */
49
+ export const OrgSettingsPatchSchema = z
50
+ .object({
51
+ toolSearch: z.enum(["on", "off"]).optional(),
52
+ locale: z.enum(["zh", "en"]).optional(),
53
+ sandboxToolPolicy: z.enum(["allow", "ask"]).optional(),
54
+ /** null 清除(恢复跟随部署默认)。 */
55
+ sandboxEgress: SandboxEgressSettingSchema.nullable().optional(),
56
+ })
57
+ .strict();
58
+ /**
59
+ * 组织实际生效的沙箱出站:没有组织设置 → 部署默认;`none` → 只有回环;`allowlist` → 组织的白名单
60
+ * (省略时用部署的),但部署是 `none` 时仍为 `none`(组织永远不比部署放得更开,部署改成 none 后存量设置也随之收紧)。
61
+ */
62
+ export function effectiveSandboxEgress(deployment, org) {
63
+ if (org === undefined)
64
+ return { egress: deployment.egress, allowHosts: [...deployment.allowHosts] };
65
+ if (org.mode === "none" || deployment.egress === "none")
66
+ return { egress: "none", allowHosts: [] };
67
+ return { egress: "allowlist", allowHosts: [...(org.allowHosts ?? deployment.allowHosts)] };
68
+ }
69
+ /**
70
+ * 组织实际生效的沙箱限额(C19 / Ruling M16):企业管理员的覆盖(部署设置 `sandboxLimitOverrides[orgId]`)
71
+ * 给出的 cpu / memoryMb 替换部署默认,未给的项、disk 与出站沿用 `deployment`。只在创建沙箱时读取。
72
+ */
73
+ export function effectiveSandboxLimits(deployment, override) {
74
+ return {
75
+ ...deployment,
76
+ allowHosts: [...deployment.allowHosts],
77
+ ...(override?.cpu !== undefined && { cpu: override.cpu }),
78
+ ...(override?.memoryMb !== undefined && { memoryMb: override.memoryMb }),
79
+ };
80
+ }
81
+ /** 按值比较(`sandboxEgress` 是对象);键序由 schema 固定。 */
82
+ const sameSettings = (a, b) => JSON.stringify(OrgSettingsSchema.parse(a)) === JSON.stringify(OrgSettingsSchema.parse(b));
83
+ const asObject = (v) => v !== null && typeof v === "object" && !Array.isArray(v) ? v : {};
84
+ /** 把存储的 jsonb 解析为设置(宽松,见 {@link OrgSettingsSchema})。 */
85
+ export function parseOrgSettings(raw) {
86
+ return OrgSettingsSchema.parse(asObject(raw));
87
+ }
88
+ /** 读组织设置(每次实时读 PG,多副本下改动立即生效);组织不存在或已删除按默认值。 */
89
+ export async function readOrgSettings(db, orgId) {
90
+ const row = await db
91
+ .selectFrom("orgs")
92
+ .select("settings")
93
+ .where("id", "=", orgId)
94
+ .where("deleted_at", "is", null)
95
+ .executeTakeFirst();
96
+ return parseOrgSettings(row?.settings);
97
+ }
98
+ /** 组织设置服务:读取与修改(修改需 `org.update`,锁内实时复核角色,写审计)。 */
99
+ export class OrgSettingsService {
100
+ db;
101
+ config;
102
+ constructor(db,
103
+ /** 部署配置(校验 `sandboxEgress` 不超出部署);省略视为部署出站 `allowlist` + 空白名单。 */
104
+ config) {
105
+ this.db = db;
106
+ this.config = config;
107
+ }
108
+ /** 部署默认值(设置页展示「跟随部署」时的实际取值)。 */
109
+ deployment() {
110
+ const lim = this.config?.().sandbox.limits;
111
+ return {
112
+ sandboxEgress: { mode: lim?.egress ?? "allowlist", allowHosts: [...(lim?.allowHosts ?? [])] },
113
+ };
114
+ }
115
+ /** 组织实际生效的沙箱 cpu / 内存(只读;由企业管理员在部署设置里覆盖)。 */
116
+ async sandboxLimits(orgId) {
117
+ const lim = this.config?.().sandbox.limits;
118
+ const override = await readSandboxLimitOverride(this.db, orgId);
119
+ return {
120
+ // 没有部署配置(测试构造)时用 schema 默认值 1 核 / 2048 MiB
121
+ cpu: override?.cpu ?? lim?.cpu ?? 1,
122
+ memoryMb: override?.memoryMb ?? lim?.memoryMb ?? 2048,
123
+ source: override === undefined ? "deployment" : "override",
124
+ };
125
+ }
126
+ async get(orgId) {
127
+ const row = await this.db
128
+ .selectFrom("orgs")
129
+ .select("settings")
130
+ .where("id", "=", orgId)
131
+ .where("deleted_at", "is", null)
132
+ .executeTakeFirst();
133
+ if (!row)
134
+ throw new ApiError("org.not_found", "Organization not found");
135
+ return parseOrgSettings(row.settings);
136
+ }
137
+ async update(orgId, patch, actorAccountId, actorTokenId) {
138
+ if (patch.sandboxEgress?.mode === "allowlist" &&
139
+ this.deployment().sandboxEgress.mode === "none") {
140
+ throw new ApiError("org.sandbox_egress_not_allowed", "This deployment disables sandbox network access (sandbox.limits.egress is none); an organization can only set sandboxEgress to none");
141
+ }
142
+ return this.db.transaction().execute(async (trx) => {
143
+ await lockOrgAndAuthorize(trx, orgId, actorAccountId, "org.update");
144
+ const row = await trx
145
+ .selectFrom("orgs")
146
+ .select("settings")
147
+ .where("id", "=", orgId)
148
+ .executeTakeFirstOrThrow();
149
+ const stored = asObject(row.settings);
150
+ const before = parseOrgSettings(stored);
151
+ const changes = Object.fromEntries(Object.entries(patch)
152
+ .filter(([, v]) => v !== undefined)
153
+ // null 清除 sandboxEgress:恢复跟随部署默认
154
+ .map(([k, v]) => [k, v === null ? undefined : v]));
155
+ const after = { ...before, ...changes };
156
+ if (after.sandboxEgress === undefined)
157
+ delete after.sandboxEgress;
158
+ if (sameSettings(before, after))
159
+ return before;
160
+ // 与存量合并:保留本版本不认识的键(清除的 sandboxEgress 不留在存量里)
161
+ const { sandboxEgress: _old, ...rest } = stored;
162
+ await trx
163
+ .updateTable("orgs")
164
+ .set({ settings: JSON.stringify({ ...rest, ...after }) })
165
+ .where("id", "=", orgId)
166
+ .execute();
167
+ await audit(trx, {
168
+ actorAccountId,
169
+ ...(actorTokenId !== undefined && { actorTokenId }),
170
+ orgId,
171
+ action: "org.settings_updated",
172
+ target: orgId,
173
+ detail: { before, after },
174
+ });
175
+ return after;
176
+ });
177
+ }
178
+ }
@@ -0,0 +1,50 @@
1
+ /**
2
+ * 从 npm registry 下载插件包(D14 / C21 / C26)。registry 地址来自配置(可信),但它返回的内容一律当作外部输入:
3
+ * - 不跟随重定向(3xx 直接失败):否则 registry 的一次重定向就能把下载(连同令牌)引到任意地址;
4
+ * - 元数据与 tarball 都边读边计数,超过上限立即中止;
5
+ * - 没有 `opts` 时 tarball 必须与 registry 同源(令牌只发往该源),并按 packument 的 `dist.integrity`
6
+ * (sha512 SRI)校验;给了 `opts.expectedIntegrity`(清单引入,T24)时只认它;
7
+ * - `opts.tarballUrl`(清单直接给出的下载地址)必须是 https,测试里可经 `allowInsecureLoopback` 允许回环 http,
8
+ * 且必须同时给出 `expectedIntegrity`;不会带 registry 令牌。
9
+ */
10
+ /** 下载或校验失败(HTTP 层映射为 `packages.npm_failed`,502)。消息为英文,不含令牌。 */
11
+ export declare class NpmFetchError extends Error {
12
+ constructor(message: string, options?: {
13
+ cause?: unknown;
14
+ });
15
+ }
16
+ /** 下载内容与期望的 integrity 不符(`expected` / `actual` 为 `sha512-<base64>`)。 */
17
+ export declare class IntegrityMismatchError extends NpmFetchError {
18
+ readonly expected: string;
19
+ readonly actual: string;
20
+ constructor(message: string, expected: string, actual: string);
21
+ }
22
+ /** The package exceeds the size limit (the HTTP layer maps it to `extension.package_too_large`, 413). */
23
+ export declare class PackageTooLargeError extends Error {
24
+ readonly maxBytes: number;
25
+ constructor(maxBytes: number);
26
+ }
27
+ export interface NpmFetchConfig {
28
+ registry: string;
29
+ token?: string;
30
+ maxBytes: number;
31
+ /** 只供测试:允许 `opts.tarballUrl` 用回环地址上的 http。 */
32
+ allowInsecureLoopback?: boolean;
33
+ }
34
+ /** 回环地址(`localhost`、`127.*`、`::1`)。 */
35
+ export declare const isLoopback: (host: string) => boolean;
36
+ /** 读响应体,累计超过 `max` 立即取消并抛 `onTooLarge()`。 */
37
+ export declare function readCapped(res: Response, max: number, onTooLarge: () => Error): Promise<Buffer>;
38
+ /**
39
+ * 下载 `name@version`(`version` 可以是精确版本、dist-tag 或范围,缺省 `latest`),返回 tgz 字节、解析出的版本与
40
+ * 实际校验所用的 integrity。失败抛 {@link NpmFetchError}(含 {@link IntegrityMismatchError})或
41
+ * {@link PackageTooLargeError}。
42
+ */
43
+ export declare function fetchNpmPackage(cfg: NpmFetchConfig, name: string, version: string | undefined, signal: AbortSignal, opts?: {
44
+ expectedIntegrity?: string;
45
+ tarballUrl?: string;
46
+ }): Promise<{
47
+ bytes: Uint8Array;
48
+ version: string;
49
+ integrity: string;
50
+ }>;
@@ -0,0 +1,218 @@
1
+ import { createHash, timingSafeEqual } from "node:crypto";
2
+ import { isIP } from "node:net";
3
+ import semver from "semver";
4
+ /**
5
+ * 从 npm registry 下载插件包(D14 / C21 / C26)。registry 地址来自配置(可信),但它返回的内容一律当作外部输入:
6
+ * - 不跟随重定向(3xx 直接失败):否则 registry 的一次重定向就能把下载(连同令牌)引到任意地址;
7
+ * - 元数据与 tarball 都边读边计数,超过上限立即中止;
8
+ * - 没有 `opts` 时 tarball 必须与 registry 同源(令牌只发往该源),并按 packument 的 `dist.integrity`
9
+ * (sha512 SRI)校验;给了 `opts.expectedIntegrity`(清单引入,T24)时只认它;
10
+ * - `opts.tarballUrl`(清单直接给出的下载地址)必须是 https,测试里可经 `allowInsecureLoopback` 允许回环 http,
11
+ * 且必须同时给出 `expectedIntegrity`;不会带 registry 令牌。
12
+ */
13
+ /** 下载或校验失败(HTTP 层映射为 `packages.npm_failed`,502)。消息为英文,不含令牌。 */
14
+ export class NpmFetchError extends Error {
15
+ constructor(message, options) {
16
+ super(message, options);
17
+ this.name = "NpmFetchError";
18
+ }
19
+ }
20
+ /** 下载内容与期望的 integrity 不符(`expected` / `actual` 为 `sha512-<base64>`)。 */
21
+ export class IntegrityMismatchError extends NpmFetchError {
22
+ expected;
23
+ actual;
24
+ constructor(message, expected, actual) {
25
+ super(message);
26
+ this.expected = expected;
27
+ this.actual = actual;
28
+ this.name = "IntegrityMismatchError";
29
+ }
30
+ }
31
+ /** The package exceeds the size limit (the HTTP layer maps it to `extension.package_too_large`, 413). */
32
+ export class PackageTooLargeError extends Error {
33
+ maxBytes;
34
+ constructor(maxBytes) {
35
+ super(`the package is larger than ${maxBytes} bytes`);
36
+ this.maxBytes = maxBytes;
37
+ this.name = "PackageTooLargeError";
38
+ }
39
+ }
40
+ /** packument(包元数据)的大小上限:热门包的完整元数据可以有几十 MB,插件包不会这么多。 */
41
+ const MAX_METADATA_BYTES = 16 * 1024 * 1024;
42
+ // npm 包名(简化,与 plugin-sdk 的规则一致):可带 scope,小写,≤ 214 字符。
43
+ const NPM_NAME_RE = /^(?:@[a-z0-9][a-z0-9._~-]*\/)?[a-z0-9][a-z0-9._~-]*$/;
44
+ const TAG_RE = /^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/;
45
+ const errMsg = (e) => (e instanceof Error ? e.message : String(e));
46
+ /** 回环地址(`localhost`、`127.*`、`::1`)。 */
47
+ export const isLoopback = (host) => {
48
+ const h = host.replace(/^\[|\]$/g, "");
49
+ return h === "localhost" || h === "::1" || (isIP(h) === 4 && h.startsWith("127."));
50
+ };
51
+ /** 读响应体,累计超过 `max` 立即取消并抛 `onTooLarge()`。 */
52
+ export async function readCapped(res, max, onTooLarge) {
53
+ const declared = Number(res.headers.get("content-length"));
54
+ if (Number.isFinite(declared) && declared > max) {
55
+ await res.body?.cancel().catch(() => { });
56
+ throw onTooLarge();
57
+ }
58
+ if (!res.body)
59
+ return Buffer.alloc(0);
60
+ const reader = res.body.getReader();
61
+ const chunks = [];
62
+ let total = 0;
63
+ for (;;) {
64
+ const { done, value } = await reader.read();
65
+ if (done)
66
+ break;
67
+ total += value.byteLength;
68
+ if (total > max) {
69
+ await reader.cancel().catch(() => { });
70
+ throw onTooLarge();
71
+ }
72
+ chunks.push(value);
73
+ }
74
+ if (chunks.length === 1) {
75
+ const c = chunks[0];
76
+ return Buffer.from(c.buffer, c.byteOffset, c.byteLength);
77
+ }
78
+ return Buffer.concat(chunks);
79
+ }
80
+ async function get(url, headers, signal, what) {
81
+ let res;
82
+ try {
83
+ res = await fetch(url, { headers, redirect: "manual", signal });
84
+ }
85
+ catch (e) {
86
+ throw new NpmFetchError(`cannot fetch the ${what}: ${errMsg(e)}`, { cause: e });
87
+ }
88
+ if (res.status >= 300 && res.status < 400) {
89
+ await res.body?.cancel().catch(() => { });
90
+ throw new NpmFetchError(`the ${what} responded with a redirect (${res.status}); redirects are not followed`);
91
+ }
92
+ if (!res.ok) {
93
+ await res.body?.cancel().catch(() => { });
94
+ throw new NpmFetchError(`the ${what} responded with HTTP ${res.status}`);
95
+ }
96
+ return res;
97
+ }
98
+ /** `sha512-<base64>` 形式的 SRI;可能有空格分隔的多个,取其中的 sha512。 */
99
+ function sha512Of(integrity) {
100
+ for (const part of integrity.trim().split(/\s+/)) {
101
+ const m = /^sha512-([A-Za-z0-9+/]+={0,2})(?:\?.*)?$/.exec(part);
102
+ if (m) {
103
+ const b = Buffer.from(m[1], "base64");
104
+ if (b.length === 64)
105
+ return b;
106
+ }
107
+ }
108
+ return undefined;
109
+ }
110
+ function verify(bytes, integrity, label) {
111
+ const want = sha512Of(integrity);
112
+ if (!want)
113
+ throw new NpmFetchError(`${label} is not a sha512 integrity`);
114
+ const got = createHash("sha512").update(bytes).digest();
115
+ if (!timingSafeEqual(want, got)) {
116
+ throw new IntegrityMismatchError(`the downloaded package does not match ${label}`, `sha512-${want.toString("base64")}`, `sha512-${got.toString("base64")}`);
117
+ }
118
+ }
119
+ /**
120
+ * 下载 `name@version`(`version` 可以是精确版本、dist-tag 或范围,缺省 `latest`),返回 tgz 字节、解析出的版本与
121
+ * 实际校验所用的 integrity。失败抛 {@link NpmFetchError}(含 {@link IntegrityMismatchError})或
122
+ * {@link PackageTooLargeError}。
123
+ */
124
+ export async function fetchNpmPackage(cfg, name, version, signal, opts = {}) {
125
+ if (typeof name !== "string" || name.length > 214 || !NPM_NAME_RE.test(name)) {
126
+ throw new NpmFetchError(`"${String(name)}" is not a valid npm package name`);
127
+ }
128
+ const registry = new URL(cfg.registry.endsWith("/") ? cfg.registry : `${cfg.registry}/`);
129
+ const authHeaders = cfg.token !== undefined ? { authorization: `Bearer ${cfg.token}` } : {};
130
+ const tooLarge = () => new PackageTooLargeError(cfg.maxBytes);
131
+ let tarball;
132
+ let resolved;
133
+ let integrity;
134
+ let tarballHeaders = authHeaders;
135
+ if (opts.tarballUrl !== undefined) {
136
+ if (opts.expectedIntegrity === undefined) {
137
+ throw new NpmFetchError("a tarballUrl needs an expectedIntegrity to verify the download");
138
+ }
139
+ if (version === undefined || semver.valid(version) === null) {
140
+ throw new NpmFetchError("a tarballUrl needs an exact version");
141
+ }
142
+ try {
143
+ tarball = new URL(opts.tarballUrl);
144
+ }
145
+ catch {
146
+ throw new NpmFetchError("the tarball URL is not a valid URL");
147
+ }
148
+ const insecureOk = cfg.allowInsecureLoopback === true &&
149
+ tarball.protocol === "http:" &&
150
+ isLoopback(tarball.hostname);
151
+ if (tarball.protocol !== "https:" && !insecureOk) {
152
+ throw new NpmFetchError("the tarball URL must use https");
153
+ }
154
+ // 令牌只发给 registry 源
155
+ if (tarball.origin !== registry.origin)
156
+ tarballHeaders = {};
157
+ resolved = version;
158
+ integrity = opts.expectedIntegrity;
159
+ }
160
+ else {
161
+ // scope 包名里的 `/` 按 npm 客户端的写法编码为 %2f
162
+ const docUrl = new URL(name.replace("/", "%2f"), registry);
163
+ const res = await get(docUrl, { ...authHeaders, accept: "application/json" }, signal, "npm registry");
164
+ const raw = await readCapped(res, MAX_METADATA_BYTES, () => new NpmFetchError("the npm package metadata is too large"));
165
+ let doc;
166
+ try {
167
+ doc = JSON.parse(raw.toString("utf8"));
168
+ }
169
+ catch {
170
+ throw new NpmFetchError("the npm package metadata is not valid JSON");
171
+ }
172
+ const versions = doc.versions && typeof doc.versions === "object" ? doc.versions : {};
173
+ const tags = doc["dist-tags"] && typeof doc["dist-tags"] === "object" ? doc["dist-tags"] : {};
174
+ const want = version ?? "latest";
175
+ let picked;
176
+ if (Object.hasOwn(versions, want) && semver.valid(want) !== null)
177
+ picked = want;
178
+ else if (TAG_RE.test(want) && typeof tags[want] === "string" && semver.valid(want) === null) {
179
+ picked = tags[want];
180
+ }
181
+ else if (semver.validRange(want) !== null) {
182
+ picked =
183
+ semver.maxSatisfying(Object.keys(versions).filter((v) => semver.valid(v) !== null), want) ?? undefined;
184
+ }
185
+ const entry = picked !== undefined && Object.hasOwn(versions, picked) ? versions[picked] : undefined;
186
+ if (picked === undefined || !entry) {
187
+ throw new NpmFetchError(`npm package ${name} has no version matching "${want}"`);
188
+ }
189
+ const dist = entry.dist ?? {};
190
+ if (typeof dist.tarball !== "string") {
191
+ throw new NpmFetchError(`npm package ${name}@${picked} has no tarball`);
192
+ }
193
+ try {
194
+ tarball = new URL(dist.tarball);
195
+ }
196
+ catch {
197
+ throw new NpmFetchError(`npm package ${name}@${picked} has an invalid tarball URL`);
198
+ }
199
+ if (tarball.origin !== registry.origin) {
200
+ throw new NpmFetchError(`the tarball of ${name}@${picked} is not on the registry origin ${registry.origin}`);
201
+ }
202
+ if (opts.expectedIntegrity !== undefined)
203
+ integrity = opts.expectedIntegrity;
204
+ else if (typeof dist.integrity === "string")
205
+ integrity = dist.integrity;
206
+ else
207
+ throw new NpmFetchError(`npm package ${name}@${picked} has no integrity to verify`);
208
+ resolved = picked;
209
+ }
210
+ const res = await get(tarball, tarballHeaders, signal, "package tarball");
211
+ const bytes = await readCapped(res, cfg.maxBytes, tooLarge);
212
+ verify(bytes, integrity, opts.expectedIntegrity !== undefined ? "the expected integrity" : "the npm dist.integrity");
213
+ return {
214
+ bytes: new Uint8Array(bytes.buffer, bytes.byteOffset, bytes.byteLength),
215
+ version: resolved,
216
+ integrity,
217
+ };
218
+ }
@@ -0,0 +1,47 @@
1
+ import { type NpmFetchConfig } from "./npm.js";
2
+ /**
3
+ * npm provenance for the import review (spec §5.5, Decision 7): the registry's attestations of
4
+ * `name@version` (`<registry>/-/npm/v1/attestations/<name>@<version>`) are read and the SLSA
5
+ * provenance statement (in-toto, inside a DSSE envelope) is parsed for the repository, commit and
6
+ * workflow it was built from. This is display only: the sigstore signatures are not verified, and
7
+ * nothing here ever fails an import. A registry without provenance, a network error, a timeout, an
8
+ * oversized or malformed answer all give `{ checked: false, reason }` ("provenance not checked").
9
+ * The registry token goes only to the registry (the attestation URL is always on its origin).
10
+ */
11
+ /** What the SLSA provenance of an npm package says about its build. */
12
+ export interface Provenance {
13
+ checked: true;
14
+ /** The source repository, as attested (e.g. `https://github.com/acme/plugins`). */
15
+ repository: string;
16
+ /** The git commit the package was built from. */
17
+ commit: string;
18
+ /** The workflow file that built it (e.g. `.github/workflows/release.yml`). */
19
+ workflow: string;
20
+ /** The SLSA build type (which CI system's build definition). */
21
+ buildType: string;
22
+ }
23
+ /** Provenance was not checked (no attestation, offline, or an answer that could not be read). */
24
+ export interface ProvenanceNotChecked {
25
+ checked: false;
26
+ reason: string;
27
+ }
28
+ export type ProvenanceResult = Provenance | ProvenanceNotChecked;
29
+ /** The predicate type of an SLSA v1 provenance statement. */
30
+ export declare const SLSA_PROVENANCE_V1 = "https://slsa.dev/provenance/v1";
31
+ /** Provenance must not hold up an import: a slow registry gives "not checked". */
32
+ export declare const PROVENANCE_TIMEOUT_MS = 15000;
33
+ /**
34
+ * Reads the SLSA provenance of `name@version` from the configured registry. `integrity` (the
35
+ * tarball's `sha512-…`, when known) must be among the statement's subject digests, so a statement
36
+ * about another tarball is not shown. Never throws (an aborted `signal` included).
37
+ */
38
+ export declare function fetchProvenance(cfg: NpmFetchConfig, name: string, version: string, signal: AbortSignal, opts?: {
39
+ integrity?: string;
40
+ }): Promise<ProvenanceResult>;
41
+ /**
42
+ * Parses an attestations answer (`{ attestations: [{ predicateType, bundle: { dsseEnvelope } }] }`).
43
+ * Exported for tests.
44
+ */
45
+ export declare function parseAttestations(body: unknown, integrity?: string): ProvenanceResult;
46
+ /** Two repository URLs name the same repository (scheme, `git+`, `.git`, case ignored). */
47
+ export declare function sameRepository(a: string, b: string): boolean;