@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,539 @@
1
+ import { TOOL_TITLE_MAX, ToolError, validateToolPresentation, } from "@capybara-hq/plugin-sdk";
2
+ import { sql } from "kysely";
3
+ import { ApiError } from "../errors.js";
4
+ import { audit } from "../identity/audit.js";
5
+ import { HIDDEN_FORMAT_RE } from "../text.js";
6
+ import { CredentialMissing, isOAuth } from "./credentials.js";
7
+ import { toolKey, toolKeyIssue } from "./naming.js";
8
+ import { redactDeep, redactorFor } from "./redact.js";
9
+ import { canonicalJson, policyFromAnnotations, specHash } from "./registry.js";
10
+ import { resourceToolSpecs } from "./resources.js";
11
+ import { recordToolSpecs } from "./specs.js";
12
+ /**
13
+ * 工具定义漂移检测(spec 7.3:新增 / 变化的工具在组织管理员复核前不可用,防 rug-pull / 工具投毒)。
14
+ *
15
+ * 与上次快照比对:新增 → 插入 `pending_review`;定义(spec_hash 或来源)变化 → `pending_review`,新定义存
16
+ * `pending_spec`,旧定义留在 `spec` 供对比,复核通过才采用;消失 → `disabled` 并记 `missing_since`(行保留,
17
+ * 又出现时按新增处理)。定义不合规(key 不合法等)的工具只能停用:新增时直接停用;复核过的工具变成不合规
18
+ * 定义时新定义同样只进 `pending_spec`(停用,approve 被拒),`spec` 始终是上次复核通过的定义。
19
+ * 从未复核过的工具(`reviewed_at` 为空)没有可比的旧定义:定义再变时直接替换 `spec`(仍待复核),不产生 pending。
20
+ * 连接器从未拍过快照(`tools_synced_at` 为空且没有工具行,即 OAuth 授权码连接器安装时不 listTools,A16)时,
21
+ * 首个快照按安装处理(直接启用)。
22
+ *
23
+ * 触发:维护队列的周期扫描(`tools.driftIntervalHours`)、连接器在会话中报告工具清单变了(MCP
24
+ * `notifications/tools/list_changed`)、管理员手动刷新(`ConnectorsService.refresh`,走同一套比对)。
25
+ * 授权(`tool_grants` / `conversation_tool_grants`)按 spec_hash 比对(D8),复核通过采用新指纹后旧授权自然失效。
26
+ */
27
+ /** 周期扫描:任务名与 job scheduler id(不含 `:`)。 */
28
+ export const DRIFT_SCAN_JOB = "drift-scan";
29
+ export const DRIFT_SCHEDULER_ID = "drift-scan-interval";
30
+ /** 单个连接器的漂移检查任务名。 */
31
+ export const DRIFT_CONNECTOR_JOB = "drift-connector";
32
+ /**
33
+ * list_changed 触发的检查:jobId 按连接器与分钟桶去重(同一分钟内多次通知只检查一次;connectorId 为 UUID,不含 `:`)。
34
+ */
35
+ export const listChangedJobId = (connectorId, now = Date.now()) => `drift-${connectorId}-${Math.floor(now / 60_000)}`;
36
+ /** 周期扫描投递的检查:jobId 按连接器与扫描周期桶去重(同一周期内重复扫描只检查一次)。 */
37
+ export const driftScanJobId = (connectorId, bucket) => `drift-${connectorId}-scan-${bucket}`;
38
+ /** 个人凭据型连接器:最多依次尝试几个成员的凭据。 */
39
+ export const PERSONAL_CANDIDATES = 3;
40
+ const isObj = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
41
+ const errName = (e) => e instanceof Error && typeof e.name === "string" && e.name !== "" ? e.name : "Error";
42
+ /** 连接失败说明里带上的 ToolError 消息最多字符数。 */
43
+ const MAX_FAILURE_DETAIL = 500;
44
+ /**
45
+ * 连接 / 列工具失败的说明:ToolError 的消息是连接器写给人看的英文说明(如「Swagger 2.0 不支持」),
46
+ * 按本次注入的凭据打码、截断后带上;其他错误只给错误类名(详情进日志)。
47
+ */
48
+ export function connectFailedMessage(e, redact) {
49
+ if (e instanceof ToolError) {
50
+ return `Could not list tools from the connector: ${redact(e.message).slice(0, MAX_FAILURE_DETAIL)}`;
51
+ }
52
+ return `Could not list tools from the connector (${errName(e)})`;
53
+ }
54
+ /**
55
+ * 把连接器返回的工具清单整理成快照:只保留 `name / description / inputSchema / annotations / connectorData`
56
+ * 以及仅供显示的 `title / keyArgs`(不合规的这两项直接丢掉,不计入指纹;连接器工具不得自带 `defaultPolicy`),
57
+ * 同名的后者丢弃;key 超长 / 含非法字符或定义不合规的工具
58
+ * 照样入库但只能停用,并给出原因——一个坏工具不挡住整个连接器。名字不是非空字符串的无法入库,只报原因。
59
+ */
60
+ export function snapshot(slug, specs, resources) {
61
+ const rows = [];
62
+ const issues = [];
63
+ if (!Array.isArray(specs)) {
64
+ throw new ApiError("connector.connect_failed", "The connector returned an invalid tool list");
65
+ }
66
+ const seen = new Set();
67
+ for (const raw of specs) {
68
+ const s = isObj(raw) ? raw : {};
69
+ const name = s.name;
70
+ if (typeof name !== "string" || name === "" || name.length > 200) {
71
+ issues.push({
72
+ name: typeof name === "string" ? name.slice(0, 200) : String(name),
73
+ reason: "Tool name must be a non-empty string of at most 200 characters",
74
+ });
75
+ continue;
76
+ }
77
+ if (seen.has(name)) {
78
+ issues.push({ name, reason: "Duplicate tool name; only the first one is kept" });
79
+ continue;
80
+ }
81
+ seen.add(name);
82
+ const spec = {
83
+ name,
84
+ description: typeof s.description === "string" ? s.description : "",
85
+ // 不是对象的 inputSchema 原样保留(缺省记 null):存库后 toolIssue 仍能认出不合规,复核时拒绝批准
86
+ inputSchema: isObj(s.inputSchema)
87
+ ? s.inputSchema
88
+ : (s.inputSchema ?? null),
89
+ ...(isObj(s.annotations) && { annotations: s.annotations }),
90
+ // 连接器的不透明数据(Ruling A21):进快照与指纹,调用时交回连接器;不发给模型
91
+ ...(isObj(s.connectorData) && { connectorData: s.connectorData }),
92
+ ...displayFields(s),
93
+ };
94
+ let issue = toolKeyIssue(toolKey(slug, name));
95
+ if (!issue && !isObj(s.inputSchema))
96
+ issue = "Tool inputSchema must be an object";
97
+ if (issue)
98
+ issues.push({ name, reason: issue });
99
+ rows.push({ name, spec, specHash: specHash(spec), issue, source: "connector" });
100
+ }
101
+ // 连接器支持 resources:补上 list_resources / read_resource;连接器自己的同名工具优先
102
+ if (resources) {
103
+ for (const spec of resourceToolSpecs()) {
104
+ if (seen.has(spec.name)) {
105
+ issues.push({
106
+ name: spec.name,
107
+ reason: `The connector has its own tool named ${spec.name}; the built-in resource tool is not added`,
108
+ });
109
+ continue;
110
+ }
111
+ const issue = toolKeyIssue(toolKey(slug, spec.name));
112
+ if (issue)
113
+ issues.push({ name: spec.name, reason: issue });
114
+ rows.push({ name: spec.name, spec, specHash: specHash(spec), issue, source: "resources" });
115
+ }
116
+ }
117
+ return { rows, issues };
118
+ }
119
+ /**
120
+ * Cleans a remote display title (UI refresh B, fix I2): removes format characters (Unicode Cf: bidi
121
+ * overrides and isolates, zero-width and other invisible ones), turns control characters (Cc,
122
+ * newlines included) into spaces, collapses whitespace runs to one space, trims and cuts to
123
+ * {@link TOOL_TITLE_MAX} code points. Undefined when nothing is left or the title is not a string.
124
+ * The title sits next to the reviewed tool key on the approval block, so it must not be able to
125
+ * reorder, hide or break that line.
126
+ */
127
+ export function sanitizeToolTitle(raw) {
128
+ if (typeof raw !== "string")
129
+ return undefined;
130
+ const clean = raw
131
+ .replace(HIDDEN_FORMAT_RE, "")
132
+ .replace(/\p{Cc}/gu, " ")
133
+ .replace(/\s+/gu, " ")
134
+ .trim();
135
+ const cut = [...clean].slice(0, TOOL_TITLE_MAX).join("").trimEnd();
136
+ return cut === "" ? undefined : cut;
137
+ }
138
+ /**
139
+ * The display-only `title` / `keyArgs` of a listed tool (UI refresh B). Every connector passes
140
+ * here, so this is the authority: the title is cleaned ({@link sanitizeToolTitle}) and then
141
+ * checked; each field is kept only when valid (`validateToolPresentation`) and an invalid one is
142
+ * dropped rather than disabling the tool.
143
+ */
144
+ function displayFields(s) {
145
+ const inputSchema = isObj(s.inputSchema) ? s.inputSchema : {};
146
+ const out = {};
147
+ const title = sanitizeToolTitle(s.title);
148
+ if (title !== undefined && validateToolPresentation({ title, inputSchema }).length === 0)
149
+ out.title = title;
150
+ if (s.keyArgs !== undefined &&
151
+ validateToolPresentation({ keyArgs: s.keyArgs, inputSchema }).length === 0)
152
+ out.keyArgs = [...s.keyArgs];
153
+ return out;
154
+ }
155
+ const displayOf = (spec) => {
156
+ const x = isObj(spec) ? spec : {};
157
+ return canonicalJson({ title: x.title, keyArgs: x.keyArgs });
158
+ };
159
+ /** 工具当前不能启用的原因(视图、启用与复核校验共用)。 */
160
+ export function toolIssue(slug, spec) {
161
+ const keyIssue = toolKeyIssue(toolKey(slug, spec.name));
162
+ if (keyIssue)
163
+ return keyIssue;
164
+ if (!isObj(spec.inputSchema))
165
+ return "Tool inputSchema must be an object";
166
+ return null;
167
+ }
168
+ /** 任务保留时长:完成的 jobId 留一段时间,同一桶内的重复投递被 BullMQ 按 jobId 去重。 */
169
+ const KEEP_FAILED = { age: 86_400 };
170
+ export class ToolDrift {
171
+ d;
172
+ constructor(d) {
173
+ this.d = d;
174
+ const m = d.maintenance;
175
+ if (m) {
176
+ m.schedule({
177
+ id: DRIFT_SCHEDULER_ID,
178
+ name: DRIFT_SCAN_JOB,
179
+ everyMs: () => this.intervalMs(),
180
+ });
181
+ m.handle(DRIFT_SCAN_JOB, async () => {
182
+ const n = await this.scan();
183
+ if (n > 0)
184
+ d.log.info("tool drift checks enqueued", { count: n });
185
+ });
186
+ m.handle(DRIFT_CONNECTOR_JOB, async (job) => {
187
+ const { orgId, connectorId, trigger } = job.data;
188
+ await this.check(orgId, connectorId, trigger);
189
+ });
190
+ }
191
+ }
192
+ intervalMs() {
193
+ return this.d.config().tools.driftIntervalHours * 3_600_000;
194
+ }
195
+ /**
196
+ * 打开一次会话拉工具清单,无论成败都关闭会话;会话带 `listResources` 即视为支持 resources。
197
+ * 清单里回显的凭据按本次注入的值打码(见 redact.ts)。凭据缺失原样抛 `credential.missing`;
198
+ * 其余失败一律 502 `connector.connect_failed`,消息只带上游错误的类名(不带消息,消息里可能回显凭据)。
199
+ */
200
+ async listTools(connector, endpoint, auth, logCtx,
201
+ /** 收到 401:OAuth 连接器在刷新锁内刷新(参数为最后一次注入的鉴权)。 */
202
+ onUnauthorized = async () => { }) {
203
+ const c = this.d.registry.findConnector(connector);
204
+ if (!c) {
205
+ throw new ApiError("connector.connect_failed", `The connector ${connector} is not installed`);
206
+ }
207
+ const signal = AbortSignal.timeout(this.d.config().tools.timeoutMs);
208
+ const injected = [];
209
+ const tracked = async () => {
210
+ const inj = await auth();
211
+ injected.push(inj);
212
+ return inj;
213
+ };
214
+ let session;
215
+ try {
216
+ // 不传 onToolsChanged:本来就在拉清单
217
+ session = await c.open({
218
+ endpoint,
219
+ auth: tracked,
220
+ onUnauthorized: () => onUnauthorized(injected.at(-1)),
221
+ signal,
222
+ });
223
+ const specs = await session.listTools();
224
+ return {
225
+ specs: redactDeep(specs, redactorFor(injected)),
226
+ resources: typeof session.listResources === "function",
227
+ };
228
+ }
229
+ catch (e) {
230
+ if (e instanceof CredentialMissing)
231
+ throw e;
232
+ // 日志经 logger 打码(凭据值已在构造注入时登记)
233
+ this.d.log.warn("connector listTools failed", { ...logCtx, connector, err: e });
234
+ throw new ApiError("connector.connect_failed", connectFailedMessage(e, redactorFor(injected)));
235
+ }
236
+ finally {
237
+ await session?.close().catch((e) => {
238
+ this.d.log.warn("connector session close failed", { ...logCtx, connector, err: e });
239
+ });
240
+ }
241
+ }
242
+ /**
243
+ * 把新快照与当前工具行比对并写入(调用方已在事务内锁住连接器行);返回按名排序的变化。
244
+ * 规则见文件头。待复核的新定义也写进 `tool_specs`(内容寻址,只增不改)。
245
+ */
246
+ async apply(t, app, rows) {
247
+ const current = await t
248
+ .selectFrom("connector_tools")
249
+ .select([
250
+ "name",
251
+ "spec",
252
+ "spec_hash",
253
+ "source",
254
+ "pending_spec",
255
+ "pending_spec_hash",
256
+ "pending_source",
257
+ "missing_since",
258
+ "policy_source",
259
+ "reviewed_at",
260
+ ])
261
+ .where("connector_id", "=", app.id)
262
+ .forUpdate()
263
+ .execute();
264
+ const initial = app.tools_synced_at === null && current.length === 0;
265
+ const before = new Map(current.map((c) => [c.name, c]));
266
+ const next = new Set(rows.map((r) => r.name));
267
+ const added = [];
268
+ const changed = [];
269
+ await recordToolSpecs(t, rows);
270
+ const fresh = rows.filter((r) => !before.has(r.name));
271
+ if (fresh.length > 0) {
272
+ await t
273
+ .insertInto("connector_tools")
274
+ .values(fresh.map((r) => ({
275
+ connector_id: app.id,
276
+ name: r.name,
277
+ spec: JSON.stringify(r.spec),
278
+ spec_hash: r.specHash,
279
+ status: r.issue
280
+ ? "disabled"
281
+ : initial
282
+ ? "enabled"
283
+ : "pending_review",
284
+ default_policy: policyFromAnnotations(r.spec.annotations),
285
+ source: r.source,
286
+ ...(initial && !r.issue && { reviewed_at: sql `now()` }),
287
+ })))
288
+ .execute();
289
+ added.push(...fresh.map((r) => r.name));
290
+ }
291
+ for (const r of rows) {
292
+ const c = before.get(r.name);
293
+ if (!c)
294
+ continue;
295
+ const sameAsReviewed = r.specHash === c.spec_hash && r.source === c.source;
296
+ // 从未复核过的工具(新增后待复核 / 被拒的新工具 / 一开始就不合规的):没有复核过的定义可比,
297
+ // 新定义直接替换当前定义(仍待复核或停用),不产生 pending;管理员设的默认策略只在同一来源时保留
298
+ const replace = {
299
+ spec: JSON.stringify(r.spec),
300
+ spec_hash: r.specHash,
301
+ source: r.source,
302
+ pending_spec: null,
303
+ pending_spec_hash: null,
304
+ pending_source: null,
305
+ ...((c.policy_source === "derived" || c.source !== r.source) && {
306
+ default_policy: policyFromAnnotations(r.spec.annotations),
307
+ policy_source: "derived",
308
+ }),
309
+ };
310
+ // 复核过的工具:新定义(含不合规的)只进 pending,`spec` 始终是上次复核通过的定义(复核对比的基准);
311
+ // 不合规的新定义只能停用(approve 会因不合规被拒,reject 清掉)
312
+ const pending = sameAsReviewed
313
+ ? { pending_spec: null, pending_spec_hash: null, pending_source: null }
314
+ : {
315
+ pending_spec: JSON.stringify(r.spec),
316
+ pending_spec_hash: r.specHash,
317
+ pending_source: r.source,
318
+ };
319
+ const next = c.reviewed_at === null ? replace : pending;
320
+ const status = r.issue ? "disabled" : "pending_review";
321
+ let set;
322
+ if (c.missing_since !== null) {
323
+ // 消失后又出现:按新增处理(待复核)
324
+ set = { ...next, status, missing_since: null };
325
+ added.push(r.name);
326
+ }
327
+ else {
328
+ const latestHash = c.pending_spec_hash ?? c.spec_hash;
329
+ const latestSource = c.pending_source ?? c.source;
330
+ if (r.specHash === latestHash && r.source === latestSource) {
331
+ // Only display-only fields (title / keyArgs) may differ under the same hash: take them
332
+ // into the latest definition silently (not drift, no review, no audit).
333
+ const pendingLatest = c.pending_spec_hash !== null;
334
+ if (displayOf(pendingLatest ? c.pending_spec : c.spec) !== displayOf(r.spec)) {
335
+ await t
336
+ .updateTable("connector_tools")
337
+ .set(pendingLatest
338
+ ? { pending_spec: JSON.stringify(r.spec) }
339
+ : { spec: JSON.stringify(r.spec) })
340
+ .where("connector_id", "=", app.id)
341
+ .where("name", "=", r.name)
342
+ .execute();
343
+ // No audit row (the model sees nothing new), but leave a trace for operators.
344
+ this.d.log.info("connector tool display updated", {
345
+ event: "connector.tool_display_updated",
346
+ connectorId: app.id,
347
+ tool: r.name,
348
+ });
349
+ }
350
+ continue;
351
+ }
352
+ set = { ...next, status };
353
+ changed.push(r.name);
354
+ }
355
+ await t
356
+ .updateTable("connector_tools")
357
+ .set(set)
358
+ .where("connector_id", "=", app.id)
359
+ .where("name", "=", r.name)
360
+ .execute();
361
+ }
362
+ const removed = current
363
+ .filter((c) => !next.has(c.name) && c.missing_since === null)
364
+ .map((c) => c.name);
365
+ if (removed.length > 0) {
366
+ await t
367
+ .updateTable("connector_tools")
368
+ .set({
369
+ status: "disabled",
370
+ missing_since: sql `now()`,
371
+ pending_spec: null,
372
+ pending_spec_hash: null,
373
+ pending_source: null,
374
+ })
375
+ .where("connector_id", "=", app.id)
376
+ .where("name", "in", removed)
377
+ .execute();
378
+ }
379
+ const any = added.length + changed.length + removed.length > 0;
380
+ await t
381
+ .updateTable("connectors")
382
+ .set({ tools_synced_at: sql `now()`, ...(any && { updated_at: sql `now()` }) })
383
+ .where("id", "=", app.id)
384
+ .execute();
385
+ return { added: added.sort(), changed: changed.sort(), removed: removed.sort() };
386
+ }
387
+ /**
388
+ * 后台检查一个连接器(维护队列的 worker 上执行,没有发起人):拉工具清单 → 比对写入 → 有变化记审计
389
+ * `connector.tools_drifted`(detail 只有新增 / 变化 / 消失的个数与触发方式,不含定义与凭据)。
390
+ * 凭据:无需凭据 / 组织凭据型(含客户端凭据流)用组织凭据;个人凭据型(静态或 OAuth 授权码)依次尝试
391
+ * 至多 {@link PERSONAL_CANDIDATES} 个**现任成员**的个人凭据,按凭据最近写入时间倒序(连接 / 刷新 token
392
+ * 都会更新写入时间,即「最近连接成功的成员」优先),用第一个成功的;没有任何成员凭据 → 跳过并记日志。
393
+ * 连不上 / 都失败 → 跳过(不改快照,下个周期或下次通知再查)。
394
+ */
395
+ async check(orgId, connectorId, trigger) {
396
+ const { db, log } = this.d;
397
+ const app = (await db
398
+ .selectFrom("connectors")
399
+ .select([
400
+ "id",
401
+ "org_id",
402
+ "slug",
403
+ "connector",
404
+ "endpoint",
405
+ "auth",
406
+ "status",
407
+ "created_by",
408
+ "tools_synced_at",
409
+ ])
410
+ .where("id", "=", connectorId)
411
+ .where("org_id", "=", orgId)
412
+ .where("deleted_at", "is", null)
413
+ .executeTakeFirst());
414
+ if (!app)
415
+ return { status: "skipped", reason: "not_found" };
416
+ if (app.status !== "active")
417
+ return { status: "skipped", reason: "inactive" };
418
+ if (!this.d.registry.findConnector(app.connector)) {
419
+ log.warn("tool drift check skipped: connector not installed", {
420
+ orgId,
421
+ connectorId,
422
+ connector: app.connector,
423
+ });
424
+ return { status: "skipped", reason: "no_connector" };
425
+ }
426
+ const auth = app.auth;
427
+ const personal = auth.type !== "none" && !isOAuth(auth) && auth.ownership === "personal";
428
+ const personalOAuth = auth.type === "oauth_code";
429
+ const accounts = personal || personalOAuth
430
+ ? await this.d.credentials.personalHolders(orgId, connectorId, PERSONAL_CANDIDATES)
431
+ : [app.created_by];
432
+ if (accounts.length === 0) {
433
+ log.info("tool drift check skipped: no member credential", { orgId, connectorId });
434
+ return { status: "skipped", reason: "no_credential" };
435
+ }
436
+ let listed;
437
+ let reason = "no_credential";
438
+ for (const accountId of accounts) {
439
+ try {
440
+ listed = await this.listTools(app.connector, app.endpoint, () => this.d.credentials.injection(orgId, connectorId, auth, accountId), { orgId, connectorId, trigger }, (last) => this.d.credentials.onUnauthorized(orgId, connectorId, auth, accountId, last));
441
+ break;
442
+ }
443
+ catch (e) {
444
+ if (e instanceof CredentialMissing)
445
+ continue;
446
+ if (e instanceof ApiError) {
447
+ reason = "connect_failed";
448
+ continue;
449
+ }
450
+ throw e;
451
+ }
452
+ }
453
+ if (!listed) {
454
+ log.warn("tool drift check skipped: could not list tools", { orgId, connectorId, reason });
455
+ return { status: "skipped", reason };
456
+ }
457
+ const { rows } = snapshot(app.slug, listed.specs, listed.resources);
458
+ const changes = await db.transaction().execute(async (t) => {
459
+ const locked = await t
460
+ .selectFrom("connectors")
461
+ .select(["id", "tools_synced_at"])
462
+ .where("id", "=", connectorId)
463
+ .where("deleted_at", "is", null)
464
+ .where("status", "=", "active")
465
+ .forUpdate()
466
+ .executeTakeFirst();
467
+ if (!locked)
468
+ return null;
469
+ const c = await this.apply(t, locked, rows);
470
+ if (c.added.length + c.changed.length + c.removed.length > 0) {
471
+ await audit(t, {
472
+ orgId,
473
+ action: "connector.tools_drifted",
474
+ target: connectorId,
475
+ detail: {
476
+ added: c.added.length,
477
+ changed: c.changed.length,
478
+ removed: c.removed.length,
479
+ trigger,
480
+ },
481
+ });
482
+ }
483
+ return c;
484
+ });
485
+ if (!changes)
486
+ return { status: "skipped", reason: "inactive" };
487
+ return { status: "checked", changes };
488
+ }
489
+ /**
490
+ * 连接器在会话中报告工具清单变了:投递一次该连接器的检查(jobId 按分钟桶去重)。投递失败只记日志。
491
+ */
492
+ async onToolsChanged(orgId, connectorId) {
493
+ const m = this.d.maintenance;
494
+ if (!m || connectorId.includes(":"))
495
+ return;
496
+ try {
497
+ await m.add(DRIFT_CONNECTOR_JOB, { orgId, connectorId, trigger: "list_changed" }, {
498
+ jobId: listChangedJobId(connectorId),
499
+ removeOnComplete: { age: 3_600 },
500
+ removeOnFail: KEEP_FAILED,
501
+ });
502
+ }
503
+ catch (err) {
504
+ this.d.log.warn("cannot enqueue tool drift check", { orgId, connectorId, err });
505
+ }
506
+ }
507
+ /**
508
+ * 周期扫描:给本周期内还没检查过的活动连接器(`tools_synced_at` 为空或早于半个周期)各投递一次检查,
509
+ * jobId 按周期桶去重——即使扫描在多个副本上重复执行,每个连接器每周期也只检查一次。返回投递数。
510
+ */
511
+ async scan() {
512
+ const m = this.d.maintenance;
513
+ if (!m)
514
+ return 0;
515
+ const interval = this.intervalMs();
516
+ const bucket = Math.floor(Date.now() / interval);
517
+ const apps = await this.d.db
518
+ .selectFrom("connectors")
519
+ .select(["id", "org_id"])
520
+ .where("deleted_at", "is", null)
521
+ .where("status", "=", "active")
522
+ .where((eb) => eb.or([
523
+ eb("tools_synced_at", "is", null),
524
+ eb("tools_synced_at", "<", sql `now() - ${Math.floor(interval / 2)}::bigint * interval '1 millisecond'`),
525
+ ]))
526
+ .orderBy("id")
527
+ .execute();
528
+ for (const a of apps) {
529
+ if (a.id.includes(":"))
530
+ continue;
531
+ await m.add(DRIFT_CONNECTOR_JOB, { orgId: a.org_id, connectorId: a.id, trigger: "schedule" }, {
532
+ jobId: driftScanJobId(a.id, bucket),
533
+ removeOnComplete: { age: Math.ceil(interval / 1000) },
534
+ removeOnFail: KEEP_FAILED,
535
+ });
536
+ }
537
+ return apps.length;
538
+ }
539
+ }
@@ -0,0 +1,81 @@
1
+ import type { ElicitationRequest, ElicitationResponse, FormAnswer, InputForm } from "@capybara-hq/plugin-sdk";
2
+ /**
3
+ * MCP elicitation(D4,仿 Claude Code:表单 + URL 两种模式)映射到通用输入请求(Task 9 的 `InputRequired`)。
4
+ *
5
+ * 设计(为什么不是「真正挂起」):官方 SDK 的 elicitation 答复只能在原 `tools/call` 还挂着时送回同一个会话;
6
+ * 而内核等人回答时运行会暂停、worker 释放、连接器会话关闭(多副本下续跑可能在另一副本),原调用不可能保持。
7
+ * 所以采用「可续的连接器调用」:
8
+ *
9
+ * 1. 调用途中远端发起 elicitation → 连接器调用 `onElicit` → 本会话({@link ElicitationSession})把请求映射成
10
+ * `InputForm`,记下待问的表单与 state,并**中止本次调用**(`onSuspend`,经 `callTool` 的 signal),`onElicit` 以
11
+ * {@link ElicitationSuspended} 拒绝;管线据此
12
+ * 把这次执行当作 `input_required`(写 `question_asked`、运行进入等待)。
13
+ * 2. 用户回答(或超时 / 取消)后,管线照常用同一 input 再次调用该工具,带 `ctx.resume = { state, answer }`;
14
+ * 远端再次发起**同样的** elicitation(按指纹匹配:表单模式看 `requestedSchema` 与文案,URL 模式看地址的 origin + path 与文案)
15
+ * 时,本会话立即用用户的答案答复,远端继续执行。一次调用里有多个 elicitation 时,state 带上之前的全部答复,
16
+ * 每次续跑整条重放;最多 3 轮(管线的输入轮次上限)。
17
+ *
18
+ * 限制(写进报告与 .agents/skills/writing-tools):远端第二次没有发起同样的 elicitation(换了 schema / 不再问)时,答案
19
+ * 不会被使用——前者会再问一次用户,后者远端按自己的逻辑继续;远端在 elicitation 之前做过的副作用会随重新发起
20
+ * 的调用再做一次(大多数服务在动手之前先问);URL 模式的完成通知(`notifications/elicitation/complete`)收不到
21
+ * (会话已关闭),以用户在卡片上确认「已完成」为准。
22
+ *
23
+ * 超出 InputForm 子集的表单(嵌套对象、`minLength > 1`、`minItems > 1` 等)不展示:立即答复 `decline`,并在工具
24
+ * 结果末尾附一条给模型的英文说明。
25
+ */
26
+ /** 本次调用为问用户而被中止(`onElicit` 以它拒绝;管线按 pending 的输入请求处理,不当作失败)。 */
27
+ export declare class ElicitationSuspended extends Error {
28
+ constructor();
29
+ }
30
+ /** 不能展示的 elicitation 被拒绝时附在工具结果后的说明(模型可见,英文)。 */
31
+ export declare const UNSUPPORTED_ELICITATION_NOTE = "The app asked the user for input that cannot be shown in this client, so the request was declined";
32
+ /** URL 模式表单里「已完成」开关的字段名。 */
33
+ export declare const URL_COMPLETED_FIELD = "completed";
34
+ /** elicitation → 交互表单;超出子集 → `{ unsupported: 原因 }`(英文)。 */
35
+ export declare function elicitationForm(req: ElicitationRequest): {
36
+ form: InputForm;
37
+ } | {
38
+ unsupported: string;
39
+ };
40
+ interface Answered {
41
+ fp: string;
42
+ response: ElicitationResponse;
43
+ }
44
+ /** 输入请求的 state(存 PG,续跑可能在另一副本)。 */
45
+ interface ElicitationState {
46
+ elicitation: {
47
+ /** 之前各轮的答复(按出现顺序)。 */
48
+ answers: Answered[];
49
+ /** 本轮问的那个 elicitation。 */
50
+ pending: {
51
+ fp: string;
52
+ mode: ElicitationRequest["mode"];
53
+ };
54
+ };
55
+ }
56
+ /**
57
+ * 一次连接器工具调用里的 elicitation 处理(见文件头)。`onSuspend` 中止本次调用;`declineAll` 用于不能续跑的场景
58
+ * (如 resources 工具),一律拒绝并附说明。
59
+ */
60
+ export declare class ElicitationSession {
61
+ private readonly opts;
62
+ /** 需要问用户的表单与 state(有值即本次执行按 `input_required` 处理)。 */
63
+ pending: {
64
+ form: InputForm;
65
+ state: ElicitationState;
66
+ } | undefined;
67
+ /** 附在工具结果后给模型的说明。 */
68
+ readonly notes: string[];
69
+ private readonly answers;
70
+ private readonly used;
71
+ constructor(opts: {
72
+ resume?: {
73
+ state: unknown;
74
+ answer: FormAnswer | null;
75
+ } | undefined;
76
+ onSuspend: () => void;
77
+ declineAll?: boolean;
78
+ });
79
+ handle: (req: ElicitationRequest) => Promise<ElicitationResponse>;
80
+ }
81
+ export {};