@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,69 @@
1
+ import type { KernelDb } from "../db/kernel-schema.js";
2
+ /**
3
+ * Where an extension comes from (C15 / C13):
4
+ * - `config`: the startup config's `extensions` list (development mode and existing deployments),
5
+ * read-only in the admin console;
6
+ * - `install`: PG install records (`extension_installs`), the package in the content-addressed package
7
+ * store, synced to local disk by each replica before loading. The bootstrap plugins (package
8
+ * ecosystem spec §7, which replaced the builtin extensions) are install records too; where an
9
+ * install came from is `extension_installs.source`.
10
+ * On a name clash config > install, and the skipped one warns.
11
+ */
12
+ export type ExtensionSource = "config" | "install";
13
+ /** 副本(进程)id:`<hostname>-<pid>-<6 位随机>`,每个进程唯一(`http.replicaId` 可能跨重启不变或多副本相同)。 */
14
+ export declare function newReplicaId(): string;
15
+ /** Why `extension_replica_status.state = pending` (F-I: the admin view derives pending_config and so on from it). */
16
+ export type PendingReason = "config" | "approval" | "migration" | "dependency";
17
+ /** One load result (written to `extension_replica_status`). */
18
+ export interface ExtensionLoadStatus {
19
+ plugin: string;
20
+ version: string;
21
+ sha256: string | null;
22
+ source: ExtensionSource;
23
+ /** `unloaded`:本进程撤销了它(停用 / 卸载,或随提供方卸下时 reason 为 `dependency`)。停机时删掉本副本的行。 */
24
+ state: "loaded" | "failed" | "pending" | "unloaded";
25
+ reason: PendingReason | string | null;
26
+ detail: string | null;
27
+ /**
28
+ * 这一行的版本没加载成(failed / pending)而本副本仍在用旧版本(升级失败或待批准时旧版照常)时,旧版本号。
29
+ * 省略视同 null。
30
+ */
31
+ servingVersion?: string | null;
32
+ }
33
+ /** This replica's extension load status (PG `extension_replica_status`; each replica writes only its own rows). */
34
+ export declare class ReplicaStatusStore {
35
+ private readonly db;
36
+ readonly replicaId: string;
37
+ private readonly httpReplicaId?;
38
+ private readonly redact;
39
+ /** 本进程写过行(停机时才需要删;没写过时不碰数据库,例如启动在迁移前就失败)。 */
40
+ private wrote;
41
+ /**
42
+ * @param redact 写 `detail` 之前打码(内核传 logger 的 `redact`:报错信息里可能带着插件拼进去的密钥)。
43
+ */
44
+ constructor(db: KernelDb, replicaId: string, httpReplicaId?: string | undefined, redact?: (text: string) => string);
45
+ /** 打码后截断到 {@link MAX_DETAIL}。 */
46
+ private cleanDetail;
47
+ /** 写入(覆盖)本副本该插件的一行,心跳取当前时间。 */
48
+ write(s: ExtensionLoadStatus): Promise<void>;
49
+ /**
50
+ * 给本副本该插件已有的一行补一句说明(不改状态),如「同名安装记录被忽略」。
51
+ * 该插件这一行属于生效的那一方(配置声明),所以只追加 detail。
52
+ */
53
+ note(plugin: string, detail: string): Promise<void>;
54
+ /**
55
+ * 心跳:本副本全部行的 `heartbeat_at` 取当前时间(每次 reconcile 之后调用;读状态的一方只算心跳不超过
56
+ * 3 个 reconcile 周期的副本,C16)。
57
+ */
58
+ heartbeat(): Promise<void>;
59
+ /**
60
+ * 清理:删掉本副本已不认识的插件的行(卸载后的名字,`keep` 为部署此刻已知的插件名),以及任何副本心跳超过
61
+ * `staleSeconds` 的行(副本已退出或崩溃;读的一方本来就不计入它们)。返回删除的行数。
62
+ */
63
+ prune(keep: readonly string[], staleSeconds: number): Promise<number>;
64
+ /**
65
+ * 正常停机:删掉本副本的全部行(尽力而为)。副本已不在,不该再计入部署状态(否则停机后约 3 个 reconcile
66
+ * 周期里一直显示「收敛中」);崩溃的副本由 {@link prune} 按心跳清理。
67
+ */
68
+ removeAll(): Promise<void>;
69
+ }
@@ -0,0 +1,120 @@
1
+ import { randomBytes } from "node:crypto";
2
+ import { hostname } from "node:os";
3
+ import { sql } from "kysely";
4
+ /** 副本(进程)id:`<hostname>-<pid>-<6 位随机>`,每个进程唯一(`http.replicaId` 可能跨重启不变或多副本相同)。 */
5
+ export function newReplicaId() {
6
+ return `${hostname()}-${process.pid}-${randomBytes(3).toString("hex")}`;
7
+ }
8
+ /** detail 的长度上限(报错信息可能很长)。 */
9
+ const MAX_DETAIL = 2000;
10
+ /** This replica's extension load status (PG `extension_replica_status`; each replica writes only its own rows). */
11
+ export class ReplicaStatusStore {
12
+ db;
13
+ replicaId;
14
+ httpReplicaId;
15
+ redact;
16
+ /** 本进程写过行(停机时才需要删;没写过时不碰数据库,例如启动在迁移前就失败)。 */
17
+ wrote = false;
18
+ /**
19
+ * @param redact 写 `detail` 之前打码(内核传 logger 的 `redact`:报错信息里可能带着插件拼进去的密钥)。
20
+ */
21
+ constructor(db, replicaId, httpReplicaId, redact = (t) => t) {
22
+ this.db = db;
23
+ this.replicaId = replicaId;
24
+ this.httpReplicaId = httpReplicaId;
25
+ this.redact = redact;
26
+ }
27
+ /** 打码后截断到 {@link MAX_DETAIL}。 */
28
+ cleanDetail(detail) {
29
+ return this.redact(detail).slice(0, MAX_DETAIL);
30
+ }
31
+ /** 写入(覆盖)本副本该插件的一行,心跳取当前时间。 */
32
+ async write(s) {
33
+ this.wrote = true;
34
+ const values = {
35
+ replica_id: this.replicaId,
36
+ plugin: s.plugin,
37
+ version: s.version,
38
+ sha256: s.sha256,
39
+ source: s.source,
40
+ state: s.state,
41
+ reason: s.reason,
42
+ detail: s.detail === null ? null : this.cleanDetail(s.detail),
43
+ serving_version: s.servingVersion ?? null,
44
+ http_replica_id: this.httpReplicaId ?? null,
45
+ heartbeat_at: sql `now()`,
46
+ };
47
+ await this.db
48
+ .insertInto("extension_replica_status")
49
+ .values(values)
50
+ .onConflict((oc) => oc.columns(["replica_id", "plugin"]).doUpdateSet({
51
+ version: values.version,
52
+ sha256: values.sha256,
53
+ source: values.source,
54
+ state: values.state,
55
+ reason: values.reason,
56
+ detail: values.detail,
57
+ serving_version: values.serving_version,
58
+ http_replica_id: values.http_replica_id,
59
+ heartbeat_at: values.heartbeat_at,
60
+ }))
61
+ .execute();
62
+ }
63
+ /**
64
+ * 给本副本该插件已有的一行补一句说明(不改状态),如「同名安装记录被忽略」。
65
+ * 该插件这一行属于生效的那一方(配置声明),所以只追加 detail。
66
+ */
67
+ async note(plugin, detail) {
68
+ await this.db
69
+ .updateTable("extension_replica_status")
70
+ .set({ detail: this.cleanDetail(detail) })
71
+ .where("replica_id", "=", this.replicaId)
72
+ .where("plugin", "=", plugin)
73
+ .execute();
74
+ }
75
+ /**
76
+ * 心跳:本副本全部行的 `heartbeat_at` 取当前时间(每次 reconcile 之后调用;读状态的一方只算心跳不超过
77
+ * 3 个 reconcile 周期的副本,C16)。
78
+ */
79
+ async heartbeat() {
80
+ if (!this.wrote)
81
+ return;
82
+ await this.db
83
+ .updateTable("extension_replica_status")
84
+ .set({ heartbeat_at: sql `now()` })
85
+ .where("replica_id", "=", this.replicaId)
86
+ .execute();
87
+ }
88
+ /**
89
+ * 清理:删掉本副本已不认识的插件的行(卸载后的名字,`keep` 为部署此刻已知的插件名),以及任何副本心跳超过
90
+ * `staleSeconds` 的行(副本已退出或崩溃;读的一方本来就不计入它们)。返回删除的行数。
91
+ */
92
+ async prune(keep, staleSeconds) {
93
+ let n = 0;
94
+ if (this.wrote) {
95
+ let q = this.db
96
+ .deleteFrom("extension_replica_status")
97
+ .where("replica_id", "=", this.replicaId);
98
+ if (keep.length > 0)
99
+ q = q.where("plugin", "not in", [...keep]);
100
+ n += Number((await q.executeTakeFirst()).numDeletedRows);
101
+ }
102
+ const r = await this.db
103
+ .deleteFrom("extension_replica_status")
104
+ .where("heartbeat_at", "<", sql `now() - make_interval(secs => ${staleSeconds})`)
105
+ .executeTakeFirst();
106
+ return n + Number(r.numDeletedRows);
107
+ }
108
+ /**
109
+ * 正常停机:删掉本副本的全部行(尽力而为)。副本已不在,不该再计入部署状态(否则停机后约 3 个 reconcile
110
+ * 周期里一直显示「收敛中」);崩溃的副本由 {@link prune} 按心跳清理。
111
+ */
112
+ async removeAll() {
113
+ if (!this.wrote)
114
+ return;
115
+ await this.db
116
+ .deleteFrom("extension_replica_status")
117
+ .where("replica_id", "=", this.replicaId)
118
+ .execute();
119
+ }
120
+ }
@@ -0,0 +1,40 @@
1
+ import { type ExtensionPackageLimits } from "./package.js";
2
+ /**
3
+ * 把内容寻址的插件包同步到本副本的本地目录(C13):`<dir>/<name>/<sha256 前 16 位>/`。
4
+ *
5
+ * - 目录里有校验文件 {@link MARKER} 且其中每个文件的 sha256 都对得上 → 直接复用(同一 sha 重启不再下载);
6
+ * - 否则取包(`blobs.get` 按记录的存放位置读取并校验 sha256),先解到同级的临时目录、写好宿主包链接与校验文件,
7
+ * 再改名换入;目标位置的残缺目录先原子地改名移开再删(不原地删除,见 {@link clearBrokenRoot})。并发的同机进程
8
+ * 各自解到自己的临时目录,改名失败时以已就位且完整的为准。
9
+ * - `node_modules/` 下为 {@link HOST_PROVIDED_PACKAGES} 建指向宿主副本的符号链接:插件 import 的 SDK 与 zod
10
+ * 就是内核用的那一份(同一模块实例)。插件目录不在宿主 `node_modules` 的上游,别的包一概解析不到。
11
+ */
12
+ /** 从包存储取到的字节与安装记录的 sha256 不符。 */
13
+ export declare class PackageShaMismatchError extends Error {
14
+ constructor(name: string, sha: string);
15
+ }
16
+ /** 解包完成后写入包根的校验文件(`wx` 写入:包里自带同名文件时同步失败)。 */
17
+ export declare const MARKER = ".capybara-package.json";
18
+ export interface Marker {
19
+ sha256: string;
20
+ entry: string;
21
+ /** 包内文件(相对包根) → sha256。 */
22
+ files: Record<string, string>;
23
+ }
24
+ /**
25
+ * 同步一个包到本地并返回 entry 的 file URL(见文件头)。`limits` 与安装时校验用同一组(`packages.maxBytes`),
26
+ * 缺省按包自身大小。名字、sha256 不合法或取到的字节与 sha256 不符时抛错,不落盘。
27
+ */
28
+ export declare function syncPackage(dir: string, name: string, sha: string, blobs: {
29
+ get(sha256: string): Promise<Uint8Array>;
30
+ }, limits?: ExtensionPackageLimits): Promise<string>;
31
+ /**
32
+ * Gets a broken package root out of the way before the rename. Never `rm` in place: another process
33
+ * on the same volume may have renamed its complete directory in after our `intact` check. The root is
34
+ * renamed aside atomically and checked again there: if it turns out complete, it is put back (or,
35
+ * when yet another process filled the root meanwhile, that one is used) and returned; otherwise the
36
+ * moved-aside copy is deleted. Exported for tests.
37
+ */
38
+ export declare function clearBrokenRoot(root: string, sha: string): Promise<Marker | undefined>;
39
+ /** `syncPackage` 返回的 entry URL 对应的包根目录(去掉 entry 的各段)。 */
40
+ export declare function packageRootOf(entryUrl: string, entry: string): string;
@@ -0,0 +1,242 @@
1
+ import { createHash, randomBytes } from "node:crypto";
2
+ import { existsSync, realpathSync } from "node:fs";
3
+ import { mkdir, readdir, readFile, rename, rm, stat, symlink, writeFile } from "node:fs/promises";
4
+ import { dirname, join, relative, resolve as resolvePath, sep } from "node:path";
5
+ import { fileURLToPath, pathToFileURL } from "node:url";
6
+ import { HOST_PROVIDED_PACKAGES, isSafePackagePath, PLUGIN_MANIFEST_FILE, } from "@capybara-hq/plugin-sdk";
7
+ import { LEGACY_FORMAT_MESSAGE, packagePath } from "../packages/tgz.js";
8
+ import { ExtensionPackageError, extractExtensionPackage, } from "./package.js";
9
+ /**
10
+ * 把内容寻址的插件包同步到本副本的本地目录(C13):`<dir>/<name>/<sha256 前 16 位>/`。
11
+ *
12
+ * - 目录里有校验文件 {@link MARKER} 且其中每个文件的 sha256 都对得上 → 直接复用(同一 sha 重启不再下载);
13
+ * - 否则取包(`blobs.get` 按记录的存放位置读取并校验 sha256),先解到同级的临时目录、写好宿主包链接与校验文件,
14
+ * 再改名换入;目标位置的残缺目录先原子地改名移开再删(不原地删除,见 {@link clearBrokenRoot})。并发的同机进程
15
+ * 各自解到自己的临时目录,改名失败时以已就位且完整的为准。
16
+ * - `node_modules/` 下为 {@link HOST_PROVIDED_PACKAGES} 建指向宿主副本的符号链接:插件 import 的 SDK 与 zod
17
+ * 就是内核用的那一份(同一模块实例)。插件目录不在宿主 `node_modules` 的上游,别的包一概解析不到。
18
+ */
19
+ /** 从包存储取到的字节与安装记录的 sha256 不符。 */
20
+ export class PackageShaMismatchError extends Error {
21
+ constructor(name, sha) {
22
+ super(`package ${name}: downloaded bytes do not match sha256 ${sha}`);
23
+ this.name = "PackageShaMismatchError";
24
+ }
25
+ }
26
+ /** 解包完成后写入包根的校验文件(`wx` 写入:包里自带同名文件时同步失败)。 */
27
+ export const MARKER = ".capybara-package.json";
28
+ /** 插件名规则同清单(`defineExtension` 的 name 校验),用作目录名。 */
29
+ const EXTENSION_NAME_RE = /^[a-z][a-z0-9-]{1,40}$/;
30
+ const SHA256_RE = /^[0-9a-f]{64}$/;
31
+ const sha256 = (b) => createHash("sha256").update(b).digest("hex");
32
+ /** 从内核所在位置向上找 `node_modules/<pkg>`(与 Node 的解析路径一致,不看 exports / 条件),返回真实路径。 */
33
+ function hostPackageDir(pkg) {
34
+ let d = dirname(fileURLToPath(import.meta.url));
35
+ for (;;) {
36
+ const candidate = join(d, "node_modules", ...pkg.split("/"));
37
+ if (existsSync(join(candidate, "package.json")))
38
+ return realpathSync(candidate);
39
+ const up = dirname(d);
40
+ if (up === d)
41
+ throw new Error(`cannot find the host copy of ${pkg}`);
42
+ d = up;
43
+ }
44
+ }
45
+ let hostDirs;
46
+ /** 宿主提供的包 → 宿主副本目录(首次调用时解析;进程内只读)。 */
47
+ function hostPackageDirs() {
48
+ hostDirs ??= new Map(HOST_PROVIDED_PACKAGES.map((p) => [p, hostPackageDir(p)]));
49
+ return hostDirs;
50
+ }
51
+ /** 已就位的目录是否完整:校验文件的 sha256 对得上、每个文件内容对得上、宿主包链接都在。 */
52
+ async function intact(root, sha) {
53
+ let marker;
54
+ try {
55
+ marker = JSON.parse(await readFile(join(root, MARKER), "utf8"));
56
+ }
57
+ catch {
58
+ return undefined;
59
+ }
60
+ if (marker.sha256 !== sha || typeof marker.files !== "object" || !marker.files)
61
+ return undefined;
62
+ if (typeof marker.entry !== "string" || !Object.hasOwn(marker.files, marker.entry))
63
+ return undefined;
64
+ for (const [path, digest] of Object.entries(marker.files)) {
65
+ if (!isSafePackagePath(path))
66
+ return undefined;
67
+ try {
68
+ if (sha256(await readFile(join(root, path))) !== digest)
69
+ return undefined;
70
+ }
71
+ catch {
72
+ return undefined;
73
+ }
74
+ }
75
+ for (const pkg of HOST_PROVIDED_PACKAGES) {
76
+ if (!existsSync(join(root, "node_modules", ...pkg.split("/"), "package.json")))
77
+ return undefined;
78
+ }
79
+ // 文件集合也要一致:多出来的文件(不在校验文件里)同样视为不完整,重新解包
80
+ let present;
81
+ try {
82
+ present = (await listFiles(root)).filter((f) => f !== MARKER);
83
+ }
84
+ catch {
85
+ return undefined;
86
+ }
87
+ const expected = Object.keys(marker.files);
88
+ if (present.length !== expected.length || present.some((f) => !Object.hasOwn(marker.files, f))) {
89
+ return undefined;
90
+ }
91
+ return marker;
92
+ }
93
+ /** 列出目录下的全部普通文件(相对路径,`/` 分隔;不跟随符号链接,宿主包链接不算)。 */
94
+ async function listFiles(root, sub = "") {
95
+ const out = [];
96
+ for (const e of await readdir(join(root, sub), { withFileTypes: true })) {
97
+ const rel = sub === "" ? e.name : `${sub}/${e.name}`;
98
+ if (e.isDirectory())
99
+ out.push(...(await listFiles(root, rel)));
100
+ else if (e.isFile())
101
+ out.push(rel);
102
+ }
103
+ return out;
104
+ }
105
+ /**
106
+ * 同步一个包到本地并返回 entry 的 file URL(见文件头)。`limits` 与安装时校验用同一组(`packages.maxBytes`),
107
+ * 缺省按包自身大小。名字、sha256 不合法或取到的字节与 sha256 不符时抛错,不落盘。
108
+ */
109
+ export async function syncPackage(dir, name, sha, blobs, limits) {
110
+ if (!EXTENSION_NAME_RE.test(name))
111
+ throw new Error(`invalid plugin name "${name}"`);
112
+ if (!SHA256_RE.test(sha))
113
+ throw new Error(`invalid package sha256 "${sha}"`);
114
+ const base = join(resolvePath(dir), name);
115
+ const root = join(base, sha.slice(0, 16));
116
+ const urlOf = (m) => pathToFileURL(join(root, ...m.entry.split("/"))).href;
117
+ const existing = await intact(root, sha);
118
+ if (existing) {
119
+ // a directory synced before 0.1.0 is complete but in the old format: refuse it the same way
120
+ await extensionEntryOf(root, name);
121
+ return urlOf(existing);
122
+ }
123
+ const bytes = await blobs.get(sha);
124
+ if (sha256(bytes) !== sha)
125
+ throw new PackageShaMismatchError(name, sha);
126
+ await mkdir(base, { recursive: true, mode: 0o755 });
127
+ const tmp = join(base, `.tmp-${sha.slice(0, 16)}-${randomBytes(4).toString("hex")}`);
128
+ try {
129
+ await extractExtensionPackage(bytes, tmp, limits ?? { maxBytes: bytes.byteLength });
130
+ const entry = await extensionEntryOf(tmp, name);
131
+ const files = {};
132
+ for (const f of await listFiles(tmp))
133
+ files[f] = sha256(await readFile(join(tmp, f)));
134
+ if (!Object.hasOwn(files, entry))
135
+ throw new Error(`package ${name}: entry ${entry} not found`);
136
+ for (const [pkgName, target] of hostPackageDirs()) {
137
+ const link = join(tmp, "node_modules", ...pkgName.split("/"));
138
+ await mkdir(dirname(link), { recursive: true, mode: 0o755 });
139
+ await symlink(target, link, "dir");
140
+ }
141
+ const marker = { sha256: sha, entry, files };
142
+ await writeFile(join(tmp, MARKER), JSON.stringify(marker), { flag: "wx", mode: 0o644 });
143
+ // 换入:解包期间同机另一个进程可能已换入完整的目录——以它为准,不删;否则先移走残缺目录
144
+ const done = await intact(root, sha);
145
+ if (done)
146
+ return urlOf(done);
147
+ const restored = await clearBrokenRoot(root, sha);
148
+ if (restored)
149
+ return urlOf(restored);
150
+ try {
151
+ await rename(tmp, root);
152
+ }
153
+ catch (e) {
154
+ // 同机另一个进程刚换入:以它为准(必须完整),否则抛原错误
155
+ const other = await intact(root, sha);
156
+ if (!other)
157
+ throw e;
158
+ return urlOf(other);
159
+ }
160
+ return urlOf(marker);
161
+ }
162
+ finally {
163
+ await rm(tmp, { recursive: true, force: true }).catch(() => { });
164
+ }
165
+ }
166
+ /**
167
+ * The extension entry (relative to the package root) from the unpacked package's
168
+ * `.capybara-plugin/plugin.json`. A package in the pre-0.1.0 format (no plugin.json, a `capybara`
169
+ * section or `app.yaml`) -> {@link ExtensionPackageError} `extension.legacy_format` (the host
170
+ * records it as the replica's failure instead of loading).
171
+ */
172
+ async function extensionEntryOf(root, name) {
173
+ const read = async (path) => {
174
+ try {
175
+ return JSON.parse(await readFile(join(root, ...path.split("/")), "utf8"));
176
+ }
177
+ catch (e) {
178
+ if (e.code === "ENOENT")
179
+ return undefined;
180
+ throw e;
181
+ }
182
+ };
183
+ const manifest = (await read(PLUGIN_MANIFEST_FILE));
184
+ if (manifest === undefined) {
185
+ const pkg = (await read("package.json"));
186
+ if (pkg?.capybara !== undefined || existsSync(join(root, "app.yaml"))) {
187
+ throw new ExtensionPackageError([`Package of extension ${name} ${LEGACY_FORMAT_MESSAGE}`], "extension.legacy_format");
188
+ }
189
+ throw new Error(`package ${name}: ${PLUGIN_MANIFEST_FILE} is missing`);
190
+ }
191
+ const entry = manifest.extension?.entry;
192
+ if (typeof entry !== "string" || !isSafePackagePath(packagePath(entry))) {
193
+ throw new Error(`package ${name}: ${PLUGIN_MANIFEST_FILE} has no extension entry`);
194
+ }
195
+ return packagePath(entry);
196
+ }
197
+ /**
198
+ * Gets a broken package root out of the way before the rename. Never `rm` in place: another process
199
+ * on the same volume may have renamed its complete directory in after our `intact` check. The root is
200
+ * renamed aside atomically and checked again there: if it turns out complete, it is put back (or,
201
+ * when yet another process filled the root meanwhile, that one is used) and returned; otherwise the
202
+ * moved-aside copy is deleted. Exported for tests.
203
+ */
204
+ export async function clearBrokenRoot(root, sha) {
205
+ if (!(await exists(root)))
206
+ return undefined;
207
+ const aside = join(dirname(root), `.old-${sha.slice(0, 16)}-${randomBytes(4).toString("hex")}`);
208
+ try {
209
+ await rename(root, aside);
210
+ }
211
+ catch (e) {
212
+ if (e.code === "ENOENT")
213
+ return undefined;
214
+ throw e;
215
+ }
216
+ try {
217
+ const moved = await intact(aside, sha);
218
+ if (!moved)
219
+ return undefined;
220
+ try {
221
+ await rename(aside, root);
222
+ return moved;
223
+ }
224
+ catch {
225
+ return await intact(root, sha);
226
+ }
227
+ }
228
+ finally {
229
+ await rm(aside, { recursive: true, force: true }).catch(() => { });
230
+ }
231
+ }
232
+ const exists = async (p) => stat(p).then(() => true, () => false);
233
+ /** `syncPackage` 返回的 entry URL 对应的包根目录(去掉 entry 的各段)。 */
234
+ export function packageRootOf(entryUrl, entry) {
235
+ const file = fileURLToPath(entryUrl);
236
+ const root = resolvePath(file, ...entry.split("/").map(() => ".."));
237
+ const rel = relative(root, file);
238
+ if (rel.startsWith("..") || rel.split(sep).join("/") !== entry) {
239
+ throw new Error(`entry ${entry} is not inside ${root}`);
240
+ }
241
+ return root;
242
+ }
@@ -0,0 +1,46 @@
1
+ import { z } from "zod";
2
+ import { type Principal } from "../identity/principal.js";
3
+ import { type OrgContext } from "../orgs/org.guard.js";
4
+ import type { OrgPreviewerItem, PreviewerItem, PreviewerRegistry } from "./previewers.js";
5
+ declare const PreviewQuery: z.ZodObject<{
6
+ locale: z.ZodDefault<z.ZodEnum<{
7
+ en: "en";
8
+ zh: "zh";
9
+ }>>;
10
+ }, z.core.$strip>;
11
+ declare const OrderBody: z.ZodObject<{
12
+ items: z.ZodArray<z.ZodObject<{
13
+ plugin: z.ZodString;
14
+ id: z.ZodString;
15
+ disabled: z.ZodDefault<z.ZodBoolean>;
16
+ }, z.core.$strip>>;
17
+ }, z.core.$strip>;
18
+ /**
19
+ * `file-preview@1` (UI refresh B Task 11):
20
+ * - `GET /api/v1/orgs/:orgId/conversations/:id/files/:fileId/previewers` → `{ previewers }`: the
21
+ * extension previewers that take this file version, in the org's order (viewer must read the
22
+ * conversation, otherwise 404);
23
+ * - `GET .../files/:fileId/previews/:plugin/:previewerId?locale=` → `{ view }`: a view previewer's
24
+ * render (10 s → 504 `ui.timeout`, throws → 502 `ui.render_failed`, invalid → 502
25
+ * `ui.invalid_view`); an embed previewer gets its token from the ui embed-token route with
26
+ * `{ conversationId, fileId }` and the file over the message bridge;
27
+ * - `GET / PUT /api/v1/orgs/:orgId/file-previewers` (`org.extensions.manage`) → `{ items }`: the
28
+ * org's order; PUT lists `{ plugin, id, disabled }` first-to-last, the rest follow.
29
+ */
30
+ export declare class FilePreviewersController {
31
+ private readonly previewers;
32
+ constructor(previewers: PreviewerRegistry);
33
+ forFile(principal: Principal, org: OrgContext, id: string, fileId: string): Promise<{
34
+ previewers: PreviewerItem[];
35
+ }>;
36
+ preview(principal: Principal, org: OrgContext, id: string, fileId: string, plugin: string, previewerId: string, q: z.infer<typeof PreviewQuery>): Promise<{
37
+ view: import("@capybara-hq/plugin-sdk").UiView;
38
+ }>;
39
+ list(org: OrgContext): Promise<{
40
+ items: OrgPreviewerItem[];
41
+ }>;
42
+ put(org: OrgContext, principal: Principal, body: z.infer<typeof OrderBody>): Promise<{
43
+ items: OrgPreviewerItem[];
44
+ }>;
45
+ }
46
+ export {};
@@ -0,0 +1,105 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
8
+ return function (target, key) { decorator(target, key, paramIndex); }
9
+ };
10
+ import { Body, Controller, Get, Header, Inject, Param, Put, Query } from "@nestjs/common";
11
+ import { z } from "zod";
12
+ import { FILE_PREVIEWERS } from "../http/tokens.js";
13
+ import { ZodPipe } from "../http/zod.pipe.js";
14
+ import { CurrentPrincipal, requireUser } from "../identity/principal.js";
15
+ import { CurrentOrg, OrgAction } from "../orgs/org.guard.js";
16
+ const Id = z.string().min(1).max(100);
17
+ const PreviewQuery = z.object({ locale: z.enum(["zh", "en"]).default("en") });
18
+ const OrderBody = z.object({
19
+ items: z.array(z.object({ plugin: Id, id: Id, disabled: z.boolean().default(false) })).max(500),
20
+ });
21
+ /**
22
+ * `file-preview@1` (UI refresh B Task 11):
23
+ * - `GET /api/v1/orgs/:orgId/conversations/:id/files/:fileId/previewers` → `{ previewers }`: the
24
+ * extension previewers that take this file version, in the org's order (viewer must read the
25
+ * conversation, otherwise 404);
26
+ * - `GET .../files/:fileId/previews/:plugin/:previewerId?locale=` → `{ view }`: a view previewer's
27
+ * render (10 s → 504 `ui.timeout`, throws → 502 `ui.render_failed`, invalid → 502
28
+ * `ui.invalid_view`); an embed previewer gets its token from the ui embed-token route with
29
+ * `{ conversationId, fileId }` and the file over the message bridge;
30
+ * - `GET / PUT /api/v1/orgs/:orgId/file-previewers` (`org.extensions.manage`) → `{ items }`: the
31
+ * org's order; PUT lists `{ plugin, id, disabled }` first-to-last, the rest follow.
32
+ */
33
+ let FilePreviewersController = class FilePreviewersController {
34
+ previewers;
35
+ constructor(previewers) {
36
+ this.previewers = previewers;
37
+ }
38
+ async forFile(principal, org, id, fileId) {
39
+ const p = requireUser(principal);
40
+ return { previewers: await this.previewers.forFile(org.orgId, id, p.account.id, fileId) };
41
+ }
42
+ async preview(principal, org, id, fileId, plugin, previewerId, q) {
43
+ const p = requireUser(principal);
44
+ const view = await this.previewers.render({
45
+ orgId: org.orgId,
46
+ accountId: p.account.id,
47
+ conversationId: id,
48
+ fileId,
49
+ plugin,
50
+ id: previewerId,
51
+ locale: q.locale,
52
+ });
53
+ return { view };
54
+ }
55
+ async list(org) {
56
+ return { items: await this.previewers.list(org.orgId) };
57
+ }
58
+ async put(org, principal, body) {
59
+ const actor = principal.kind === "service"
60
+ ? { tokenId: principal.tokenId }
61
+ : {
62
+ accountId: principal.account.id,
63
+ ...(principal.via === "pat" && { tokenId: principal.tokenId }),
64
+ };
65
+ return { items: await this.previewers.put(org.orgId, body.items, actor) };
66
+ }
67
+ };
68
+ __decorate([
69
+ Get("conversations/:id/files/:fileId/previewers"),
70
+ Header("cache-control", "private, no-store"),
71
+ OrgAction("agents.use"),
72
+ __param(0, CurrentPrincipal()),
73
+ __param(1, CurrentOrg()),
74
+ __param(2, Param("id")),
75
+ __param(3, Param("fileId"))
76
+ ], FilePreviewersController.prototype, "forFile", null);
77
+ __decorate([
78
+ Get("conversations/:id/files/:fileId/previews/:plugin/:previewerId"),
79
+ Header("cache-control", "private, no-store"),
80
+ OrgAction("agents.use"),
81
+ __param(0, CurrentPrincipal()),
82
+ __param(1, CurrentOrg()),
83
+ __param(2, Param("id")),
84
+ __param(3, Param("fileId")),
85
+ __param(4, Param("plugin", new ZodPipe(Id))),
86
+ __param(5, Param("previewerId", new ZodPipe(Id))),
87
+ __param(6, Query(new ZodPipe(PreviewQuery)))
88
+ ], FilePreviewersController.prototype, "preview", null);
89
+ __decorate([
90
+ Get("file-previewers"),
91
+ OrgAction("org.extensions.manage"),
92
+ __param(0, CurrentOrg())
93
+ ], FilePreviewersController.prototype, "list", null);
94
+ __decorate([
95
+ Put("file-previewers"),
96
+ OrgAction("org.extensions.manage"),
97
+ __param(0, CurrentOrg()),
98
+ __param(1, CurrentPrincipal()),
99
+ __param(2, Body(new ZodPipe(OrderBody)))
100
+ ], FilePreviewersController.prototype, "put", null);
101
+ FilePreviewersController = __decorate([
102
+ Controller("api/v1/orgs/:orgId"),
103
+ __param(0, Inject(FILE_PREVIEWERS))
104
+ ], FilePreviewersController);
105
+ export { FilePreviewersController };