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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (631) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +2 -0
  3. package/README.md +20 -2
  4. package/bootstrap.json +22 -0
  5. package/dist/admin/admin.controller.d.ts +139 -0
  6. package/dist/admin/admin.controller.js +238 -0
  7. package/dist/admin/extensions.controller.d.ts +100 -0
  8. package/dist/admin/extensions.controller.js +226 -0
  9. package/dist/admin/setup.controller.d.ts +36 -0
  10. package/dist/admin/setup.controller.js +106 -0
  11. package/dist/admin/setup.service.d.ts +47 -0
  12. package/dist/admin/setup.service.js +90 -0
  13. package/dist/agents/agents.controller.d.ts +205 -0
  14. package/dist/agents/agents.controller.js +144 -0
  15. package/dist/agents/agents.service.d.ts +177 -0
  16. package/dist/agents/agents.service.js +677 -0
  17. package/dist/agents/definition.d.ts +198 -0
  18. package/dist/agents/definition.js +152 -0
  19. package/dist/agents/models.controller.d.ts +13 -0
  20. package/dist/agents/models.controller.js +31 -0
  21. package/dist/agents/templates.controller.d.ts +15 -0
  22. package/dist/agents/templates.controller.js +37 -0
  23. package/dist/agents/templates.d.ts +83 -0
  24. package/dist/agents/templates.js +173 -0
  25. package/dist/catalog/admin-catalog.controller.d.ts +143 -0
  26. package/dist/catalog/admin-catalog.controller.js +245 -0
  27. package/dist/catalog/catalog.service.d.ts +430 -0
  28. package/dist/catalog/catalog.service.js +882 -0
  29. package/dist/catalog/claude/agents.d.ts +27 -0
  30. package/dist/catalog/claude/agents.js +270 -0
  31. package/dist/catalog/claude/commands.d.ts +50 -0
  32. package/dist/catalog/claude/commands.js +179 -0
  33. package/dist/catalog/claude/manifest.d.ts +69 -0
  34. package/dist/catalog/claude/manifest.js +134 -0
  35. package/dist/catalog/claude/marketplace.d.ts +35 -0
  36. package/dist/catalog/claude/marketplace.js +194 -0
  37. package/dist/catalog/claude/mcp.d.ts +33 -0
  38. package/dist/catalog/claude/mcp.js +226 -0
  39. package/dist/catalog/claude/report.d.ts +86 -0
  40. package/dist/catalog/claude/report.js +121 -0
  41. package/dist/catalog/claude/translate.d.ts +56 -0
  42. package/dist/catalog/claude/translate.js +857 -0
  43. package/dist/catalog/cli.d.ts +46 -0
  44. package/dist/catalog/cli.js +211 -0
  45. package/dist/catalog/git-source.d.ts +127 -0
  46. package/dist/catalog/git-source.js +520 -0
  47. package/dist/catalog/marketplace-fetch.d.ts +99 -0
  48. package/dist/catalog/marketplace-fetch.js +203 -0
  49. package/dist/catalog/marketplaces.controller.d.ts +97 -0
  50. package/dist/catalog/marketplaces.controller.js +197 -0
  51. package/dist/catalog/marketplaces.service.d.ts +340 -0
  52. package/dist/catalog/marketplaces.service.js +1217 -0
  53. package/dist/catalog/org-catalog.controller.d.ts +128 -0
  54. package/dist/catalog/org-catalog.controller.js +277 -0
  55. package/dist/catalog/org-catalog.service.d.ts +246 -0
  56. package/dist/catalog/org-catalog.service.js +625 -0
  57. package/dist/catalog/plugin-import.d.ts +436 -0
  58. package/dist/catalog/plugin-import.js +1069 -0
  59. package/dist/catalog/plugin-install.d.ts +447 -0
  60. package/dist/catalog/plugin-install.js +1333 -0
  61. package/dist/catalog/plugin-package.d.ts +143 -0
  62. package/dist/catalog/plugin-package.js +382 -0
  63. package/dist/catalog/plugin-upgrade.d.ts +222 -0
  64. package/dist/catalog/plugin-upgrade.js +1219 -0
  65. package/dist/catalog/requests.service.d.ts +162 -0
  66. package/dist/catalog/requests.service.js +504 -0
  67. package/dist/catalog/schema-path.d.ts +7 -0
  68. package/dist/catalog/schema-path.js +63 -0
  69. package/dist/catalog/upgrade-targets.d.ts +59 -0
  70. package/dist/catalog/upgrade-targets.js +90 -0
  71. package/dist/catalog/versions.d.ts +31 -0
  72. package/dist/catalog/versions.js +44 -0
  73. package/dist/channels/actions.d.ts +37 -0
  74. package/dist/channels/actions.js +121 -0
  75. package/dist/channels/cards.d.ts +44 -0
  76. package/dist/channels/cards.js +156 -0
  77. package/dist/channels/connections.controller.d.ts +59 -0
  78. package/dist/channels/connections.controller.js +115 -0
  79. package/dist/channels/connections.service.d.ts +187 -0
  80. package/dist/channels/connections.service.js +534 -0
  81. package/dist/channels/features.d.ts +12 -0
  82. package/dist/channels/features.js +22 -0
  83. package/dist/channels/inbound.d.ts +120 -0
  84. package/dist/channels/inbound.js +332 -0
  85. package/dist/channels/outbound.d.ts +140 -0
  86. package/dist/channels/outbound.js +1125 -0
  87. package/dist/channels/phrases.d.ts +100 -0
  88. package/dist/channels/phrases.js +81 -0
  89. package/dist/channels/supervisor.d.ts +182 -0
  90. package/dist/channels/supervisor.js +625 -0
  91. package/dist/channels/threads.d.ts +29 -0
  92. package/dist/channels/threads.js +104 -0
  93. package/dist/channels/webhook-url.d.ts +16 -0
  94. package/dist/channels/webhook-url.js +34 -0
  95. package/dist/channels/webhook.controller.d.ts +19 -0
  96. package/dist/channels/webhook.controller.js +72 -0
  97. package/dist/channels/webhook.d.ts +73 -0
  98. package/dist/channels/webhook.js +274 -0
  99. package/dist/config/docs.d.ts +9 -0
  100. package/dist/config/docs.js +85 -0
  101. package/dist/config/env.d.ts +6 -0
  102. package/dist/config/env.js +73 -0
  103. package/dist/config/fields.d.ts +42 -0
  104. package/dist/config/fields.js +214 -0
  105. package/dist/config/file-source.d.ts +3 -0
  106. package/dist/config/file-source.js +31 -0
  107. package/dist/config/load.d.ts +20 -0
  108. package/dist/config/load.js +98 -0
  109. package/dist/config/nacos-source.d.ts +31 -0
  110. package/dist/config/nacos-source.js +229 -0
  111. package/dist/config/schema.d.ts +223 -0
  112. package/dist/config/schema.js +1151 -0
  113. package/dist/config/sources.d.ts +18 -0
  114. package/dist/config/sources.js +59 -0
  115. package/dist/config/types.d.ts +9 -0
  116. package/dist/config/types.js +7 -0
  117. package/dist/conversations/artifacts.d.ts +52 -0
  118. package/dist/conversations/artifacts.js +137 -0
  119. package/dist/conversations/attachments.controller.d.ts +28 -0
  120. package/dist/conversations/attachments.controller.js +96 -0
  121. package/dist/conversations/attachments.service.d.ts +180 -0
  122. package/dist/conversations/attachments.service.js +578 -0
  123. package/dist/conversations/conversations.controller.d.ts +288 -0
  124. package/dist/conversations/conversations.controller.js +607 -0
  125. package/dist/conversations/conversations.service.d.ts +321 -0
  126. package/dist/conversations/conversations.service.js +754 -0
  127. package/dist/conversations/event-log.d.ts +122 -0
  128. package/dist/conversations/event-log.js +259 -0
  129. package/dist/conversations/events.d.ts +856 -0
  130. package/dist/conversations/events.js +639 -0
  131. package/dist/conversations/files.d.ts +92 -0
  132. package/dist/conversations/files.js +213 -0
  133. package/dist/conversations/outputs-read.d.ts +34 -0
  134. package/dist/conversations/outputs-read.js +37 -0
  135. package/dist/conversations/queue.d.ts +169 -0
  136. package/dist/conversations/queue.js +527 -0
  137. package/dist/conversations/sandbox-status.d.ts +21 -0
  138. package/dist/conversations/sandbox-status.js +24 -0
  139. package/dist/conversations/selection.d.ts +46 -0
  140. package/dist/conversations/selection.js +75 -0
  141. package/dist/conversations/titles.d.ts +93 -0
  142. package/dist/conversations/titles.js +422 -0
  143. package/dist/ctx/bus.d.ts +16 -0
  144. package/dist/ctx/bus.js +101 -0
  145. package/dist/ctx/create-ctx.d.ts +109 -0
  146. package/dist/ctx/create-ctx.js +592 -0
  147. package/dist/ctx/kv.d.ts +4 -0
  148. package/dist/ctx/kv.js +31 -0
  149. package/dist/ctx/lock.d.ts +4 -0
  150. package/dist/ctx/lock.js +39 -0
  151. package/dist/ctx/namespace.d.ts +6 -0
  152. package/dist/ctx/namespace.js +12 -0
  153. package/dist/ctx/queue.d.ts +25 -0
  154. package/dist/ctx/queue.js +150 -0
  155. package/dist/ctx/secrets.d.ts +45 -0
  156. package/dist/ctx/secrets.js +175 -0
  157. package/dist/db/kernel-schema.d.ts +1122 -0
  158. package/dist/db/kernel-schema.js +5 -0
  159. package/dist/db/migrator.d.ts +28 -0
  160. package/dist/db/migrator.js +140 -0
  161. package/dist/db/pool.d.ts +21 -0
  162. package/dist/db/pool.js +28 -0
  163. package/dist/db/sql-statements.d.ts +34 -0
  164. package/dist/db/sql-statements.js +168 -0
  165. package/dist/errors.d.ts +210 -0
  166. package/dist/errors.js +212 -0
  167. package/dist/evals/budget.d.ts +61 -0
  168. package/dist/evals/budget.js +181 -0
  169. package/dist/evals/diff.d.ts +55 -0
  170. package/dist/evals/diff.js +133 -0
  171. package/dist/evals/judge.d.ts +53 -0
  172. package/dist/evals/judge.js +149 -0
  173. package/dist/evals/plan.d.ts +47 -0
  174. package/dist/evals/plan.js +77 -0
  175. package/dist/evals/reconstruct.d.ts +137 -0
  176. package/dist/evals/reconstruct.js +322 -0
  177. package/dist/evals/recorded-tools.d.ts +54 -0
  178. package/dist/evals/recorded-tools.js +167 -0
  179. package/dist/evals/run-replay.d.ts +86 -0
  180. package/dist/evals/run-replay.js +502 -0
  181. package/dist/evals/runs.controller.d.ts +100 -0
  182. package/dist/evals/runs.controller.js +199 -0
  183. package/dist/evals/runs.service.d.ts +275 -0
  184. package/dist/evals/runs.service.js +836 -0
  185. package/dist/evals/sets.controller.d.ts +61 -0
  186. package/dist/evals/sets.controller.js +183 -0
  187. package/dist/evals/sets.service.d.ts +128 -0
  188. package/dist/evals/sets.service.js +558 -0
  189. package/dist/evals/snapshot.d.ts +76 -0
  190. package/dist/evals/snapshot.js +207 -0
  191. package/dist/evals/step-replay.d.ts +113 -0
  192. package/dist/evals/step-replay.js +181 -0
  193. package/dist/evals/trajectory.controller.d.ts +41 -0
  194. package/dist/evals/trajectory.controller.js +88 -0
  195. package/dist/evals/trajectory.d.ts +144 -0
  196. package/dist/evals/trajectory.js +338 -0
  197. package/dist/evals/trajectory.service.d.ts +108 -0
  198. package/dist/evals/trajectory.service.js +323 -0
  199. package/dist/evals/worker.d.ts +101 -0
  200. package/dist/evals/worker.js +789 -0
  201. package/dist/extensions/admin-ops.d.ts +105 -0
  202. package/dist/extensions/admin-ops.js +353 -0
  203. package/dist/extensions/admin-view.d.ts +79 -0
  204. package/dist/extensions/admin-view.js +327 -0
  205. package/dist/extensions/approvals.d.ts +119 -0
  206. package/dist/extensions/approvals.js +205 -0
  207. package/dist/extensions/blobs.d.ts +45 -0
  208. package/dist/extensions/blobs.js +160 -0
  209. package/dist/extensions/bootstrap.d.ts +149 -0
  210. package/dist/extensions/bootstrap.js +441 -0
  211. package/dist/extensions/cli.d.ts +61 -0
  212. package/dist/extensions/cli.js +165 -0
  213. package/dist/extensions/config-json-schema.d.ts +9 -0
  214. package/dist/extensions/config-json-schema.js +73 -0
  215. package/dist/extensions/deployment-config.d.ts +138 -0
  216. package/dist/extensions/deployment-config.js +394 -0
  217. package/dist/extensions/enabled.d.ts +31 -0
  218. package/dist/extensions/enabled.js +55 -0
  219. package/dist/extensions/hooks.d.ts +161 -0
  220. package/dist/extensions/hooks.js +425 -0
  221. package/dist/extensions/host.d.ts +577 -0
  222. package/dist/extensions/host.js +2071 -0
  223. package/dist/extensions/inflight.d.ts +69 -0
  224. package/dist/extensions/inflight.js +277 -0
  225. package/dist/extensions/installs.d.ts +166 -0
  226. package/dist/extensions/installs.js +253 -0
  227. package/dist/extensions/instance.d.ts +167 -0
  228. package/dist/extensions/instance.js +329 -0
  229. package/dist/extensions/ledger.d.ts +30 -0
  230. package/dist/extensions/ledger.js +50 -0
  231. package/dist/extensions/lifecycle.d.ts +80 -0
  232. package/dist/extensions/lifecycle.js +152 -0
  233. package/dist/extensions/migrate-lock.d.ts +51 -0
  234. package/dist/extensions/migrate-lock.js +100 -0
  235. package/dist/extensions/org-config.controller.d.ts +24 -0
  236. package/dist/extensions/org-config.controller.js +59 -0
  237. package/dist/extensions/org-config.d.ts +169 -0
  238. package/dist/extensions/org-config.js +520 -0
  239. package/dist/extensions/package.d.ts +115 -0
  240. package/dist/extensions/package.js +246 -0
  241. package/dist/extensions/permission-set.d.ts +117 -0
  242. package/dist/extensions/permission-set.js +184 -0
  243. package/dist/extensions/permission-view.d.ts +194 -0
  244. package/dist/extensions/permission-view.js +284 -0
  245. package/dist/extensions/registry.d.ts +24 -0
  246. package/dist/extensions/registry.js +56 -0
  247. package/dist/extensions/resolve.d.ts +12 -0
  248. package/dist/extensions/resolve.js +71 -0
  249. package/dist/extensions/sources.d.ts +69 -0
  250. package/dist/extensions/sources.js +120 -0
  251. package/dist/extensions/sync.d.ts +40 -0
  252. package/dist/extensions/sync.js +242 -0
  253. package/dist/files/previewers.controller.d.ts +46 -0
  254. package/dist/files/previewers.controller.js +105 -0
  255. package/dist/files/previewers.d.ts +100 -0
  256. package/dist/files/previewers.js +250 -0
  257. package/dist/http/api.module.d.ts +114 -0
  258. package/dist/http/api.module.js +448 -0
  259. package/dist/http/app.d.ts +77 -0
  260. package/dist/http/app.js +170 -0
  261. package/dist/http/error.filter.d.ts +21 -0
  262. package/dist/http/error.filter.js +85 -0
  263. package/dist/http/gateway.module.d.ts +15 -0
  264. package/dist/http/gateway.module.js +13 -0
  265. package/dist/http/health.controller.d.ts +26 -0
  266. package/dist/http/health.controller.js +79 -0
  267. package/dist/http/nest-logger.d.ts +20 -0
  268. package/dist/http/nest-logger.js +28 -0
  269. package/dist/http/plugin-dispatch.d.ts +68 -0
  270. package/dist/http/plugin-dispatch.js +200 -0
  271. package/dist/http/tokens.d.ts +131 -0
  272. package/dist/http/tokens.js +131 -0
  273. package/dist/http/zod.pipe.d.ts +8 -0
  274. package/dist/http/zod.pipe.js +14 -0
  275. package/dist/identity/accounts.d.ts +93 -0
  276. package/dist/identity/accounts.js +367 -0
  277. package/dist/identity/api-tokens.d.ts +73 -0
  278. package/dist/identity/api-tokens.js +197 -0
  279. package/dist/identity/audit.d.ts +23 -0
  280. package/dist/identity/audit.js +41 -0
  281. package/dist/identity/auth.controller.d.ts +40 -0
  282. package/dist/identity/auth.controller.js +130 -0
  283. package/dist/identity/auth.guard.d.ts +41 -0
  284. package/dist/identity/auth.guard.js +162 -0
  285. package/dist/identity/binding.d.ts +47 -0
  286. package/dist/identity/binding.js +84 -0
  287. package/dist/identity/cookies.d.ts +16 -0
  288. package/dist/identity/cookies.js +32 -0
  289. package/dist/identity/credential-check.d.ts +17 -0
  290. package/dist/identity/credential-check.js +24 -0
  291. package/dist/identity/enterprise-admin.d.ts +14 -0
  292. package/dist/identity/enterprise-admin.js +27 -0
  293. package/dist/identity/external.d.ts +106 -0
  294. package/dist/identity/external.js +337 -0
  295. package/dist/identity/hash.d.ts +2 -0
  296. package/dist/identity/hash.js +3 -0
  297. package/dist/identity/login.d.ts +6 -0
  298. package/dist/identity/login.js +20 -0
  299. package/dist/identity/me.controller.d.ts +61 -0
  300. package/dist/identity/me.controller.js +159 -0
  301. package/dist/identity/passwords.d.ts +6 -0
  302. package/dist/identity/passwords.js +37 -0
  303. package/dist/identity/principal.d.ts +56 -0
  304. package/dist/identity/principal.js +38 -0
  305. package/dist/identity/rate-limit.d.ts +55 -0
  306. package/dist/identity/rate-limit.js +121 -0
  307. package/dist/identity/sessions.d.ts +84 -0
  308. package/dist/identity/sessions.js +306 -0
  309. package/dist/identity/settings.d.ts +121 -0
  310. package/dist/identity/settings.js +248 -0
  311. package/dist/identity/sso.controller.d.ts +59 -0
  312. package/dist/identity/sso.controller.js +192 -0
  313. package/dist/identity/sso.d.ts +83 -0
  314. package/dist/identity/sso.js +202 -0
  315. package/dist/inbox/inbox.service.d.ts +43 -0
  316. package/dist/inbox/inbox.service.js +57 -0
  317. package/dist/index.d.ts +67 -0
  318. package/dist/index.js +65 -0
  319. package/dist/kernel.d.ts +256 -0
  320. package/dist/kernel.js +1326 -0
  321. package/dist/log.d.ts +48 -0
  322. package/dist/log.js +229 -0
  323. package/dist/models/prices.d.ts +53 -0
  324. package/dist/models/prices.js +121 -0
  325. package/dist/models/purposes.controller.d.ts +19 -0
  326. package/dist/models/purposes.controller.js +56 -0
  327. package/dist/models/purposes.d.ts +140 -0
  328. package/dist/models/purposes.js +267 -0
  329. package/dist/net/proxy.d.ts +44 -0
  330. package/dist/net/proxy.js +162 -0
  331. package/dist/net/public-address.d.ts +60 -0
  332. package/dist/net/public-address.js +271 -0
  333. package/dist/net/safe-fetch.d.ts +38 -0
  334. package/dist/net/safe-fetch.js +140 -0
  335. package/dist/orgs/directory-sync.controller.d.ts +14 -0
  336. package/dist/orgs/directory-sync.controller.js +40 -0
  337. package/dist/orgs/directory-sync.d.ts +166 -0
  338. package/dist/orgs/directory-sync.js +558 -0
  339. package/dist/orgs/invitations.controller.d.ts +58 -0
  340. package/dist/orgs/invitations.controller.js +137 -0
  341. package/dist/orgs/invitations.service.d.ts +80 -0
  342. package/dist/orgs/invitations.service.js +217 -0
  343. package/dist/orgs/members.service.d.ts +63 -0
  344. package/dist/orgs/members.service.js +234 -0
  345. package/dist/orgs/offboarding.d.ts +141 -0
  346. package/dist/orgs/offboarding.js +398 -0
  347. package/dist/orgs/org-lock.d.ts +32 -0
  348. package/dist/orgs/org-lock.js +46 -0
  349. package/dist/orgs/org.guard.d.ts +35 -0
  350. package/dist/orgs/org.guard.js +95 -0
  351. package/dist/orgs/orgs.controller.d.ts +78 -0
  352. package/dist/orgs/orgs.controller.js +192 -0
  353. package/dist/orgs/orgs.service.d.ts +61 -0
  354. package/dist/orgs/orgs.service.js +209 -0
  355. package/dist/orgs/roles.d.ts +13 -0
  356. package/dist/orgs/roles.js +58 -0
  357. package/dist/orgs/settings.controller.d.ts +20 -0
  358. package/dist/orgs/settings.controller.js +53 -0
  359. package/dist/orgs/settings.service.d.ts +120 -0
  360. package/dist/orgs/settings.service.js +178 -0
  361. package/dist/packages/npm.d.ts +50 -0
  362. package/dist/packages/npm.js +218 -0
  363. package/dist/packages/provenance.d.ts +47 -0
  364. package/dist/packages/provenance.js +147 -0
  365. package/dist/packages/tgz.d.ts +76 -0
  366. package/dist/packages/tgz.js +225 -0
  367. package/dist/runtime/abort.d.ts +32 -0
  368. package/dist/runtime/abort.js +71 -0
  369. package/dist/runtime/checkpointer.d.ts +32 -0
  370. package/dist/runtime/checkpointer.js +243 -0
  371. package/dist/runtime/context/build.d.ts +254 -0
  372. package/dist/runtime/context/build.js +693 -0
  373. package/dist/runtime/context/claude-tools.d.ts +11 -0
  374. package/dist/runtime/context/claude-tools.js +24 -0
  375. package/dist/runtime/context/compaction.d.ts +26 -0
  376. package/dist/runtime/context/compaction.js +195 -0
  377. package/dist/runtime/context/pairing.d.ts +11 -0
  378. package/dist/runtime/context/pairing.js +82 -0
  379. package/dist/runtime/context/reminders.d.ts +5 -0
  380. package/dist/runtime/context/reminders.js +11 -0
  381. package/dist/runtime/context/skills.d.ts +105 -0
  382. package/dist/runtime/context/skills.js +283 -0
  383. package/dist/runtime/context/tokens.d.ts +19 -0
  384. package/dist/runtime/context/tokens.js +104 -0
  385. package/dist/runtime/conversation-lock.d.ts +40 -0
  386. package/dist/runtime/conversation-lock.js +97 -0
  387. package/dist/runtime/hook-calls.d.ts +84 -0
  388. package/dist/runtime/hook-calls.js +136 -0
  389. package/dist/runtime/langgraph-loop.d.ts +52 -0
  390. package/dist/runtime/langgraph-loop.js +247 -0
  391. package/dist/runtime/loop.d.ts +93 -0
  392. package/dist/runtime/loop.js +7 -0
  393. package/dist/runtime/maintenance.d.ts +80 -0
  394. package/dist/runtime/maintenance.js +147 -0
  395. package/dist/runtime/media-cache.d.ts +21 -0
  396. package/dist/runtime/media-cache.js +51 -0
  397. package/dist/runtime/model-call.d.ts +176 -0
  398. package/dist/runtime/model-call.js +1049 -0
  399. package/dist/runtime/providers.d.ts +86 -0
  400. package/dist/runtime/providers.js +224 -0
  401. package/dist/runtime/quota.d.ts +29 -0
  402. package/dist/runtime/quota.js +70 -0
  403. package/dist/runtime/run-finish.d.ts +45 -0
  404. package/dist/runtime/run-finish.js +69 -0
  405. package/dist/runtime/run-queue.d.ts +121 -0
  406. package/dist/runtime/run-queue.js +493 -0
  407. package/dist/runtime/run-worker.d.ts +138 -0
  408. package/dist/runtime/run-worker.js +805 -0
  409. package/dist/runtime/stream.controller.d.ts +34 -0
  410. package/dist/runtime/stream.controller.js +122 -0
  411. package/dist/runtime/stream.d.ts +63 -0
  412. package/dist/runtime/stream.js +262 -0
  413. package/dist/runtime/subagents/child.d.ts +80 -0
  414. package/dist/runtime/subagents/child.js +225 -0
  415. package/dist/runtime/subagents/definition.d.ts +103 -0
  416. package/dist/runtime/subagents/definition.js +392 -0
  417. package/dist/runtime/subagents/dispatch.d.ts +69 -0
  418. package/dist/runtime/subagents/dispatch.js +502 -0
  419. package/dist/runtime/subagents/limits.d.ts +23 -0
  420. package/dist/runtime/subagents/limits.js +34 -0
  421. package/dist/runtime/subagents/org-agents.d.ts +50 -0
  422. package/dist/runtime/subagents/org-agents.js +70 -0
  423. package/dist/runtime/subagents/preamble.d.ts +7 -0
  424. package/dist/runtime/subagents/preamble.js +11 -0
  425. package/dist/runtime/subagents/progress.d.ts +26 -0
  426. package/dist/runtime/subagents/progress.js +36 -0
  427. package/dist/runtime/subagents/roster.d.ts +55 -0
  428. package/dist/runtime/subagents/roster.js +111 -0
  429. package/dist/runtime/subagents/skill-fork.d.ts +123 -0
  430. package/dist/runtime/subagents/skill-fork.js +259 -0
  431. package/dist/runtime/usage-report.d.ts +163 -0
  432. package/dist/runtime/usage-report.js +550 -0
  433. package/dist/runtime/waits.d.ts +233 -0
  434. package/dist/runtime/waits.js +883 -0
  435. package/dist/sandbox/leases.d.ts +169 -0
  436. package/dist/sandbox/leases.js +515 -0
  437. package/dist/sandbox/lifecycle.d.ts +21 -0
  438. package/dist/sandbox/lifecycle.js +68 -0
  439. package/dist/sandbox/sandbox.service.d.ts +249 -0
  440. package/dist/sandbox/sandbox.service.js +908 -0
  441. package/dist/skills/catalog.d.ts +149 -0
  442. package/dist/skills/catalog.js +405 -0
  443. package/dist/skills/changes.controller.d.ts +56 -0
  444. package/dist/skills/changes.controller.js +136 -0
  445. package/dist/skills/changes.service.d.ts +175 -0
  446. package/dist/skills/changes.service.js +805 -0
  447. package/dist/skills/invocable.controller.d.ts +23 -0
  448. package/dist/skills/invocable.controller.js +50 -0
  449. package/dist/skills/invocation-keys.d.ts +23 -0
  450. package/dist/skills/invocation-keys.js +44 -0
  451. package/dist/skills/invoke.d.ts +135 -0
  452. package/dist/skills/invoke.js +286 -0
  453. package/dist/skills/package.d.ts +87 -0
  454. package/dist/skills/package.js +227 -0
  455. package/dist/skills/skills.controller.d.ts +40 -0
  456. package/dist/skills/skills.controller.js +110 -0
  457. package/dist/skills/skills.service.d.ts +192 -0
  458. package/dist/skills/skills.service.js +567 -0
  459. package/dist/storage/prefix.d.ts +36 -0
  460. package/dist/storage/prefix.js +104 -0
  461. package/dist/storage/purge.d.ts +27 -0
  462. package/dist/storage/purge.js +75 -0
  463. package/dist/storage/storage.service.d.ts +44 -0
  464. package/dist/storage/storage.service.js +145 -0
  465. package/dist/text.d.ts +13 -0
  466. package/dist/text.js +13 -0
  467. package/dist/tools/approvals.controller.d.ts +53 -0
  468. package/dist/tools/approvals.controller.js +128 -0
  469. package/dist/tools/approvals.service.d.ts +172 -0
  470. package/dist/tools/approvals.service.js +568 -0
  471. package/dist/tools/breaker.d.ts +28 -0
  472. package/dist/tools/breaker.js +72 -0
  473. package/dist/tools/builtins/agent.d.ts +81 -0
  474. package/dist/tools/builtins/agent.js +223 -0
  475. package/dist/tools/builtins/ask-user.d.ts +28 -0
  476. package/dist/tools/builtins/ask-user.js +139 -0
  477. package/dist/tools/builtins/read-tool-output.d.ts +18 -0
  478. package/dist/tools/builtins/read-tool-output.js +108 -0
  479. package/dist/tools/builtins/sandbox/bash.d.ts +16 -0
  480. package/dist/tools/builtins/sandbox/bash.js +137 -0
  481. package/dist/tools/builtins/sandbox/common.d.ts +114 -0
  482. package/dist/tools/builtins/sandbox/common.js +304 -0
  483. package/dist/tools/builtins/sandbox/deliver.d.ts +5 -0
  484. package/dist/tools/builtins/sandbox/deliver.js +180 -0
  485. package/dist/tools/builtins/sandbox/edit.d.ts +4 -0
  486. package/dist/tools/builtins/sandbox/edit.js +98 -0
  487. package/dist/tools/builtins/sandbox/glob-match.d.ts +25 -0
  488. package/dist/tools/builtins/sandbox/glob-match.js +240 -0
  489. package/dist/tools/builtins/sandbox/glob.d.ts +4 -0
  490. package/dist/tools/builtins/sandbox/glob.js +104 -0
  491. package/dist/tools/builtins/sandbox/grep.d.ts +9 -0
  492. package/dist/tools/builtins/sandbox/grep.js +133 -0
  493. package/dist/tools/builtins/sandbox/index.d.ts +12 -0
  494. package/dist/tools/builtins/sandbox/index.js +27 -0
  495. package/dist/tools/builtins/sandbox/names.d.ts +7 -0
  496. package/dist/tools/builtins/sandbox/names.js +20 -0
  497. package/dist/tools/builtins/sandbox/read.d.ts +8 -0
  498. package/dist/tools/builtins/sandbox/read.js +121 -0
  499. package/dist/tools/builtins/sandbox/write.d.ts +4 -0
  500. package/dist/tools/builtins/sandbox/write.js +88 -0
  501. package/dist/tools/builtins/skill-load.d.ts +53 -0
  502. package/dist/tools/builtins/skill-load.js +446 -0
  503. package/dist/tools/builtins/skill-write.d.ts +59 -0
  504. package/dist/tools/builtins/skill-write.js +244 -0
  505. package/dist/tools/builtins/tool-search.d.ts +31 -0
  506. package/dist/tools/builtins/tool-search.js +171 -0
  507. package/dist/tools/connector-content.controller.d.ts +34 -0
  508. package/dist/tools/connector-content.controller.js +78 -0
  509. package/dist/tools/connector-content.d.ts +104 -0
  510. package/dist/tools/connector-content.js +267 -0
  511. package/dist/tools/connectors.controller.d.ts +210 -0
  512. package/dist/tools/connectors.controller.js +234 -0
  513. package/dist/tools/connectors.service.d.ts +303 -0
  514. package/dist/tools/connectors.service.js +1102 -0
  515. package/dist/tools/credentials.d.ts +139 -0
  516. package/dist/tools/credentials.js +351 -0
  517. package/dist/tools/drift.d.ts +141 -0
  518. package/dist/tools/drift.js +539 -0
  519. package/dist/tools/elicitation.d.ts +81 -0
  520. package/dist/tools/elicitation.js +266 -0
  521. package/dist/tools/endpoint.d.ts +18 -0
  522. package/dist/tools/endpoint.js +115 -0
  523. package/dist/tools/info.d.ts +67 -0
  524. package/dist/tools/info.js +113 -0
  525. package/dist/tools/naming.d.ts +27 -0
  526. package/dist/tools/naming.js +47 -0
  527. package/dist/tools/oauth/discovery.d.ts +65 -0
  528. package/dist/tools/oauth/discovery.js +307 -0
  529. package/dist/tools/oauth/flow.d.ts +63 -0
  530. package/dist/tools/oauth/flow.js +237 -0
  531. package/dist/tools/oauth/oauth.controller.d.ts +31 -0
  532. package/dist/tools/oauth/oauth.controller.js +95 -0
  533. package/dist/tools/oauth/tokens.d.ts +111 -0
  534. package/dist/tools/oauth/tokens.js +258 -0
  535. package/dist/tools/outputs.d.ts +61 -0
  536. package/dist/tools/outputs.js +156 -0
  537. package/dist/tools/pipeline.d.ts +322 -0
  538. package/dist/tools/pipeline.js +1236 -0
  539. package/dist/tools/policy.d.ts +60 -0
  540. package/dist/tools/policy.js +236 -0
  541. package/dist/tools/questions.controller.d.ts +24 -0
  542. package/dist/tools/questions.controller.js +58 -0
  543. package/dist/tools/questions.service.d.ts +103 -0
  544. package/dist/tools/questions.service.js +295 -0
  545. package/dist/tools/redact.d.ts +20 -0
  546. package/dist/tools/redact.js +60 -0
  547. package/dist/tools/registry.d.ts +246 -0
  548. package/dist/tools/registry.js +481 -0
  549. package/dist/tools/resources.d.ts +16 -0
  550. package/dist/tools/resources.js +76 -0
  551. package/dist/tools/specs.d.ts +14 -0
  552. package/dist/tools/specs.js +31 -0
  553. package/dist/tools/validate.d.ts +20 -0
  554. package/dist/tools/validate.js +183 -0
  555. package/dist/tools/view.d.ts +43 -0
  556. package/dist/tools/view.js +225 -0
  557. package/dist/ui/embed-token.d.ts +31 -0
  558. package/dist/ui/embed-token.js +132 -0
  559. package/dist/ui/registry.d.ts +58 -0
  560. package/dist/ui/registry.js +90 -0
  561. package/dist/ui/ui-stream.d.ts +37 -0
  562. package/dist/ui/ui-stream.js +162 -0
  563. package/dist/ui/views.controller.d.ts +81 -0
  564. package/dist/ui/views.controller.js +261 -0
  565. package/dist/ui/views.d.ts +155 -0
  566. package/dist/ui/views.js +306 -0
  567. package/dist/version.d.ts +5 -0
  568. package/dist/version.js +6 -0
  569. package/package.json +67 -3
  570. package/src/migrations/0001_init.sql +8 -0
  571. package/src/migrations/0002_secrets.sql +8 -0
  572. package/src/migrations/0003_identity.sql +117 -0
  573. package/src/migrations/0004_plugin_org_config_nullable.sql +3 -0
  574. package/src/migrations/0005_agents.sql +27 -0
  575. package/src/migrations/0006_conversations.sql +37 -0
  576. package/src/migrations/0007_checkpoints.sql +26 -0
  577. package/src/migrations/0008_runs_trigger_seq.sql +3 -0
  578. package/src/migrations/0009_runs_active_unique.sql +4 -0
  579. package/src/migrations/0010_tools.sql +125 -0
  580. package/src/migrations/0011_approvals_spec.sql +10 -0
  581. package/src/migrations/0012_run_waits.sql +24 -0
  582. package/src/migrations/0013_app_tools_source.sql +4 -0
  583. package/src/migrations/0014_tool_specs.sql +8 -0
  584. package/src/migrations/0015_tool_drift.sql +20 -0
  585. package/src/migrations/0016_plugin_permissions.sql +11 -0
  586. package/src/migrations/0017_identity_sources.sql +6 -0
  587. package/src/migrations/0018_channels.sql +74 -0
  588. package/src/migrations/0019_identity_trust.sql +17 -0
  589. package/src/migrations/0020_channel_card_lookup.sql +10 -0
  590. package/src/migrations/0021_org_storage_purge.sql +9 -0
  591. package/src/migrations/0022_attachments.sql +29 -0
  592. package/src/migrations/0023_sandboxes.sql +37 -0
  593. package/src/migrations/0024_skills.sql +46 -0
  594. package/src/migrations/0025_skills_catalog_idx.sql +6 -0
  595. package/src/migrations/0026_skill_changes.sql +34 -0
  596. package/src/migrations/0027_model_prices.sql +18 -0
  597. package/src/migrations/0028_evals.sql +105 -0
  598. package/src/migrations/0029_model_purposes.sql +18 -0
  599. package/src/migrations/0030_plugin_installs.sql +73 -0
  600. package/src/migrations/0031_plugin_snapshot_source.sql +6 -0
  601. package/src/migrations/0032_plugin_deployment_configs.sql +10 -0
  602. package/src/migrations/0033_rename_apps_to_connectors.sql +25 -0
  603. package/src/migrations/0034_directory.sql +49 -0
  604. package/src/migrations/0035_catalogs.sql +40 -0
  605. package/src/migrations/0036_app_import_staging.sql +17 -0
  606. package/src/migrations/0037_directory_installs.sql +92 -0
  607. package/src/migrations/0038_channel_inbound_mode.sql +6 -0
  608. package/src/migrations/0039_channel_card_pending.sql +8 -0
  609. package/src/migrations/0040_usage_report_sweep.sql +10 -0
  610. package/src/migrations/0041_rename_plugins_to_extensions.sql +38 -0
  611. package/src/migrations/0042_rename_directory_to_catalog.sql +80 -0
  612. package/src/migrations/0043_rename_app_installs_to_plugin_installs.sql +20 -0
  613. package/src/migrations/0044_catalog_one_kind.sql +90 -0
  614. package/src/migrations/0045_plugin_dependencies.sql +9 -0
  615. package/src/migrations/0046_git_sources.sql +25 -0
  616. package/src/migrations/0047_marketplace_entry_heads.sql +7 -0
  617. package/src/migrations/0048_marketplace_entry_trees.sql +8 -0
  618. package/src/migrations/0049_plugin_upgrades.sql +37 -0
  619. package/src/migrations/0050_bootstrap.sql +53 -0
  620. package/src/migrations/0051_claude_compat.sql +26 -0
  621. package/src/migrations/0052_conversations_account_agent_idx.sql +5 -0
  622. package/src/migrations/0053_subagents.sql +73 -0
  623. package/src/migrations/0054_subagent_wait_expiry.sql +7 -0
  624. package/src/migrations/0055_subagent_parent_indexes.sql +10 -0
  625. package/src/migrations/0056_approval_reason.sql +3 -0
  626. package/src/migrations/0057_conversation_titles.sql +11 -0
  627. package/src/migrations/0058_conversation_selection.sql +4 -0
  628. package/src/migrations/0059_conversation_queue.sql +22 -0
  629. package/src/migrations/0060_file_previewers.sql +10 -0
  630. package/src/migrations/0061_queue_selection.sql +5 -0
  631. package/src/migrations/0062_queued_skill.sql +8 -0
