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

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 (637) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +2 -0
  3. package/README.md +20 -2
  4. package/bootstrap.json +26 -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 +1126 -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 +237 -0
  112. package/dist/config/schema.js +1192 -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 +423 -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 +151 -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 +211 -0
  166. package/dist/errors.js +213 -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 +790 -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 +176 -0
  210. package/dist/extensions/bootstrap.js +535 -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 +220 -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 +69 -0
  318. package/dist/index.js +67 -0
  319. package/dist/kernel.d.ts +259 -0
  320. package/dist/kernel.js +1326 -0
  321. package/dist/log-config.d.ts +9 -0
  322. package/dist/log-config.js +27 -0
  323. package/dist/log-context.d.ts +32 -0
  324. package/dist/log-context.js +40 -0
  325. package/dist/log-loki.d.ts +34 -0
  326. package/dist/log-loki.js +145 -0
  327. package/dist/log.d.ts +79 -0
  328. package/dist/log.js +303 -0
  329. package/dist/models/prices.d.ts +53 -0
  330. package/dist/models/prices.js +121 -0
  331. package/dist/models/purposes.controller.d.ts +19 -0
  332. package/dist/models/purposes.controller.js +56 -0
  333. package/dist/models/purposes.d.ts +140 -0
  334. package/dist/models/purposes.js +267 -0
  335. package/dist/net/proxy.d.ts +44 -0
  336. package/dist/net/proxy.js +162 -0
  337. package/dist/net/public-address.d.ts +60 -0
  338. package/dist/net/public-address.js +272 -0
  339. package/dist/net/safe-fetch.d.ts +38 -0
  340. package/dist/net/safe-fetch.js +140 -0
  341. package/dist/orgs/directory-sync.controller.d.ts +14 -0
  342. package/dist/orgs/directory-sync.controller.js +40 -0
  343. package/dist/orgs/directory-sync.d.ts +166 -0
  344. package/dist/orgs/directory-sync.js +558 -0
  345. package/dist/orgs/invitations.controller.d.ts +58 -0
  346. package/dist/orgs/invitations.controller.js +137 -0
  347. package/dist/orgs/invitations.service.d.ts +80 -0
  348. package/dist/orgs/invitations.service.js +217 -0
  349. package/dist/orgs/members.service.d.ts +63 -0
  350. package/dist/orgs/members.service.js +234 -0
  351. package/dist/orgs/offboarding.d.ts +141 -0
  352. package/dist/orgs/offboarding.js +398 -0
  353. package/dist/orgs/org-lock.d.ts +32 -0
  354. package/dist/orgs/org-lock.js +46 -0
  355. package/dist/orgs/org.guard.d.ts +35 -0
  356. package/dist/orgs/org.guard.js +95 -0
  357. package/dist/orgs/orgs.controller.d.ts +78 -0
  358. package/dist/orgs/orgs.controller.js +192 -0
  359. package/dist/orgs/orgs.service.d.ts +61 -0
  360. package/dist/orgs/orgs.service.js +209 -0
  361. package/dist/orgs/roles.d.ts +13 -0
  362. package/dist/orgs/roles.js +58 -0
  363. package/dist/orgs/settings.controller.d.ts +20 -0
  364. package/dist/orgs/settings.controller.js +53 -0
  365. package/dist/orgs/settings.service.d.ts +120 -0
  366. package/dist/orgs/settings.service.js +178 -0
  367. package/dist/packages/npm.d.ts +50 -0
  368. package/dist/packages/npm.js +218 -0
  369. package/dist/packages/provenance.d.ts +47 -0
  370. package/dist/packages/provenance.js +147 -0
  371. package/dist/packages/tgz.d.ts +76 -0
  372. package/dist/packages/tgz.js +225 -0
  373. package/dist/runtime/abort.d.ts +32 -0
  374. package/dist/runtime/abort.js +71 -0
  375. package/dist/runtime/checkpointer.d.ts +32 -0
  376. package/dist/runtime/checkpointer.js +243 -0
  377. package/dist/runtime/context/build.d.ts +254 -0
  378. package/dist/runtime/context/build.js +693 -0
  379. package/dist/runtime/context/claude-tools.d.ts +11 -0
  380. package/dist/runtime/context/claude-tools.js +24 -0
  381. package/dist/runtime/context/compaction.d.ts +26 -0
  382. package/dist/runtime/context/compaction.js +195 -0
  383. package/dist/runtime/context/pairing.d.ts +11 -0
  384. package/dist/runtime/context/pairing.js +82 -0
  385. package/dist/runtime/context/reminders.d.ts +5 -0
  386. package/dist/runtime/context/reminders.js +11 -0
  387. package/dist/runtime/context/skills.d.ts +105 -0
  388. package/dist/runtime/context/skills.js +283 -0
  389. package/dist/runtime/context/tokens.d.ts +19 -0
  390. package/dist/runtime/context/tokens.js +104 -0
  391. package/dist/runtime/conversation-lock.d.ts +40 -0
  392. package/dist/runtime/conversation-lock.js +97 -0
  393. package/dist/runtime/hook-calls.d.ts +84 -0
  394. package/dist/runtime/hook-calls.js +136 -0
  395. package/dist/runtime/langgraph-loop.d.ts +52 -0
  396. package/dist/runtime/langgraph-loop.js +247 -0
  397. package/dist/runtime/loop.d.ts +93 -0
  398. package/dist/runtime/loop.js +7 -0
  399. package/dist/runtime/maintenance.d.ts +80 -0
  400. package/dist/runtime/maintenance.js +148 -0
  401. package/dist/runtime/media-cache.d.ts +21 -0
  402. package/dist/runtime/media-cache.js +51 -0
  403. package/dist/runtime/model-call.d.ts +176 -0
  404. package/dist/runtime/model-call.js +1049 -0
  405. package/dist/runtime/providers.d.ts +86 -0
  406. package/dist/runtime/providers.js +224 -0
  407. package/dist/runtime/quota.d.ts +29 -0
  408. package/dist/runtime/quota.js +70 -0
  409. package/dist/runtime/run-finish.d.ts +45 -0
  410. package/dist/runtime/run-finish.js +69 -0
  411. package/dist/runtime/run-queue.d.ts +121 -0
  412. package/dist/runtime/run-queue.js +493 -0
  413. package/dist/runtime/run-worker.d.ts +138 -0
  414. package/dist/runtime/run-worker.js +806 -0
  415. package/dist/runtime/stream.controller.d.ts +34 -0
  416. package/dist/runtime/stream.controller.js +122 -0
  417. package/dist/runtime/stream.d.ts +63 -0
  418. package/dist/runtime/stream.js +262 -0
  419. package/dist/runtime/subagents/child.d.ts +80 -0
  420. package/dist/runtime/subagents/child.js +225 -0
  421. package/dist/runtime/subagents/definition.d.ts +103 -0
  422. package/dist/runtime/subagents/definition.js +392 -0
  423. package/dist/runtime/subagents/dispatch.d.ts +69 -0
  424. package/dist/runtime/subagents/dispatch.js +502 -0
  425. package/dist/runtime/subagents/limits.d.ts +23 -0
  426. package/dist/runtime/subagents/limits.js +34 -0
  427. package/dist/runtime/subagents/org-agents.d.ts +50 -0
  428. package/dist/runtime/subagents/org-agents.js +70 -0
  429. package/dist/runtime/subagents/preamble.d.ts +7 -0
  430. package/dist/runtime/subagents/preamble.js +11 -0
  431. package/dist/runtime/subagents/progress.d.ts +26 -0
  432. package/dist/runtime/subagents/progress.js +36 -0
  433. package/dist/runtime/subagents/roster.d.ts +55 -0
  434. package/dist/runtime/subagents/roster.js +111 -0
  435. package/dist/runtime/subagents/skill-fork.d.ts +123 -0
  436. package/dist/runtime/subagents/skill-fork.js +259 -0
  437. package/dist/runtime/usage-report.d.ts +163 -0
  438. package/dist/runtime/usage-report.js +551 -0
  439. package/dist/runtime/waits.d.ts +233 -0
  440. package/dist/runtime/waits.js +883 -0
  441. package/dist/sandbox/leases.d.ts +169 -0
  442. package/dist/sandbox/leases.js +515 -0
  443. package/dist/sandbox/lifecycle.d.ts +21 -0
  444. package/dist/sandbox/lifecycle.js +68 -0
  445. package/dist/sandbox/sandbox.service.d.ts +249 -0
  446. package/dist/sandbox/sandbox.service.js +908 -0
  447. package/dist/skills/catalog.d.ts +149 -0
  448. package/dist/skills/catalog.js +405 -0
  449. package/dist/skills/changes.controller.d.ts +56 -0
  450. package/dist/skills/changes.controller.js +136 -0
  451. package/dist/skills/changes.service.d.ts +175 -0
  452. package/dist/skills/changes.service.js +805 -0
  453. package/dist/skills/invocable.controller.d.ts +23 -0
  454. package/dist/skills/invocable.controller.js +50 -0
  455. package/dist/skills/invocation-keys.d.ts +23 -0
  456. package/dist/skills/invocation-keys.js +44 -0
  457. package/dist/skills/invoke.d.ts +135 -0
  458. package/dist/skills/invoke.js +286 -0
  459. package/dist/skills/package.d.ts +87 -0
  460. package/dist/skills/package.js +227 -0
  461. package/dist/skills/skills.controller.d.ts +40 -0
  462. package/dist/skills/skills.controller.js +110 -0
  463. package/dist/skills/skills.service.d.ts +192 -0
  464. package/dist/skills/skills.service.js +567 -0
  465. package/dist/storage/prefix.d.ts +36 -0
  466. package/dist/storage/prefix.js +104 -0
  467. package/dist/storage/purge.d.ts +27 -0
  468. package/dist/storage/purge.js +75 -0
  469. package/dist/storage/storage.service.d.ts +44 -0
  470. package/dist/storage/storage.service.js +145 -0
  471. package/dist/text.d.ts +13 -0
  472. package/dist/text.js +13 -0
  473. package/dist/tools/approvals.controller.d.ts +53 -0
  474. package/dist/tools/approvals.controller.js +128 -0
  475. package/dist/tools/approvals.service.d.ts +172 -0
  476. package/dist/tools/approvals.service.js +568 -0
  477. package/dist/tools/breaker.d.ts +28 -0
  478. package/dist/tools/breaker.js +72 -0
  479. package/dist/tools/builtins/agent.d.ts +81 -0
  480. package/dist/tools/builtins/agent.js +223 -0
  481. package/dist/tools/builtins/ask-user.d.ts +28 -0
  482. package/dist/tools/builtins/ask-user.js +139 -0
  483. package/dist/tools/builtins/read-tool-output.d.ts +18 -0
  484. package/dist/tools/builtins/read-tool-output.js +108 -0
  485. package/dist/tools/builtins/sandbox/bash.d.ts +16 -0
  486. package/dist/tools/builtins/sandbox/bash.js +137 -0
  487. package/dist/tools/builtins/sandbox/common.d.ts +116 -0
  488. package/dist/tools/builtins/sandbox/common.js +306 -0
  489. package/dist/tools/builtins/sandbox/deliver.d.ts +5 -0
  490. package/dist/tools/builtins/sandbox/deliver.js +180 -0
  491. package/dist/tools/builtins/sandbox/edit.d.ts +4 -0
  492. package/dist/tools/builtins/sandbox/edit.js +98 -0
  493. package/dist/tools/builtins/sandbox/glob-match.d.ts +25 -0
  494. package/dist/tools/builtins/sandbox/glob-match.js +240 -0
  495. package/dist/tools/builtins/sandbox/glob.d.ts +4 -0
  496. package/dist/tools/builtins/sandbox/glob.js +104 -0
  497. package/dist/tools/builtins/sandbox/grep.d.ts +9 -0
  498. package/dist/tools/builtins/sandbox/grep.js +133 -0
  499. package/dist/tools/builtins/sandbox/index.d.ts +12 -0
  500. package/dist/tools/builtins/sandbox/index.js +27 -0
  501. package/dist/tools/builtins/sandbox/names.d.ts +7 -0
  502. package/dist/tools/builtins/sandbox/names.js +20 -0
  503. package/dist/tools/builtins/sandbox/read.d.ts +8 -0
  504. package/dist/tools/builtins/sandbox/read.js +121 -0
  505. package/dist/tools/builtins/sandbox/write.d.ts +4 -0
  506. package/dist/tools/builtins/sandbox/write.js +88 -0
  507. package/dist/tools/builtins/skill-load.d.ts +53 -0
  508. package/dist/tools/builtins/skill-load.js +446 -0
  509. package/dist/tools/builtins/skill-write.d.ts +59 -0
  510. package/dist/tools/builtins/skill-write.js +244 -0
  511. package/dist/tools/builtins/tool-search.d.ts +31 -0
  512. package/dist/tools/builtins/tool-search.js +171 -0
  513. package/dist/tools/connector-content.controller.d.ts +34 -0
  514. package/dist/tools/connector-content.controller.js +78 -0
  515. package/dist/tools/connector-content.d.ts +104 -0
  516. package/dist/tools/connector-content.js +267 -0
  517. package/dist/tools/connectors.controller.d.ts +210 -0
  518. package/dist/tools/connectors.controller.js +234 -0
  519. package/dist/tools/connectors.service.d.ts +303 -0
  520. package/dist/tools/connectors.service.js +1102 -0
  521. package/dist/tools/credentials.d.ts +139 -0
  522. package/dist/tools/credentials.js +351 -0
  523. package/dist/tools/drift.d.ts +141 -0
  524. package/dist/tools/drift.js +539 -0
  525. package/dist/tools/elicitation.d.ts +81 -0
  526. package/dist/tools/elicitation.js +266 -0
  527. package/dist/tools/endpoint.d.ts +18 -0
  528. package/dist/tools/endpoint.js +115 -0
  529. package/dist/tools/info.d.ts +67 -0
  530. package/dist/tools/info.js +113 -0
  531. package/dist/tools/naming.d.ts +27 -0
  532. package/dist/tools/naming.js +47 -0
  533. package/dist/tools/oauth/discovery.d.ts +65 -0
  534. package/dist/tools/oauth/discovery.js +307 -0
  535. package/dist/tools/oauth/flow.d.ts +63 -0
  536. package/dist/tools/oauth/flow.js +237 -0
  537. package/dist/tools/oauth/oauth.controller.d.ts +31 -0
  538. package/dist/tools/oauth/oauth.controller.js +95 -0
  539. package/dist/tools/oauth/tokens.d.ts +111 -0
  540. package/dist/tools/oauth/tokens.js +258 -0
  541. package/dist/tools/outputs.d.ts +61 -0
  542. package/dist/tools/outputs.js +156 -0
  543. package/dist/tools/pipeline.d.ts +322 -0
  544. package/dist/tools/pipeline.js +1236 -0
  545. package/dist/tools/policy.d.ts +60 -0
  546. package/dist/tools/policy.js +236 -0
  547. package/dist/tools/questions.controller.d.ts +24 -0
  548. package/dist/tools/questions.controller.js +58 -0
  549. package/dist/tools/questions.service.d.ts +103 -0
  550. package/dist/tools/questions.service.js +295 -0
  551. package/dist/tools/redact.d.ts +20 -0
  552. package/dist/tools/redact.js +60 -0
  553. package/dist/tools/registry.d.ts +246 -0
  554. package/dist/tools/registry.js +481 -0
  555. package/dist/tools/resources.d.ts +16 -0
  556. package/dist/tools/resources.js +76 -0
  557. package/dist/tools/specs.d.ts +14 -0
  558. package/dist/tools/specs.js +31 -0
  559. package/dist/tools/validate.d.ts +20 -0
  560. package/dist/tools/validate.js +183 -0
  561. package/dist/tools/view.d.ts +43 -0
  562. package/dist/tools/view.js +225 -0
  563. package/dist/ui/embed-token.d.ts +31 -0
  564. package/dist/ui/embed-token.js +132 -0
  565. package/dist/ui/registry.d.ts +58 -0
  566. package/dist/ui/registry.js +90 -0
  567. package/dist/ui/ui-stream.d.ts +37 -0
  568. package/dist/ui/ui-stream.js +162 -0
  569. package/dist/ui/views.controller.d.ts +81 -0
  570. package/dist/ui/views.controller.js +261 -0
  571. package/dist/ui/views.d.ts +155 -0
  572. package/dist/ui/views.js +306 -0
  573. package/dist/version.d.ts +5 -0
  574. package/dist/version.js +6 -0
  575. package/package.json +69 -3
  576. package/src/migrations/0001_init.sql +8 -0
  577. package/src/migrations/0002_secrets.sql +8 -0
  578. package/src/migrations/0003_identity.sql +117 -0
  579. package/src/migrations/0004_plugin_org_config_nullable.sql +3 -0
  580. package/src/migrations/0005_agents.sql +27 -0
  581. package/src/migrations/0006_conversations.sql +37 -0
  582. package/src/migrations/0007_checkpoints.sql +26 -0
  583. package/src/migrations/0008_runs_trigger_seq.sql +3 -0
  584. package/src/migrations/0009_runs_active_unique.sql +4 -0
  585. package/src/migrations/0010_tools.sql +125 -0
  586. package/src/migrations/0011_approvals_spec.sql +10 -0
  587. package/src/migrations/0012_run_waits.sql +24 -0
  588. package/src/migrations/0013_app_tools_source.sql +4 -0
  589. package/src/migrations/0014_tool_specs.sql +8 -0
  590. package/src/migrations/0015_tool_drift.sql +20 -0
  591. package/src/migrations/0016_plugin_permissions.sql +11 -0
  592. package/src/migrations/0017_identity_sources.sql +6 -0
  593. package/src/migrations/0018_channels.sql +74 -0
  594. package/src/migrations/0019_identity_trust.sql +17 -0
  595. package/src/migrations/0020_channel_card_lookup.sql +10 -0
  596. package/src/migrations/0021_org_storage_purge.sql +9 -0
  597. package/src/migrations/0022_attachments.sql +29 -0
  598. package/src/migrations/0023_sandboxes.sql +37 -0
  599. package/src/migrations/0024_skills.sql +46 -0
  600. package/src/migrations/0025_skills_catalog_idx.sql +6 -0
  601. package/src/migrations/0026_skill_changes.sql +34 -0
  602. package/src/migrations/0027_model_prices.sql +18 -0
  603. package/src/migrations/0028_evals.sql +105 -0
  604. package/src/migrations/0029_model_purposes.sql +18 -0
  605. package/src/migrations/0030_plugin_installs.sql +73 -0
  606. package/src/migrations/0031_plugin_snapshot_source.sql +6 -0
  607. package/src/migrations/0032_plugin_deployment_configs.sql +10 -0
  608. package/src/migrations/0033_rename_apps_to_connectors.sql +25 -0
  609. package/src/migrations/0034_directory.sql +49 -0
  610. package/src/migrations/0035_catalogs.sql +40 -0
  611. package/src/migrations/0036_app_import_staging.sql +17 -0
  612. package/src/migrations/0037_directory_installs.sql +92 -0
  613. package/src/migrations/0038_channel_inbound_mode.sql +6 -0
  614. package/src/migrations/0039_channel_card_pending.sql +8 -0
  615. package/src/migrations/0040_usage_report_sweep.sql +10 -0
  616. package/src/migrations/0041_rename_plugins_to_extensions.sql +38 -0
  617. package/src/migrations/0042_rename_directory_to_catalog.sql +80 -0
  618. package/src/migrations/0043_rename_app_installs_to_plugin_installs.sql +20 -0
  619. package/src/migrations/0044_catalog_one_kind.sql +90 -0
  620. package/src/migrations/0045_plugin_dependencies.sql +9 -0
  621. package/src/migrations/0046_git_sources.sql +25 -0
  622. package/src/migrations/0047_marketplace_entry_heads.sql +7 -0
  623. package/src/migrations/0048_marketplace_entry_trees.sql +8 -0
  624. package/src/migrations/0049_plugin_upgrades.sql +37 -0
  625. package/src/migrations/0050_bootstrap.sql +53 -0
  626. package/src/migrations/0051_claude_compat.sql +26 -0
  627. package/src/migrations/0052_conversations_account_agent_idx.sql +5 -0
  628. package/src/migrations/0053_subagents.sql +73 -0
  629. package/src/migrations/0054_subagent_wait_expiry.sql +7 -0
  630. package/src/migrations/0055_subagent_parent_indexes.sql +10 -0
  631. package/src/migrations/0056_approval_reason.sql +3 -0
  632. package/src/migrations/0057_conversation_titles.sql +11 -0
  633. package/src/migrations/0058_conversation_selection.sql +4 -0
  634. package/src/migrations/0059_conversation_queue.sql +22 -0
  635. package/src/migrations/0060_file_previewers.sql +10 -0
  636. package/src/migrations/0061_queue_selection.sql +5 -0
  637. package/src/migrations/0062_queued_skill.sql +8 -0
