@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,394 @@
1
+ import { isDeepStrictEqual } from "node:util";
2
+ import { sql } from "kysely";
3
+ import { configFields, describeSchema, getPath, secretValues } from "../config/fields.js";
4
+ import { fieldSource } from "../config/sources.js";
5
+ import { createSecrets } from "../ctx/secrets.js";
6
+ import { ApiError } from "../errors.js";
7
+ import { audit } from "../identity/audit.js";
8
+ import { lockEnterpriseAdminsAndAuthorize } from "../identity/enterprise-admin.js";
9
+ import { configToJsonSchema } from "./config-json-schema.js";
10
+ import { toIssues } from "./org-config.js";
11
+ /** 部署级插件配置的密钥存在 `capybara.secrets` 的这个 org_id 下(不是真实组织;namespace `kernel`)。 */
12
+ export const DEPLOYMENT_SECRETS_ORG = "_deployment";
13
+ /** 内核自己的 secrets 命名空间(`kernel` 是保留插件名)。 */
14
+ const SECRETS_NAMESPACE = "kernel";
15
+ const SECRET_KEY_PREFIX = "plugin-deployment-config:";
16
+ const secretKey = (plugin, path) => `${SECRET_KEY_PREFIX}${plugin}:${path}`;
17
+ /**
18
+ * 部署配置保存之后(kernel bus 主题,频道 `cap:kernel:plugin-deployment-config`,payload `{ plugin }`):
19
+ * 各副本重读并校验——只改了 hot 字段就地替换,改了非 hot 字段重新加载实例,不合法保持当前值并告警;
20
+ * 插件此刻待配置时,下一次 reconcile 加载它。
21
+ */
22
+ export const PLUGIN_DEPLOYMENT_CONFIG_TOPIC = "plugin-deployment-config";
23
+ /** 由 zod schema 得出字段清单(`configFields`:对象路径上的叶子,secret 向下继承)。 */
24
+ export function schemaFields(schema) {
25
+ if (!schema)
26
+ return [];
27
+ return configFields(schema).map((f) => ({
28
+ path: f.path,
29
+ secret: f.meta?.secret === true,
30
+ hot: f.meta?.hot === true,
31
+ }));
32
+ }
33
+ const isObj = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
34
+ /** 按点路径设值,缺失的中间对象自动创建;中间节点不是对象时放弃。 */
35
+ function setDeep(obj, path, value) {
36
+ const segs = path.split(".");
37
+ let node = obj;
38
+ for (const seg of segs.slice(0, -1)) {
39
+ const next = node[seg];
40
+ if (next === undefined)
41
+ node[seg] = {};
42
+ else if (!isObj(next))
43
+ return;
44
+ node = node[seg];
45
+ }
46
+ node[segs[segs.length - 1]] = value;
47
+ }
48
+ /** 按点路径删除键;删完变空的中间对象一并删掉。 */
49
+ function deleteDeep(obj, path) {
50
+ const segs = path.split(".");
51
+ const chain = [obj];
52
+ let node = obj;
53
+ for (const seg of segs.slice(0, -1)) {
54
+ if (!isObj(node))
55
+ return;
56
+ node = node[seg];
57
+ if (!isObj(node))
58
+ return;
59
+ chain.push(node);
60
+ }
61
+ delete chain[chain.length - 1][segs[segs.length - 1]];
62
+ for (let i = chain.length - 1; i > 0; i--) {
63
+ if (Object.keys(chain[i]).length > 0)
64
+ break;
65
+ delete chain[i - 1][segs[i - 1]];
66
+ }
67
+ }
68
+ /** 叶子点路径(对象递归;其余都是叶子)。 */
69
+ function leafPaths(value, prefix = "", out = []) {
70
+ if (isObj(value)) {
71
+ for (const [k, v] of Object.entries(value))
72
+ leafPaths(v, prefix ? `${prefix}.${k}` : k, out);
73
+ }
74
+ else if (prefix !== "")
75
+ out.push(prefix);
76
+ return out;
77
+ }
78
+ /** 启动配置(文件 / 环境变量合并后的值)是否覆盖了这个字段:给了它、它下面的值,或在祖先上给了非对象值。 */
79
+ function coveredBy(fileValue, path) {
80
+ let node = fileValue;
81
+ for (const seg of path.split(".")) {
82
+ if (node === undefined)
83
+ return false;
84
+ if (!isObj(node))
85
+ return true;
86
+ node = node[seg];
87
+ }
88
+ return node !== undefined;
89
+ }
90
+ /**
91
+ * 合并一个插件的部署配置(C10 的优先级:环境变量 > 文件 / Nacos > PG > schema 默认值):以启动配置
92
+ * (`fileValue`,已含环境变量)为底,逐字段补上 PG 里保存、而启动配置没有覆盖的值。按字段合并:启动配置给了的字段
93
+ * 整个以它为准(不与 PG 的值深合并)。`fields` 为字段点路径(没有 schema 时用 PG 值的叶子路径)。默认值由校验补上。
94
+ */
95
+ export function mergeDeploymentConfig(stored, fileValue, fields = leafPaths(stored)) {
96
+ if (fileValue !== undefined && !isObj(fileValue))
97
+ return fileValue;
98
+ const out = structuredClone(fileValue ?? {});
99
+ for (const path of fields) {
100
+ const v = getPath(stored, path);
101
+ if (v === undefined || coveredBy(fileValue, path))
102
+ continue;
103
+ setDeep(out, path, structuredClone(v));
104
+ }
105
+ return out;
106
+ }
107
+ /**
108
+ * PG 里一个插件保存的部署配置(非密钥字段 + 解密的密钥字段,按点路径放回对象)。只并入 `secretPaths`(当前
109
+ * schema 里是密钥的字段)的密钥:旧版本留下、现在已不是密钥或已删掉的字段不解密、不并入(否则会被当成明文回显
110
+ * 或保存)。
111
+ */
112
+ export async function readStoredDeploymentConfig(db, keyring, plugin, opts) {
113
+ let q = db
114
+ .selectFrom("extension_deployment_configs")
115
+ .select("config")
116
+ .where("plugin", "=", plugin);
117
+ if (opts.forUpdate)
118
+ q = q.forUpdate();
119
+ const row = await q.executeTakeFirst();
120
+ const out = structuredClone(row?.config ?? {});
121
+ const prefix = secretKey(plugin, "");
122
+ const wanted = new Set(opts.secretPaths);
123
+ if (wanted.size === 0)
124
+ return out;
125
+ const keys = await db
126
+ .selectFrom("secrets")
127
+ .select("key")
128
+ .where("namespace", "=", SECRETS_NAMESPACE)
129
+ .where("org_id", "=", DEPLOYMENT_SECRETS_ORG)
130
+ .execute();
131
+ const secrets = createSecrets(db, keyring, SECRETS_NAMESPACE);
132
+ for (const { key } of keys) {
133
+ if (!key.startsWith(prefix) || !wanted.has(key.slice(prefix.length)))
134
+ continue;
135
+ const v = await secrets.get(DEPLOYMENT_SECRETS_ORG, key);
136
+ if (v !== null)
137
+ setDeep(out, key.slice(prefix.length), JSON.parse(v));
138
+ }
139
+ return out;
140
+ }
141
+ /** 字段清单里的密钥字段路径。 */
142
+ export const secretPathsOf = (fields) => fields.filter((f) => f.secret).map((f) => f.path);
143
+ /** JSON Schema 转换按 schema 对象缓存(清单不可变)。 */
144
+ const jsonSchemaCache = new WeakMap();
145
+ function jsonSchemaOf(schema) {
146
+ let js = jsonSchemaCache.get(schema);
147
+ if (!js) {
148
+ js = configToJsonSchema(schema);
149
+ jsonSchemaCache.set(schema, js);
150
+ }
151
+ return structuredClone(js);
152
+ }
153
+ /** 某字段 zod 叶子上的默认值(整份配置不合法、校验没能补上默认值时,视图仍按它显示)。 */
154
+ function defaultOf(schema, path) {
155
+ const f = configFields(schema).find((x) => x.path === path);
156
+ if (!f)
157
+ return { has: false };
158
+ const d = describeSchema(f.schema);
159
+ return d.hasDefault ? { has: true, value: d.defaultValue } : { has: false };
160
+ }
161
+ /**
162
+ * Deployment-level extension config (D8 / C10): non-secret fields are stored in
163
+ * `extension_deployment_configs`, each secret field encrypted in `capybara.secrets` (namespace
164
+ * `kernel`, org `_deployment`, key `plugin-deployment-config:<plugin>:<path>`). Fields present in the
165
+ * startup config (file / Nacos / env) are read-only and show their source; the effective value
166
+ * follows {@link mergeDeploymentConfig}. No in-process state, shared by every replica.
167
+ * Secret values are never echoed: responses only say "set", audits only record which paths changed.
168
+ */
169
+ export class ExtensionDeploymentConfigService {
170
+ d;
171
+ constructor(d) {
172
+ this.d = d;
173
+ }
174
+ /** 插件的生效部署配置(未校验):启动配置为底,补上 PG 里保存的字段。`schema` 给出时按它的字段合并。 */
175
+ async effective(plugin, fileValue, schema) {
176
+ const stored = await readStoredDeploymentConfig(this.d.db, this.d.keyring, plugin, {
177
+ secretPaths: secretPathsOf(schemaFields(schema)),
178
+ });
179
+ const fields = schema ? configFields(schema).map((f) => f.path) : undefined;
180
+ return mergeDeploymentConfig(stored, fileValue, fields);
181
+ }
182
+ /** Admin view; an extension unknown to the deployment -> `extension.not_found`. */
183
+ async view(plugin) {
184
+ const info = await this.info(plugin);
185
+ const stored = await this.d.db
186
+ .transaction()
187
+ .setIsolationLevel("repeatable read")
188
+ .setAccessMode("read only")
189
+ .execute((t) => readStoredDeploymentConfig(t, this.d.keyring, plugin, {
190
+ secretPaths: secretPathsOf(info.fields),
191
+ }));
192
+ return this.render(plugin, info, stored);
193
+ }
194
+ /**
195
+ * Saves some fields: `values` keyed by field dot path, `null` = clear (back to the default),
196
+ * omitted = unchanged.
197
+ * - Unknown to the deployment -> `extension.not_found`; no deployment config, unknown field, or
198
+ * invalid after merging (except a problem in a read-only startup-config field itself) ->
199
+ * `extension.config_invalid` (details carry only paths and messages);
200
+ * - a field present in the startup config (file / Nacos / env) -> 409 `extension.config_readonly`.
201
+ * In a transaction, first `lockEnterpriseAdminsAndAuthorize` (re-checks the enterprise admin under
202
+ * the lock), then an advisory lock per extension; audit `extension.deployment_config_updated`
203
+ * (detail only `changedPaths`). After the commit publishes {@link PLUGIN_DEPLOYMENT_CONFIG_TOPIC} and
204
+ * applies it on this replica right away.
205
+ */
206
+ async put(plugin, values, actor, actorTokenId) {
207
+ const info = await this.info(plugin);
208
+ if (info.fields.length === 0) {
209
+ throw new ApiError("extension.config_invalid", `Extension ${plugin} has no deployment config`);
210
+ }
211
+ const byPath = new Map(info.fields.map((f) => [f.path, f]));
212
+ const unknown = Object.keys(values).filter((p) => !byPath.has(p));
213
+ if (unknown.length > 0) {
214
+ throw new ApiError("extension.config_invalid", `Unknown deployment config fields for extension ${plugin}`, unknown.map((path) => ({ path, message: "unknown field" })));
215
+ }
216
+ const sources = this.d.sources[plugin];
217
+ const readonly = Object.keys(values).filter((p) => fieldSource(sources, p) !== undefined);
218
+ if (readonly.length > 0) {
219
+ throw new ApiError("extension.config_readonly", `These deployment config fields of extension ${plugin} are set in the startup config (file, Nacos or environment) and are read-only here: ${readonly.join(", ")}`, readonly.map((path) => ({ path, source: fieldSource(sources, path) })));
220
+ }
221
+ const fileValue = this.d.fileConfig()[plugin];
222
+ const fieldPaths = info.fields.map((f) => f.path);
223
+ let saved;
224
+ let changed = [];
225
+ await this.d.db.transaction().execute(async (t) => {
226
+ await lockEnterpriseAdminsAndAuthorize(t, actor);
227
+ await sql `SELECT pg_advisory_xact_lock(hashtext(${`capybara.plugin-deployment-config:${plugin}`}))`.execute(t);
228
+ const before = await readStoredDeploymentConfig(t, this.d.keyring, plugin, {
229
+ forUpdate: true,
230
+ secretPaths: secretPathsOf(info.fields),
231
+ });
232
+ const next = structuredClone(before);
233
+ for (const [path, v] of Object.entries(values)) {
234
+ if (v === null)
235
+ deleteDeep(next, path);
236
+ else
237
+ setDeep(next, path, structuredClone(v));
238
+ }
239
+ if (info.schema) {
240
+ const r = info.schema.safeParse(mergeDeploymentConfig(next, fileValue, fieldPaths));
241
+ if (!r.success) {
242
+ // 启动配置里只读字段自己的问题这里改不了(照样保存,插件保持待配置),其余拒绝
243
+ const issues = toIssues(r.error).filter((i) => i.path === "" || fieldSource(sources, i.path) === undefined);
244
+ if (issues.length > 0) {
245
+ throw new ApiError("extension.config_invalid", `Invalid deployment config for extension ${plugin}`, issues);
246
+ }
247
+ }
248
+ }
249
+ changed = Object.keys(values)
250
+ .filter((p) => !isDeepStrictEqual(getPath(before, p), getPath(next, p)))
251
+ .sort();
252
+ saved = next;
253
+ if (changed.length === 0)
254
+ return;
255
+ const plain = structuredClone(next);
256
+ const secrets = createSecrets(t, this.d.keyring, SECRETS_NAMESPACE);
257
+ for (const f of info.fields) {
258
+ if (!f.secret)
259
+ continue;
260
+ deleteDeep(plain, f.path);
261
+ if (!(f.path in values))
262
+ continue;
263
+ const v = getPath(next, f.path);
264
+ if (v === undefined)
265
+ await secrets.delete(DEPLOYMENT_SECRETS_ORG, secretKey(plugin, f.path));
266
+ else
267
+ await secrets.set(DEPLOYMENT_SECRETS_ORG, secretKey(plugin, f.path), JSON.stringify(v));
268
+ }
269
+ await t
270
+ .insertInto("extension_deployment_configs")
271
+ .values({ plugin, config: JSON.stringify(plain), updated_by: actor })
272
+ .onConflict((oc) => oc.column("plugin").doUpdateSet({
273
+ config: JSON.stringify(plain),
274
+ updated_by: actor,
275
+ updated_at: new Date(),
276
+ }))
277
+ .execute();
278
+ await audit(t, {
279
+ actorAccountId: actor,
280
+ ...(actorTokenId !== undefined && { actorTokenId }),
281
+ action: "extension.deployment_config_updated",
282
+ target: plugin,
283
+ detail: { changedPaths: changed },
284
+ });
285
+ });
286
+ const stored = saved ?? {};
287
+ if (info.schema && this.d.onSecrets) {
288
+ const values = secretValues(info.schema, mergeDeploymentConfig(stored, fileValue, fieldPaths));
289
+ if (values.length > 0)
290
+ this.d.onSecrets(values);
291
+ }
292
+ if (changed.length > 0) {
293
+ try {
294
+ await this.d.bus?.publish(PLUGIN_DEPLOYMENT_CONFIG_TOPIC, { plugin });
295
+ }
296
+ catch (err) {
297
+ this.d.log.warn("cannot publish plugin-deployment-config after saving", { plugin, err });
298
+ }
299
+ try {
300
+ await this.d.applyLocal?.(plugin);
301
+ }
302
+ catch (err) {
303
+ this.d.log.error("applying the plugin deployment config on this replica failed", {
304
+ plugin,
305
+ err,
306
+ });
307
+ }
308
+ }
309
+ return this.render(plugin, info, stored);
310
+ }
311
+ async info(plugin) {
312
+ const info = await this.d.schemaOf(plugin);
313
+ if (!info) {
314
+ throw new ApiError("extension.not_found", `Extension ${plugin} is not known to this deployment`);
315
+ }
316
+ return info;
317
+ }
318
+ render(plugin, info, stored) {
319
+ const fileValue = this.d.fileConfig()[plugin];
320
+ const sources = this.d.sources[plugin];
321
+ const raw = mergeDeploymentConfig(stored, fileValue, info.fields.map((f) => f.path));
322
+ let effective = raw;
323
+ let valid = true;
324
+ let issues = [];
325
+ if (info.schema) {
326
+ const r = info.schema.safeParse(raw);
327
+ if (r.success)
328
+ effective = r.data;
329
+ else {
330
+ valid = false;
331
+ issues = toIssues(r.error);
332
+ }
333
+ }
334
+ const fields = info.fields.map((f) => {
335
+ const from = fieldSource(sources, f.path);
336
+ let value = getPath(effective, f.path);
337
+ let source;
338
+ if (from !== undefined)
339
+ source = from;
340
+ else if (getPath(stored, f.path) !== undefined)
341
+ source = "db";
342
+ else {
343
+ const d = info.schema ? defaultOf(info.schema, f.path) : { has: false };
344
+ if (value === undefined && d.has)
345
+ value = d.value;
346
+ source = value === undefined ? "unset" : "default";
347
+ }
348
+ const base = {
349
+ path: f.path,
350
+ secret: f.secret,
351
+ hot: f.hot,
352
+ source,
353
+ readonly: from !== undefined,
354
+ };
355
+ if (f.secret)
356
+ return { ...base, set: value !== undefined };
357
+ return value === undefined ? base : { ...base, value: structuredClone(value) };
358
+ });
359
+ return {
360
+ plugin,
361
+ version: info.version,
362
+ configurable: info.fields.length > 0,
363
+ fields,
364
+ schema: info.schema ? jsonSchemaOf(info.schema) : null,
365
+ valid,
366
+ validated: info.schema !== undefined,
367
+ issues,
368
+ };
369
+ }
370
+ }
371
+ /**
372
+ * 本副本拿不到模块时(未加载的安装记录)按包内审阅过的静态清单给出字段(没有 zod schema:不校验,加载时再校验)。
373
+ */
374
+ export async function staticDeploymentSchema(db, plugin) {
375
+ const row = await db
376
+ .selectFrom("extension_installs")
377
+ .innerJoin("extension_packages", "extension_packages.sha256", "extension_installs.sha256")
378
+ .select(["extension_installs.version", "extension_packages.section"])
379
+ .where("extension_installs.name", "=", plugin)
380
+ .executeTakeFirst();
381
+ if (!row)
382
+ return undefined;
383
+ // new rows hold the plugin's extension section, pre-0.1.0 rows the old capybara section; both
384
+ // carry the static manifest
385
+ const section = row.section;
386
+ return {
387
+ version: row.version,
388
+ fields: (section.manifest.config?.deployment ?? []).map((f) => ({
389
+ path: f.path,
390
+ secret: f.secret,
391
+ hot: f.hot,
392
+ })),
393
+ };
394
+ }
@@ -0,0 +1,31 @@
1
+ import type { KernelDb } from "../db/kernel-schema.js";
2
+ /**
3
+ * Which extensions an organization has enabled. Two sources, and every reader goes through these
4
+ * helpers so none of them misses one:
5
+ * - `extension_org_configs.enabled` (the org's own switch);
6
+ * - every required bootstrap plugin (`extension_installs.required`, package ecosystem spec §7):
7
+ * enabled in every org, existing and future, without an org config row, whatever such a row says.
8
+ * Neither checks that the extension is loaded on this replica or enabled on the deployment; callers
9
+ * that need that check it themselves, as before. `db` may be a transaction.
10
+ */
11
+ /** The names of the extensions enabled in `orgId` (a subquery with one column, `plugin`). */
12
+ export declare function enabledExtensionsQuery(db: KernelDb, orgId: string): import("kysely").SelectQueryBuilder<import("../db/kernel-schema.js").KernelDatabase & {
13
+ eoc: import("../db/kernel-schema.js").ExtensionOrgConfigsTable;
14
+ }, "eoc", {
15
+ plugin: string;
16
+ }>;
17
+ /**
18
+ * Every (org, extension) pair that is enabled, for queries that join it (columns `org_id`,
19
+ * `plugin`): `.innerJoin(enabledExtensionsByOrg(db).as("en"), (j) => j.onRef("en.org_id", …)…)`.
20
+ * Soft-deleted orgs are included, as their org config rows are; callers filter `orgs.deleted_at`.
21
+ */
22
+ export declare function enabledExtensionsByOrg(db: KernelDb): import("kysely").SelectQueryBuilder<import("../db/kernel-schema.js").KernelDatabase & {
23
+ eoc: import("../db/kernel-schema.js").ExtensionOrgConfigsTable;
24
+ }, "eoc", {
25
+ org_id: string;
26
+ plugin: string;
27
+ }>;
28
+ /** Whether `plugin` is enabled in `orgId` (see the file header). */
29
+ export declare function isExtensionEnabled(db: KernelDb, orgId: string, plugin: string): Promise<boolean>;
30
+ /** The names of the required bootstrap plugins (installed with `required`). */
31
+ export declare function requiredExtensions(db: KernelDb): Promise<Set<string>>;
@@ -0,0 +1,55 @@
1
+ import { sql } from "kysely";
2
+ /**
3
+ * Which extensions an organization has enabled. Two sources, and every reader goes through these
4
+ * helpers so none of them misses one:
5
+ * - `extension_org_configs.enabled` (the org's own switch);
6
+ * - every required bootstrap plugin (`extension_installs.required`, package ecosystem spec §7):
7
+ * enabled in every org, existing and future, without an org config row, whatever such a row says.
8
+ * Neither checks that the extension is loaded on this replica or enabled on the deployment; callers
9
+ * that need that check it themselves, as before. `db` may be a transaction.
10
+ */
11
+ /** The names of the extensions enabled in `orgId` (a subquery with one column, `plugin`). */
12
+ export function enabledExtensionsQuery(db, orgId) {
13
+ return db
14
+ .selectFrom("extension_org_configs as eoc")
15
+ .select("eoc.plugin as plugin")
16
+ .where("eoc.org_id", "=", orgId)
17
+ .where("eoc.enabled", "=", true)
18
+ .union(db
19
+ .selectFrom("extension_installs as ri")
20
+ .select("ri.name as plugin")
21
+ .where("ri.required", "=", true));
22
+ }
23
+ /**
24
+ * Every (org, extension) pair that is enabled, for queries that join it (columns `org_id`,
25
+ * `plugin`): `.innerJoin(enabledExtensionsByOrg(db).as("en"), (j) => j.onRef("en.org_id", …)…)`.
26
+ * Soft-deleted orgs are included, as their org config rows are; callers filter `orgs.deleted_at`.
27
+ */
28
+ export function enabledExtensionsByOrg(db) {
29
+ return db
30
+ .selectFrom("extension_org_configs as eoc")
31
+ .select(["eoc.org_id as org_id", "eoc.plugin as plugin"])
32
+ .where("eoc.enabled", "=", true)
33
+ .union(db
34
+ .selectFrom("orgs as ro")
35
+ .innerJoin("extension_installs as ri", (j) => j.on("ri.required", "=", true))
36
+ .select(["ro.id as org_id", "ri.name as plugin"]));
37
+ }
38
+ /** Whether `plugin` is enabled in `orgId` (see the file header). */
39
+ export async function isExtensionEnabled(db, orgId, plugin) {
40
+ const row = await db
41
+ .selectFrom(enabledExtensionsQuery(db, orgId).as("en"))
42
+ .select(sql `1`.as("one"))
43
+ .where("en.plugin", "=", plugin)
44
+ .executeTakeFirst();
45
+ return row !== undefined;
46
+ }
47
+ /** The names of the required bootstrap plugins (installed with `required`). */
48
+ export async function requiredExtensions(db) {
49
+ const rows = await db
50
+ .selectFrom("extension_installs")
51
+ .select("name")
52
+ .where("required", "=", true)
53
+ .execute();
54
+ return new Set(rows.map((r) => r.name));
55
+ }
@@ -0,0 +1,161 @@
1
+ import { type AvailableHook, type HookHandler, type HookOptions, type HookPayloads, type Logger, type PolicyHook } from "@capybara-hq/plugin-sdk";
2
+ import type { Redis } from "ioredis";
3
+ import type { KernelConfig } from "../config/schema.js";
4
+ import { type InflightTracker } from "./inflight.js";
5
+ /** Default of `hooks.timeoutMs` (used when a host is built without kernel config, e.g. in tests). */
6
+ export declare const DEFAULT_HOOK_TIMEOUT_MS = 5000;
7
+ /**
8
+ * Longest plugin-authored deny reason kept, in UTF-16 code units (the `hook_denied` event's limit;
9
+ * the model-visible denial quotes it).
10
+ */
11
+ export declare const HOOK_REASON_MAX_CHARS = 500;
12
+ /** In-flight observe calls allowed per plugin on one replica; overflow is dropped with a warning. */
13
+ export declare const OBSERVE_INFLIGHT_MAX = 64;
14
+ /** Reason used when a plugin denies with an empty (or whitespace-only) reason. */
15
+ export declare const EMPTY_DENY_REASON = "(no reason given)";
16
+ /**
17
+ * Result of running the policy hooks of a mount point. `reason` is model-visible: the plugin's own
18
+ * (sanitized) text for `deny`, a generic sentence for `hook_error` / `timeout`. `detail` is the raw
19
+ * error for logs and audit only, never for the model.
20
+ */
21
+ export type HookOutcome = {
22
+ allowed: true;
23
+ } | {
24
+ allowed: false;
25
+ plugin: string;
26
+ reason: string;
27
+ cause: "deny" | "hook_error" | "timeout";
28
+ detail?: string;
29
+ /**
30
+ * R10: the hooks could not run at all (organization lookup or payload copy failed); `plugin` is
31
+ * only the first policy plugin on the mount, not the cause.
32
+ */
33
+ preflight?: true;
34
+ /**
35
+ * M-1: `plugin` declares a policy hook on this mount (`permissions.policyHooks`), is enabled and
36
+ * approved, but is not loaded on this replica: the call fails closed without running any hook.
37
+ */
38
+ notLoaded?: true;
39
+ };
40
+ /** A hook a plugin instance registered through `ctx.hooks.on` (kept on the instance, like tools). */
41
+ export interface RegisteredHook {
42
+ mount: AvailableHook;
43
+ handler: HookHandler<AvailableHook>;
44
+ mode: HookOptions["mode"];
45
+ }
46
+ /** What the registry needs from a plugin instance (satisfied by `ExtensionInstance`). */
47
+ export interface HookSource {
48
+ readonly name: string;
49
+ readonly hooks: readonly RegisteredHook[];
50
+ readonly inflight: InflightTracker;
51
+ }
52
+ /** Error text that never throws itself (a hostile `message` getter or `toString`). */
53
+ export declare function errMsg(e: unknown): string;
54
+ /**
55
+ * Sanitizes a plugin-authored deny reason for the model: control characters become spaces,
56
+ * whitespace collapses, and the text is clipped to {@link HOOK_REASON_MAX_CHARS} UTF-16 code units
57
+ * (never splitting a surrogate pair). An empty result becomes {@link EMPTY_DENY_REASON}.
58
+ */
59
+ export declare function sanitizeDenyReason(raw: string): string;
60
+ /** Clips to at most `max` UTF-16 code units, ending in "…", without splitting a surrogate pair. */
61
+ export declare function clipText(s: string, max: number): string;
62
+ /** Deep-freezes a structured clone in place (typed arrays cannot be frozen and are left as they are). */
63
+ export declare function deepFreeze<T>(v: T): T;
64
+ /** Validates a registration; throws a plain Error (permission checks happen in the ctx). */
65
+ export declare function checkHookRegistration(plugin: string, mount: string, handler: unknown, opts: HookOptions | undefined): void;
66
+ /** Longest raw error kept in `HookOutcome.detail` (characters). */
67
+ export declare const HOOK_DETAIL_MAX_CHARS = 2048;
68
+ /**
69
+ * Runs the hooks of this process's **active** plugin instances (one registry per replica, like
70
+ * tools). Hooks live on each instance (`ctx.hooks.on` records them in the instance ledger), and the
71
+ * registry resolves them from the host's active instances on every call: after an upgrade only the
72
+ * new generation fires, and unloading or disabling an instance stops its hooks. Every hook call runs
73
+ * through the instance's `inflight.run`, so revocation drains it (up to `extensionHost.drainSeconds`).
74
+ *
75
+ * {@link run} (Ruling R11):
76
+ * 1. If the caller's signal is aborted, throw its reason (an abort is never a deny).
77
+ * 2. Resolve the organization's enabled plugins (every run, not cached) and make one deep-frozen
78
+ * `structuredClone` of the payload. If either throws (Ruling R10): with any policy hook on the
79
+ * mount, deny with a generic reason (`hook_error`); with only observe hooks, allow and warn.
80
+ * If a plugin the organization enabled is expected to run policy hooks on the mount (deployment
81
+ * state, `expectedPolicy`) but is not loaded on this replica, deny with a generic reason
82
+ * (`hook_error`, `notLoaded`) without running any policy hook (M-1: fail closed). Observe hooks
83
+ * of plugins that are not loaded are simply missing.
84
+ * 3. Policy hooks run serially by plugin name (registration order within a plugin), each limited
85
+ * by `hooks.timeoutMs` (read on every run, hot). `{ deny }`, an error or a timeout stops the chain
86
+ * and denies (`deny` / `hook_error` / `timeout`). A policy hook cut off by its instance being
87
+ * revoked (`ExtensionUnloadedError`) reruns once on the plugin's current generation, if one is active
88
+ * and enabled; otherwise the call is denied.
89
+ * 4. Observe hooks (resolved again from the active instances) are then dispatched concurrently, fire-and-forget, whether or not the call was
90
+ * denied (never awaited on the call path). At most {@link OBSERVE_INFLIGHT_MAX} run per plugin on
91
+ * this replica; overflow is dropped. Their verdicts are ignored; errors, timeouts and drops are
92
+ * logged at most once per plugin and mount per minute (Redis counter with a TTL, shared by
93
+ * replicas).
94
+ *
95
+ * The in-flight observe counter is per replica on purpose (it bounds this process's work); it is not
96
+ * cross-request state anybody reads back. Callers fire hooks only for chat conversations, never in
97
+ * eval replays, and skip building the payload when {@link has} is false.
98
+ */
99
+ export declare class HookRegistry {
100
+ private readonly d;
101
+ /** In-flight observe calls per plugin on this replica (see {@link OBSERVE_INFLIGHT_MAX}). */
102
+ private readonly observing;
103
+ constructor(d: {
104
+ /** The host's active instances (read on every call). */
105
+ instances(): readonly HookSource[];
106
+ /** The active instance of a plugin (the current generation), if any. */
107
+ current(plugin: string): HookSource | undefined;
108
+ /**
109
+ * Plugins that deployment state expects to run policy hooks on a mount point (M-1): enabled and
110
+ * approved, with `permissions.policyHooks` listing it in the approved snapshot. In-process (refreshed by the host on every reconcile), so asking costs no
111
+ * I/O. Absent: none.
112
+ */
113
+ expectedPolicy?(mount: PolicyHook): readonly string[];
114
+ enabledPlugins(orgId: string): Promise<Set<string>>;
115
+ redis: Redis;
116
+ config: () => {
117
+ hooks: Pick<KernelConfig["hooks"], "timeoutMs">;
118
+ };
119
+ log: Logger;
120
+ });
121
+ /**
122
+ * Whether calls on the mount point need {@link run}: an active instance has a hook on it, or a plugin
123
+ * expected to run policy hooks on it is not loaded here (M-1). In-process only (regardless of
124
+ * organization), so callers skip building payloads and log lookups when it is false.
125
+ */
126
+ has(mount: AvailableHook): boolean;
127
+ /**
128
+ * Plugins expected to run policy hooks on the mount (deployment state) that have no active instance
129
+ * on this replica, sorted by name. A loaded plugin that registered no policy hook is not listed.
130
+ */
131
+ private unloadedPolicy;
132
+ /**
133
+ * `usage.report` handlers by plugin name (delivered by the usage queue, not by {@link run}); each
134
+ * call runs through the instance's `inflight.run`.
135
+ */
136
+ handlers(mount: "usage.report"): {
137
+ plugin: string;
138
+ handler: HookHandler<"usage.report">;
139
+ }[];
140
+ /** Runs the hooks of a mount point (see the class comment). */
141
+ run<K extends Exclude<AvailableHook, "usage.report">>(mount: K, payload: HookPayloads[K], signal: AbortSignal): Promise<HookOutcome>;
142
+ /**
143
+ * The M-1 denial: `missing` (sorted) are enabled policy plugins that are not loaded on this replica.
144
+ * The model-visible reason is generic; the detail and a throttled warning name the plugin for the
145
+ * admin.
146
+ */
147
+ private notLoadedDenial;
148
+ /** Active entries of a mount point, sorted by plugin name (stable: registration order within). */
149
+ private entries;
150
+ /** One plugin's policy hooks in registration order; reruns once on a newer generation if revoked. */
151
+ private runPolicies;
152
+ /** Fire-and-forget observe call through the instance's in-flight tracker, capped per plugin. */
153
+ private dispatchObserve;
154
+ /**
155
+ * Calls one handler with its own signal (aborted on timeout or when `s` aborts). Rejects with
156
+ * `s.reason` when `s` aborts first, so callers can tell an abort from a hook failure.
157
+ */
158
+ private call;
159
+ /** Logs a warning at most once per plugin, mount and kind per minute (counter in Redis, TTL). */
160
+ private warnOnce;
161
+ }