@@ -0,0 +1,194 @@
1
+ import { type PermissionSet } from "./permission-set.js";
2
+ import type { ExtensionSource } from "./sources.js";
3
+ /**
4
+ * Review digest: the first 16 hex digits of `sha256(permissionKeys(set).join("\n"))`; with migration
5
+ * warnings their digest (kind, file, line and statement) is folded in, without warnings it equals the
6
+ * permissions-only digest. The caller sends it back when approving, and approval is refused when it
7
+ * differs from the one recomputed now (permissions or warnings changed after the review,
8
+ * `extension.approval_stale`).
9
+ */
10
+ export declare function reviewHash(set: PermissionSet, warnings?: readonly PackageWarning[]): string;
11
+ /** 权限清单展示用的一组:按类别分组,`sensitive` 标出需要管理员特别留意的类别。 */
12
+ export interface PermissionGroup {
13
+ category: "provides" | "requires" | "optional" | "config" | "tables" | "secrets" | "storage" | "http" | "publicRoutes" | "tools" | "hooks" | "models" | "network" | "ui";
14
+ /**
15
+ * Sensitive category: secrets, public routes, tools, hooks; also the "provides" group when it holds
16
+ * one of {@link SENSITIVE_EXTENSION_POINTS}, and the "UI" group when it holds an embedded app
17
+ * (embed: the extension's own page in an iframe).
18
+ */
19
+ sensitive: boolean;
20
+ items: string[];
21
+ /** 与 `items` 一一对应:逐项的敏感标记与原因(界面据此高亮并写原因,不自己判定)。 */
22
+ entries: PermissionItem[];
23
+ }
24
+ /**
25
+ * Sensitive reason codes (the UI translates them by code): secrets, public routes, tools, hooks,
26
+ * embedded apps, and sensitive extension points ({@link SENSITIVE_EXTENSION_POINTS}; the code is the
27
+ * extension point name without `@<major>`, with `-` replaced by `_`).
28
+ */
29
+ export type SensitiveReason = "secrets" | "public_routes" | "tools" | "hooks" | "ui_embed" | "channel" | "directory" | "identity_source" | "sandbox" | "object_store" | "migration_warnings";
30
+ /** 权限清单里的一项(分组里的一项,或 `added` 里的一个权限键)。 */
31
+ export interface PermissionItem {
32
+ value: string;
33
+ sensitive: boolean;
34
+ /** 敏感时的原因码。 */
35
+ reason?: SensitiveReason;
36
+ }
37
+ /**
38
+ * 敏感的能力(D10 + 计划扩展,F-AI):`sandbox@1` 在部署里执行任意命令、`object-store@1` 保管全部附件与插件包(D10);
39
+ * `channel@1` 收到组织在 IM 里的对话内容(Ruling A33)、`directory@1` 能把人加进组织(并为其建账号、建身份)、
40
+ * `identity-source@1` 决定谁能登录成哪个账号。插件提供其中任何一个时,「提供」一组标为敏感,
41
+ * 后台插件列表的 `sensitive` 为真,须企业管理员批准。只影响展示,不改权限快照的键。
42
+ */
43
+ export declare const SENSITIVE_EXTENSION_POINTS: readonly string[];
44
+ /**
45
+ * 单个权限键是否敏感(`capybara extensions review / approve` 逐项标 `(sensitive)`):
46
+ * 与 {@link permissionGroups} 的敏感分组同一套规则。
47
+ */
48
+ export declare function isSensitivePermissionKey(key: string): boolean;
49
+ /** 权限键逐项的敏感标记与原因(`added` 用;与 {@link permissionGroups} 同一套规则)。 */
50
+ export declare function permissionKeyItems(keys: string[]): PermissionItem[];
51
+ /** 把权限集合整理成分组清单(固定顺序,空组省略)。纯函数。 */
52
+ export declare function permissionGroups(set: PermissionSet): PermissionGroup[];
53
+ /**
54
+ * 部署级插件状态(后台展示;F-I:副本行存原因,这里推导展示用的状态)。
55
+ * `dependency`:必需能力没有(加载着的)提供方(F-M:排在 `failed` 之后、`pending_approval` 之前)。
56
+ */
57
+ export type DeploymentExtensionStatus = "enabled" | "disabled" | "pending_approval" | "pending_config" | "pending_migration" | "converging" | "failed" | "dependency"
58
+ /** The stored package is in the pre-0.1.0 format: reinstall it from a repacked tgz. */
59
+ | "legacy_format";
60
+ /**
61
+ * 需要企业管理员处理的状态(后台概览「需要处理的插件」):待批准、待配置、失败、依赖缺失,以及副本不一致
62
+ * (`converging` 收敛中、`pending_migration` 待迁移)。
63
+ */
64
+ export declare function extensionNeedsAction(status: DeploymentExtensionStatus): boolean;
65
+ /** One item of the admin extension list (`GET /api/v1/admin/extensions`). */
66
+ export interface AdminExtensionView {
67
+ name: string;
68
+ version: string;
69
+ source: ExtensionSource;
70
+ /** 安装记录的包;配置声明为 null。 */
71
+ sha256: string | null;
72
+ status: DeploymentExtensionStatus;
73
+ /** 安装记录的期望状态;配置声明为 null(始终期望启用)。 */
74
+ desired: {
75
+ version: string;
76
+ sha256: string;
77
+ state: "enabled" | "disabled";
78
+ } | null;
79
+ /** 各副本最近一次上报的加载结果。 */
80
+ replicas: {
81
+ replicaId: string;
82
+ version: string;
83
+ state: string;
84
+ reason: string | null;
85
+ detail: string | null;
86
+ /** 这一行的版本没加载成、该副本仍在用的旧版本(新版失败 / 待批准时旧版照常);否则 null。 */
87
+ servingVersion: string | null;
88
+ heartbeatAt: string;
89
+ }[];
90
+ permissions: PermissionGroup[];
91
+ /** 相对已批准快照多出 / 少了的权限键(没有快照时全部算新增)。 */
92
+ added: string[];
93
+ /** `added` 逐项的敏感标记与原因。 */
94
+ addedItems: PermissionItem[];
95
+ removed: string[];
96
+ /** 见 {@link reviewHash}:网页批准时回传。 */
97
+ reviewHash: string;
98
+ /** 任一权限分组敏感(与 `permissions[].sensitive` 一致,界面据此高亮)。 */
99
+ sensitive: boolean;
100
+ /**
101
+ * 安装记录包里迁移 SQL 的审阅警告(与上传时的 `PackageReview.warnings` 相同;配置声明为空)。
102
+ * 批准前界面同样高亮并要求确认。
103
+ */
104
+ warnings: PackageWarning[];
105
+ snapshot: {
106
+ version: string;
107
+ approvedAt: string;
108
+ approvedBy: string | null;
109
+ source: "cli" | "auto" | "web" | "bootstrap";
110
+ } | null;
111
+ /** 有部署级配置字段。 */
112
+ configurable: boolean;
113
+ configValid: boolean;
114
+ /** 能从部署卸载(只有安装记录,必需的引导插件除外;卸载前须先停用)。 */
115
+ removable: boolean;
116
+ /**
117
+ * A required bootstrap plugin (package ecosystem spec §7): enabled in every org, cannot be
118
+ * disabled or uninstalled; an enterprise admin may upgrade it.
119
+ */
120
+ required: boolean;
121
+ /** Where the install record came from (`bootstrap` for the bootstrap step); null for config-declared. */
122
+ installSource: "npm" | "file" | "catalog" | "bootstrap" | null;
123
+ /**
124
+ * Why the install record's package cannot be read (bytes missing or corrupt, over the current
125
+ * size limit; status failed), or the legacy-format message (status `legacy_format`); permissions
126
+ * are then empty.
127
+ */
128
+ error?: string;
129
+ }
130
+ /** Input of {@link deriveExtensionStatus}. */
131
+ export interface StatusInput {
132
+ source: ExtensionSource;
133
+ /** 安装记录的期望包与状态;配置声明为 null。 */
134
+ desired: {
135
+ sha256: string;
136
+ state: "enabled" | "disabled";
137
+ } | null;
138
+ /** 权限集合未被快照覆盖(F-N:与期望状态无关)。 */
139
+ pendingApproval: boolean;
140
+ configValid: boolean;
141
+ /** 安装记录的 `migrated_sha`。 */
142
+ migratedSha: string | null;
143
+ /** 计入的副本行(调用方已按心跳筛过)。 */
144
+ replicas: {
145
+ state: string;
146
+ reason: string | null;
147
+ sha256: string | null;
148
+ }[];
149
+ }
150
+ /**
151
+ * 由期望状态、快照、配置校验、`migrated_sha` 与各副本状态推出部署级状态,优先级:
152
+ * `failed` > `dependency` > `pending_approval` > `pending_config` > `pending_migration` > `converging` > `enabled` / `disabled`。
153
+ * - 安装记录只看目标包(`desired.sha256`)的副本行:旧包的失败不算;
154
+ * - 停用的安装记录不看迁移;仍有副本加载着时为 `converging`;
155
+ * - 配置声明始终期望启用。
156
+ */
157
+ export declare function deriveExtensionStatus(i: StatusInput): DeploymentExtensionStatus;
158
+ /**
159
+ * 迁移 SQL 的审阅警告:破坏性语句(`destructive_migration`)、内容不做静态检查的 `DO` 块(`dynamic_sql`,
160
+ * 块里可以执行任意语句),以及写到插件自己 schema 之外或改权限 / 角色 / 事务的语句(`foreign_schema`,
161
+ * 见 {@link isForeignSchemaSql})。都标敏感,不拒绝。
162
+ */
163
+ export declare function migrationWarnings(files: {
164
+ file: string;
165
+ sql: string;
166
+ }[], plugin: string): PackageWarning[];
167
+ /**
168
+ * 迁移警告的摘要(种类、文件与语句,不含行号:只挪行不算变化):sha256 前 16 位十六进制;没有警告时为空串。
169
+ * 记进安装记录包的权限集合(`warningsDigest`,Ruling P4):权限不变、警告变了(如新增 `GRANT`)同样要重新批准。
170
+ */
171
+ export declare function warningsDigest(warnings: readonly PackageWarning[]): string;
172
+ /**
173
+ * 语句是否越出插件自己的 schema(`own`,即 `plugin_<name>`;够用即可,不是 SQL 解析器):引用内核 schema
174
+ * `capybara`(`capybara.x` / `"capybara".x`)、写到别的 schema 的对象(`other.x`)、`GRANT` / `REVOKE`、
175
+ * `CREATE` / `ALTER` / `DROP ROLE|USER|GROUP`、`ALTER DEFAULT PRIVILEGES`、`ALTER … OWNER TO`、
176
+ * `SET ROLE` / `SET SESSION AUTHORIZATION` / `SET search_path`、`CREATE SCHEMA`、`CREATE EXTENSION`、
177
+ * `CREATE [OR REPLACE] FUNCTION|PROCEDURE|TRIGGER|EVENT TRIGGER`、`COPY … PROGRAM`,以及事务控制
178
+ * `COMMIT` / `ROLLBACK` / `BEGIN` / `START TRANSACTION` / `END`(迁移器把每个文件放在一个事务里)。
179
+ */
180
+ export declare function isForeignSchemaSql(t: string, own: string): boolean;
181
+ /** {@link PackageReview.warnings} 的一项。 */
182
+ export interface PackageWarning {
183
+ /**
184
+ * `dynamic_sql`:`DO` 块,块内语句没有检查;`foreign_schema`:写到插件自己 schema 之外、改权限 / 角色、
185
+ * 建函数 / 触发器或控制事务({@link isForeignSchemaSql})。
186
+ */
187
+ kind: "destructive_migration" | "dynamic_sql" | "foreign_schema";
188
+ sensitive: true;
189
+ /** 迁移文件名(`capybara.migrations` 目录下)。 */
190
+ file: string;
191
+ line: number;
192
+ /** 语句(压成一行,字符串字面量已抹掉)。 */
193
+ statement: string;
194
+ }
@@ -0,0 +1,284 @@
1
+ import { createHash } from "node:crypto";
2
+ import { pluginSchemaName } from "../ctx/create-ctx.js";
3
+ import { isDestructiveSql, splitSqlStatements } from "../db/sql-statements.js";
4
+ import { permissionKeys, WARNINGS_KEY_PREFIX } from "./permission-set.js";
5
+ /**
6
+ * Review digest: the first 16 hex digits of `sha256(permissionKeys(set).join("\n"))`; with migration
7
+ * warnings their digest (kind, file, line and statement) is folded in, without warnings it equals the
8
+ * permissions-only digest. The caller sends it back when approving, and approval is refused when it
9
+ * differs from the one recomputed now (permissions or warnings changed after the review,
10
+ * `extension.approval_stale`).
11
+ */
12
+ export function reviewHash(set, warnings = []) {
13
+ const h = createHash("sha256").update(permissionKeys(set).join("\n"));
14
+ if (warnings.length > 0) {
15
+ h.update("\n--warnings--\n");
16
+ h.update(warnings.map((w) => `${w.kind}\t${w.file}:${w.line}\t${w.statement}`).join("\n"));
17
+ }
18
+ return h.digest("hex").slice(0, 16);
19
+ }
20
+ /**
21
+ * 敏感的能力(D10 + 计划扩展,F-AI):`sandbox@1` 在部署里执行任意命令、`object-store@1` 保管全部附件与插件包(D10);
22
+ * `channel@1` 收到组织在 IM 里的对话内容(Ruling A33)、`directory@1` 能把人加进组织(并为其建账号、建身份)、
23
+ * `identity-source@1` 决定谁能登录成哪个账号。插件提供其中任何一个时,「提供」一组标为敏感,
24
+ * 后台插件列表的 `sensitive` 为真,须企业管理员批准。只影响展示,不改权限快照的键。
25
+ */
26
+ export const SENSITIVE_EXTENSION_POINTS = [
27
+ "channel@1",
28
+ "directory@1",
29
+ "identity-source@1",
30
+ "sandbox@1",
31
+ "object-store@1",
32
+ ];
33
+ /** 总是敏感的类别。 */
34
+ const ALWAYS_SENSITIVE = new Set([
35
+ "secrets",
36
+ "publicRoutes",
37
+ "tools",
38
+ "hooks",
39
+ ]);
40
+ const CATEGORY_REASON = {
41
+ secrets: "secrets",
42
+ publicRoutes: "public_routes",
43
+ tools: "tools",
44
+ hooks: "hooks",
45
+ };
46
+ /**
47
+ * Why an item in a category is sensitive (undefined when it is not; shared by the grouped list, the
48
+ * per-item `added` and the CLI markers): secrets, public routes, tools and hooks are always
49
+ * sensitive; {@link SENSITIVE_EXTENSION_POINTS} in "provides"; embedded apps (`embed:<id>`) in "UI".
50
+ */
51
+ function itemReason(category, item) {
52
+ // storage 不算敏感:ctx.storage 的键由内核加前缀 `plugins/<插件>/<orgId>/`,插件只能读写自己的前缀
53
+ if (category === "provides") {
54
+ return SENSITIVE_EXTENSION_POINTS.includes(item)
55
+ ? item.split("@")[0].replaceAll("-", "_")
56
+ : undefined;
57
+ }
58
+ if (category === "ui")
59
+ return item.startsWith("embed:") ? "ui_embed" : undefined;
60
+ return ALWAYS_SENSITIVE.has(category) ? CATEGORY_REASON[category] : undefined;
61
+ }
62
+ const itemOf = (category, value) => {
63
+ const reason = itemReason(category, value);
64
+ return reason === undefined ? { value, sensitive: false } : { value, sensitive: true, reason };
65
+ };
66
+ /** 权限键({@link permissionKeys} 的格式)所属的类别与展示项;不属于敏感判定相关类别的返回 null。 */
67
+ function keyItem(key) {
68
+ const after = (prefix) => (key.startsWith(prefix) ? key.slice(prefix.length) : null);
69
+ if (key === "permissions.secrets")
70
+ return { category: "secrets", item: "secret store" };
71
+ if (/^config\.(deployment|org)\.secret:/.test(key))
72
+ return { category: "secrets", item: key.slice(key.indexOf(":") + 1) };
73
+ const table = [
74
+ ["provides:", "provides", ""],
75
+ ["permissions.http.public:", "publicRoutes", ""],
76
+ ["permissions.tools:", "tools", ""],
77
+ ["permissions.hooks:", "hooks", ""],
78
+ ["permissions.hooks.policy:", "hooks", "policy:"],
79
+ ["ui.embed:", "ui", "embed:"],
80
+ ["ui.view:", "ui", "view:"],
81
+ ];
82
+ for (const [prefix, category, itemPrefix] of table) {
83
+ const rest = after(prefix);
84
+ if (rest !== null)
85
+ return { category, item: `${itemPrefix}${rest}` };
86
+ }
87
+ return null;
88
+ }
89
+ /**
90
+ * 单个权限键是否敏感(`capybara extensions review / approve` 逐项标 `(sensitive)`):
91
+ * 与 {@link permissionGroups} 的敏感分组同一套规则。
92
+ */
93
+ export function isSensitivePermissionKey(key) {
94
+ if (key.startsWith(WARNINGS_KEY_PREFIX))
95
+ return true;
96
+ const k = keyItem(key);
97
+ return k !== null && itemReason(k.category, k.item) !== undefined;
98
+ }
99
+ /** 权限键逐项的敏感标记与原因(`added` 用;与 {@link permissionGroups} 同一套规则)。 */
100
+ export function permissionKeyItems(keys) {
101
+ return keys.map((value) => {
102
+ // 迁移警告的摘要(Ruling P4):警告本身见 `warnings`
103
+ if (value.startsWith(WARNINGS_KEY_PREFIX)) {
104
+ return { value, sensitive: true, reason: "migration_warnings" };
105
+ }
106
+ const k = keyItem(value);
107
+ if (k === null)
108
+ return { value, sensitive: false };
109
+ const reason = itemReason(k.category, k.item);
110
+ return reason === undefined ? { value, sensitive: false } : { value, sensitive: true, reason };
111
+ });
112
+ }
113
+ /** 把权限集合整理成分组清单(固定顺序,空组省略)。纯函数。 */
114
+ export function permissionGroups(set) {
115
+ const p = set.permissions;
116
+ // 旧快照没有 ui(按空处理)
117
+ const ui = p.ui ?? { views: [], embeds: [] };
118
+ const secretFields = [...set.config.deployment, ...set.config.org]
119
+ .filter((f) => f.secret)
120
+ .map((f) => f.path || "<root>");
121
+ const configFields = ["deployment", "org"].flatMap((level) => set.config[level].map((f) => `${level}:${f.path || "<root>"}`));
122
+ const secretItems = [...(p.secrets ? ["secret store"] : []), ...secretFields];
123
+ const groups = [
124
+ {
125
+ category: "provides",
126
+ items: set.provides,
127
+ },
128
+ { category: "requires", items: set.requires },
129
+ { category: "optional", items: set.optional },
130
+ { category: "config", items: configFields },
131
+ { category: "tables", items: set.tables },
132
+ { category: "secrets", items: secretItems },
133
+ { category: "storage", items: p.storage ? ["storage"] : [] },
134
+ {
135
+ category: "http",
136
+ items: p.http.filter((r) => !r.public).map((r) => `${r.method} ${r.path}`),
137
+ },
138
+ {
139
+ category: "publicRoutes",
140
+ items: p.http.filter((r) => r.public).map((r) => `${r.method} ${r.path}`),
141
+ },
142
+ { category: "tools", items: p.tools },
143
+ { category: "hooks", items: [...p.hooks, ...(p.policyHooks ?? []).map((h) => `policy:${h}`)] },
144
+ {
145
+ category: "models",
146
+ items: p.models.map((m) => `${m.purpose} (${m.kind})`),
147
+ },
148
+ { category: "network", items: p.network },
149
+ {
150
+ category: "ui",
151
+ items: [...ui.views.map((v) => `view:${v}`), ...ui.embeds.map((e) => `embed:${e}`)],
152
+ },
153
+ ];
154
+ return groups
155
+ .filter((g) => g.items.length > 0)
156
+ .map((g) => {
157
+ const entries = g.items.map((i) => itemOf(g.category, i));
158
+ return { ...g, sensitive: entries.some((e) => e.sensitive), entries };
159
+ });
160
+ }
161
+ /**
162
+ * 需要企业管理员处理的状态(后台概览「需要处理的插件」):待批准、待配置、失败、依赖缺失,以及副本不一致
163
+ * (`converging` 收敛中、`pending_migration` 待迁移)。
164
+ */
165
+ export function extensionNeedsAction(status) {
166
+ return status !== "enabled" && status !== "disabled";
167
+ }
168
+ /**
169
+ * 由期望状态、快照、配置校验、`migrated_sha` 与各副本状态推出部署级状态,优先级:
170
+ * `failed` > `dependency` > `pending_approval` > `pending_config` > `pending_migration` > `converging` > `enabled` / `disabled`。
171
+ * - 安装记录只看目标包(`desired.sha256`)的副本行:旧包的失败不算;
172
+ * - 停用的安装记录不看迁移;仍有副本加载着时为 `converging`;
173
+ * - 配置声明始终期望启用。
174
+ */
175
+ export function deriveExtensionStatus(i) {
176
+ const target = i.desired?.sha256 ?? null;
177
+ const rows = target === null ? i.replicas : i.replicas.filter((r) => r.sha256 === target);
178
+ if (rows.some((r) => r.state === "failed"))
179
+ return "failed";
180
+ if (rows.some((r) => r.reason === "dependency" && (r.state === "pending" || r.state === "unloaded")))
181
+ return "dependency";
182
+ if (i.pendingApproval)
183
+ return "pending_approval";
184
+ if (!i.configValid)
185
+ return "pending_config";
186
+ const wantLoaded = i.desired === null || i.desired.state === "enabled";
187
+ if (!wantLoaded)
188
+ return i.replicas.some((r) => r.state === "loaded") ? "converging" : "disabled";
189
+ if (i.desired !== null && i.migratedSha !== i.desired.sha256)
190
+ return "pending_migration";
191
+ if (rows.some((r) => r.state === "pending" && r.reason === "migration"))
192
+ return "pending_migration";
193
+ const done = i.replicas.length > 0 &&
194
+ i.replicas.every((r) => r.state === "loaded" && (target === null || r.sha256 === target));
195
+ return done ? "enabled" : "converging";
196
+ }
197
+ /**
198
+ * 迁移 SQL 的审阅警告:破坏性语句(`destructive_migration`)、内容不做静态检查的 `DO` 块(`dynamic_sql`,
199
+ * 块里可以执行任意语句),以及写到插件自己 schema 之外或改权限 / 角色 / 事务的语句(`foreign_schema`,
200
+ * 见 {@link isForeignSchemaSql})。都标敏感,不拒绝。
201
+ */
202
+ export function migrationWarnings(files, plugin) {
203
+ const own = pluginSchemaName(plugin);
204
+ return files.flatMap((m) => splitSqlStatements(m.sql).flatMap((st) => {
205
+ const base = { sensitive: true, file: m.file, line: st.line, statement: st.text };
206
+ if (/^DO\b/i.test(st.text))
207
+ return [{ kind: "dynamic_sql", ...base }];
208
+ if (isForeignSchemaSql(withQuoted(st), own))
209
+ return [{ kind: "foreign_schema", ...base }];
210
+ if (isDestructiveSql(st.text))
211
+ return [{ kind: "destructive_migration", ...base }];
212
+ return [];
213
+ }));
214
+ }
215
+ /**
216
+ * 迁移警告的摘要(种类、文件与语句,不含行号:只挪行不算变化):sha256 前 16 位十六进制;没有警告时为空串。
217
+ * 记进安装记录包的权限集合(`warningsDigest`,Ruling P4):权限不变、警告变了(如新增 `GRANT`)同样要重新批准。
218
+ */
219
+ export function warningsDigest(warnings) {
220
+ if (warnings.length === 0)
221
+ return "";
222
+ return createHash("sha256")
223
+ .update(warnings.map((w) => `${w.kind}\t${w.file}\t${w.statement}`).join("\n"))
224
+ .digest("hex")
225
+ .slice(0, 16);
226
+ }
227
+ const IDENT_RE = `(?:"(?:[^"]|"")+"|[A-Za-z_][A-Za-z0-9_$]*)`;
228
+ const TARGET_RE = String.raw `(${IDENT_RE}(?:\s*\.\s*${IDENT_RE})?)`;
229
+ /**
230
+ * Targets of write statements (creating / altering / dropping tables, indexes, views and so on, and
231
+ * the table of INSERT / UPDATE / DELETE / TRUNCATE / MERGE / COPY).
232
+ */
233
+ const WRITE_TARGETS = [
234
+ new RegExp(String.raw `^INSERT\s+INTO\s+${TARGET_RE}`, "i"),
235
+ new RegExp(String.raw `^UPDATE\s+(?:ONLY\s+)?${TARGET_RE}`, "i"),
236
+ new RegExp(String.raw `^DELETE\s+FROM\s+(?:ONLY\s+)?${TARGET_RE}`, "i"),
237
+ new RegExp(String.raw `^TRUNCATE\s+(?:TABLE\s+)?(?:ONLY\s+)?${TARGET_RE}`, "i"),
238
+ new RegExp(String.raw `^MERGE\s+INTO\s+${TARGET_RE}`, "i"),
239
+ new RegExp(String.raw `^COPY\s+${TARGET_RE}`, "i"),
240
+ new RegExp(String.raw `^(?:CREATE|ALTER|DROP)\s+(?:OR\s+REPLACE\s+)?(?:(?:GLOBAL|LOCAL)\s+)?(?:(?:TEMP|TEMPORARY|UNLOGGED|MATERIALIZED|UNIQUE|FOREIGN)\s+)?(?:TABLE|INDEX|VIEW|SEQUENCE|TYPE|DOMAIN)\s+(?:CONCURRENTLY\s+)?(?:IF\s+(?:NOT\s+)?EXISTS\s+)?(?:ONLY\s+)?${TARGET_RE}`, "i"),
241
+ // CREATE INDEX … ON <表>
242
+ new RegExp(String.raw `^CREATE\s+(?:UNIQUE\s+)?INDEX\b.*?\bON\s+(?:ONLY\s+)?${TARGET_RE}`, "i"),
243
+ ];
244
+ /** 标识符规范化:带引号的去引号(`""` 还原),不带引号的转小写。 */
245
+ const normIdent = (s) => s.startsWith('"') ? s.slice(1, -1).replaceAll('""', '"') : s.toLowerCase();
246
+ /** 写语句的目标里有带 schema、且不是 `own` 的。 */
247
+ function writesOtherSchema(t, own) {
248
+ for (const re of WRITE_TARGETS) {
249
+ const m = re.exec(t);
250
+ if (!m)
251
+ continue;
252
+ const parts = m[1].match(new RegExp(IDENT_RE, "g")) ?? [];
253
+ if (parts.length === 2 && normIdent(parts[0]) !== own)
254
+ return true;
255
+ }
256
+ return false;
257
+ }
258
+ /** 把语句 `text` 里抹掉的双引号标识符填回去(`"capybara".x` 这类引用才看得见)。 */
259
+ function withQuoted(st) {
260
+ let k = 0;
261
+ return st.text.replace(/""/g, () => `"${st.quoted[k++] ?? ""}"`);
262
+ }
263
+ /**
264
+ * 语句是否越出插件自己的 schema(`own`,即 `plugin_<name>`;够用即可,不是 SQL 解析器):引用内核 schema
265
+ * `capybara`(`capybara.x` / `"capybara".x`)、写到别的 schema 的对象(`other.x`)、`GRANT` / `REVOKE`、
266
+ * `CREATE` / `ALTER` / `DROP ROLE|USER|GROUP`、`ALTER DEFAULT PRIVILEGES`、`ALTER … OWNER TO`、
267
+ * `SET ROLE` / `SET SESSION AUTHORIZATION` / `SET search_path`、`CREATE SCHEMA`、`CREATE EXTENSION`、
268
+ * `CREATE [OR REPLACE] FUNCTION|PROCEDURE|TRIGGER|EVENT TRIGGER`、`COPY … PROGRAM`,以及事务控制
269
+ * `COMMIT` / `ROLLBACK` / `BEGIN` / `START TRANSACTION` / `END`(迁移器把每个文件放在一个事务里)。
270
+ */
271
+ export function isForeignSchemaSql(t, own) {
272
+ return (/(?:^|[^\w$"])"?capybara"?\s*\./i.test(t) ||
273
+ writesOtherSchema(t, own) ||
274
+ /^ALTER\b.*\bOWNER\s+TO\b/i.test(t) ||
275
+ /^SET\s+(?:SESSION\s+|LOCAL\s+)?search_path\b/i.test(t) ||
276
+ /^CREATE\s+(?:SCHEMA|EXTENSION)\b/i.test(t) ||
277
+ /^COPY\b.*\bPROGRAM\b/i.test(t) ||
278
+ /^(?:GRANT|REVOKE)\b/i.test(t) ||
279
+ /^(?:CREATE|ALTER|DROP)\s+(?:ROLE|USER|GROUP)\b/i.test(t) ||
280
+ /^ALTER\s+DEFAULT\s+PRIVILEGES\b/i.test(t) ||
281
+ /^SET\s+(?:SESSION\s+|LOCAL\s+)?(?:ROLE|SESSION\s+AUTHORIZATION)\b/i.test(t) ||
282
+ /^CREATE\s+(?:OR\s+REPLACE\s+)?(?:CONSTRAINT\s+)?(?:FUNCTION|PROCEDURE|TRIGGER|EVENT\s+TRIGGER)\b/i.test(t) ||
283
+ /^(?:COMMIT|ROLLBACK|BEGIN|START\s+TRANSACTION|END|ABORT)\b/i.test(t));
284
+ }
@@ -0,0 +1,24 @@
1
+ import type { ExtensionInstance } from "./instance.js";
2
+ /**
3
+ * 本进程生效的插件实例(按插件名,一名一个)。顺序 = 首次激活的顺序(宿主按依赖拓扑序加载;
4
+ * 替换同名实例保持原位置)。只是本进程的视图:跨副本的期望状态在 PG(安装记录),由各副本自己 reconcile。
5
+ */
6
+ export declare class ExtensionRegistry {
7
+ private readonly instances;
8
+ private readonly listeners;
9
+ private rev;
10
+ /** 原子替换:登记新实例,返回被替换的旧实例(由调用方 dispose)。 */
11
+ activate(inst: ExtensionInstance): ExtensionInstance | undefined;
12
+ /** 摘下:返回被摘下的实例(由调用方 dispose);不在时返回 undefined。 */
13
+ deactivate(name: string): ExtensionInstance | undefined;
14
+ current(name: string): ExtensionInstance | undefined;
15
+ all(): ExtensionInstance[];
16
+ /** 每次激活 / 摘下加一(给按版本缓存的派生视图用,如插件路由表)。 */
17
+ revision(): number;
18
+ /**
19
+ * 订阅变化(激活 / 替换 / 摘下,参数为插件名)。只通知本进程的消费方(渠道 supervisor、界面等),不跨副本。
20
+ * 监听函数同步调用,抛错被吞掉(不影响注册表与其他监听方)。返回取消订阅函数。
21
+ */
22
+ onChange(listener: (name: string) => void): () => void;
23
+ private changed;
24
+ }
@@ -0,0 +1,56 @@
1
+ /**
2
+ * 本进程生效的插件实例(按插件名,一名一个)。顺序 = 首次激活的顺序(宿主按依赖拓扑序加载;
3
+ * 替换同名实例保持原位置)。只是本进程的视图:跨副本的期望状态在 PG(安装记录),由各副本自己 reconcile。
4
+ */
5
+ export class ExtensionRegistry {
6
+ instances = new Map();
7
+ listeners = new Set();
8
+ rev = 0;
9
+ /** 原子替换:登记新实例,返回被替换的旧实例(由调用方 dispose)。 */
10
+ activate(inst) {
11
+ const old = this.instances.get(inst.name);
12
+ this.instances.set(inst.name, inst);
13
+ this.changed(inst.name);
14
+ return old;
15
+ }
16
+ /** 摘下:返回被摘下的实例(由调用方 dispose);不在时返回 undefined。 */
17
+ deactivate(name) {
18
+ const old = this.instances.get(name);
19
+ if (!old)
20
+ return undefined;
21
+ this.instances.delete(name);
22
+ this.changed(name);
23
+ return old;
24
+ }
25
+ current(name) {
26
+ return this.instances.get(name);
27
+ }
28
+ all() {
29
+ return [...this.instances.values()];
30
+ }
31
+ /** 每次激活 / 摘下加一(给按版本缓存的派生视图用,如插件路由表)。 */
32
+ revision() {
33
+ return this.rev;
34
+ }
35
+ /**
36
+ * 订阅变化(激活 / 替换 / 摘下,参数为插件名)。只通知本进程的消费方(渠道 supervisor、界面等),不跨副本。
37
+ * 监听函数同步调用,抛错被吞掉(不影响注册表与其他监听方)。返回取消订阅函数。
38
+ */
39
+ onChange(listener) {
40
+ this.listeners.add(listener);
41
+ return () => {
42
+ this.listeners.delete(listener);
43
+ };
44
+ }
45
+ changed(name) {
46
+ this.rev += 1;
47
+ for (const l of [...this.listeners]) {
48
+ try {
49
+ l(name);
50
+ }
51
+ catch {
52
+ // 监听方自己记日志;这里不让它影响注册表
53
+ }
54
+ }
55
+ }
56
+ }
@@ -0,0 +1,12 @@
1
+ import { type ExtensionManifest } from "@capybara-hq/plugin-sdk";
2
+ /** 插件依赖解析失败(信息列出插件名与能力名)。 */
3
+ export declare class ExtensionResolveError extends Error {
4
+ constructor(message: string);
5
+ }
6
+ /**
7
+ * 校验 sdk 范围、依赖满足度、单选能力唯一性与无环,返回按依赖拓扑排序后的列表(同层保持输入顺序)。
8
+ * `requires` 缺提供方报错;`optional` 缺提供方不报错,但存在的提供方与 `requires` 一样参与排序与环检测。
9
+ * 声明了 `permissions.storage` 的插件隐含依赖 `object-store@1`(中转能力,不能 `requires`):提供方排在它前面;
10
+ * 缺提供方不在这里报错,由权限闸门把它列为 pending(见 approvals.ts)。
11
+ */
12
+ export declare function resolveExtensions(manifests: ExtensionManifest[], sdkVersion: string): ExtensionManifest[];
@@ -0,0 +1,71 @@
1
+ import { EXTENSION_POINT_CARDINALITY, OBJECT_STORE_EXTENSION_POINT, parseExtensionPoint, } from "@capybara-hq/plugin-sdk";
2
+ import semver from "semver";
3
+ /** 插件依赖解析失败(信息列出插件名与能力名)。 */
4
+ export class ExtensionResolveError extends Error {
5
+ constructor(message) {
6
+ super(message);
7
+ this.name = "ExtensionResolveError";
8
+ }
9
+ }
10
+ /**
11
+ * 校验 sdk 范围、依赖满足度、单选能力唯一性与无环,返回按依赖拓扑排序后的列表(同层保持输入顺序)。
12
+ * `requires` 缺提供方报错;`optional` 缺提供方不报错,但存在的提供方与 `requires` 一样参与排序与环检测。
13
+ * 声明了 `permissions.storage` 的插件隐含依赖 `object-store@1`(中转能力,不能 `requires`):提供方排在它前面;
14
+ * 缺提供方不在这里报错,由权限闸门把它列为 pending(见 approvals.ts)。
15
+ */
16
+ export function resolveExtensions(manifests, sdkVersion) {
17
+ const seen = new Set();
18
+ for (const m of manifests) {
19
+ if (seen.has(m.name))
20
+ throw new ExtensionResolveError(`plugin ${m.name}: loaded more than once`);
21
+ seen.add(m.name);
22
+ if (!semver.satisfies(sdkVersion, m.sdk)) {
23
+ throw new ExtensionResolveError(`plugin ${m.name}: sdk range "${m.sdk}" is not satisfied by SDK_VERSION ${sdkVersion}`);
24
+ }
25
+ }
26
+ const providers = new Map();
27
+ for (const m of manifests) {
28
+ for (const cap of m.provides)
29
+ providers.set(cap, [...(providers.get(cap) ?? []), m]);
30
+ }
31
+ for (const [cap, list] of providers) {
32
+ if (EXTENSION_POINT_CARDINALITY[parseExtensionPoint(cap).name] === "single" &&
33
+ list.length > 1) {
34
+ throw new ExtensionResolveError(`extension point ${cap} is single-provider but provided by: ${list.map((p) => p.name).join(", ")}`);
35
+ }
36
+ }
37
+ for (const m of manifests) {
38
+ for (const cap of m.requires ?? []) {
39
+ if (!providers.has(cap)) {
40
+ throw new ExtensionResolveError(`plugin ${m.name}: required extension point ${cap} has no provider`);
41
+ }
42
+ }
43
+ }
44
+ const done = new Set();
45
+ const visiting = [];
46
+ const out = [];
47
+ const visit = (m) => {
48
+ if (done.has(m.name))
49
+ return;
50
+ if (visiting.includes(m.name)) {
51
+ const cycle = [...visiting.slice(visiting.indexOf(m.name)), m.name].join(" -> ");
52
+ throw new ExtensionResolveError(`dependency cycle: ${cycle}`);
53
+ }
54
+ visiting.push(m.name);
55
+ for (const cap of [...(m.requires ?? []), ...(m.optional ?? [])]) {
56
+ for (const p of providers.get(cap) ?? [])
57
+ visit(p);
58
+ }
59
+ if (m.permissions?.storage) {
60
+ for (const p of providers.get(OBJECT_STORE_EXTENSION_POINT) ?? [])
61
+ if (p !== m)
62
+ visit(p);
63
+ }
64
+ visiting.pop();
65
+ done.add(m.name);
66
+ out.push(m);
67
+ };
68
+ for (const m of manifests)
69
+ visit(m);
70
+ return out;
71
+ }