@@ -0,0 +1,520 @@
1
+ import { EXTENSION_POINTS, parseExtensionPoint, } from "@capybara-hq/plugin-sdk";
2
+ import { assertItemInstallable, assertPluginSourcesInstallable, disabledPluginItems, pluginItemDisabled, } from "../catalog/requests.service.js";
3
+ import { changedPaths, configFields, getPath, secretValues } from "../config/fields.js";
4
+ import { createSecrets } from "../ctx/secrets.js";
5
+ import { ApiError } from "../errors.js";
6
+ import { audit } from "../identity/audit.js";
7
+ import { lockOrgAndAuthorize } from "../orgs/org-lock.js";
8
+ import { configToJsonSchema } from "./config-json-schema.js";
9
+ import { enabledExtensionsQuery, requiredExtensions } from "./enabled.js";
10
+ import { permissionGroups } from "./permission-view.js";
11
+ /** 内核自己的 secrets 命名空间(plugin-sdk 把 `kernel` 列为保留插件名,插件不会与之相撞)。 */
12
+ const SECRETS_NAMESPACE = "kernel";
13
+ const secretKey = (plugin, path) => `plugin-config:${plugin}:${path}`;
14
+ /** 清单不可变:每个组织级 schema 的 JSON Schema 转换结果按 schema 对象缓存(只读、无跨请求状态)。 */
15
+ const jsonSchemaCache = new WeakMap();
16
+ function orgJsonSchema(schema) {
17
+ let js = jsonSchemaCache.get(schema);
18
+ if (!js) {
19
+ js = configToJsonSchema(schema);
20
+ jsonSchemaCache.set(schema, js);
21
+ }
22
+ return structuredClone(js);
23
+ }
24
+ const isObj = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
25
+ /** 按点路径设值,缺失的中间对象自动创建;中间节点不是对象时放弃(交给 schema 校验报错)。 */
26
+ function setDeep(obj, path, value) {
27
+ const segs = path.split(".");
28
+ let node = obj;
29
+ for (const seg of segs.slice(0, -1)) {
30
+ const next = node[seg];
31
+ if (next === undefined)
32
+ node[seg] = {};
33
+ else if (!isObj(next))
34
+ return;
35
+ node = node[seg];
36
+ }
37
+ node[segs[segs.length - 1]] = value;
38
+ }
39
+ /** 按点路径删除键(路径不存在时无操作)。 */
40
+ function deleteDeep(obj, path) {
41
+ const segs = path.split(".");
42
+ let node = obj;
43
+ for (const seg of segs.slice(0, -1)) {
44
+ if (!isObj(node))
45
+ return;
46
+ node = node[seg];
47
+ }
48
+ if (isObj(node))
49
+ delete node[segs[segs.length - 1]];
50
+ }
51
+ /** 由 issue 类型与结构字段生成说明;不用 zod 的 message(自定义消息可能拼入输入值)。 */
52
+ function issueMessage(i) {
53
+ switch (i.code) {
54
+ case "invalid_type":
55
+ return `expected ${i.expected}`;
56
+ case "too_small":
57
+ return `too small (minimum ${String(i.minimum)})`;
58
+ case "too_big":
59
+ return `too big (maximum ${String(i.maximum)})`;
60
+ case "invalid_format":
61
+ return `invalid ${i.format}`;
62
+ case "not_multiple_of":
63
+ return `not a multiple of ${String(i.divisor)}`;
64
+ case "unrecognized_keys":
65
+ return "unrecognized keys";
66
+ case "invalid_union":
67
+ return "no union member matched";
68
+ case "invalid_key":
69
+ return "invalid key";
70
+ case "invalid_element":
71
+ return "invalid element";
72
+ default:
73
+ return "invalid value";
74
+ }
75
+ }
76
+ export function toIssues(error) {
77
+ return error.issues.map((i) => ({
78
+ path: i.path.map(String).join("."),
79
+ message: issueMessage(i),
80
+ }));
81
+ }
82
+ /** 插件组织级 schema 中标记 secret 的叶子点路径(对象路径之外的 secret 已在插件加载时拒绝)。 */
83
+ function secretPaths(schema) {
84
+ return configFields(schema)
85
+ .filter((f) => f.meta?.secret)
86
+ .map((f) => f.path);
87
+ }
88
+ /**
89
+ * Org-level extension config: enablement and the `config.org` config stored per org.
90
+ * The non-secret part is stored in `capybara.extension_org_configs.config`; each secret field is
91
+ * encrypted separately in `capybara.secrets` (namespace `kernel`, key `plugin-config:<plugin>:<path>`),
92
+ * written in the same transaction as the config row.
93
+ * No in-process state: every call reads PG, safe with multiple replicas.
94
+ */
95
+ export class OrgExtensionConfigs {
96
+ db;
97
+ keyring;
98
+ host;
99
+ hooks;
100
+ constructor(db, keyring, host, hooks = {}) {
101
+ this.db = db;
102
+ this.keyring = keyring;
103
+ this.host = host;
104
+ this.hooks = hooks;
105
+ }
106
+ /** 把一份组织配置里的密钥值交给 onSecrets(无回调或无密钥时无操作);调用方须在事务提交后调用。 */
107
+ reportSecrets(found) {
108
+ if (!found || !this.hooks.onSecrets)
109
+ return;
110
+ const values = secretValues(found.schema, found.config);
111
+ if (values.length > 0)
112
+ this.hooks.onSecrets(values);
113
+ }
114
+ /** `REPEATABLE READ` 只读事务:配置行与密钥来自同一个快照,不会读到跨两次提交的混合状态。 */
115
+ snapshot(fn) {
116
+ return this.db
117
+ .transaction()
118
+ .setIsolationLevel("repeatable read")
119
+ .setAccessMode("read only")
120
+ .execute(fn);
121
+ }
122
+ /**
123
+ * 列出所有已加载插件在该组织下的状态(按加载顺序);无记录时 enabled=false、config=null。
124
+ * 之后是已安装但此刻没加载的插件(部署上停用等),`available: false`,按名字排序。
125
+ */
126
+ async list(orgId) {
127
+ const installed = (await this.hooks.installed?.()) ?? [];
128
+ return this.snapshot(async (t) => {
129
+ const rows = await t
130
+ .selectFrom("extension_org_configs")
131
+ .select(["plugin", "enabled", "config"])
132
+ .where("org_id", "=", orgId)
133
+ .execute();
134
+ await this.hooks.afterConfigRowRead?.();
135
+ const setKeys = await this.setSecretKeys(t, orgId);
136
+ // Required bootstrap plugins are listed enabled (no org config row needed, spec §7)
137
+ const required = await requiredExtensions(t);
138
+ const loaded = this.host.manifests();
139
+ const views = loaded.map((m) => this.view(m, rows.find((r) => r.plugin === m.name), setKeys, required.has(m.name)));
140
+ const names = new Set(loaded.map((m) => m.name));
141
+ const unavailable = installed
142
+ .filter((i) => !names.has(i.name))
143
+ .sort((a, b) => a.name.localeCompare(b.name))
144
+ .map((i) => ({
145
+ plugin: i.name,
146
+ version: i.version,
147
+ enabled: required.has(i.name) || (rows.find((r) => r.plugin === i.name)?.enabled ?? false),
148
+ configurable: false,
149
+ config: null,
150
+ secrets: [],
151
+ permissions: [],
152
+ orgConfigSchema: null,
153
+ available: false,
154
+ required: required.has(i.name),
155
+ }));
156
+ return [...views, ...unavailable];
157
+ });
158
+ }
159
+ /**
160
+ * Writes enablement and / or config. The actor's role is re-read under the org row lock (needs
161
+ * `org.extensions.manage`).
162
+ * - Extension not loaded -> `extension.not_found`; `config` given but the extension has no
163
+ * `config.org` -> `extension.no_org_config`; `enabled: false` for a required bootstrap plugin
164
+ * -> `extension.required` (it stays enabled in every org; its config can still be written).
165
+ * - Non-secret fields are replaced as a whole by the given value; secret fields keep the old value
166
+ * when omitted, `null` clears, any other value is the new value.
167
+ * - The merged full config (or, without `config`, the existing config when the result is enabled)
168
+ * does not satisfy the schema -> `extension.config_invalid`.
169
+ */
170
+ async put(orgId, plugin, input, actorAccountId, actorTokenId, opts = {}) {
171
+ const manifest = this.manifest(plugin);
172
+ const schema = manifest.config?.org;
173
+ if (input.config !== undefined && !schema) {
174
+ throw new ApiError("extension.no_org_config", `Extension ${plugin} has no organization config`);
175
+ }
176
+ let seen;
177
+ const view = await this.db.transaction().execute(async (t) => {
178
+ await lockOrgAndAuthorize(t, orgId, actorAccountId, "org.extensions.manage");
179
+ const row = await t
180
+ .selectFrom("extension_org_configs")
181
+ .select(["enabled", "config"])
182
+ .where("plugin", "=", plugin)
183
+ .where("org_id", "=", orgId)
184
+ .executeTakeFirst();
185
+ const required = (await requiredExtensions(t)).has(plugin);
186
+ if (required && input.enabled === false)
187
+ throw requiredError(plugin);
188
+ if (opts.ifDisabled && (row?.enabled === true || required)) {
189
+ opts.ifDisabled.skipped = true;
190
+ await opts.inTransaction?.(t, true);
191
+ return this.view(manifest, row, await this.setSecretKeys(t, orgId), required);
192
+ }
193
+ // A required plugin is enabled whatever the row said (it may predate `required`)
194
+ const enabled = required || (input.enabled ?? row?.enabled ?? false);
195
+ // 新启用来自企业目录的插件:按条目策略与授予复核(C22;已启用的不受影响)
196
+ if (input.enabled === true && row?.enabled !== true && !required) {
197
+ // 插件自己的条目 disabled 是总开关,任何途径都不能新启用(裁决 M-5)
198
+ const killed = await disabledPluginItems(t, [plugin]);
199
+ if (killed.length > 0)
200
+ throw pluginItemDisabled(killed);
201
+ // 经某个条目安装:只看该条目(应用里的插件按应用条目,C22);直接启用:全部来源里最严格的生效
202
+ if (opts.viaItem !== undefined) {
203
+ await assertItemInstallable(t, orgId, opts.viaItem, opts.approvedBy ?? opts.viaItem);
204
+ }
205
+ else
206
+ await assertPluginSourcesInstallable(t, orgId, plugin);
207
+ }
208
+ if (input.enabled === true)
209
+ await this.assertDependenciesEnabled(t, orgId, manifest);
210
+ else if (input.enabled === false && !input.force) {
211
+ await this.assertNoEnabledDependents(t, orgId, manifest);
212
+ }
213
+ let plain = row?.config ?? null;
214
+ let changed = [];
215
+ if (schema) {
216
+ const secrets = createSecrets(t, this.keyring, SECRETS_NAMESPACE);
217
+ const paths = secretPaths(schema);
218
+ const before = structuredClone(plain ?? {});
219
+ for (const p of paths) {
220
+ const v = await secrets.get(orgId, secretKey(plugin, p));
221
+ if (v !== null)
222
+ setDeep(before, p, JSON.parse(v));
223
+ }
224
+ let next;
225
+ if (input.config !== undefined) {
226
+ next = structuredClone(input.config);
227
+ for (const p of paths) {
228
+ const v = getPath(input.config, p);
229
+ if (v === null)
230
+ deleteDeep(next, p);
231
+ else if (v === undefined) {
232
+ const old = getPath(before, p);
233
+ if (old !== undefined)
234
+ setDeep(next, p, old);
235
+ }
236
+ }
237
+ }
238
+ else {
239
+ next = before;
240
+ }
241
+ if (input.config !== undefined || enabled) {
242
+ const r = schema.safeParse(next);
243
+ if (!r.success) {
244
+ throw new ApiError("extension.config_invalid", `Invalid organization config for extension ${plugin}`, toIssues(r.error));
245
+ }
246
+ next = r.data;
247
+ }
248
+ seen = { schema, config: next };
249
+ if (input.config !== undefined) {
250
+ changed = changedPaths(schema, before, next);
251
+ plain = structuredClone(next);
252
+ for (const p of paths) {
253
+ const v = getPath(next, p);
254
+ deleteDeep(plain, p);
255
+ if (v === undefined)
256
+ await secrets.delete(orgId, secretKey(plugin, p));
257
+ else
258
+ await secrets.set(orgId, secretKey(plugin, p), JSON.stringify(v));
259
+ }
260
+ }
261
+ }
262
+ // 当前 schema 中已不存在的密钥路径:同一事务内清掉遗留的密文行
263
+ const live = new Set((schema ? secretPaths(schema) : []).map((p) => secretKey(plugin, p)));
264
+ const prefix = secretKey(plugin, "");
265
+ const cleanup = createSecrets(t, this.keyring, SECRETS_NAMESPACE);
266
+ for (const key of await this.setSecretKeys(t, orgId)) {
267
+ if (key.startsWith(prefix) && !live.has(key))
268
+ await cleanup.delete(orgId, key);
269
+ }
270
+ await t
271
+ .insertInto("extension_org_configs")
272
+ .values({
273
+ plugin,
274
+ org_id: orgId,
275
+ enabled,
276
+ config: plain === null ? null : JSON.stringify(plain),
277
+ updated_by: actorAccountId,
278
+ })
279
+ .onConflict((oc) => oc.columns(["plugin", "org_id"]).doUpdateSet({
280
+ enabled,
281
+ config: plain === null ? null : JSON.stringify(plain),
282
+ updated_by: actorAccountId,
283
+ updated_at: new Date(),
284
+ }))
285
+ .execute();
286
+ await audit(t, {
287
+ actorAccountId,
288
+ ...(actorTokenId !== undefined && { actorTokenId }),
289
+ orgId,
290
+ action: "org.plugin_config.updated",
291
+ target: plugin,
292
+ detail: {
293
+ enabled,
294
+ changedPaths: changed,
295
+ ...(opts.viaItem !== undefined && { catalogItemId: opts.viaItem }),
296
+ },
297
+ });
298
+ await opts.inTransaction?.(t, false);
299
+ // 在同一事务里读回,返回值就是刚提交的状态
300
+ const saved = await t
301
+ .selectFrom("extension_org_configs")
302
+ .select(["plugin", "enabled", "config"])
303
+ .where("plugin", "=", plugin)
304
+ .where("org_id", "=", orgId)
305
+ .executeTakeFirst();
306
+ return this.view(manifest, saved, await this.setSecretKeys(t, orgId), required);
307
+ });
308
+ // 事务已提交:回滚的写入不会走到这里
309
+ this.reportSecrets(seen);
310
+ await this.hooks.afterPut?.(orgId, plugin, view.enabled);
311
+ return view;
312
+ }
313
+ /**
314
+ * 读取并解密某插件在该组织下的完整配置(供运行时按组织构造插件实例)。
315
+ * A required bootstrap plugin is enabled without a row (its stored config, or `{}`, is validated).
316
+ * 无记录 → undefined;插件无 `config.org` 或已停用(`enabled=false`,不校验、不读密钥)时 `config` 为 null。
317
+ * 配置行与密钥在同一个 `REPEATABLE READ` 只读事务里读取。
318
+ * 已存配置不再满足 schema(如插件升级后)→ 抛 Error,信息含插件名、组织 ID 与出错路径(不含值)。
319
+ */
320
+ async get(orgId, plugin) {
321
+ const manifest = this.manifest(plugin);
322
+ const result = await this.snapshot(async (t) => {
323
+ const row = await t
324
+ .selectFrom("extension_org_configs")
325
+ .select(["enabled", "config"])
326
+ .where("plugin", "=", plugin)
327
+ .where("org_id", "=", orgId)
328
+ .executeTakeFirst();
329
+ await this.hooks.afterConfigRowRead?.();
330
+ const required = (await requiredExtensions(t)).has(plugin);
331
+ if (!row && !required)
332
+ return undefined;
333
+ const enabled = required || row?.enabled === true;
334
+ const schema = manifest.config?.org;
335
+ // 已停用的插件不会被实例化:不校验(可能是升级前存下的旧配置),也不解密密钥
336
+ if (!schema || !enabled)
337
+ return { enabled, config: null };
338
+ return this.decode(t, orgId, plugin, schema, row?.config ?? {});
339
+ });
340
+ // 只读快照已结束;config 非 null 意味着插件有 org schema 且已解密
341
+ const schema = manifest.config?.org;
342
+ if (schema && result?.config != null)
343
+ this.reportSecrets({ schema, config: result.config });
344
+ return result;
345
+ }
346
+ async decode(t, orgId, plugin, schema, stored) {
347
+ const full = structuredClone(stored);
348
+ const secrets = createSecrets(t, this.keyring, SECRETS_NAMESPACE);
349
+ for (const p of secretPaths(schema)) {
350
+ const v = await secrets.get(orgId, secretKey(plugin, p));
351
+ if (v !== null)
352
+ setDeep(full, p, JSON.parse(v));
353
+ }
354
+ const r = schema.safeParse(full);
355
+ if (!r.success) {
356
+ const detail = toIssues(r.error)
357
+ .map((i) => `${i.path || "<root>"}: ${i.message}`)
358
+ .join("; ");
359
+ throw new Error(`plugin ${plugin}: stored organization config for org ${orgId} is invalid: ${detail}`);
360
+ }
361
+ return { enabled: true, config: r.data };
362
+ }
363
+ /**
364
+ * 该组织里已启用、且所 requires 的按组织启用的能力只剩这个插件提供的插件(停用它会让它们失去依赖)。
365
+ * 在调用方事务里读(应用卸载 / 回滚前判断是否保留)。
366
+ */
367
+ async enabledDependents(t, orgId, plugin) {
368
+ const manifest = this.host.manifests().find((m) => m.name === plugin);
369
+ if (!manifest)
370
+ return [];
371
+ const provided = manifest.provides.filter((r) => this.isOrgScoped(r));
372
+ if (provided.length === 0)
373
+ return [];
374
+ const enabled = await this.enabledSet(t, orgId);
375
+ if (!enabled.has(plugin))
376
+ return [];
377
+ const out = new Set();
378
+ for (const ref of provided) {
379
+ if (this.enabledProviders(enabled, ref, plugin).length > 0)
380
+ continue;
381
+ for (const m of this.host.manifests()) {
382
+ if (m.name === plugin || !enabled.has(m.name))
383
+ continue;
384
+ if ((m.requires ?? []).includes(ref))
385
+ out.add(m.name);
386
+ }
387
+ }
388
+ return [...out].sort();
389
+ }
390
+ /**
391
+ * 在调用方事务里停用(应用安装的回滚与卸载用;调用方已锁组织行并复核角色):不检查依赖方,配置保留,
392
+ * 审计 `org.plugin_config.updated`(带 reason)。提交后调用方须再调 {@link afterDisable}。
393
+ */
394
+ async disableIn(t, orgId, plugin, actorAccountId, reason) {
395
+ // A required bootstrap plugin stays enabled in every org
396
+ if ((await requiredExtensions(t)).has(plugin))
397
+ return false;
398
+ const r = await t
399
+ .updateTable("extension_org_configs")
400
+ .set({ enabled: false, updated_by: actorAccountId, updated_at: new Date() })
401
+ .where("plugin", "=", plugin)
402
+ .where("org_id", "=", orgId)
403
+ .where("enabled", "=", true)
404
+ .returning("plugin")
405
+ .executeTakeFirst();
406
+ if (!r)
407
+ return false;
408
+ await audit(t, {
409
+ actorAccountId,
410
+ orgId,
411
+ action: "org.plugin_config.updated",
412
+ target: plugin,
413
+ detail: { enabled: false, changedPaths: [], reason },
414
+ });
415
+ return true;
416
+ }
417
+ /** {@link disableIn} 的事务提交之后:通知停用(断开该插件的渠道连接等)。 */
418
+ async afterDisable(orgId, plugin) {
419
+ await this.hooks.afterPut?.(orgId, plugin, false);
420
+ }
421
+ /** 该组织已启用的插件名(只含当前已加载的插件;待批准的不算;必需的引导插件始终算启用)。 */
422
+ async enabledSet(t, orgId) {
423
+ const rows = await enabledExtensionsQuery(t, orgId).execute();
424
+ const loaded = new Set(this.host.manifests().map((m) => m.name));
425
+ return new Set(rows.map((r) => r.plugin).filter((n) => loaded.has(n)));
426
+ }
427
+ /** 引用是否为按组织启用的能力。 */
428
+ isOrgScoped(ref) {
429
+ return EXTENSION_POINTS[parseExtensionPoint(ref).name]?.orgScoped === true;
430
+ }
431
+ /** 该组织内(已启用、已加载、非 `except`)提供完整引用(含主版本)的插件。 */
432
+ enabledProviders(enabled, ref, except) {
433
+ return this.host
434
+ .manifests()
435
+ .filter((m) => m.name !== except && enabled.has(m.name) && m.provides.includes(ref))
436
+ .map((m) => m.name);
437
+ }
438
+ /** 启用前:A `requires` 的每个 orgScoped 能力(按主版本),该组织须至少有一个已启用的提供方。 */
439
+ async assertDependenciesEnabled(t, orgId, manifest) {
440
+ const needed = (manifest.requires ?? []).filter((r) => this.isOrgScoped(r));
441
+ if (needed.length === 0)
442
+ return;
443
+ const enabled = await this.enabledSet(t, orgId);
444
+ const missing = needed.filter((r) => this.enabledProviders(enabled, r, manifest.name).length === 0);
445
+ if (missing.length > 0) {
446
+ throw new ApiError("extension.dependency_missing", `Extension ${manifest.name} requires extension points with no enabled provider in this organization: ${missing.join(", ")}`, missing.map((extensionPoint) => ({ extensionPoint })));
447
+ }
448
+ }
449
+ /** 停用前:若停用后某个已启用的插件所 requires 的 orgScoped 能力(按主版本)再无已启用的提供方,拒绝。 */
450
+ async assertNoEnabledDependents(t, orgId, manifest) {
451
+ const provided = manifest.provides.filter((r) => this.isOrgScoped(r));
452
+ if (provided.length === 0)
453
+ return;
454
+ const enabled = await this.enabledSet(t, orgId);
455
+ if (!enabled.has(manifest.name))
456
+ return;
457
+ const dependents = new Map();
458
+ for (const ref of provided) {
459
+ if (this.enabledProviders(enabled, ref, manifest.name).length > 0)
460
+ continue;
461
+ for (const m of this.host.manifests()) {
462
+ if (m.name === manifest.name || !enabled.has(m.name))
463
+ continue;
464
+ if ((m.requires ?? []).includes(ref)) {
465
+ dependents.set(`${m.name}\0${ref}`, { plugin: m.name, extensionPoint: ref });
466
+ }
467
+ }
468
+ }
469
+ if (dependents.size > 0) {
470
+ const list = [...dependents.values()];
471
+ throw new ApiError("extension.has_dependents", `Extension ${manifest.name} is required by enabled extensions in this organization: ${[...new Set(list.map((d) => d.plugin))].join(", ")} (pass force to disable anyway)`, list);
472
+ }
473
+ }
474
+ manifest(plugin) {
475
+ const m = this.host.manifests().find((x) => x.name === plugin);
476
+ if (!m)
477
+ throw new ApiError("extension.not_found", `Extension ${plugin} is not installed`);
478
+ return m;
479
+ }
480
+ permissionsOf(plugin) {
481
+ const set = this.host.permissionSet(plugin);
482
+ if (!set)
483
+ throw new ApiError("extension.not_found", `Extension ${plugin} is not installed`);
484
+ return set;
485
+ }
486
+ view(m, row, setKeys, required) {
487
+ const schema = m.config?.org;
488
+ const paths = schema ? secretPaths(schema) : [];
489
+ let config = null;
490
+ if (schema && row?.config) {
491
+ config = structuredClone(row.config);
492
+ for (const p of paths)
493
+ deleteDeep(config, p);
494
+ }
495
+ return {
496
+ plugin: m.name,
497
+ version: m.version,
498
+ enabled: required || (row?.enabled ?? false),
499
+ configurable: schema !== undefined,
500
+ config,
501
+ secrets: paths.map((p) => ({ path: p, set: setKeys.has(secretKey(m.name, p)) })),
502
+ permissions: permissionGroups(this.permissionsOf(m.name)),
503
+ orgConfigSchema: schema ? orgJsonSchema(schema) : null,
504
+ available: true,
505
+ required,
506
+ };
507
+ }
508
+ /** 该组织在 `kernel` 命名空间下已设置的插件配置密钥键(不解密)。 */
509
+ async setSecretKeys(db, orgId) {
510
+ const rows = await db
511
+ .selectFrom("secrets")
512
+ .select("key")
513
+ .where("namespace", "=", SECRETS_NAMESPACE)
514
+ .where("org_id", "=", orgId)
515
+ .where("key", "like", "plugin-config:%")
516
+ .execute();
517
+ return new Set(rows.map((r) => r.key));
518
+ }
519
+ }
520
+ const requiredError = (plugin) => new ApiError("extension.required", `Extension ${plugin} is required by this deployment (a bootstrap plugin): it is enabled in every organization and cannot be disabled`);
@@ -0,0 +1,115 @@
1
+ import { type PluginExtensionSection } from "@capybara-hq/plugin-sdk";
2
+ import { ApiError } from "../errors.js";
3
+ import { HOST_ZOD_VERSION, type PackageTgzLimits } from "../packages/tgz.js";
4
+ import { type PermissionSet } from "./permission-set.js";
5
+ /**
6
+ * Reading and validating an extension package: a plugin tgz (`readPluginPackage`,
7
+ * `catalog/plugin-package.ts`: unpacking by the rules of `packages/tgz.ts`, plugin.json, the
8
+ * package.json rules of plugin-sdk `validatePluginPackageJsonFor`, the pre-0.1.0 format rejected)
9
+ * with an `extension` section. On top of the plugin rules:
10
+ *
11
+ * - import 白名单:用 es-module-lexer(2.3.2,固定版本)静态分析 entry 及其包内相对 import 到的模块:
12
+ * 静态 import / `export ... from` / 字面量动态 `import()` 只许 `node:*`、宿主两包(含子路径)与包内相对路径;
13
+ * **非字面量的动态 `import()` 拒绝**。相对路径解析后必须仍在包内、指向包里存在的 `.mjs` / `.js`,并同样被扫描。
14
+ * - `require`:ESM 里没有 `require` 绑定,bundle 只能经 `node:module` 的 `createRequire` 得到它(打包工具的横幅
15
+ * 就是这样给打进来的 CJS 依赖用的)。这里**不**静态分析 `require(...)`:一是 bundle 里大量 `require("x")`
16
+ * 字样出现在字符串 / 代码生成模板里(实测 connector-mcp 里 ajv 的模板、object-store-s3 的报错文案),正则必然误报,
17
+ * 为此在安装路径上引入完整 JS 解析器不值得;二是插件本来就以批准过的代码在进程内运行(权限是治理而非沙箱),
18
+ * 拦 `require` 拦不住 `process.getBuiltinModule`。打包工具在构建时已保证 require 只指向 `node:*` 与宿主包
19
+ * (其余全部打进 bundle);插件目录不在宿主 `node_modules` 的上游路径里,漏打的 `require("x")` 加载时找不到,
20
+ * 安装记录转为 failed。
21
+ */
22
+ /** Limits on unpacking an extension package (the shared tgz limits). */
23
+ export declare const EXTENSION_PACKAGE_LIMITS: {
24
+ readonly maxUnpackedBytes: number;
25
+ readonly maxEntries: 5000;
26
+ readonly maxPackageJsonBytes: number;
27
+ };
28
+ export { HOST_ZOD_VERSION };
29
+ /** Unpack limits: `maxBytes` is `packages.maxBytes`; the rest default to {@link EXTENSION_PACKAGE_LIMITS}. */
30
+ export type ExtensionPackageLimits = PackageTgzLimits;
31
+ /**
32
+ * Codes of {@link ExtensionPackageError}: an invalid package, a tgz in the pre-0.1.0 format, or a
33
+ * plugin without an extension (nothing to install on the deployment).
34
+ */
35
+ export type ExtensionPackageErrorCode = "extension.package_invalid" | "extension.legacy_format" | "extension.no_extension";
36
+ /** The extension package is invalid; `issues` lists the problems (English, shown to the admin). */
37
+ export declare class ExtensionPackageError extends Error {
38
+ readonly code: ExtensionPackageErrorCode;
39
+ readonly issues: string[];
40
+ constructor(issues: string[], code?: ExtensionPackageErrorCode);
41
+ }
42
+ /** The API error for an {@link ExtensionPackageError} (its code, message and issues as details). */
43
+ export declare function extensionPackageApiError(e: ExtensionPackageError): ApiError;
44
+ /**
45
+ * The extension of a read package: the plugin's {@link PluginExtensionSection} (paths start with
46
+ * `./`; resolve them with {@link packagePath}) plus the plugin's name and version.
47
+ */
48
+ export type ExtensionPackageSection = PluginExtensionSection & {
49
+ name: string;
50
+ version: string;
51
+ };
52
+ /** A read and validated extension package. Paths are relative to the package root (no `package/`). */
53
+ export interface ExtensionPackage {
54
+ /** Hex sha256 of the whole tgz. */
55
+ sha256: string;
56
+ /** tgz bytes. */
57
+ size: number;
58
+ packageJson: Record<string, unknown>;
59
+ section: ExtensionPackageSection;
60
+ files: {
61
+ path: string;
62
+ size: number;
63
+ }[];
64
+ /** Migration-named SQL directly in the `extension.migrations` directory, sorted by file name. */
65
+ migrationSql: {
66
+ file: string;
67
+ sql: string;
68
+ }[];
69
+ }
70
+ /** Options of {@link readExtensionPackage}; `hostZodVersion` defaults to {@link HOST_ZOD_VERSION}. */
71
+ export interface ReadExtensionPackageOptions extends ExtensionPackageLimits {
72
+ hostSdkVersion: string;
73
+ hostZodVersion?: string;
74
+ }
75
+ /**
76
+ * Reads and validates an extension package without running any code from it: a plugin tgz
77
+ * (`readPluginPackage`) with an `extension` section, whose entry's module graph passes the import
78
+ * rules (file header) and whose `extension.migrations` SQL is collected. Invalid ->
79
+ * {@link ExtensionPackageError} (listing every problem it can find; problems while unpacking stop
80
+ * at the first): `extension.legacy_format` for the pre-0.1.0 format, `extension.no_extension` for a
81
+ * plugin without an extension, otherwise `extension.package_invalid`.
82
+ */
83
+ export declare function readExtensionPackage(bytes: Uint8Array, opts: ReadExtensionPackageOptions): Promise<ExtensionPackage>;
84
+ /**
85
+ * The package's permission set from the static manifest and the migration SQL only (review runs no
86
+ * extension code), in the same shape as `computePermissionSet` on the real module (config fields
87
+ * keep only path / secret).
88
+ */
89
+ export declare function permissionSetOfPackage(p: ExtensionPackage): PermissionSet;
90
+ /**
91
+ * Same as {@link permissionSetOfPackage}, from the extension section and the migration SQL (the host
92
+ * uses it on the locally synced package for the permission gate without importing the module: no
93
+ * extension code, top-level code included, runs before approval).
94
+ */
95
+ export declare function permissionSetOfSection(section: Pick<PluginExtensionSection, "manifest">, migrationSql: {
96
+ file: string;
97
+ sql: string;
98
+ }[]): PermissionSet;
99
+ /**
100
+ * Reads the migration SQL in `extension.migrations` under the locally unpacked directory `root` (not
101
+ * recursive, only files with migration names, sorted by name), in the same shape as the
102
+ * `migrationSql` of {@link readExtensionPackage}; empty when no migrations are declared.
103
+ */
104
+ export declare function readMigrationSql(root: string, section: Pick<PluginExtensionSection, "migrations">): Promise<{
105
+ file: string;
106
+ sql: string;
107
+ }[]>;
108
+ /**
109
+ * Unpacks the package into `dir` (dropping the `package/` prefix). `dir` must not exist or be empty;
110
+ * the unpack rules and limits are the same as {@link readExtensionPackage} (paths, file types, entry
111
+ * count and unpacked size; pass the same `limits`, i.e. `packages.maxBytes`), and the package should
112
+ * have been validated with it first. Files 0644, directories 0755, written with `wx` (no overwrite,
113
+ * no following existing links).
114
+ */
115
+ export declare function extractExtensionPackage(bytes: Uint8Array, dir: string, limits: ExtensionPackageLimits): Promise<void>;