@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,267 @@
1
+ import { sanitizeParams, } from "@capybara-hq/plugin-sdk";
2
+ import { z } from "zod";
3
+ import { paramIssues } from "../agents/agents.service.js";
4
+ import { ModelRef } from "../agents/definition.js";
5
+ import { ApiError } from "../errors.js";
6
+ import { audit } from "../identity/audit.js";
7
+ import { lockEnterpriseAdminsAndAuthorize } from "../identity/enterprise-admin.js";
8
+ import { lockOrgAndAuthorize } from "../orgs/org-lock.js";
9
+ import { estimateTokens } from "../runtime/context/tokens.js";
10
+ import { consumeModelStream } from "../runtime/model-call.js";
11
+ import { ProviderListError } from "../runtime/providers.js";
12
+ /**
13
+ * 模型用途映射(C9):内核与插件按「用途」取模型,不在代码里写死模型。
14
+ * - 用途 = 内核用途 {@link KERNEL_PURPOSES}(目前只有评委 `eval`),或已加载插件 `permissions.models` 声明的;
15
+ * - 映射 = 部署默认(`org_id` 为 null,企业管理员设)+ 组织覆盖(组织管理员设,`org.models.manage`);
16
+ * 生效的映射先取组织覆盖、再取部署默认,都没有 → `model.unconfigured`;
17
+ * - 目标模型按部署范围解析(与运行时一致),参数按目标模型自己的声明严格校验;不做模型白名单;
18
+ * - 每次都查 PG,不在进程内缓存(多副本下改映射立即生效)。`ctx.models` 仍预留,插件暂不能调用。
19
+ */
20
+ /**
21
+ * Purposes the kernel declares: the eval judge, and the three sub-agent model tiers (phase C,
22
+ * spec §5.4: `fast` / `standard` / `capable` → `subagent_<tier>`; an unmapped tier runs on the
23
+ * parent's model).
24
+ */
25
+ export const KERNEL_PURPOSES = [
26
+ { purpose: "eval", kind: "chat", label: { zh: "评测评委", en: "Eval judge" } },
27
+ /** Conversation titles (UI refresh B); unmapped → the conversation's current chat model. */
28
+ { purpose: "title", kind: "chat", label: { zh: "会话标题", en: "Conversation titles" } },
29
+ {
30
+ purpose: "subagent_fast",
31
+ kind: "chat",
32
+ label: { zh: "子代理:快速", en: "Sub-agent: fast" },
33
+ },
34
+ {
35
+ purpose: "subagent_standard",
36
+ kind: "chat",
37
+ label: { zh: "子代理:标准", en: "Sub-agent: standard" },
38
+ },
39
+ {
40
+ purpose: "subagent_capable",
41
+ kind: "chat",
42
+ label: { zh: "子代理:最强", en: "Sub-agent: capable" },
43
+ },
44
+ ];
45
+ /** `PUT …/model-purposes/:purpose` 的 body:设映射,或 `target: null` 清除。 */
46
+ export const PURPOSE_PUT = z
47
+ .object({
48
+ target: z
49
+ .object({
50
+ model: ModelRef.strict(),
51
+ params: z.record(z.string(), z.union([z.string(), z.number(), z.boolean()])).optional(),
52
+ })
53
+ .strict()
54
+ .nullable(),
55
+ })
56
+ .strict();
57
+ /**
58
+ * 用途请求已经发出、但没有正常收完(出错、超时、中止):`tokens` 是应计入预算的估算用量(输入估算 + 已流出字符 / 4,
59
+ * 与评测回放一致),`cause` 是原始错误。请求发出之前的失败(未映射、模型不可用)原样抛出。
60
+ */
61
+ export class PurposeAttemptError extends Error {
62
+ cause;
63
+ tokens;
64
+ provider;
65
+ model;
66
+ constructor(cause, tokens, provider, model) {
67
+ super(cause instanceof Error ? cause.message : String(cause), { cause });
68
+ this.cause = cause;
69
+ this.tokens = tokens;
70
+ this.provider = provider;
71
+ this.model = model;
72
+ this.name = "PurposeAttemptError";
73
+ }
74
+ }
75
+ const unknownPurpose = (purpose) => new ApiError("model.purpose_unknown", `Unknown model purpose "${purpose}"`);
76
+ const invalid = (details) => new ApiError("validation_failed", "Invalid purpose target", details);
77
+ const targetOf = (r) => r === undefined
78
+ ? null
79
+ : {
80
+ model: { provider: r.provider, model: r.model },
81
+ params: (r.params ?? {}),
82
+ };
83
+ export class ModelPurposesService {
84
+ d;
85
+ constructor(d) {
86
+ this.d = d;
87
+ }
88
+ /** 全部已声明的用途:内核的在前,其后按插件加载顺序。 */
89
+ declared() {
90
+ const out = KERNEL_PURPOSES.map((p) => ({
91
+ purpose: p.purpose,
92
+ kind: p.kind,
93
+ label: { ...p.label },
94
+ declaredBy: "kernel",
95
+ }));
96
+ const seen = new Set(out.map((p) => p.purpose));
97
+ for (const m of this.d.manifests()) {
98
+ for (const p of m.permissions?.models ?? []) {
99
+ if (seen.has(p.purpose))
100
+ continue;
101
+ seen.add(p.purpose);
102
+ out.push({
103
+ purpose: p.purpose,
104
+ kind: p.kind,
105
+ label: { zh: p.label.zh, en: p.label.en },
106
+ declaredBy: m.name,
107
+ });
108
+ }
109
+ }
110
+ return out;
111
+ }
112
+ find(purpose) {
113
+ const p = this.declared().find((x) => x.purpose === purpose);
114
+ if (!p)
115
+ throw unknownPurpose(purpose);
116
+ return p;
117
+ }
118
+ async rows(purposes, orgId) {
119
+ if (purposes.length === 0)
120
+ return [];
121
+ return this.d.db
122
+ .selectFrom("model_purpose_mappings")
123
+ .select(["org_id", "purpose", "provider", "model", "params"])
124
+ .where("purpose", "in", purposes)
125
+ .where((eb) => orgId === undefined
126
+ ? eb("org_id", "is", null)
127
+ : eb.or([eb("org_id", "is", null), eb("org_id", "=", orgId)]))
128
+ .execute();
129
+ }
130
+ async views(decl, orgId) {
131
+ const rows = await this.rows(decl.map((p) => p.purpose), orgId);
132
+ return decl.map((p) => {
133
+ const def = targetOf(rows.find((r) => r.purpose === p.purpose && r.org_id === null));
134
+ const ovr = orgId === undefined
135
+ ? null
136
+ : targetOf(rows.find((r) => r.purpose === p.purpose && r.org_id === orgId));
137
+ return { ...p, default: def, override: ovr, effective: ovr ?? def };
138
+ });
139
+ }
140
+ /** 全部用途与映射;不给 `orgId` = 部署级视图(`override` 一律为 null)。 */
141
+ async list(orgId) {
142
+ return this.views(this.declared(), orgId);
143
+ }
144
+ /** 校验目标:模型可解析(部署范围)、参数按它的声明严格通过。 */
145
+ async check(target) {
146
+ let info;
147
+ try {
148
+ ({ info } = await this.d.registry.resolve(target.model));
149
+ }
150
+ catch (e) {
151
+ if (e instanceof ProviderListError)
152
+ throw e;
153
+ if (e instanceof ApiError && e.code === "agent.model_unavailable") {
154
+ throw invalid([{ path: "target.model", message: "model is not available" }]);
155
+ }
156
+ throw e;
157
+ }
158
+ const issues = paramIssues("target.params", info.parameters, target.params);
159
+ if (issues.length > 0)
160
+ throw invalid(issues);
161
+ }
162
+ async set(orgId, purpose, target, actor, actorTokenId) {
163
+ const decl = this.find(purpose);
164
+ if (target)
165
+ await this.check(target);
166
+ await this.d.db.transaction().execute(async (trx) => {
167
+ if (orgId === null)
168
+ await lockEnterpriseAdminsAndAuthorize(trx, actor);
169
+ else
170
+ await lockOrgAndAuthorize(trx, orgId, actor, "org.models.manage");
171
+ if (target === null) {
172
+ await trx
173
+ .deleteFrom("model_purpose_mappings")
174
+ .where("purpose", "=", purpose)
175
+ .where((eb) => (orgId === null ? eb("org_id", "is", null) : eb("org_id", "=", orgId)))
176
+ .execute();
177
+ }
178
+ else {
179
+ const values = {
180
+ provider: target.model.provider,
181
+ model: target.model.model,
182
+ params: JSON.stringify(target.params),
183
+ updated_by: actor,
184
+ };
185
+ await trx
186
+ .insertInto("model_purpose_mappings")
187
+ .values({ org_id: orgId, purpose, ...values })
188
+ .onConflict((oc) => oc
189
+ .constraint("model_purpose_mappings_scope_key")
190
+ .doUpdateSet({ ...values, updated_at: new Date() }))
191
+ .execute();
192
+ }
193
+ await audit(trx, {
194
+ actorAccountId: actor,
195
+ ...(actorTokenId !== undefined && { actorTokenId }),
196
+ ...(orgId !== null && { orgId }),
197
+ action: "model.purpose_mapped",
198
+ target: purpose,
199
+ detail: { scope: orgId === null ? "deployment" : "org", target },
200
+ });
201
+ });
202
+ const [view] = await this.views([decl], orgId ?? undefined);
203
+ return view;
204
+ }
205
+ /** 设置(或 `null` 清除)部署默认;只有企业管理员(事务内复核)。 */
206
+ setDefault(purpose, target, actor, actorTokenId) {
207
+ return this.set(null, purpose, target, actor, actorTokenId);
208
+ }
209
+ /** 设置(或 `null` 清除)组织覆盖;事务内锁组织并复核 `org.models.manage`。 */
210
+ setOrg(orgId, purpose, target, actor, actorTokenId) {
211
+ return this.set(orgId, purpose, target, actor, actorTokenId);
212
+ }
213
+ /** 生效的映射:组织覆盖,否则部署默认;都没有 → `model.unconfigured`;用途未声明 → `model.purpose_unknown`。 */
214
+ async resolve(orgId, purpose) {
215
+ const [view] = await this.views([this.find(purpose)], orgId);
216
+ if (!view?.effective) {
217
+ throw new ApiError("model.unconfigured", `No model is configured for the "${purpose}" purpose`);
218
+ }
219
+ return view.effective;
220
+ }
221
+ /**
222
+ * 按用途发一次对话请求:解析映射、按目标模型的声明宽松处理参数(补默认值,与运行时一致),用 `consumeModelStream`
223
+ * 收完(只有流空闲看门狗)。输出上限取 `min(req.maxOutputTokens, 目标模型的 maxOutputTokens)`。
224
+ * 请求发出之前的失败原样抛出;发出之后的失败包成 {@link PurposeAttemptError}(带估算用量)。
225
+ * `opts.fallback`: the target used when the purpose is not mapped (`model.unconfigured`).
226
+ * `opts.beforeSend`: called with the resolved target and the final request just before sending;
227
+ * what it throws is thrown as is (a pre-send failure, e.g. a denied `model.request` hook).
228
+ */
229
+ async chat(orgId, purpose, req, signal, opts = {}) {
230
+ let target;
231
+ try {
232
+ target = await this.resolve(orgId, purpose);
233
+ }
234
+ catch (e) {
235
+ if (!(e instanceof ApiError && e.code === "model.unconfigured") || !opts.fallback)
236
+ throw e;
237
+ target = opts.fallback;
238
+ }
239
+ const { provider, info } = await this.d.registry.resolve(target.model);
240
+ const request = {
241
+ ...req,
242
+ model: info.id,
243
+ params: sanitizeParams(info.parameters, target.params).value,
244
+ // 输出上限不超过目标模型自己的上限(与运行时 assembleModelRequest 一致)
245
+ maxOutputTokens: Math.min(req.maxOutputTokens, info.maxOutputTokens),
246
+ };
247
+ const idleMs = info.streamIdleTimeoutMs ?? this.d.config().runtime.streamIdleMs;
248
+ await opts.beforeSend?.(target.model, request);
249
+ let chars = 0;
250
+ try {
251
+ const out = await consumeModelStream(provider, request, idleMs, signal, (ev) => {
252
+ chars += ev.text.length;
253
+ });
254
+ return {
255
+ content: out.content,
256
+ stopReason: out.stopReason,
257
+ usage: out.usage,
258
+ provider: target.model.provider,
259
+ model: target.model.model,
260
+ };
261
+ }
262
+ catch (err) {
263
+ const tokens = estimateTokens(request.messages, request.system, request.tools) + Math.ceil(chars / 4);
264
+ throw new PurposeAttemptError(err, tokens, target.model.provider, target.model.model);
265
+ }
266
+ }
267
+ }
@@ -0,0 +1,44 @@
1
+ import { Agent } from "undici";
2
+ /**
3
+ * Tunneling untrusted downloads through an HTTP(S) egress proxy with `CONNECT` (`net.httpsProxy`).
4
+ *
5
+ * Behind a proxy the kernel does not resolve the target: the proxy does, and the kernel's own DNS
6
+ * may answer fake or internal addresses (e.g. a fake-IP resolver answering 198.18.0.0/15) that say
7
+ * nothing about where the proxy connects. `safeFetch` therefore checks only the hostname rules
8
+ * (IP-literal targets against the private ranges and `allowPrivateHosts`; `allowedHosts` is checked
9
+ * by the callers on the hostname) and leaves SSRF protection for resolved addresses to the proxy.
10
+ *
11
+ * The proxy URL may carry credentials (`http://user:pass@proxy:3128`, sent as Basic
12
+ * `Proxy-Authorization`); they never appear in errors or logs: messages name the proxy by host and
13
+ * port only ({@link proxyLabel}).
14
+ */
15
+ /** The egress proxy part of a `NetPolicy`. */
16
+ export type NetProxy = {
17
+ /** `http://` or `https://` proxy URL, optionally with `user:password@`. */
18
+ url: string;
19
+ /** Hostnames that bypass the proxy (an entry also matches its subdomains). */
20
+ noProxy: string[];
21
+ };
22
+ /** Why a `net.httpsProxy` value is refused (English, never echoing the value), or undefined. */
23
+ export declare function proxyUrlProblem(value: string): string | undefined;
24
+ /** Why a `net.noProxy` entry is refused, or undefined: a hostname (optionally `.`-prefixed) or IP. */
25
+ export declare function noProxyEntryProblem(entry: string): string | undefined;
26
+ /** Whether `host` bypasses the proxy: equal to a `noProxy` entry or a subdomain of one. */
27
+ export declare function bypassesProxy(host: string, noProxy: readonly string[]): boolean;
28
+ /** The proxy as `host:port`, for messages: never its credentials. */
29
+ export declare function proxyLabel(proxy: URL): string;
30
+ /**
31
+ * TLS trust overrides (tests): `ca` for the target, `proxyCa` for an https proxy; and the tunnel
32
+ * deadline (tests; default 10 s).
33
+ */
34
+ export type ProxyTls = {
35
+ ca?: string | string[];
36
+ proxyCa?: string | string[];
37
+ tunnelTimeoutMs?: number;
38
+ };
39
+ /**
40
+ * An undici dispatcher that reaches every https origin through a `CONNECT` tunnel on `proxyUrl`,
41
+ * then speaks TLS to the target over it (SNI and certificate checks for the target's hostname).
42
+ * The target is never resolved locally. One agent per download, like `pinnedAgent`.
43
+ */
44
+ export declare function proxyAgent(proxyUrl: string, tls?: ProxyTls): Agent;
@@ -0,0 +1,162 @@
1
+ import { isIP } from "node:net";
2
+ import { Agent, buildConnector } from "undici";
3
+ import { NetDeniedError, normalizeHost } from "./public-address.js";
4
+ /**
5
+ * How long opening the tunnel may take in total: connecting to the proxy plus its whole `CONNECT`
6
+ * answer. One deadline, not an idle timeout, so a proxy trickling bytes cannot hold a download open.
7
+ */
8
+ const TUNNEL_TIMEOUT_MS = 10_000;
9
+ /** The largest `CONNECT` response head accepted from the proxy. */
10
+ const MAX_RESPONSE_HEAD = 16 * 1024;
11
+ /** Why a `net.httpsProxy` value is refused (English, never echoing the value), or undefined. */
12
+ export function proxyUrlProblem(value) {
13
+ let u;
14
+ try {
15
+ u = new URL(value);
16
+ }
17
+ catch {
18
+ return "must be an http:// or https:// URL such as http://proxy.internal:3128";
19
+ }
20
+ if (u.protocol !== "http:" && u.protocol !== "https:") {
21
+ return "must be an http:// or https:// URL (other proxy protocols are not supported)";
22
+ }
23
+ if ((u.pathname !== "" && u.pathname !== "/") || u.search !== "" || u.hash !== "") {
24
+ return "must not have a path, query or fragment";
25
+ }
26
+ try {
27
+ // proxyAgent decodes them for Basic auth; a bad escape (`%zz`) would throw on every download
28
+ decodeURIComponent(u.username);
29
+ decodeURIComponent(u.password);
30
+ }
31
+ catch {
32
+ return "the user name or password is not valid percent-encoding";
33
+ }
34
+ return undefined;
35
+ }
36
+ const HOSTNAME_RE = /^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/i;
37
+ /** Why a `net.noProxy` entry is refused, or undefined: a hostname (optionally `.`-prefixed) or IP. */
38
+ export function noProxyEntryProblem(entry) {
39
+ const e = entry.startsWith(".") ? entry.slice(1) : entry;
40
+ if (isIP(e) !== 0 || HOSTNAME_RE.test(e))
41
+ return undefined;
42
+ return `"${entry}" is not a hostname or an IP address (no scheme, port, path or wildcard)`;
43
+ }
44
+ /** Whether `host` bypasses the proxy: equal to a `noProxy` entry or a subdomain of one. */
45
+ export function bypassesProxy(host, noProxy) {
46
+ const h = normalizeHost(host);
47
+ return noProxy.some((entry) => {
48
+ const e = normalizeHost(entry.startsWith(".") ? entry.slice(1) : entry);
49
+ return e !== "" && (h === e || (isIP(h) === 0 && h.endsWith(`.${e}`)));
50
+ });
51
+ }
52
+ /** The proxy as `host:port`, for messages: never its credentials. */
53
+ export function proxyLabel(proxy) {
54
+ return `${proxy.hostname}:${proxy.port || (proxy.protocol === "https:" ? "443" : "80")}`;
55
+ }
56
+ /** Reads the proxy's answer to `CONNECT` and resolves its status once the head is complete. */
57
+ function readConnectResponse(socket) {
58
+ return new Promise((resolve, reject) => {
59
+ let head = Buffer.alloc(0);
60
+ const done = (err, status) => {
61
+ socket.off("data", onData);
62
+ socket.off("error", onError);
63
+ socket.off("close", onClose);
64
+ if (err)
65
+ reject(err);
66
+ else
67
+ resolve(status);
68
+ };
69
+ const onData = (chunk) => {
70
+ head = Buffer.concat([head, chunk]);
71
+ // Checked before looking for the terminator, so a large chunk that holds it is refused too
72
+ if (head.length > MAX_RESPONSE_HEAD) {
73
+ done(new Error("the proxy response head is too large"));
74
+ return;
75
+ }
76
+ const end = head.indexOf("\r\n\r\n");
77
+ if (end < 0)
78
+ return;
79
+ socket.pause();
80
+ const rest = head.subarray(end + 4);
81
+ // Bytes after the head belong to the TLS stream: the socket is paused, so tls.connect over
82
+ // it (targetConnect with httpSocket) reads them first
83
+ if (rest.length > 0)
84
+ socket.unshift(rest);
85
+ const m = /^HTTP\/1\.[01] (\d{3})/.exec(head.subarray(0, end).toString("latin1"));
86
+ if (!m)
87
+ done(new Error("the proxy sent an invalid response to CONNECT"));
88
+ else
89
+ done(null, Number(m[1]));
90
+ };
91
+ const onError = (e) => done(e);
92
+ const onClose = () => done(new Error("the proxy closed the connection during CONNECT"));
93
+ socket.on("data", onData);
94
+ socket.on("error", onError);
95
+ socket.on("close", onClose);
96
+ });
97
+ }
98
+ /**
99
+ * An undici dispatcher that reaches every https origin through a `CONNECT` tunnel on `proxyUrl`,
100
+ * then speaks TLS to the target over it (SNI and certificate checks for the target's hostname).
101
+ * The target is never resolved locally. One agent per download, like `pinnedAgent`.
102
+ */
103
+ export function proxyAgent(proxyUrl, tls = {}) {
104
+ const proxy = new URL(proxyUrl);
105
+ const label = proxyLabel(proxy);
106
+ const auth = proxy.username !== "" || proxy.password !== ""
107
+ ? `Basic ${Buffer.from(`${decodeURIComponent(proxy.username)}:${decodeURIComponent(proxy.password)}`).toString("base64")}`
108
+ : undefined;
109
+ const tunnelTimeoutMs = tls.tunnelTimeoutMs ?? TUNNEL_TIMEOUT_MS;
110
+ const proxyConnect = buildConnector({
111
+ timeout: tunnelTimeoutMs,
112
+ ...(tls.proxyCa !== undefined && { ca: tls.proxyCa }),
113
+ });
114
+ const targetConnect = buildConnector({
115
+ ...(tls.ca !== undefined && { ca: tls.ca }),
116
+ });
117
+ const proxyPort = proxy.port || (proxy.protocol === "https:" ? "443" : "80");
118
+ const proxyHost = normalizeHost(proxy.hostname);
119
+ const connect = (opts, callback) => {
120
+ const target = normalizeHost(opts.hostname);
121
+ const port = opts.port || "443";
122
+ const authority = `${isIP(target) === 6 ? `[${target}]` : target}:${port}`;
123
+ const fail = (e) => callback(e, null);
124
+ if (opts.protocol !== "https:") {
125
+ fail(new Error("only https targets are sent through the egress proxy"));
126
+ return;
127
+ }
128
+ const deadline = Date.now() + tunnelTimeoutMs;
129
+ proxyConnect({
130
+ protocol: proxy.protocol,
131
+ hostname: proxyHost,
132
+ host: `${proxy.hostname}:${proxyPort}`,
133
+ port: proxyPort,
134
+ }, (err, socket) => {
135
+ if (err || socket === null) {
136
+ fail(new Error(`cannot connect to the egress proxy ${label}: ${err?.message ?? ""}`));
137
+ return;
138
+ }
139
+ const s = socket;
140
+ // What is left of the one deadline that started before connecting to the proxy
141
+ const timer = setTimeout(() => s.destroy(new Error("the proxy did not answer CONNECT in time")), Math.max(0, deadline - Date.now()));
142
+ const lines = [`CONNECT ${authority} HTTP/1.1`, `Host: ${authority}`];
143
+ if (auth !== undefined)
144
+ lines.push(`Proxy-Authorization: ${auth}`);
145
+ s.write(`${lines.join("\r\n")}\r\n\r\n`);
146
+ readConnectResponse(s).then((status) => {
147
+ clearTimeout(timer);
148
+ if (status < 200 || status > 299) {
149
+ s.destroy();
150
+ fail(new NetDeniedError("net.proxy_refused", target, `The egress proxy ${label} refused the connection to ${authority} (HTTP ${status}).`));
151
+ return;
152
+ }
153
+ targetConnect({ ...opts, httpSocket: s }, callback);
154
+ }, (e) => {
155
+ clearTimeout(timer);
156
+ s.destroy();
157
+ fail(new Error(`egress proxy ${label}: ${e.message}`));
158
+ });
159
+ });
160
+ };
161
+ return new Agent({ connect: connect });
162
+ }
@@ -0,0 +1,60 @@
1
+ /** Whether connecting to this (resolved) IP is forbidden: private, loopback, reserved, or unparseable. */
2
+ export declare function isForbiddenAddress(ip: string): boolean;
3
+ /** Link-local (incl. cloud metadata 169.254.169.254) or unparseable: forbidden whatever the exemptions. */
4
+ export declare function isLinkLocalAddress(ip: string): boolean;
5
+ /** A hostname normalized for comparison: lower case, no IPv6 brackets, no trailing dots. */
6
+ export declare function normalizeHost(host: string): string;
7
+ /** `localhost`, `127.0.0.0/8` or `::1` (as written in a URL). */
8
+ export declare function isLoopbackHost(host: string): boolean;
9
+ /** Where downloads may go besides public addresses. */
10
+ export type NetPolicy = {
11
+ /** Testing only: plain http and loopback addresses for loopback hosts. */
12
+ allowInsecureLoopback: boolean;
13
+ /**
14
+ * `marketplaces.allowPrivateHosts`: a hostname entry (exact, case-insensitive) exempts that host's
15
+ * resolved addresses; an IP or CIDR entry exempts IP-literal URL hosts inside it only, never a DNS
16
+ * name that resolves there (an attacker's name could point into the range).
17
+ */
18
+ allowPrivateHosts: string[];
19
+ /** Origins configured by the admin (the npm registry): their hosts may resolve to private addresses. */
20
+ trustedOrigins: string[];
21
+ /**
22
+ * `net.httpsProxy` / `net.noProxy`: https downloads tunnel through this proxy (see `proxy.ts`);
23
+ * the target is then resolved by the proxy, not checked here, except IP-literal hosts.
24
+ */
25
+ proxy?: {
26
+ url: string;
27
+ noProxy: string[];
28
+ };
29
+ };
30
+ export type LookupFn = (host: string) => Promise<{
31
+ address: string;
32
+ family: number;
33
+ }[]>;
34
+ export type NetDeniedCode = "net.private_address" | "net.dns_failed" | "net.redirect" | "net.insecure_url" | "net.proxy_refused";
35
+ /** A download refused by the network rules. English message, safe to show. */
36
+ export declare class NetDeniedError extends Error {
37
+ readonly code: NetDeniedCode;
38
+ readonly host: string;
39
+ constructor(code: NetDeniedCode, host: string, message: string);
40
+ }
41
+ /** The shortest prefix an `allowPrivateHosts` CIDR may have, per family. */
42
+ export declare const MIN_CIDR_PREFIX: {
43
+ readonly ipv4: 8;
44
+ readonly ipv6: 16;
45
+ };
46
+ /** A syntactically valid `addr/prefix` CIDR as [address, prefix, family], else undefined. */
47
+ export declare function parseCidr(s: string): [string, number, "ipv4" | "ipv6"] | undefined;
48
+ /**
49
+ * Why a `marketplaces.allowPrivateHosts` entry is invalid (English), or null when it is a hostname,
50
+ * an IP address or a CIDR no broader than /8 (IPv4) or /16 (IPv6).
51
+ */
52
+ export declare function privateHostEntryProblem(entry: string): string | null;
53
+ /** A valid `marketplaces.allowPrivateHosts` entry (see {@link privateHostEntryProblem}). */
54
+ export declare function isPrivateHostEntry(entry: string): boolean;
55
+ /**
56
+ * Resolves `host` (an IP literal is taken as is) and returns every address, in resolution order,
57
+ * after checking that each is public or exempt by `policy`. Throws {@link NetDeniedError}
58
+ * `net.dns_failed` (no answer) or `net.private_address` (some address is private and not exempt).
59
+ */
60
+ export declare function resolvePublic(host: string, policy: NetPolicy, lookup?: LookupFn): Promise<string[]>;