@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,329 @@
1
+ import { dirname } from "node:path";
2
+ import { fileURLToPath } from "node:url";
3
+ import { defineExtension, ExtensionManifestError, staticManifestOf, } from "@capybara-hq/plugin-sdk";
4
+ import { createExtensionContext, LiveConfig, } from "../ctx/create-ctx.js";
5
+ import { InflightTracker } from "./inflight.js";
6
+ const errMsg = (e) => (e instanceof Error ? e.message : String(e));
7
+ /** 模块清单与审阅过的静态清单(包内 `capybara.manifest`)不一致。 */
8
+ export class ManifestMismatchError extends Error {
9
+ constructor(plugin, moduleName) {
10
+ super(`plugin ${plugin}: the plugin module's manifest does not match the reviewed package manifest (module name "${moduleName}")`);
11
+ this.name = "ManifestMismatchError";
12
+ }
13
+ }
14
+ /** 键排序 JSON(jsonb 会重排对象键;比较静态清单用)。 */
15
+ const canonical = (v) => {
16
+ if (Array.isArray(v))
17
+ return `[${v.map((x) => (x === undefined ? "null" : canonical(x))).join(",")}]`;
18
+ if (v !== null && typeof v === "object") {
19
+ const entries = Object.entries(v)
20
+ .filter(([, x]) => x !== undefined)
21
+ .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0));
22
+ return `{${entries.map(([k, x]) => `${JSON.stringify(k)}:${canonical(x)}`).join(",")}}`;
23
+ }
24
+ return JSON.stringify(v) ?? "null";
25
+ };
26
+ /** 模块清单与审阅过的静态清单是否一致(名字与 {@link staticManifestOf} 都须相同)。 */
27
+ export function matchesSection(manifest, name, section) {
28
+ return manifest.name === name && canonical(staticManifestOf(manifest)) === canonical(section);
29
+ }
30
+ /** 导入一个插件模块(default 导出)并按 defineExtension 校验清单。 */
31
+ export async function importExtensionModule(url, label, resolveFrom) {
32
+ let mod;
33
+ try {
34
+ mod = (await import(url));
35
+ }
36
+ catch (e) {
37
+ throw new Error(`cannot import plugin "${label}" from "${resolveFrom}": ${errMsg(e)}`, {
38
+ cause: e,
39
+ });
40
+ }
41
+ if (typeof mod.default !== "object" || mod.default === null)
42
+ throw new Error(`plugin module "${label}" has no default export object`);
43
+ try {
44
+ return defineExtension(mod.default);
45
+ }
46
+ catch (e) {
47
+ throw new ExtensionManifestError(label, errMsg(e));
48
+ }
49
+ }
50
+ /**
51
+ * 一个已完成 setup 的插件实例(一代):清单、来源、权限、部署配置,以及它经 ctx 做过的全部登记(账)。
52
+ * 同一插件升级 / 重新加载会产生新实例(generation 加一),旧实例 `dispose` 后它的登记全部撤销;
53
+ * 旧模块代码留在内存里直到进程重启(ESM 无法卸载)。
54
+ */
55
+ export class ExtensionInstance {
56
+ name;
57
+ version;
58
+ sha256;
59
+ source;
60
+ generation;
61
+ manifest;
62
+ permissions;
63
+ hash;
64
+ live;
65
+ entryUrl;
66
+ inflight;
67
+ ctx;
68
+ log;
69
+ disposing;
70
+ /** {@link hurry}:进行中的 dispose 不再等排空时限。 */
71
+ hurried = new AbortController();
72
+ constructor(init) {
73
+ this.manifest = init.manifest;
74
+ this.name = init.manifest.name;
75
+ this.version = init.manifest.version;
76
+ this.sha256 = init.sha256;
77
+ this.source = init.source;
78
+ this.generation = init.generation;
79
+ this.permissions = init.permissions;
80
+ this.hash = init.configHash;
81
+ this.live = init.config;
82
+ this.entryUrl = init.entryUrl;
83
+ this.ctx = init.ctx;
84
+ this.log = init.log;
85
+ this.inflight = new InflightTracker(this.name);
86
+ }
87
+ /** 此刻的部署配置(hot 改动后是新值)。 */
88
+ get config() {
89
+ return this.live.value;
90
+ }
91
+ /** 部署配置摘要(见 `deploymentConfigHash`;hot 改动后随之更新)。 */
92
+ get configHash() {
93
+ return this.hash;
94
+ }
95
+ /** hot 字段改动:就地替换部署配置(插件下次读 `ctx.config` 拿到新值),不重新 setup(C10)。 */
96
+ updateConfig(config, configHash) {
97
+ this.live.value = config;
98
+ this.hash = configHash;
99
+ }
100
+ /** 提供的能力(撤销后为空)。 */
101
+ get provided() {
102
+ return this.ctx.provided;
103
+ }
104
+ get routes() {
105
+ return this.ctx.routes;
106
+ }
107
+ get tools() {
108
+ return this.ctx.registeredTools;
109
+ }
110
+ /** Hooks registered through `ctx.hooks.on` (empty after revocation). */
111
+ get hooks() {
112
+ return this.ctx.registeredHooks;
113
+ }
114
+ get uiViews() {
115
+ return this.ctx.uiViews;
116
+ }
117
+ get uiActions() {
118
+ return this.ctx.uiActions;
119
+ }
120
+ /** 账上仍在的登记(撤销后为空)。 */
121
+ registrations() {
122
+ return this.ctx.ledger.list();
123
+ }
124
+ get disposed() {
125
+ return this.disposing !== undefined;
126
+ }
127
+ /**
128
+ * Revokes this instance (idempotent; the caller should first remove it from the registry or replace
129
+ * it). In order:
130
+ * 1. stop taking new work (in-flight tracker closed, queue workers stop taking new jobs);
131
+ * 2. wait for in-flight tool calls and running queue worker jobs together, up to `drainMs` (one
132
+ * deadline);
133
+ * 3. abort: remaining in-flight calls end with `ExtensionUnloadedError` (the model gets
134
+ * `PLUGIN_UNLOADED_TOOL_ERROR`), `ctx.signal` aborts (so work that honours `ctx.signal` is not
135
+ * aborted within the drain limit);
136
+ * 4. revoke the ledger's registrations one by one (in reverse; queue jobs still running at the
137
+ * deadline are forced to stay in the queue);
138
+ * 5. call the extension's `dispose(ctx)`, up to `disposeTimeoutMs` (a throw or timeout is only
139
+ * logged, and it goes on);
140
+ * 6. close the ctx (queue connections, pending audit writes). Step 6 throws on failure (the caller
141
+ * logs it).
142
+ * `waitQueueJobs` (shutdown path): queue workers wait for running jobs to finish instead of being
143
+ * force-closed at the deadline.
144
+ */
145
+ dispose(opts) {
146
+ this.disposing ??= this.doDispose(opts);
147
+ return this.disposing;
148
+ }
149
+ /**
150
+ * 让进行中(或之后开始)的 {@link dispose} 立即结束排空:余下的在途调用随即中止,队列任务按到时处理
151
+ * (停机时宿主对后台撤销中的旧实例调用)。没有在撤销时等同于以排空时限 0 撤销。
152
+ */
153
+ hurry() {
154
+ this.hurried.abort();
155
+ this.inflight.abort();
156
+ return this.dispose({ drainMs: 0 });
157
+ }
158
+ async doDispose(opts) {
159
+ const deadline = Date.now() + Math.max(0, opts.drainMs);
160
+ this.inflight.close();
161
+ let queues = Promise.resolve("drained");
162
+ if (!opts.waitQueueJobs) {
163
+ await this.ctx.beginDispose(deadline).catch((err) => {
164
+ this.log.warn("plugin queue pause failed", { plugin: this.name, err });
165
+ });
166
+ queues = this.ctx.drainQueues(deadline).catch(() => "timeout");
167
+ }
168
+ let onHurry = () => { };
169
+ const hurried = new Promise((resolve) => {
170
+ onHurry = () => resolve("timeout");
171
+ if (this.hurried.signal.aborted)
172
+ onHurry();
173
+ else
174
+ this.hurried.signal.addEventListener("abort", onHurry, { once: true });
175
+ });
176
+ const [calls, jobs] = await Promise.all([
177
+ Promise.race([this.inflight.drain(Math.max(0, deadline - Date.now())), hurried]),
178
+ Promise.race([queues, hurried]),
179
+ ]);
180
+ this.hurried.signal.removeEventListener("abort", onHurry);
181
+ if (jobs === "timeout") {
182
+ this.log.warn("plugin queue jobs still running after the drain timeout; leaving them queued", {
183
+ plugin: this.name,
184
+ generation: this.generation,
185
+ drainMs: opts.drainMs,
186
+ });
187
+ }
188
+ const drained = calls;
189
+ if (drained === "timeout") {
190
+ this.log.warn("plugin calls still running after the drain timeout; aborting them", {
191
+ plugin: this.name,
192
+ generation: this.generation,
193
+ inflight: this.inflight.size,
194
+ drainMs: opts.drainMs,
195
+ });
196
+ }
197
+ this.inflight.abort();
198
+ this.ctx.abort();
199
+ this.ctx.ledger.seal();
200
+ await this.ctx.ledger.disposeAll((r, err) => this.log.warn("plugin registration dispose failed", {
201
+ plugin: this.name,
202
+ kind: r.kind,
203
+ key: r.key,
204
+ err,
205
+ }));
206
+ if (this.manifest.dispose) {
207
+ const dispose = this.manifest.dispose;
208
+ const ms = opts.disposeTimeoutMs ?? DEFAULT_DISPOSE_TIMEOUT_MS;
209
+ let timer;
210
+ try {
211
+ const r = await Promise.race([
212
+ Promise.resolve()
213
+ .then(() => dispose(this.ctx))
214
+ .then(() => "done"),
215
+ new Promise((resolve) => {
216
+ timer = setTimeout(() => resolve("timeout"), ms);
217
+ }),
218
+ ]);
219
+ if (r === "timeout") {
220
+ this.log.warn("plugin dispose() did not finish in time; continuing without it", {
221
+ plugin: this.name,
222
+ generation: this.generation,
223
+ timeoutMs: ms,
224
+ });
225
+ }
226
+ }
227
+ catch (err) {
228
+ this.log.warn("plugin dispose() failed", { plugin: this.name, err });
229
+ }
230
+ finally {
231
+ clearTimeout(timer);
232
+ }
233
+ }
234
+ await this.ctx.close();
235
+ }
236
+ }
237
+ /** 插件 `dispose()` 的默认时限(`extensionHost.disposeTimeoutSeconds` 的默认值)。 */
238
+ export const DEFAULT_DISPOSE_TIMEOUT_MS = 10_000;
239
+ /** 同进程导入过的插件模块数超过多少(每个插件第一个入口不算)就告警。 */
240
+ export const UPGRADE_WARN_THRESHOLD = 20;
241
+ /**
242
+ * 记录本进程导入过的插件模块入口(按插件名去重的 URL):ESM 模块无法卸载,每个新入口(升级到新包)
243
+ * 的代码都留在内存里直到进程重启。同一 URL 的重新加载不新增模块,不计数。
244
+ * 升级数 = 各插件「不同入口数 - 1」之和;第一次超过 {@link UPGRADE_WARN_THRESHOLD} 时 `record` 返回 true(只一次)。
245
+ */
246
+ export class ImportTracker {
247
+ urls = new Map();
248
+ warned = false;
249
+ /** 本进程的升级数(见类注释)。 */
250
+ get upgrades() {
251
+ let n = 0;
252
+ for (const set of this.urls.values())
253
+ n += set.size - 1;
254
+ return n;
255
+ }
256
+ /** 记一次导入;返回这次是否应当告警。 */
257
+ record(plugin, url) {
258
+ let set = this.urls.get(plugin);
259
+ if (!set) {
260
+ set = new Set();
261
+ this.urls.set(plugin, set);
262
+ }
263
+ set.add(url);
264
+ if (!this.warned && this.upgrades > UPGRADE_WARN_THRESHOLD) {
265
+ this.warned = true;
266
+ return true;
267
+ }
268
+ return false;
269
+ }
270
+ }
271
+ /** 升级次数超过阈值的告警(旧模块代码留在内存直到重启)。 */
272
+ export function warnUpgrades(log, imports) {
273
+ log.warn("plugins were upgraded many times in this process; the code of earlier plugin versions stays in memory until the process restarts, so restart this replica to free it", { upgrades: imports.upgrades, threshold: UPGRADE_WARN_THRESHOLD });
274
+ }
275
+ /** 在已导入、已核对的清单上建 ctx(记账)并 setup;setup 抛错时撤销已登记的再抛。 */
276
+ export async function setupInstance(deps, manifest, input) {
277
+ const live = new LiveConfig(input.config);
278
+ const ctx = createExtensionContext(deps.kernel, manifest, live, deps.extensionPointAccess);
279
+ input.onCtx?.(ctx);
280
+ try {
281
+ await manifest.setup(ctx);
282
+ ctx.sealTools();
283
+ for (const cap of manifest.provides) {
284
+ if (!ctx.provided.has(cap)) {
285
+ throw new Error(`declared extension point ${cap} was not provided by setup`);
286
+ }
287
+ }
288
+ }
289
+ catch (e) {
290
+ try {
291
+ await ctx.close();
292
+ }
293
+ catch (err) {
294
+ deps.kernel.log.warn("plugin context close failed", { plugin: manifest.name, err });
295
+ }
296
+ throw new Error(`plugin ${manifest.name}: setup failed: ${errMsg(e)}`, { cause: e });
297
+ }
298
+ finally {
299
+ input.onCtx?.(undefined);
300
+ }
301
+ return new ExtensionInstance({
302
+ manifest,
303
+ source: input.source,
304
+ sha256: input.sha256,
305
+ generation: deps.nextGeneration(manifest.name),
306
+ permissions: input.permissions,
307
+ configHash: input.configHash,
308
+ config: live,
309
+ entryUrl: input.entryUrl,
310
+ ctx,
311
+ log: deps.kernel.log,
312
+ });
313
+ }
314
+ /**
315
+ * 加载一个插件实例:import → defineExtension → 有包内静态清单(`section`)时与 {@link staticManifestOf} 核对
316
+ * (名字与静态清单都须一致,否则抛 {@link ManifestMismatchError};配置声明 / 内置插件没有 section,跳过核对)
317
+ * → 建 ctx(记账)→ setup;setup 抛错时撤销已登记的再抛。
318
+ * 不做权限闸门、部署配置校验与迁移(宿主在此之前完成);`config` 为已校验的部署配置。
319
+ */
320
+ export async function loadInstance(deps, input) {
321
+ const label = input.section?.name ?? input.entryUrl;
322
+ const manifest = await importExtensionModule(input.entryUrl, label, dirname(fileURLToPath(input.entryUrl)));
323
+ if (input.section && !matchesSection(manifest, input.section.name, input.section.manifest)) {
324
+ throw new ManifestMismatchError(input.section.name, manifest.name);
325
+ }
326
+ if (deps.imports?.record(manifest.name, input.entryUrl))
327
+ warnUpgrades(deps.kernel.log, deps.imports);
328
+ return setupInstance(deps, manifest, input);
329
+ }
@@ -0,0 +1,30 @@
1
+ /** 插件经 ctx 做的一项登记的种类(C17)。 */
2
+ export type RegistrationKind = "tool" | "route" | "queue" | "bus" | "lease" | "ui.view" | "ui.action" | "provide" | "hook";
3
+ /** 账上的一项:撤销时调用 `dispose()`。 */
4
+ export interface Registration {
5
+ kind: RegistrationKind;
6
+ key: string;
7
+ dispose(): Promise<void>;
8
+ }
9
+ /**
10
+ * 一个插件实例的登记账(每个 ctx 一本):ctx 的每次登记都记一笔,撤销实例时逐项(倒序)撤销。
11
+ * 封账(`seal()`,实例开始撤销 / ctx 关闭)之后再登记:立即撤销这一项并抛错,不留下无人管的资源。
12
+ */
13
+ export declare class RegistrationLedger {
14
+ private readonly plugin;
15
+ private items;
16
+ private closed;
17
+ constructor(plugin: string);
18
+ /**
19
+ * 记一笔,返回「销账」函数(插件自己撤销时调用,如退订、释放锁;只从账上拿掉,不再调用 dispose)。
20
+ * 已封账时先撤销这一项再抛错。
21
+ */
22
+ add(r: Registration): () => void;
23
+ /** 当前账上的登记(按登记顺序,副本)。 */
24
+ list(): Registration[];
25
+ get sealed(): boolean;
26
+ /** 封账:此后的登记立即撤销并抛错。 */
27
+ seal(): void;
28
+ /** 封账并按登记的倒序逐项撤销;单项失败交给 `onError`,继续其余各项。 */
29
+ disposeAll(onError: (r: Registration, e: unknown) => void): Promise<void>;
30
+ }
@@ -0,0 +1,50 @@
1
+ /**
2
+ * 一个插件实例的登记账(每个 ctx 一本):ctx 的每次登记都记一笔,撤销实例时逐项(倒序)撤销。
3
+ * 封账(`seal()`,实例开始撤销 / ctx 关闭)之后再登记:立即撤销这一项并抛错,不留下无人管的资源。
4
+ */
5
+ export class RegistrationLedger {
6
+ plugin;
7
+ items = [];
8
+ closed = false;
9
+ constructor(plugin) {
10
+ this.plugin = plugin;
11
+ }
12
+ /**
13
+ * 记一笔,返回「销账」函数(插件自己撤销时调用,如退订、释放锁;只从账上拿掉,不再调用 dispose)。
14
+ * 已封账时先撤销这一项再抛错。
15
+ */
16
+ add(r) {
17
+ if (this.closed) {
18
+ void r.dispose().catch(() => { });
19
+ throw new Error(`plugin ${this.plugin}: the plugin instance is unloaded; ${r.kind} "${r.key}" cannot be registered`);
20
+ }
21
+ this.items.push(r);
22
+ return () => {
23
+ this.items = this.items.filter((x) => x !== r);
24
+ };
25
+ }
26
+ /** 当前账上的登记(按登记顺序,副本)。 */
27
+ list() {
28
+ return [...this.items];
29
+ }
30
+ get sealed() {
31
+ return this.closed;
32
+ }
33
+ /** 封账:此后的登记立即撤销并抛错。 */
34
+ seal() {
35
+ this.closed = true;
36
+ }
37
+ /** 封账并按登记的倒序逐项撤销;单项失败交给 `onError`,继续其余各项。 */
38
+ async disposeAll(onError) {
39
+ this.seal();
40
+ while (this.items.length > 0) {
41
+ const r = this.items.pop();
42
+ try {
43
+ await r.dispose();
44
+ }
45
+ catch (e) {
46
+ onError(r, e);
47
+ }
48
+ }
49
+ }
50
+ }
@@ -0,0 +1,80 @@
1
+ import type { Logger } from "@capybara-hq/plugin-sdk";
2
+ import type { ExtensionInstance } from "./instance.js";
3
+ import { PLUGINS_MIGRATED_TOPIC } from "./migrate-lock.js";
4
+ import type { ReplicaStatusStore } from "./sources.js";
5
+ /**
6
+ * 插件期望状态 / 快照变了(kernel bus 主题,频道 `cap:kernel:plugins.changed`,payload `{ plugin }`)。
7
+ * 后台、CLI 写完 PG 后发布;各副本据此 reconcile,并作废路由闸门的名字缓存。
8
+ */
9
+ export declare const PLUGINS_CHANGED_TOPIC = "plugins.changed";
10
+ /** 周期兜底(kernel bus 主题 `plugins.reconcile`,payload `{}`):维护任务 `plugins-reconcile` 发布。 */
11
+ export declare const PLUGINS_RECONCILE_TOPIC = "plugins.reconcile";
12
+ export { PLUGINS_MIGRATED_TOPIC };
13
+ /** 维护任务:每 `extensionHost.reconcileIntervalSeconds` 秒发布一次 `plugins.reconcile`(任务名与 scheduler id 不含 `:`)。 */
14
+ export declare const PLUGINS_RECONCILE_JOB = "plugins-reconcile";
15
+ export declare const PLUGINS_RECONCILE_SCHEDULER_ID = "plugins-reconcile-every";
16
+ /** 副本行心跳超过这么多个 reconcile 周期的副本不计入(C16;读状态的一方据此筛选)。 */
17
+ export declare const STALE_RECONCILE_PERIODS = 3;
18
+ /** The host operations {@link ExtensionLifecycle} needs. */
19
+ export interface LifecycleHost {
20
+ /** Converges this replica to the deployment's desired state (serialized; see `ExtensionHost.converge`). */
21
+ converge(): Promise<void>;
22
+ /** 用同一个包重新 setup(配置的非 hot 改动、依赖方联动)。 */
23
+ reload(name: string): Promise<ExtensionInstance>;
24
+ /**
25
+ * 部署配置保存后本副本重读并校验(hot 就地替换、非 hot 重新加载、不合法保持当前值);
26
+ * 插件此刻没在本副本生效时返回 `not_loaded`(待配置的由随后的 reconcile 加载)。
27
+ */
28
+ applyDeploymentConfig(name: string): Promise<string>;
29
+ /** 在本副本生效、声明了部署级配置的插件(周期 reconcile 据此补上丢了消息的配置改动)。 */
30
+ configurablePlugins(): string[];
31
+ /** 作废路由闸门的安装记录名字缓存。 */
32
+ invalidateKnownNames(): void;
33
+ /** 内置与配置声明的插件名。 */
34
+ declared(): ReadonlyMap<string, unknown>;
35
+ }
36
+ export interface ExtensionLifecycleDeps {
37
+ host: LifecycleHost;
38
+ bus: {
39
+ subscribe(topic: string, handler: (payload: unknown) => void): Promise<() => Promise<void>>;
40
+ };
41
+ status: ReplicaStatusStore;
42
+ /** 安装记录里的全部插件名(任何期望状态;清理本副本已不认识的状态行)。 */
43
+ installedNames(): Promise<string[]>;
44
+ reconcileIntervalSeconds(): number;
45
+ log: Pick<Logger, "info" | "warn" | "error">;
46
+ }
47
+ /**
48
+ * 每副本一个:把本副本的插件加载状态收敛到 PG 期望状态(C16)。
49
+ * 触发来源:bus `kernel.plugins.changed`(后台 / CLI 改了期望状态或快照)、`kernel.plugins.reconcile`(维护任务周期兜底,
50
+ * 丢了消息也能收敛)、`kernel.plugins.migrated`(别的副本迁移完成),以及启动。
51
+ * `reconcile` 在本副本内排队串行:进行中时再来的请求合并成「当前这次结束后再跑一次」。
52
+ * 每次 reconcile 开始与结束时都刷新本副本状态行的心跳,并清理已卸载插件的行与早已退出的副本的行。
53
+ * 进程内只有排队用的 Promise(不是跨副本状态)。
54
+ */
55
+ export declare class ExtensionLifecycle {
56
+ private readonly d;
57
+ private running;
58
+ private queued;
59
+ private unsubs;
60
+ private stopped;
61
+ constructor(d: ExtensionLifecycleDeps);
62
+ /** 订阅三个主题(订阅失败只记 error:周期任务的消息同样收不到时,下次启动再来)。 */
63
+ start(): Promise<void>;
64
+ /**
65
+ * 部署配置保存后(C10,本副本的 HTTP 请求与 bus 消息都走这里):生效的插件重读并校验(hot 就地替换、
66
+ * 非 hot 重新加载);没在本副本生效的(如待配置)跑一次 reconcile,配置合法了就加载。
67
+ */
68
+ applyConfig(plugin: string): Promise<void>;
69
+ /** 取消订阅;之后的 reconcile 直接返回。进行中的那次由宿主关闭收尾。 */
70
+ stop(): Promise<void>;
71
+ /**
72
+ * 收敛一次(本副本内串行;进行中时合并为「结束后再跑一次」,返回那一次的 Promise)。
73
+ * 宿主那一步失败只记 error(下一个周期再来);之后照常刷新心跳。
74
+ */
75
+ reconcile(reason: string): Promise<void>;
76
+ /** 用同一个包重新 setup(配置的非 hot 改动、依赖方联动;与 reconcile 一样在宿主的串行队列里)。 */
77
+ reload(name: string): Promise<void>;
78
+ private trigger;
79
+ private run;
80
+ }
@@ -0,0 +1,152 @@
1
+ import { PLUGIN_DEPLOYMENT_CONFIG_TOPIC } from "./deployment-config.js";
2
+ import { PLUGINS_MIGRATED_TOPIC } from "./migrate-lock.js";
3
+ /**
4
+ * 插件期望状态 / 快照变了(kernel bus 主题,频道 `cap:kernel:plugins.changed`,payload `{ plugin }`)。
5
+ * 后台、CLI 写完 PG 后发布;各副本据此 reconcile,并作废路由闸门的名字缓存。
6
+ */
7
+ export const PLUGINS_CHANGED_TOPIC = "plugins.changed";
8
+ /** 周期兜底(kernel bus 主题 `plugins.reconcile`,payload `{}`):维护任务 `plugins-reconcile` 发布。 */
9
+ export const PLUGINS_RECONCILE_TOPIC = "plugins.reconcile";
10
+ export { PLUGINS_MIGRATED_TOPIC };
11
+ /** 维护任务:每 `extensionHost.reconcileIntervalSeconds` 秒发布一次 `plugins.reconcile`(任务名与 scheduler id 不含 `:`)。 */
12
+ export const PLUGINS_RECONCILE_JOB = "plugins-reconcile";
13
+ export const PLUGINS_RECONCILE_SCHEDULER_ID = "plugins-reconcile-every";
14
+ /** 副本行心跳超过这么多个 reconcile 周期的副本不计入(C16;读状态的一方据此筛选)。 */
15
+ export const STALE_RECONCILE_PERIODS = 3;
16
+ /** 心跳超过这么多个周期的行直接删除(副本早已退出;读的一方本来就不计入)。 */
17
+ const PRUNE_RECONCILE_PERIODS = 10;
18
+ /**
19
+ * 每副本一个:把本副本的插件加载状态收敛到 PG 期望状态(C16)。
20
+ * 触发来源:bus `kernel.plugins.changed`(后台 / CLI 改了期望状态或快照)、`kernel.plugins.reconcile`(维护任务周期兜底,
21
+ * 丢了消息也能收敛)、`kernel.plugins.migrated`(别的副本迁移完成),以及启动。
22
+ * `reconcile` 在本副本内排队串行:进行中时再来的请求合并成「当前这次结束后再跑一次」。
23
+ * 每次 reconcile 开始与结束时都刷新本副本状态行的心跳,并清理已卸载插件的行与早已退出的副本的行。
24
+ * 进程内只有排队用的 Promise(不是跨副本状态)。
25
+ */
26
+ export class ExtensionLifecycle {
27
+ d;
28
+ running;
29
+ queued;
30
+ unsubs = [];
31
+ stopped = false;
32
+ constructor(d) {
33
+ this.d = d;
34
+ }
35
+ /** 订阅三个主题(订阅失败只记 error:周期任务的消息同样收不到时,下次启动再来)。 */
36
+ async start() {
37
+ const on = async (topic, handler) => {
38
+ try {
39
+ this.unsubs.push(await this.d.bus.subscribe(topic, handler));
40
+ }
41
+ catch (err) {
42
+ this.d.log.error("cannot subscribe to plugin lifecycle topic", { topic, err });
43
+ }
44
+ };
45
+ await on(PLUGINS_CHANGED_TOPIC, (p) => {
46
+ // 安装 / 卸载改变了「部署已知」的插件名:路由闸门不等 TTL
47
+ this.d.host.invalidateKnownNames();
48
+ this.trigger(`changed:${pluginOf(p)}`);
49
+ });
50
+ await on(PLUGINS_RECONCILE_TOPIC, () => this.trigger("periodic"));
51
+ await on(PLUGINS_MIGRATED_TOPIC, (p) => this.trigger(`migrated:${pluginOf(p)}`));
52
+ await on(PLUGIN_DEPLOYMENT_CONFIG_TOPIC, (p) => {
53
+ this.applyConfig(pluginOf(p)).catch((err) => this.d.log.error("applying a plugin deployment config change failed", {
54
+ plugin: pluginOf(p),
55
+ err,
56
+ }));
57
+ });
58
+ }
59
+ /**
60
+ * 部署配置保存后(C10,本副本的 HTTP 请求与 bus 消息都走这里):生效的插件重读并校验(hot 就地替换、
61
+ * 非 hot 重新加载);没在本副本生效的(如待配置)跑一次 reconcile,配置合法了就加载。
62
+ */
63
+ async applyConfig(plugin) {
64
+ if (this.stopped)
65
+ return;
66
+ const r = await this.d.host.applyDeploymentConfig(plugin);
67
+ if (r === "not_loaded")
68
+ await this.reconcile(`config:${plugin}`);
69
+ }
70
+ /** 取消订阅;之后的 reconcile 直接返回。进行中的那次由宿主关闭收尾。 */
71
+ async stop() {
72
+ this.stopped = true;
73
+ const unsubs = this.unsubs;
74
+ this.unsubs = [];
75
+ await Promise.allSettled(unsubs.map((u) => u()));
76
+ }
77
+ /**
78
+ * 收敛一次(本副本内串行;进行中时合并为「结束后再跑一次」,返回那一次的 Promise)。
79
+ * 宿主那一步失败只记 error(下一个周期再来);之后照常刷新心跳。
80
+ */
81
+ reconcile(reason) {
82
+ if (this.stopped)
83
+ return Promise.resolve();
84
+ if (this.queued)
85
+ return this.queued;
86
+ if (!this.running) {
87
+ this.running = this.run(reason).finally(() => {
88
+ this.running = undefined;
89
+ });
90
+ return this.running;
91
+ }
92
+ const after = this.running;
93
+ this.queued = after.then(() => {
94
+ this.queued = undefined;
95
+ return this.reconcile(reason);
96
+ });
97
+ return this.queued;
98
+ }
99
+ /** 用同一个包重新 setup(配置的非 hot 改动、依赖方联动;与 reconcile 一样在宿主的串行队列里)。 */
100
+ async reload(name) {
101
+ await this.d.host.reload(name);
102
+ }
103
+ trigger(reason) {
104
+ this.reconcile(reason).catch((err) => this.d.log.error("plugin reconcile failed", { reason, err }));
105
+ }
106
+ async run(reason) {
107
+ // 开始时也刷新心跳:converge 可能很久(排空在途调用、迁移),不能因此被读状态的一方当成退出的副本
108
+ await this.d.status.heartbeat().catch((err) => {
109
+ this.d.log.warn("cannot refresh plugin replica status heartbeats", { err });
110
+ });
111
+ try {
112
+ await this.d.host.converge();
113
+ }
114
+ catch (err) {
115
+ if (this.stopped)
116
+ return;
117
+ this.d.log.error("plugin reconcile failed; retrying on the next cycle", { reason, err });
118
+ }
119
+ if (this.stopped)
120
+ return;
121
+ if (reason === "periodic") {
122
+ // 丢了 plugin-deployment-config 消息时:周期兜底重读生效插件的部署配置(没变时什么都不做)
123
+ for (const name of this.d.host.configurablePlugins()) {
124
+ if (this.stopped)
125
+ return;
126
+ try {
127
+ await this.d.host.applyDeploymentConfig(name);
128
+ }
129
+ catch (err) {
130
+ if (this.stopped)
131
+ return;
132
+ this.d.log.error("applying a plugin deployment config change failed", {
133
+ plugin: name,
134
+ err,
135
+ });
136
+ }
137
+ }
138
+ }
139
+ try {
140
+ await this.d.status.heartbeat();
141
+ const keep = [...this.d.host.declared().keys(), ...(await this.d.installedNames())];
142
+ const period = this.d.reconcileIntervalSeconds();
143
+ await this.d.status.prune(keep, PRUNE_RECONCILE_PERIODS * period);
144
+ }
145
+ catch (err) {
146
+ this.d.log.warn("cannot refresh plugin replica status heartbeats", { err });
147
+ }
148
+ }
149
+ }
150
+ const pluginOf = (p) => typeof p === "object" && p !== null && typeof p.plugin === "string"
151
+ ? p.plugin
152
+ : "?";