@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,149 @@
1
+ import { type Logger, type SkillInvocation } from "@capybara-hq/plugin-sdk";
2
+ import { type Transaction } from "kysely";
3
+ import type { AgentDefinition } from "../agents/definition.js";
4
+ import type { EventLog } from "../conversations/event-log.js";
5
+ import { type ConversationEvent } from "../conversations/events.js";
6
+ import type { KernelDatabase, KernelDb, SkillManifest, SourceFormat } from "../db/kernel-schema.js";
7
+ import { ApiError } from "../errors.js";
8
+ import { type CatalogSkill, type PinnedSkill, type SkillsSnapshot } from "../runtime/context/skills.js";
9
+ import type { StorageService } from "../storage/storage.service.js";
10
+ /**
11
+ * 技能目录快照(M5 T14,Ruling M17):运行开始时解析「此刻对这个对话生效的技能」,与日志里最新一份快照不同才写
12
+ * `skills_catalog`。模型看到的目录与 `skill_load` 的名字解析只来自日志,不读实时的库。
13
+ */
14
+ /**
15
+ * Pinned skill limits (spec §9.1): at most `count` pinned skills per agent, whose current SKILL.md
16
+ * sizes total at most `totalBytes`. Saving checks both; at run time the pinned bodies are kept in
17
+ * the agent's order while they fit.
18
+ */
19
+ export declare const PINNED_SKILLS_LIMITS: {
20
+ readonly count: 3;
21
+ readonly totalBytes: 32768;
22
+ };
23
+ /** {@link resolveEffectiveSkills} 的输入。 */
24
+ export interface EffectiveSkillsInput {
25
+ orgId: string;
26
+ agentId: string;
27
+ /** 本次运行固定的 agent 版本的定义(`skills.orgSkills` 是选中的组织技能 id)。 */
28
+ agent: Pick<AgentDefinition, "skills">;
29
+ /**
30
+ * 对话 id:共享 agent 待批准的技能改动(T15,`skill_change_requests`)只在发起它的对话里生效(试用),
31
+ * 在这里按对话覆盖。
32
+ */
33
+ conversationId: string;
34
+ }
35
+ /**
36
+ * 此刻对这个对话生效的技能,按名字(码点序)排序:
37
+ * - 运行所用 agent 版本选中的组织技能(`scope='org'`,id 在 `skills.orgSkills` 里);
38
+ * - 加上这个 agent 自己的技能(`scope='agent'`);
39
+ * - 已删除的跳过(保存过的 agent 版本仍可能引用它们);
40
+ * - 版本取 `current_version`,描述取该版本清单里的描述。
41
+ * 组织技能与 agent 自己的技能同名时只保留 agent 自己的(更具体;`/skills/<name>/` 与按名字加载都不能有两个)。
42
+ *
43
+ * 试用(T15,R4):这个 agent 待批准、且由本对话发起的技能改动,按名字替换对应技能的版本 / 新增技能
44
+ * (id 为已有技能或预先分配的 id,版本为批准后预期的版本号);其他对话照旧用 `current_version`。
45
+ * 批准后版本成为当前版本,各对话下一次运行开始时由快照差异得到提醒;拒绝 / 取消后发起对话回到当前版本。
46
+ */
47
+ export declare function resolveEffectiveSkills(db: KernelDb, input: EffectiveSkillsInput, log?: Pick<Logger, "warn">): Promise<CatalogSkill[]>;
48
+ /** The invocation metadata of a skill version: the manifest's, or the defaults when absent. */
49
+ export declare function invocationOf(manifest: Pick<SkillManifest, "invocation">): SkillInvocation;
50
+ /** An effective skill with what the snapshot needs beyond its catalog entry. */
51
+ export interface ResolvedSkill {
52
+ skill: CatalogSkill;
53
+ /** The source format of its version (a trial draft is `capybara`). */
54
+ format: SourceFormat;
55
+ /** Its version's file manifest (a trial draft's proposed one). */
56
+ manifest: SkillManifest;
57
+ }
58
+ /**
59
+ * Every effective skill with its format and manifest, sorted by name, manual-only versions
60
+ * included and not truncated ({@link forModel} gives the model's part). Without
61
+ * `conversationId` (a conversation not created yet) no trial draft applies.
62
+ */
63
+ export declare function resolveSkills(db: KernelDb, input: Omit<EffectiveSkillsInput, "conversationId"> & {
64
+ conversationId?: string;
65
+ }): Promise<ResolvedSkill[]>;
66
+ /** A pinned skill to read: an effective skill the agent version pins. */
67
+ interface PinnedCandidate {
68
+ id: string;
69
+ version: number;
70
+ name: string;
71
+ source: string;
72
+ manifest: SkillManifest;
73
+ }
74
+ /**
75
+ * The `run_failed` message (shown to the user, English like the other run texts) for a
76
+ * `storage.unavailable` from {@link recordSkillsCatalog}: a pinned SKILL.md that is missing,
77
+ * corrupt or unparsable points at the agent's owner, since sending again cannot help; anything
78
+ * else is a transient storage failure.
79
+ */
80
+ export declare function pinnedFailureText(e: ApiError): string;
81
+ /**
82
+ * Reads each pinned skill's SKILL.md from `kernel/<orgId>/<source>SKILL.md`, verifies it against
83
+ * the manifest's size and sha256 and returns the parsed body, in order. Every failure throws
84
+ * `storage.unavailable` (Decision 9: the run fails before any model request):
85
+ * - a read error is retried once ({@link PINNED_READ_ATTEMPTS}), then is transient (the user
86
+ * sends again);
87
+ * - a manifest without SKILL.md, a missing object, an integrity mismatch, non-UTF-8 or an
88
+ * unparsable file is permanent: logged at `error` with the skill id and source, and the error
89
+ * carries `details: [{ reason: "pinned_unreadable", skillId, name, source }]`
90
+ * ({@link pinnedFailureText} turns it into an owner-facing message).
91
+ */
92
+ export declare function loadPinnedBodies(storage: StorageService, orgId: string, pinned: readonly PinnedCandidate[], opts?: {
93
+ signal?: AbortSignal;
94
+ log?: Pick<Logger, "error">;
95
+ }): Promise<PinnedSkill[]>;
96
+ /**
97
+ * The pinned skills that fit: in order while the running total of UTF-8 body bytes stays within
98
+ * {@link PINNED_SKILLS_LIMITS}.totalBytes; the first that does not fit and every later one are
99
+ * dropped with a warning (Review Focus 4: a pinned skill's new version can push a saved set over).
100
+ */
101
+ export declare function fitPinned(pinned: readonly PinnedSkill[], log: Pick<Logger, "warn"> | undefined, input: Partial<Pick<EffectiveSkillsInput, "orgId" | "agentId" | "conversationId">>): PinnedSkill[];
102
+ /** `skills_catalog` 的幂等键:每次运行最多写一份。 */
103
+ /**
104
+ * 是否给模型 `skill_load`:日志里有过技能目录快照(Ruling M17),**即使最新一份是空的**。构建请求与执行工具调用
105
+ * 用同一判定。不因空快照收回这个工具:工具集合一变缓存前缀就失效;而且 agent 没有别的工具时会发出「没有工具
106
+ * 但历史里有 tool_use」的请求,Anthropic 会拒绝。空目录下调用 skill_load 由 `NO_SKILLS_TEXT` 给出可执行的说明。
107
+ */
108
+ export declare function skillLoadOffered(latest: Extract<ConversationEvent, {
109
+ type: "skills_catalog";
110
+ }> | undefined,
111
+ /**
112
+ * Phase D (batch 2 review I2): the log holds a person's skill invocation (any `user_message`
113
+ * with `skill`), so an agent whose skills are all manual-only can still copy an invoked skill's
114
+ * files. Derived from the log, so a replay recomputes it.
115
+ */
116
+ invoked?: boolean): boolean;
117
+ /** Whether `events` hold a person's skill invocation (a `user_message` with `skill`). */
118
+ export declare const hasInvocation: (events: readonly ConversationEvent[]) => boolean;
119
+ /** {@link skillLoadOffered} for a conversation, read from the database. */
120
+ export declare function skillLoadOfferedIn(db: KernelDb, eventLog: Pick<EventLog, "latestOfType">, conversationId: string): Promise<boolean>;
121
+ export declare const skillsCatalogIdemKey: (runId: string) => string;
122
+ /**
123
+ * 在事务 `t` 里锁会话行(与 `EventLog.append` 同一把锁)并读最新一份技能目录快照(没有为 undefined)。
124
+ * 「读最新 → 推出下一份 → 追加」都在这把锁内,别的写快照的事务(运行开始、skill_write、拒绝时的回退)插不进来。
125
+ */
126
+ export declare function lockLatestCatalog(t: Transaction<KernelDatabase>, conversationId: string): Promise<SkillsSnapshot | undefined>;
127
+ /**
128
+ * 运行开始时记录技能目录快照:解析生效的技能,与日志里最新一份不同才写(带幂等键,崩溃重试不重复)。
129
+ * 从没有快照、现在也没有技能 → 不写(没有技能的 agent 不出现目录);之前有、现在全没了 → 写空快照(模型据此得知被移除)。
130
+ * 解析、比较、追加在一个事务里、先锁会话行:否则在解析与追加之间提交的拒绝 + 回退快照会被过时的草稿条目盖回去。
131
+ * 解析只读 skills / agents / 申请(不加锁),不会与别的路径形成死锁。
132
+ *
133
+ * Phase B: the snapshot also carries each skill's `plugin`, the pinned skills' bodies (`pinned`)
134
+ * and the Claude Code tool-name map (`toolMap`, iff an effective skill has source format
135
+ * `claude-code`). Pinned bodies are read from object storage outside the transaction (1); inside
136
+ * it the skills are resolved again (2), and when the pinned identities changed meanwhile the
137
+ * whole thing starts over (at most {@link RECORD_ATTEMPTS} times, then `conflict`). A read failure
138
+ * throws `storage.unavailable` before anything is written. Writes only when `!sameSnapshot`.
139
+ */
140
+ export declare function recordSkillsCatalog(deps: {
141
+ db: KernelDb;
142
+ eventLog: Pick<EventLog, "append" | "notify">;
143
+ log?: Pick<Logger, "warn" | "error">;
144
+ /** Reads pinned bodies; without it an agent with pinned skills fails `storage.unavailable`. */
145
+ storage?: StorageService;
146
+ }, input: EffectiveSkillsInput & {
147
+ runId: string;
148
+ }): Promise<void>;
149
+ export {};
@@ -0,0 +1,405 @@
1
+ import { createHash } from "node:crypto";
2
+ import { parseSkillMd, SKILL_ENTRY_FILE, } from "@capybara-hq/plugin-sdk";
3
+ import { sql } from "kysely";
4
+ import { SKILLS_CATALOG_MAX } from "../conversations/events.js";
5
+ import { ApiError } from "../errors.js";
6
+ import { CLAUDE_CODE_TOOL_MAP } from "../runtime/context/claude-tools.js";
7
+ import { sameSnapshot, } from "../runtime/context/skills.js";
8
+ /**
9
+ * 技能目录快照(M5 T14,Ruling M17):运行开始时解析「此刻对这个对话生效的技能」,与日志里最新一份快照不同才写
10
+ * `skills_catalog`。模型看到的目录与 `skill_load` 的名字解析只来自日志,不读实时的库。
11
+ */
12
+ /**
13
+ * Pinned skill limits (spec §9.1): at most `count` pinned skills per agent, whose current SKILL.md
14
+ * sizes total at most `totalBytes`. Saving checks both; at run time the pinned bodies are kept in
15
+ * the agent's order while they fit.
16
+ */
17
+ export const PINNED_SKILLS_LIMITS = { count: 3, totalBytes: 32768 };
18
+ /**
19
+ * 此刻对这个对话生效的技能,按名字(码点序)排序:
20
+ * - 运行所用 agent 版本选中的组织技能(`scope='org'`,id 在 `skills.orgSkills` 里);
21
+ * - 加上这个 agent 自己的技能(`scope='agent'`);
22
+ * - 已删除的跳过(保存过的 agent 版本仍可能引用它们);
23
+ * - 版本取 `current_version`,描述取该版本清单里的描述。
24
+ * 组织技能与 agent 自己的技能同名时只保留 agent 自己的(更具体;`/skills/<name>/` 与按名字加载都不能有两个)。
25
+ *
26
+ * 试用(T15,R4):这个 agent 待批准、且由本对话发起的技能改动,按名字替换对应技能的版本 / 新增技能
27
+ * (id 为已有技能或预先分配的 id,版本为批准后预期的版本号);其他对话照旧用 `current_version`。
28
+ * 批准后版本成为当前版本,各对话下一次运行开始时由快照差异得到提醒;拒绝 / 取消后发起对话回到当前版本。
29
+ */
30
+ export async function resolveEffectiveSkills(db, input, log) {
31
+ return forModel(await resolveSkills(db, input), input, log).map((r) => r.skill);
32
+ }
33
+ /** The invocation metadata of a skill version: the manifest's, or the defaults when absent. */
34
+ export function invocationOf(manifest) {
35
+ return manifest.invocation ?? { model: true, user: true };
36
+ }
37
+ /**
38
+ * The skills the model sees (phase D): the effective skills without manual-only versions
39
+ * (`invocation.model === false`), cut deterministically to the snapshot's size limit.
40
+ */
41
+ function forModel(all, input, log) {
42
+ const model = all.filter((r) => invocationOf(r.manifest).model);
43
+ // 快照大小不能让运行失败:按名字排序后确定地截到上限(事件 schema 的上限)
44
+ if (model.length > SKILLS_CATALOG_MAX) {
45
+ log?.warn("skills catalog truncated", {
46
+ orgId: input.orgId,
47
+ agentId: input.agentId,
48
+ skills: model.length,
49
+ kept: SKILLS_CATALOG_MAX,
50
+ });
51
+ return model.slice(0, SKILLS_CATALOG_MAX);
52
+ }
53
+ return model;
54
+ }
55
+ /**
56
+ * Every effective skill with its format and manifest, sorted by name, manual-only versions
57
+ * included and not truncated ({@link forModel} gives the model's part). Without
58
+ * `conversationId` (a conversation not created yet) no trial draft applies.
59
+ */
60
+ export async function resolveSkills(db, input) {
61
+ const orgSkills = [...new Set(input.agent.skills?.orgSkills ?? [])];
62
+ const rows = await db
63
+ .selectFrom("skills")
64
+ .innerJoin("skill_versions", (j) => j
65
+ .onRef("skill_versions.skill_id", "=", "skills.id")
66
+ .onRef("skill_versions.version", "=", "skills.current_version"))
67
+ .leftJoin("catalog_items", "catalog_items.id", "skills.catalog_item_id")
68
+ .select([
69
+ "skills.id",
70
+ "skills.scope",
71
+ "skills.name",
72
+ "skills.current_version",
73
+ "skill_versions.manifest",
74
+ "skill_versions.object_prefix",
75
+ "skill_versions.source_format",
76
+ "catalog_items.name as item_name",
77
+ ])
78
+ .where("skills.org_id", "=", input.orgId)
79
+ .where("skills.deleted_at", "is", null)
80
+ .where((eb) => {
81
+ const agentOwn = eb.and([
82
+ eb("skills.scope", "=", "agent"),
83
+ eb("skills.agent_id", "=", input.agentId),
84
+ ]);
85
+ if (orgSkills.length === 0)
86
+ return agentOwn;
87
+ return eb.or([
88
+ agentOwn,
89
+ eb.and([eb("skills.scope", "=", "org"), eb("skills.id", "in", orgSkills)]),
90
+ ]);
91
+ })
92
+ .execute();
93
+ const byName = new Map();
94
+ for (const r of rows) {
95
+ const prev = byName.get(r.name);
96
+ if (!prev || (prev.scope === "org" && r.scope === "agent"))
97
+ byName.set(r.name, r);
98
+ }
99
+ const effective = new Map([...byName.values()].map((r) => [
100
+ r.name,
101
+ {
102
+ skill: {
103
+ id: r.id,
104
+ name: r.name,
105
+ description: r.manifest.description,
106
+ version: r.current_version,
107
+ source: r.object_prefix,
108
+ ...(r.item_name !== null && { plugin: r.item_name }),
109
+ },
110
+ format: r.source_format,
111
+ manifest: r.manifest,
112
+ },
113
+ ]));
114
+ const trials = input.conversationId === undefined
115
+ ? []
116
+ : await db
117
+ .selectFrom("skill_change_requests")
118
+ .select(["proposed_version", "object_prefix"])
119
+ .where("requested_in_conversation", "=", input.conversationId)
120
+ .where("agent_id", "=", input.agentId)
121
+ .where("org_id", "=", input.orgId)
122
+ .where("status", "=", "pending")
123
+ .execute();
124
+ for (const { proposed_version: p, object_prefix } of trials) {
125
+ effective.set(p.manifest.name, {
126
+ skill: {
127
+ id: p.skillId,
128
+ name: p.manifest.name,
129
+ description: p.manifest.description,
130
+ version: p.version,
131
+ source: object_prefix,
132
+ },
133
+ format: "capybara",
134
+ manifest: p.manifest,
135
+ });
136
+ }
137
+ return [...effective.values()].sort((a, b) => a.skill.name < b.skill.name ? -1 : a.skill.name > b.skill.name ? 1 : 0);
138
+ }
139
+ /**
140
+ * The pinned skills of the run's agent version that are effective now, in the definition's order
141
+ * (unique, at most {@link PINNED_SKILLS_LIMITS}.count). An id that is not in the model's catalog
142
+ * (`model`: deleted, deselected, its plugin uninstalled, shadowed by an agent skill of the same
143
+ * name) is skipped; one whose current version is manual-only (phase D) is skipped with a warning
144
+ * when `log` is given.
145
+ */
146
+ function pinnedCandidates(model, agent, input, all, log) {
147
+ const byId = new Map(model.map((r) => [r.skill.id, r]));
148
+ const manual = new Map(all.filter((r) => !invocationOf(r.manifest).model).map((r) => [r.skill.id, r]));
149
+ const out = [];
150
+ for (const id of new Set(agent.skills?.pinned ?? [])) {
151
+ const m = manual.get(id);
152
+ if (m) {
153
+ log?.warn("pinned skill is manual-only", {
154
+ orgId: input.orgId,
155
+ agentId: input.agentId,
156
+ conversationId: input.conversationId,
157
+ skillId: id,
158
+ name: m.skill.name,
159
+ version: m.skill.version,
160
+ });
161
+ continue;
162
+ }
163
+ const r = byId.get(id);
164
+ if (!r)
165
+ continue;
166
+ const { name, version, source } = r.skill;
167
+ out.push({ id, version, name, source, manifest: r.manifest });
168
+ if (out.length >= PINNED_SKILLS_LIMITS.count)
169
+ break;
170
+ }
171
+ return out;
172
+ }
173
+ const sameCandidates = (a, b) => a.length === b.length &&
174
+ a.every((p, i) => {
175
+ const q = b[i];
176
+ return q !== undefined && p.id === q.id && p.version === q.version && p.source === q.source;
177
+ });
178
+ const storageUnavailable = (message) => new ApiError("storage.unavailable", message);
179
+ /** `details[0].reason` of a pinned SKILL.md that cannot be used whatever the retries. */
180
+ const PINNED_UNREADABLE = "pinned_unreadable";
181
+ /** Read attempts per pinned SKILL.md (a transient storage error is retried once). */
182
+ const PINNED_READ_ATTEMPTS = 2;
183
+ /**
184
+ * The `run_failed` message (shown to the user, English like the other run texts) for a
185
+ * `storage.unavailable` from {@link recordSkillsCatalog}: a pinned SKILL.md that is missing,
186
+ * corrupt or unparsable points at the agent's owner, since sending again cannot help; anything
187
+ * else is a transient storage failure.
188
+ */
189
+ export function pinnedFailureText(e) {
190
+ const d = e.details?.[0];
191
+ if (d?.reason === PINNED_UNREADABLE) {
192
+ return `Pinned skill "${d.name}" cannot be read; ask the agent's owner to unpin it or upload it again.`;
193
+ }
194
+ return "File storage is temporarily unavailable, so this agent's pinned skills cannot be read; send the message again later.";
195
+ }
196
+ /**
197
+ * Reads each pinned skill's SKILL.md from `kernel/<orgId>/<source>SKILL.md`, verifies it against
198
+ * the manifest's size and sha256 and returns the parsed body, in order. Every failure throws
199
+ * `storage.unavailable` (Decision 9: the run fails before any model request):
200
+ * - a read error is retried once ({@link PINNED_READ_ATTEMPTS}), then is transient (the user
201
+ * sends again);
202
+ * - a manifest without SKILL.md, a missing object, an integrity mismatch, non-UTF-8 or an
203
+ * unparsable file is permanent: logged at `error` with the skill id and source, and the error
204
+ * carries `details: [{ reason: "pinned_unreadable", skillId, name, source }]`
205
+ * ({@link pinnedFailureText} turns it into an owner-facing message).
206
+ */
207
+ export async function loadPinnedBodies(storage, orgId, pinned, opts = {}) {
208
+ if (pinned.length === 0)
209
+ return [];
210
+ storage.assertAvailable();
211
+ const store = storage.kernel(orgId);
212
+ const out = [];
213
+ for (const p of pinned) {
214
+ const unreadable = (problem) => {
215
+ opts.log?.error("pinned skill unreadable", {
216
+ orgId,
217
+ skillId: p.id,
218
+ version: p.version,
219
+ source: p.source,
220
+ problem,
221
+ });
222
+ return new ApiError("storage.unavailable", `Pinned skill ${p.name} ${problem}`, [
223
+ { reason: PINNED_UNREADABLE, skillId: p.id, name: p.name, source: p.source },
224
+ ]);
225
+ };
226
+ const entry = p.manifest.files.find((f) => f.path === SKILL_ENTRY_FILE);
227
+ if (!entry)
228
+ throw unreadable(`has no ${SKILL_ENTRY_FILE} in its manifest`);
229
+ let bytes = null;
230
+ for (let attempt = 1; bytes === null; attempt++) {
231
+ let got;
232
+ try {
233
+ got = await store.get(`${p.source}${SKILL_ENTRY_FILE}`, opts.signal && { signal: opts.signal });
234
+ if (got)
235
+ bytes = new Uint8Array(await new Response(got.body).arrayBuffer());
236
+ }
237
+ catch {
238
+ if (attempt >= PINNED_READ_ATTEMPTS) {
239
+ throw storageUnavailable(`Cannot read pinned skill ${p.name} from storage`);
240
+ }
241
+ continue;
242
+ }
243
+ if (!got)
244
+ throw unreadable("is missing from storage");
245
+ }
246
+ if (bytes.byteLength !== entry.size ||
247
+ createHash("sha256").update(bytes).digest("hex") !== entry.sha256) {
248
+ throw unreadable("failed its integrity check");
249
+ }
250
+ let text;
251
+ try {
252
+ text = new TextDecoder("utf-8", { fatal: true }).decode(bytes);
253
+ }
254
+ catch {
255
+ throw unreadable("is not UTF-8");
256
+ }
257
+ const parsed = parseSkillMd(text, { invocationKeys: false });
258
+ if ("errors" in parsed)
259
+ throw unreadable("cannot be parsed");
260
+ out.push({ id: p.id, version: p.version, name: p.name, source: p.source, body: parsed.body });
261
+ }
262
+ return out;
263
+ }
264
+ /**
265
+ * The pinned skills that fit: in order while the running total of UTF-8 body bytes stays within
266
+ * {@link PINNED_SKILLS_LIMITS}.totalBytes; the first that does not fit and every later one are
267
+ * dropped with a warning (Review Focus 4: a pinned skill's new version can push a saved set over).
268
+ */
269
+ export function fitPinned(pinned, log, input) {
270
+ const enc = new TextEncoder();
271
+ let total = 0;
272
+ for (let i = 0; i < pinned.length; i++) {
273
+ total += enc.encode(pinned[i].body).byteLength;
274
+ if (total > PINNED_SKILLS_LIMITS.totalBytes) {
275
+ log?.warn("pinned skills over the limit", {
276
+ orgId: input.orgId,
277
+ agentId: input.agentId,
278
+ conversationId: input.conversationId,
279
+ kept: pinned.slice(0, i).map((p) => p.name),
280
+ dropped: pinned.slice(i).map((p) => p.name),
281
+ maxBytes: PINNED_SKILLS_LIMITS.totalBytes,
282
+ });
283
+ return pinned.slice(0, i);
284
+ }
285
+ }
286
+ return [...pinned];
287
+ }
288
+ /** `skills_catalog` 的幂等键:每次运行最多写一份。 */
289
+ /**
290
+ * 是否给模型 `skill_load`:日志里有过技能目录快照(Ruling M17),**即使最新一份是空的**。构建请求与执行工具调用
291
+ * 用同一判定。不因空快照收回这个工具:工具集合一变缓存前缀就失效;而且 agent 没有别的工具时会发出「没有工具
292
+ * 但历史里有 tool_use」的请求,Anthropic 会拒绝。空目录下调用 skill_load 由 `NO_SKILLS_TEXT` 给出可执行的说明。
293
+ */
294
+ export function skillLoadOffered(latest,
295
+ /**
296
+ * Phase D (batch 2 review I2): the log holds a person's skill invocation (any `user_message`
297
+ * with `skill`), so an agent whose skills are all manual-only can still copy an invoked skill's
298
+ * files. Derived from the log, so a replay recomputes it.
299
+ */
300
+ invoked = false) {
301
+ return latest !== undefined || invoked;
302
+ }
303
+ /** Whether `events` hold a person's skill invocation (a `user_message` with `skill`). */
304
+ export const hasInvocation = (events) => events.some((e) => e.type === "user_message" && e.payload.skill !== undefined);
305
+ /** {@link skillLoadOffered} for a conversation, read from the database. */
306
+ export async function skillLoadOfferedIn(db, eventLog, conversationId) {
307
+ if (await eventLog.latestOfType(conversationId, "skills_catalog"))
308
+ return true;
309
+ const row = await db
310
+ .selectFrom("conversation_events")
311
+ .select("seq")
312
+ .where("conversation_id", "=", conversationId)
313
+ .where("type", "=", "user_message")
314
+ .where(sql `payload -> 'skill' IS NOT NULL`)
315
+ .limit(1)
316
+ .executeTakeFirst();
317
+ return row !== undefined;
318
+ }
319
+ export const skillsCatalogIdemKey = (runId) => `skills_catalog:${runId}`;
320
+ /**
321
+ * 在事务 `t` 里锁会话行(与 `EventLog.append` 同一把锁)并读最新一份技能目录快照(没有为 undefined)。
322
+ * 「读最新 → 推出下一份 → 追加」都在这把锁内,别的写快照的事务(运行开始、skill_write、拒绝时的回退)插不进来。
323
+ */
324
+ export async function lockLatestCatalog(t, conversationId) {
325
+ await t
326
+ .selectFrom("conversations")
327
+ .select("id")
328
+ .where("id", "=", conversationId)
329
+ .forUpdate()
330
+ .executeTakeFirst();
331
+ const last = await t
332
+ .selectFrom("conversation_events")
333
+ .select("payload")
334
+ .where("conversation_id", "=", conversationId)
335
+ .where("type", "=", "skills_catalog")
336
+ .orderBy("seq", "desc")
337
+ .limit(1)
338
+ .executeTakeFirst();
339
+ return last ? last.payload : undefined;
340
+ }
341
+ /** How often run start re-resolves when the pinned set changed while its bodies were read. */
342
+ const RECORD_ATTEMPTS = 3;
343
+ /**
344
+ * 运行开始时记录技能目录快照:解析生效的技能,与日志里最新一份不同才写(带幂等键,崩溃重试不重复)。
345
+ * 从没有快照、现在也没有技能 → 不写(没有技能的 agent 不出现目录);之前有、现在全没了 → 写空快照(模型据此得知被移除)。
346
+ * 解析、比较、追加在一个事务里、先锁会话行:否则在解析与追加之间提交的拒绝 + 回退快照会被过时的草稿条目盖回去。
347
+ * 解析只读 skills / agents / 申请(不加锁),不会与别的路径形成死锁。
348
+ *
349
+ * Phase B: the snapshot also carries each skill's `plugin`, the pinned skills' bodies (`pinned`)
350
+ * and the Claude Code tool-name map (`toolMap`, iff an effective skill has source format
351
+ * `claude-code`). Pinned bodies are read from object storage outside the transaction (1); inside
352
+ * it the skills are resolved again (2), and when the pinned identities changed meanwhile the
353
+ * whole thing starts over (at most {@link RECORD_ATTEMPTS} times, then `conflict`). A read failure
354
+ * throws `storage.unavailable` before anything is written. Writes only when `!sameSnapshot`.
355
+ */
356
+ export async function recordSkillsCatalog(deps, input) {
357
+ for (let attempt = 1; attempt <= RECORD_ATTEMPTS; attempt++) {
358
+ const all = await resolveSkills(deps.db, input);
359
+ // Warn about manual-only pins once, on the first attempt
360
+ const first = pinnedCandidates(forModel(all, input), input.agent, input, all, attempt === 1 ? deps.log : undefined);
361
+ if (first.length > 0 && !deps.storage) {
362
+ throw storageUnavailable("No object storage to read pinned skills from");
363
+ }
364
+ const pinned = fitPinned(deps.storage
365
+ ? await loadPinnedBodies(deps.storage, input.orgId, first, {
366
+ ...(deps.log && { log: deps.log }),
367
+ })
368
+ : [], deps.log, input);
369
+ const toSeq = await deps.db.transaction().execute(async (t) => {
370
+ const last = await lockLatestCatalog(t, input.conversationId);
371
+ const all = await resolveSkills(t, input);
372
+ const resolved = forModel(all, input, deps.log);
373
+ if (!sameCandidates(first, pinnedCandidates(resolved, input.agent, input, all))) {
374
+ return "retry";
375
+ }
376
+ const skills = resolved.map((r) => r.skill);
377
+ const next = {
378
+ skills,
379
+ ...(pinned.length > 0 && { pinned }),
380
+ // The model's (truncated) skills as before phase D, plus manual-only ones: a person can
381
+ // invoke one whose body names Claude tools (batch 1 review M8)
382
+ ...([...resolved, ...all.filter((r) => !invocationOf(r.manifest).model)].some((r) => r.format === "claude-code") && {
383
+ toolMap: CLAUDE_CODE_TOOL_MAP,
384
+ }),
385
+ };
386
+ if (last ? sameSnapshot(last, next) : skills.length === 0)
387
+ return null;
388
+ const written = await deps.eventLog.append(input.conversationId, [
389
+ {
390
+ type: "skills_catalog",
391
+ runId: input.runId,
392
+ idemKey: skillsCatalogIdemKey(input.runId),
393
+ payload: next,
394
+ },
395
+ ], t);
396
+ return Math.max(...written.map((e) => e.seq));
397
+ });
398
+ if (toSeq === "retry")
399
+ continue;
400
+ if (toSeq !== null)
401
+ await deps.eventLog.notify(input.conversationId, toSeq);
402
+ return;
403
+ }
404
+ throw new ApiError("conflict", "The pinned skills kept changing while the run started; send the message again.");
405
+ }
@@ -0,0 +1,56 @@
1
+ import { z } from "zod";
2
+ import type { AgentsService } from "../agents/agents.service.js";
3
+ import { type Principal } from "../identity/principal.js";
4
+ import type { InboxService, InboxView } from "../inbox/inbox.service.js";
5
+ import { type OrgContext } from "../orgs/org.guard.js";
6
+ import type { SkillChangeDetail, SkillChangesService, SkillChangeView } from "./changes.service.js";
7
+ import type { SkillSummary, SkillsService } from "./skills.service.js";
8
+ declare const DecideBody: z.ZodObject<{
9
+ decision: z.ZodEnum<{
10
+ approve: "approve";
11
+ reject: "reject";
12
+ }>;
13
+ note: z.ZodOptional<z.ZodString>;
14
+ }, z.core.$strict>;
15
+ /**
16
+ * 共享 agent 的技能变更申请(`/api/v1/orgs/:orgId/skill-changes`,M5 T15,R4)。动作 `approvals.decide`
17
+ * (访客起、仅限用户主体:agent / 服务令牌不能决定,R2);能否决定由服务按该 agent **当前的负责人**判定,
18
+ * 其他人 403 `skill_change.not_owner`。详情只给负责人与发起人,其他人 404。
19
+ */
20
+ export declare class SkillChangesController {
21
+ private readonly changes;
22
+ constructor(changes: SkillChangesService);
23
+ get(principal: Principal, org: OrgContext, id: string): Promise<{
24
+ skillChange: SkillChangeDetail;
25
+ }>;
26
+ decide(principal: Principal, org: OrgContext, id: string, body: z.infer<typeof DecideBody>): Promise<{
27
+ skillChange: SkillChangeView;
28
+ }>;
29
+ }
30
+ /**
31
+ * agent 自己的技能(`/api/v1/orgs/:orgId/agents/:agentId/skills`,M5 T15 / T16):
32
+ * - `GET /`:列表(`scope=agent`、未删除,按名字),与 `GET /agents/:agentId` 同一可见性(`agents.use`;
33
+ * 看不到的 agent → 404 `agent.not_found`;服务令牌只看到 visibility='org' 的 agent);
34
+ * - `DELETE /:skillId`:软删除,只有该 agent 当前的负责人(其他人 403 `forbidden`),仅限用户主体
35
+ * (`agents.create` 属 HUMAN_ONLY)。同名的待处理改动一并取消。
36
+ */
37
+ export declare class AgentSkillsController {
38
+ private readonly changes;
39
+ private readonly agents;
40
+ private readonly skills;
41
+ constructor(changes: SkillChangesService, agents: AgentsService, skills: SkillsService);
42
+ list(principal: Principal, org: OrgContext, agentId: string): Promise<{
43
+ skills: SkillSummary[];
44
+ }>;
45
+ remove(principal: Principal, org: OrgContext, agentId: string, skillId: string): Promise<void>;
46
+ }
47
+ /**
48
+ * 收件箱(`GET /api/v1/orgs/:orgId/inbox`,计划取舍 C6:按类型汇总):当前用户待处理的工具审批与
49
+ * 能决定的技能变更,新的在前、最多 100 项(`truncated` 表示还有更多)。仅限用户主体。
50
+ */
51
+ export declare class InboxController {
52
+ private readonly inbox;
53
+ constructor(inbox: InboxService);
54
+ list(principal: Principal, org: OrgContext): Promise<InboxView>;
55
+ }
56
+ export {};