@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,625 @@
1
+ import { createHash } from "node:crypto";
2
+ import { parseAgentTemplate, parseConnectorTemplateFile, } from "@capybara-hq/plugin-sdk";
3
+ import { ApiError } from "../errors.js";
4
+ import { lockOrgAndAuthorize } from "../orgs/org-lock.js";
5
+ import { can, roleAtLeast } from "../orgs/roles.js";
6
+ import { packagePath } from "../packages/tgz.js";
7
+ import { checkSkillFiles, SkillArchiveError } from "../skills/package.js";
8
+ import { itemView } from "./catalog.service.js";
9
+ import { iconProblem } from "./plugin-package.js";
10
+ import { upgradeInfo } from "./upgrade-targets.js";
11
+ import { satisfiesRange } from "./versions.js";
12
+ /**
13
+ * A connector template as an org sees it (the install wizard and the upgrade preview's inputs):
14
+ * presets and editable paths, no credentials.
15
+ */
16
+ export function orgTemplateView(id, file) {
17
+ const t = file.template;
18
+ return {
19
+ id,
20
+ displayName: file.displayName,
21
+ description: file.description ?? "",
22
+ plugin: t.plugin,
23
+ connector: t.connector,
24
+ endpoint: t.endpoint,
25
+ editableEndpoint: t.editableEndpoint ?? [],
26
+ auth: t.auth,
27
+ ownership: t.ownership ??
28
+ (typeof t.auth.ownership === "string" ? t.auth.ownership : null),
29
+ };
30
+ }
31
+ const iconNotFound = () => new ApiError("catalog.icon_not_found", "This catalog item has no icon");
32
+ /**
33
+ * The item's latest version row; item missing, deleted or (when `includeDisabled` is false)
34
+ * disabled -> `catalog.item_not_found`.
35
+ */
36
+ async function latestVersionRow(db, itemId, includeDisabled) {
37
+ if (!UUID_RE.test(itemId))
38
+ throw itemNotFound();
39
+ const item = await db
40
+ .selectFrom("catalog_items")
41
+ .select(["latest_version", "policy"])
42
+ .where("id", "=", itemId)
43
+ .where("deleted_at", "is", null)
44
+ .executeTakeFirst();
45
+ // An item the caller cannot see is "not found" before any version / storage is read, so "no icon"
46
+ // never reveals that it exists
47
+ if (!item || (!includeDisabled && item.policy === "disabled"))
48
+ throw itemNotFound();
49
+ const v = await db
50
+ .selectFrom("catalog_item_versions")
51
+ .select(["manifest", "object_prefix", "files"])
52
+ .where("item_id", "=", itemId)
53
+ .where("version", "=", item.latest_version)
54
+ .executeTakeFirst();
55
+ if (!v)
56
+ throw itemNotFound();
57
+ return { item, v };
58
+ }
59
+ /** The icon's path in the version's files (undefined without an icon). */
60
+ const iconPath = (v) => {
61
+ const icon = v.manifest.icon;
62
+ return icon === undefined ? undefined : packagePath(icon);
63
+ };
64
+ /** Whether the item's latest version has an icon; unreadable counts as none. */
65
+ export async function catalogHasIcon(db, itemId) {
66
+ try {
67
+ const { v } = await latestVersionRow(db, itemId, true);
68
+ const path = iconPath(v);
69
+ return path !== undefined && v.files.some((f) => f.path === path);
70
+ }
71
+ catch {
72
+ return false;
73
+ }
74
+ }
75
+ /**
76
+ * Reads the icon of the item's latest version (served only through kernel routes, with nosniff and
77
+ * a CSP sandbox in the response headers; the web only shows it with `<img>`). Item missing, deleted
78
+ * or (when `includeDisabled` is false) disabled -> `catalog.item_not_found` (decided before reading
79
+ * storage); no icon -> `catalog.icon_not_found`; stored content that is not a valid svg / png
80
+ * (checked at import, this guards against tampered storage) -> `internal`.
81
+ */
82
+ export async function readCatalogIcon(db, storage, itemId, includeDisabled) {
83
+ const { item, v } = await latestVersionRow(db, itemId, includeDisabled);
84
+ const path = iconPath(v);
85
+ const f = path === undefined ? undefined : v.files.find((x) => x.path === path);
86
+ if (path === undefined || !f)
87
+ throw iconNotFound();
88
+ const [file] = await readCatalogFiles(storage, v.object_prefix, [f]);
89
+ if (!file)
90
+ throw iconNotFound();
91
+ const problem = iconProblem(path, file.data);
92
+ if (problem !== undefined)
93
+ throw new ApiError("internal", `Stored icon is invalid: ${problem}`);
94
+ return {
95
+ data: file.data,
96
+ contentType: /\.svg$/i.test(path) ? "image/svg+xml" : "image/png",
97
+ policy: item.policy,
98
+ };
99
+ }
100
+ const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
101
+ const itemNotFound = () => new ApiError("catalog.item_not_found", "Catalog item not found");
102
+ const itemDisabled = () => new ApiError("catalog.item_disabled", "This catalog item is disabled by the enterprise admin and cannot be newly installed");
103
+ const fail = (path, message) => new ApiError("validation_failed", "Request validation failed", [{ path, message }]);
104
+ /**
105
+ * The org actions installing / uninstalling a plugin needs: the union over its components (an
106
+ * extension -> `org.extensions.manage`, skills -> `skills.manage`, connector templates ->
107
+ * `connectors.manage`, agent templates -> `agents.manage`), re-checked inside the org row lock.
108
+ */
109
+ export function requiredActions(m) {
110
+ const out = [];
111
+ if (m.extension)
112
+ out.push("org.extensions.manage");
113
+ if ((m.connectorTemplates ?? []).length > 0)
114
+ out.push("connectors.manage");
115
+ if ((m.skills ?? []).length > 0)
116
+ out.push("skills.manage");
117
+ if ((m.agents ?? []).length > 0)
118
+ out.push("agents.manage");
119
+ return out.length > 0 ? out : ["org.extensions.manage"];
120
+ }
121
+ /** Locks the org row in the caller's transaction and re-checks the actor can do every action (else `forbidden`). */
122
+ export async function lockOrgForActions(t, orgId, actor, actions) {
123
+ const [first, ...rest] = actions;
124
+ const { role } = await lockOrgAndAuthorize(t, orgId, actor, first);
125
+ for (const a of rest) {
126
+ if (!can(role, a))
127
+ throw new ApiError("forbidden", "Insufficient organization role");
128
+ }
129
+ }
130
+ const isObj = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
131
+ const UNSAFE_KEYS = new Set(["__proto__", "prototype", "constructor"]);
132
+ /** 对象的全部叶子点路径(数组与非对象值算叶子)。 */
133
+ function leafPaths(v, base = "") {
134
+ const out = [];
135
+ for (const [k, x] of Object.entries(v)) {
136
+ const p = base ? `${base}.${k}` : k;
137
+ if (isObj(x) && Object.keys(x).length > 0)
138
+ out.push(...leafPaths(x, p));
139
+ else
140
+ out.push(p);
141
+ }
142
+ return out;
143
+ }
144
+ /** The value at a dot path of `v` (own keys only), undefined when absent. */
145
+ export function getPath(v, path) {
146
+ let node = v;
147
+ for (const seg of path.split(".")) {
148
+ if (!isObj(node) || !Object.hasOwn(node, seg))
149
+ return undefined;
150
+ node = node[seg];
151
+ }
152
+ return node;
153
+ }
154
+ /** Sets the value at a dot path of `obj`, creating the objects on the way. */
155
+ export function setPath(obj, path, value) {
156
+ const segs = path.split(".");
157
+ let node = obj;
158
+ for (const seg of segs.slice(0, -1)) {
159
+ if (!isObj(node[seg]))
160
+ node[seg] = {};
161
+ node = node[seg];
162
+ }
163
+ node[segs[segs.length - 1]] = value;
164
+ }
165
+ /**
166
+ * 模板的连接器插件此刻是否可用:插件加载且提供该 kind,并满足 `pluginVersion`(若写了);不可用返回原因
167
+ * (模型不可见,给管理员看的英文)。
168
+ */
169
+ export function templatePluginProblem(d, template) {
170
+ if (!d.findConnector(template.plugin, template.connector)) {
171
+ return `Connector extension ${template.plugin} providing "${template.connector}" is not deployed; ask the enterprise admin to install and enable it`;
172
+ }
173
+ const range = template.pluginVersion;
174
+ const version = d.pluginVersion(template.plugin);
175
+ if (range !== undefined && version !== undefined && !satisfiesRange(version, range)) {
176
+ return `Connector extension ${template.plugin} is deployed at version ${version}, but the template needs ${range}; ask the enterprise admin to upgrade it`;
177
+ }
178
+ return undefined;
179
+ }
180
+ /**
181
+ * Builds the connector install input from a connector template plus what the org filled in (C30):
182
+ * the endpoint comes from the template, only paths listed in `editableEndpoint` (or fields under
183
+ * them) may be changed by the org, changing another path -> `validation_failed`; the auth method
184
+ * comes from the template, the org only gives credentials (static credentials via `credential`,
185
+ * OAuth via `client`). Re-checks the template's plugin, kind and `pluginVersion` against the
186
+ * connectors loaded on this replica right now (unmet -> `catalog.not_deployed`); the endpoint
187
+ * (merged as a whole) schema check, credential pattern check and OAuth URL policy are re-checked by
188
+ * `ConnectorsService.create`.
189
+ */
190
+ export function templateConnectorInput(deps, template, ref, input, defaultName, at = "connector") {
191
+ const problem = templatePluginProblem(deps, template);
192
+ if (problem !== undefined)
193
+ throw new ApiError("catalog.not_deployed", problem);
194
+ const given = input ?? {};
195
+ const editable = template.editableEndpoint ?? [];
196
+ const endpoint = structuredClone(template.endpoint);
197
+ if (given.endpoint !== undefined) {
198
+ if (!isObj(given.endpoint))
199
+ throw fail(`${at}.endpoint`, "Expected an object");
200
+ for (const p of leafPaths(given.endpoint)) {
201
+ const segs = p.split(".");
202
+ if (segs.some((s) => UNSAFE_KEYS.has(s))) {
203
+ throw fail(`${at}.endpoint.${p}`, "Invalid key");
204
+ }
205
+ const allowed = editable.some((e) => p === e || p.startsWith(`${e}.`));
206
+ if (!allowed) {
207
+ throw fail(`${at}.endpoint.${p}`, "This endpoint field is set by the template and cannot be changed");
208
+ }
209
+ }
210
+ for (const e of editable) {
211
+ const v = getPath(given.endpoint, e);
212
+ if (v !== undefined)
213
+ setPath(endpoint, e, v);
214
+ }
215
+ }
216
+ const auth = template.auth;
217
+ const oauth = auth.type === "oauth_code" || auth.type === "oauth_client";
218
+ if (oauth && given.credential !== undefined) {
219
+ throw fail(`${at}.credential`, "This connector uses OAuth; provide client instead");
220
+ }
221
+ if (!oauth && given.client !== undefined) {
222
+ throw fail(`${at}.client`, "This connector does not use OAuth; provide credential instead");
223
+ }
224
+ const credential = oauth ? given.client : given.credential;
225
+ return {
226
+ name: given.name ?? defaultName,
227
+ ...(given.slug !== undefined && { slug: given.slug }),
228
+ connector: template.connector,
229
+ endpoint,
230
+ auth,
231
+ ...(credential !== undefined && { credential }),
232
+ template: {
233
+ ...ref,
234
+ ...(template.defaultToolPolicies !== undefined && {
235
+ defaultToolPolicies: template.defaultToolPolicies,
236
+ }),
237
+ },
238
+ };
239
+ }
240
+ /** 从部署存储读目录版本里的文件(按版本行的 sha256 校验);`under` 给出时只读该目录下的文件,路径去掉该前缀。 */
241
+ export async function readCatalogFiles(storage, objectPrefix, files, under) {
242
+ storage.assertAvailable();
243
+ if (objectPrefix === null)
244
+ return [];
245
+ const store = storage.deployment();
246
+ const dir = under === undefined ? "" : `${under}/`;
247
+ const out = [];
248
+ for (const f of files) {
249
+ if (!f.path.startsWith(dir))
250
+ continue;
251
+ const got = await store.get(`${objectPrefix}${f.path}`);
252
+ if (!got) {
253
+ throw new ApiError("storage.unavailable", `Catalog file ${f.path} is missing from object storage`);
254
+ }
255
+ const data = new Uint8Array(await new Response(got.body).arrayBuffer());
256
+ if (createHash("sha256").update(data).digest("hex") !== f.sha256) {
257
+ throw new ApiError("internal", `Catalog file ${f.path} does not match its recorded hash`);
258
+ }
259
+ out.push({ path: f.path.slice(dir.length), size: data.byteLength, sha256: f.sha256, data });
260
+ }
261
+ return out;
262
+ }
263
+ /** 校验技能文件并取名字与描述(导入时已校验过;这里防存储被改)。 */
264
+ export function skillOf(files) {
265
+ try {
266
+ // Stored files: a version imported before phase D keeps installing (its invocation keys are
267
+ // read leniently; `skillInvocation` ignores values of the wrong type)
268
+ return checkSkillFiles(files, { invocationKeys: false });
269
+ }
270
+ catch (e) {
271
+ if (e instanceof SkillArchiveError) {
272
+ throw new ApiError("internal", `Stored skill is invalid: ${e.problems.join("; ")}`);
273
+ }
274
+ throw e;
275
+ }
276
+ }
277
+ /** The connector templates of a catalog version, read from storage (id = the file's base name). */
278
+ export async function readCatalogTemplates(storage, v) {
279
+ const refs = v.manifest.connectorTemplates ?? [];
280
+ if (refs.length === 0)
281
+ return [];
282
+ const paths = refs.map((r) => packagePath(r.path));
283
+ const files = await readCatalogFiles(storage, v.object_prefix, v.files.filter((f) => paths.includes(f.path)));
284
+ return paths.map((path) => {
285
+ const f = files.find((x) => x.path === path);
286
+ let parsed;
287
+ try {
288
+ parsed = f && parseConnectorTemplateFile(JSON.parse(new TextDecoder().decode(f.data)));
289
+ }
290
+ catch {
291
+ parsed = undefined;
292
+ }
293
+ if (!parsed || "errors" in parsed) {
294
+ throw new ApiError("internal", `Stored connector template ${path} is missing or invalid`);
295
+ }
296
+ return { id: path.split("/").pop().replace(/\.json$/, ""), file: parsed };
297
+ });
298
+ }
299
+ /**
300
+ * The agent templates of a catalog version (`manifest.agents`, listed explicitly since import),
301
+ * parsed from storage (checked at import; parsed again in case storage was changed).
302
+ */
303
+ export async function readCatalogAgentTemplates(storage, v) {
304
+ const refs = v.manifest.agents ?? [];
305
+ if (refs.length === 0)
306
+ return [];
307
+ const paths = refs.map((r) => packagePath(r.path));
308
+ const files = await readCatalogFiles(storage, v.object_prefix, v.files.filter((f) => paths.includes(f.path)));
309
+ return paths.map((path) => {
310
+ const f = files.find((x) => x.path === path);
311
+ const parsed = f && parseAgentTemplate(new TextDecoder().decode(f.data));
312
+ if (!parsed || "errors" in parsed) {
313
+ throw new ApiError("internal", `Stored agent template ${path} is missing or invalid`);
314
+ }
315
+ return { path, template: parsed.template };
316
+ });
317
+ }
318
+ /**
319
+ * Organizations browse and install from the enterprise catalog (C22): members browse (without
320
+ * disabled items) and request, org admins install. Every item is a plugin, installed with its
321
+ * dependencies by {@link PluginInstaller}; installing requires the union of the component actions
322
+ * of the plugins it brings in ({@link requiredActions}), re-checked inside the org row lock; item
323
+ * disabled -> `catalog.item_disabled`; a dependency unresolved / disabled / in a cycle ->
324
+ * `catalog.dependency_*`; an extension or a template's connector not on the deployment ->
325
+ * `catalog.not_deployed`; needs_approval without a grant -> a stage deployment request (HTTP 202;
326
+ * dependencies are not approved separately, spec §10). No in-process state.
327
+ */
328
+ export class OrgCatalogService {
329
+ d;
330
+ constructor(d) {
331
+ this.d = d;
332
+ }
333
+ /** The org's view of the items; members (not admins) don't see disabled items. */
334
+ async list(orgId, accountId, itemId) {
335
+ const m = await this.d.db
336
+ .selectFrom("memberships")
337
+ .select("role")
338
+ .where("org_id", "=", orgId)
339
+ .where("account_id", "=", accountId)
340
+ .executeTakeFirst();
341
+ const isAdmin = m !== undefined && roleAtLeast(m.role, "admin");
342
+ let q = this.d.db
343
+ .selectFrom("catalog_items")
344
+ .selectAll()
345
+ .where("deleted_at", "is", null)
346
+ .orderBy("name")
347
+ .orderBy("id");
348
+ if (itemId !== undefined)
349
+ q = q.where("id", "=", itemId);
350
+ if (!isAdmin)
351
+ q = q.where("policy", "<>", "disabled");
352
+ const items = await q.execute();
353
+ if (items.length === 0)
354
+ return [];
355
+ const ids = items.map((i) => i.id);
356
+ const [versions, grants, requests, pluginInstalls] = await Promise.all([
357
+ this.d.db
358
+ .selectFrom("catalog_item_versions")
359
+ .select(["item_id", "version", "source", "manifest", "object_prefix", "files"])
360
+ .where("item_id", "in", ids)
361
+ .execute(),
362
+ this.d.db
363
+ .selectFrom("catalog_org_grants")
364
+ .select("item_id")
365
+ .where("org_id", "=", orgId)
366
+ .execute(),
367
+ this.d.requests.latestByItem(orgId),
368
+ this.d.db
369
+ .selectFrom("plugin_installs")
370
+ .select(["id", "item_id", "version"])
371
+ .where("org_id", "=", orgId)
372
+ .where("status", "in", ["installing", "installed", "upgrading"])
373
+ .execute(),
374
+ ]);
375
+ const upgrades = await upgradeInfo(this.d.db, this.d.host, pluginInstalls.flatMap((a) => {
376
+ const item = items.find((i) => i.id === a.item_id);
377
+ return item ? [{ itemId: a.item_id, name: item.name, version: a.version }] : [];
378
+ }));
379
+ const granted = new Set(grants.map((g) => g.item_id));
380
+ const undeployed = await this.undeployed(items.flatMap((i) => {
381
+ const v = versions.find((x) => x.item_id === i.id && x.version === i.latest_version);
382
+ return v ? [v] : [];
383
+ }));
384
+ const out = [];
385
+ for (const i of items) {
386
+ const vs = versions.filter((v) => v.item_id === i.id);
387
+ const { installs: _installs, marketplaceId: _source, latestMarketplaceVersion: _latest, newerInMarketplace: _newer, ...view } = itemView(i, vs);
388
+ const latest = vs.find((v) => v.version === i.latest_version);
389
+ let installable;
390
+ if (i.policy === "disabled")
391
+ installable = "disabled";
392
+ else if (latest && undeployed.has(i.id)) {
393
+ installable = "not_deployed";
394
+ }
395
+ else if (i.policy === "needs_approval") {
396
+ installable = granted.has(i.id) ? "granted" : "needs_approval";
397
+ }
398
+ else
399
+ installable = "yes";
400
+ const a = pluginInstalls.find((x) => x.item_id === i.id);
401
+ out.push({
402
+ ...view,
403
+ installable,
404
+ installed: a
405
+ ? {
406
+ pluginInstallId: a.id,
407
+ version: a.version,
408
+ upgradeAvailable: upgrades.get(`${a.item_id}@${a.version}`)?.upgradeAvailable ?? null,
409
+ }
410
+ : null,
411
+ request: requests.get(i.id) ?? null,
412
+ });
413
+ }
414
+ return out;
415
+ }
416
+ /**
417
+ * Item detail (for the install wizard): the same view as the list (members don't see disabled
418
+ * items, not visible means `catalog.item_not_found`), plus the latest version's extension,
419
+ * connector templates (endpoint preset, editable paths, auth preset), dependencies, skills and
420
+ * agent templates.
421
+ */
422
+ async detail(orgId, accountId, itemId) {
423
+ if (!UUID_RE.test(itemId))
424
+ throw itemNotFound();
425
+ const [item] = await this.list(orgId, accountId, itemId);
426
+ if (!item)
427
+ throw itemNotFound();
428
+ const v = await this.d.db
429
+ .selectFrom("catalog_item_versions")
430
+ .select(["manifest", "object_prefix", "files"])
431
+ .where("item_id", "=", itemId)
432
+ .where("version", "=", item.latestVersion)
433
+ .executeTakeFirst();
434
+ if (!v)
435
+ throw itemNotFound();
436
+ const m = v.manifest;
437
+ return {
438
+ item,
439
+ hasIcon: m.icon !== undefined,
440
+ extension: m.extension ? m.name : null,
441
+ templates: (await readCatalogTemplates(this.d.storage, v)).map((t) => orgTemplateView(t.id, t.file)),
442
+ dependencies: (m.dependencies ?? []).map((d) => ({ name: d.name, range: d.version })),
443
+ skills: (m.skills ?? []).map((s) => packagePath(s.path)),
444
+ agents: (m.agents ?? []).map((a) => packagePath(a.path)),
445
+ };
446
+ }
447
+ /**
448
+ * The item's icon; members don't see disabled items (-> `catalog.item_not_found`, decided before
449
+ * reading storage).
450
+ */
451
+ icon(itemId, isAdmin) {
452
+ return readCatalogIcon(this.d.db, this.d.storage, itemId, isAdmin);
453
+ }
454
+ /** For the admin item detail: whether the latest version has an icon. */
455
+ hasIcon(itemId) {
456
+ return catalogHasIcon(this.d.db, itemId);
457
+ }
458
+ /**
459
+ * The items (latest versions) this replica cannot install now: the plugin's extension is not
460
+ * loaded, or a connector template's connector extension is not (or not at the template's
461
+ * `pluginVersion`). Dependencies are judged at install. A template that cannot be read counts as
462
+ * deployed here (the install reads it again).
463
+ */
464
+ async undeployed(versions) {
465
+ const loaded = new Map(this.d.host.manifests().map((m) => [m.name, m.version]));
466
+ const deps = {
467
+ findConnector: this.d.findConnector,
468
+ pluginVersion: (n) => loaded.get(n),
469
+ };
470
+ const out = new Set();
471
+ await Promise.all(versions.map(async (v) => {
472
+ const m = v.manifest;
473
+ if (m.extension && !loaded.has(m.name)) {
474
+ out.add(v.item_id);
475
+ return;
476
+ }
477
+ if ((m.connectorTemplates ?? []).length === 0)
478
+ return;
479
+ try {
480
+ const templates = await readCatalogTemplates(this.d.storage, v);
481
+ if (templates.some((t) => templatePluginProblem(deps, t.file.template) !== undefined)) {
482
+ out.add(v.item_id);
483
+ }
484
+ }
485
+ catch (e) {
486
+ // Unreadable here: counted as deployed, the install reports it
487
+ this.d.log?.warn("catalog template read failed in the org list", {
488
+ itemId: v.item_id,
489
+ error: e instanceof Error ? e.message : String(e),
490
+ });
491
+ }
492
+ }));
493
+ return out;
494
+ }
495
+ /** Installs a plugin in the org (see the class comment). */
496
+ async install(orgId, actor, itemId, body, actorTokenId) {
497
+ if (!UUID_RE.test(itemId))
498
+ throw itemNotFound();
499
+ // The role first (forbidden when it can install nothing), then item errors: a member cannot
500
+ // probe the existence or versions of a disabled item through error codes
501
+ await this.d.db.transaction().execute(async (t) => {
502
+ const { role } = await lockOrgAndAuthorize(t, orgId, actor, "catalog.read");
503
+ const canAny = ["org.extensions.manage", "connectors.manage", "skills.manage"].some((a) => can(role, a));
504
+ if (!canAny)
505
+ throw new ApiError("forbidden", "Insufficient organization role");
506
+ });
507
+ const item = await this.d.db
508
+ .selectFrom("catalog_items")
509
+ .selectAll()
510
+ .where("id", "=", itemId)
511
+ .where("deleted_at", "is", null)
512
+ .executeTakeFirst();
513
+ if (!item)
514
+ throw itemNotFound();
515
+ const version = body.version ?? item.latest_version;
516
+ const v = await this.d.db
517
+ .selectFrom("catalog_item_versions")
518
+ .select("version")
519
+ .where("item_id", "=", itemId)
520
+ .where("version", "=", version)
521
+ .executeTakeFirst();
522
+ if (!v)
523
+ throw new ApiError("catalog.item_not_found", `Version ${version} of this item not found`);
524
+ const opts = actorTokenId !== undefined ? { actorTokenId } : {};
525
+ if (item.policy === "disabled")
526
+ throw itemDisabled();
527
+ // Dependencies resolved, extensions deployed, template connectors available: before a request
528
+ // is created. The actions are the union over the plugins the install brings in
529
+ const { actions } = await this.d.pluginInstaller.preflight(orgId, actor, itemId, version);
530
+ // 1. Role and policy under the lock; needs_approval without a grant -> a request (202). Approval
531
+ // follows this plugin's policy only, not its dependencies' (spec §10)
532
+ const pending = await this.d.db.transaction().execute(async (t) => {
533
+ await lockOrgForActions(t, orgId, actor, actions);
534
+ const locked = await t
535
+ .selectFrom("catalog_items")
536
+ .select(["policy", "deleted_at"])
537
+ .where("id", "=", itemId)
538
+ .forShare()
539
+ .executeTakeFirst();
540
+ if (!locked || locked.deleted_at !== null)
541
+ throw itemNotFound();
542
+ if (locked.policy === "disabled")
543
+ throw itemDisabled();
544
+ if (locked.policy === "needs_approval") {
545
+ const grant = await t
546
+ .selectFrom("catalog_org_grants")
547
+ .select("item_id")
548
+ .where("item_id", "=", itemId)
549
+ .where("org_id", "=", orgId)
550
+ .executeTakeFirst();
551
+ if (!grant) {
552
+ return this.d.requests.requestDeployment(t, orgId, actor, item, version, opts);
553
+ }
554
+ }
555
+ return undefined;
556
+ });
557
+ if (pending !== undefined) {
558
+ return { status: 202, request: await this.d.requests.view(this.d.db, pending) };
559
+ }
560
+ // 2. Install (each step re-checks the item policy in its own transaction)
561
+ const { version: _version, ...input } = body;
562
+ const view = await this.d.pluginInstaller.install(orgId, actor, itemId, version, input, opts);
563
+ return {
564
+ status: 201,
565
+ installed: { itemId, version, pluginInstallId: view.id },
566
+ install: view,
567
+ };
568
+ }
569
+ /** The upgrade preview of an org install (spec §10, see `PluginUpgrader`). */
570
+ async upgradePreview(orgId, actor, installId, version) {
571
+ await this.assertCanInstall(orgId, actor);
572
+ return this.d.pluginUpgrader.preview(orgId, actor, installId, version);
573
+ }
574
+ /**
575
+ * Upgrades an org install in place (spec §10, Decision 11): the preview's `diffHash` is checked
576
+ * first (`plugin.upgrade_stale`); the item disabled -> `catalog.item_disabled`; needs_approval
577
+ * without a grant -> a stage deployment request for the target version (202; after approval the
578
+ * org admin runs the upgrade again); otherwise the upgrade runs (200, the install view).
579
+ */
580
+ async upgrade(orgId, actor, installId, body, actorTokenId) {
581
+ await this.assertCanInstall(orgId, actor);
582
+ const opts = actorTokenId !== undefined ? { actorTokenId } : {};
583
+ const { itemId, actions, diff } = await this.d.pluginUpgrader.check(orgId, actor, installId, body);
584
+ const pending = await this.d.db.transaction().execute(async (t) => {
585
+ await lockOrgForActions(t, orgId, actor, actions);
586
+ const locked = await t
587
+ .selectFrom("catalog_items")
588
+ .select(["id", "name", "policy", "deleted_at"])
589
+ .where("id", "=", itemId)
590
+ .forShare()
591
+ .executeTakeFirst();
592
+ if (!locked || locked.deleted_at !== null)
593
+ throw itemNotFound();
594
+ if (locked.policy === "disabled")
595
+ throw itemDisabled();
596
+ if (locked.policy !== "needs_approval")
597
+ return undefined;
598
+ const grant = await t
599
+ .selectFrom("catalog_org_grants")
600
+ .select("item_id")
601
+ .where("item_id", "=", itemId)
602
+ .where("org_id", "=", orgId)
603
+ .executeTakeFirst();
604
+ if (grant)
605
+ return undefined;
606
+ return this.d.requests.requestDeployment(t, orgId, actor, locked, body.version, opts);
607
+ });
608
+ if (pending !== undefined) {
609
+ return { status: 202, request: await this.d.requests.view(this.d.db, pending) };
610
+ }
611
+ return {
612
+ status: 200,
613
+ install: await this.d.pluginUpgrader.upgrade(orgId, actor, installId, body, opts, diff),
614
+ };
615
+ }
616
+ /** The actor can install something in the org (forbidden otherwise), checked before item errors. */
617
+ async assertCanInstall(orgId, actor) {
618
+ await this.d.db.transaction().execute(async (t) => {
619
+ const { role } = await lockOrgAndAuthorize(t, orgId, actor, "catalog.read");
620
+ const canAny = ["org.extensions.manage", "connectors.manage", "skills.manage"].some((a) => can(role, a));
621
+ if (!canAny)
622
+ throw new ApiError("forbidden", "Insufficient organization role");
623
+ });
624
+ }
625
+ }