@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,41 @@
1
+ /** 写一条审计事件;`action` 用点分英文小写,如 `org.member.role_changed`。 */
2
+ export async function audit(db, e) {
3
+ await db
4
+ .insertInto("audit_events")
5
+ .values({
6
+ actor_account_id: e.actorAccountId ?? null,
7
+ actor_token_id: e.actorTokenId ?? null,
8
+ org_id: e.orgId ?? null,
9
+ action: e.action,
10
+ target: e.target ?? null,
11
+ detail: JSON.stringify(e.detail ?? {}),
12
+ })
13
+ .execute();
14
+ }
15
+ /**
16
+ * Connector audit actions written before the D17 rename (old rows are not rewritten, C27) -> the
17
+ * renamed action. Only these are listed, nothing is inferred from the `app.*` prefix: after D17
18
+ * "app" meant app bundles (`app.installed` etc., `plugin.org_installed` since phase 0a), which are
19
+ * unrelated to connectors (F-X).
20
+ */
21
+ export const LEGACY_AUDIT_ACTIONS = Object.freeze({
22
+ "app.created": "connector.created",
23
+ "app.updated": "connector.updated",
24
+ "app.deleted": "connector.deleted",
25
+ "app.tools_refreshed": "connector.tools_refreshed",
26
+ "app.tools_drifted": "connector.tools_drifted",
27
+ "app.tool_reviewed": "connector.tool_reviewed",
28
+ "app.credential.set": "connector.credential.set",
29
+ "app.credential.cleared": "connector.credential.cleared",
30
+ });
31
+ /**
32
+ * 按 action 查询审计时与之同义的全部 action(含自身):`connector.created` ↔ `app.created` 等,
33
+ * 只按 {@link LEGACY_AUDIT_ACTIONS} 显式映射;其余 action 只有自身。
34
+ */
35
+ export function auditActionAliases(action) {
36
+ const current = LEGACY_AUDIT_ACTIONS[action] ?? action;
37
+ const legacy = Object.entries(LEGACY_AUDIT_ACTIONS)
38
+ .filter(([, to]) => to === current)
39
+ .map(([from]) => from);
40
+ return [current, ...legacy];
41
+ }
@@ -0,0 +1,40 @@
1
+ import type { FastifyReply, FastifyRequest } from "fastify";
2
+ import { z } from "zod";
3
+ import type { KernelConfig } from "../config/schema.js";
4
+ import type { Account, AccountsService } from "./accounts.js";
5
+ import type { LoginRateLimiter } from "./rate-limit.js";
6
+ import type { SessionService } from "./sessions.js";
7
+ declare const LoginBody: z.ZodObject<{
8
+ login: z.ZodString;
9
+ password: z.ZodString;
10
+ }, z.core.$strip>;
11
+ /** 会话的客户端信息(记入 sessions 表)。`req.ip` 在 `http.trustProxy` 时取自 X-Forwarded-For。 */
12
+ export declare function clientMeta(req: FastifyRequest): {
13
+ userAgent?: string;
14
+ ip: string;
15
+ };
16
+ /** 本地登录、刷新与登出(`/api/v1/auth/*`,均为公开路由)。 */
17
+ export declare class AuthController {
18
+ private readonly accounts;
19
+ private readonly sessions;
20
+ private readonly limiter;
21
+ private readonly config;
22
+ constructor(accounts: AccountsService, sessions: SessionService, limiter: LoginRateLimiter, config: () => KernelConfig);
23
+ /**
24
+ * 登录名不存在与密码错误返回同一错误;每次尝试先按(登录名, IP)、IP、登录名三个计数原子占用限流额度,
25
+ * 成功后清零登录名计数并退还 IP 额度(见 LoginRateLimiter)。
26
+ */
27
+ login(body: z.infer<typeof LoginBody>, req: FastifyRequest, reply: FastifyReply): Promise<{
28
+ account: Account;
29
+ }>;
30
+ /**
31
+ * 用 `cap_rt` 换新的一对 Cookie。失败时清 Cookie;但 `auth.refresh_race` 不清——
32
+ * 并发的另一个请求刚换到了新 Cookie,这里清掉会覆盖它。
33
+ */
34
+ refresh(req: FastifyRequest, reply: FastifyReply): Promise<{
35
+ account: Account;
36
+ }>;
37
+ /** 吊销 Cookie 对应的会话(access token 过期也接受,验签失败忽略),总是清 Cookie。 */
38
+ logout(req: FastifyRequest, reply: FastifyReply): Promise<void>;
39
+ }
40
+ export {};
@@ -0,0 +1,130 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
8
+ return function (target, key) { decorator(target, key, paramIndex); }
9
+ };
10
+ import { Body, Controller, HttpCode, Inject, Post, Req, Res } from "@nestjs/common";
11
+ import { z } from "zod";
12
+ import { ApiError } from "../errors.js";
13
+ import { ACCOUNTS, KERNEL_CONFIG, RATE_LIMITER, SESSIONS } from "../http/tokens.js";
14
+ import { ZodPipe } from "../http/zod.pipe.js";
15
+ import { ACCESS_COOKIE, clearSessionCookies, REFRESH_COOKIE, setSessionCookies, } from "./cookies.js";
16
+ import { Public } from "./principal.js";
17
+ const LoginBody = z.object({ login: z.string().max(256), password: z.string() });
18
+ /** 会话的客户端信息(记入 sessions 表)。`req.ip` 在 `http.trustProxy` 时取自 X-Forwarded-For。 */
19
+ export function clientMeta(req) {
20
+ const ua = req.headers["user-agent"];
21
+ return { ip: req.ip, ...(ua !== undefined && { userAgent: ua }) };
22
+ }
23
+ /** 本地登录、刷新与登出(`/api/v1/auth/*`,均为公开路由)。 */
24
+ let AuthController = class AuthController {
25
+ accounts;
26
+ sessions;
27
+ limiter;
28
+ config;
29
+ constructor(accounts, sessions, limiter, config) {
30
+ this.accounts = accounts;
31
+ this.sessions = sessions;
32
+ this.limiter = limiter;
33
+ this.config = config;
34
+ }
35
+ /**
36
+ * 登录名不存在与密码错误返回同一错误;每次尝试先按(登录名, IP)、IP、登录名三个计数原子占用限流额度,
37
+ * 成功后清零登录名计数并退还 IP 额度(见 LoginRateLimiter)。
38
+ */
39
+ async login(body, req, reply) {
40
+ const meta = clientMeta(req);
41
+ // 校验密码之前先原子地占用一次尝试额度:并发请求也无法绕过上限
42
+ const rl = await this.limiter.reserve(body.login, meta.ip);
43
+ if (!rl.allowed) {
44
+ reply.header("retry-after", String(rl.retryAfterSeconds));
45
+ throw new ApiError("auth.rate_limited", "Too many failed login attempts; try again later");
46
+ }
47
+ let account;
48
+ try {
49
+ account = await this.accounts.authenticateLocal(body.login, body.password);
50
+ }
51
+ catch (e) {
52
+ // 停用账号的密码是对的(authenticateLocal 先核对密码再看状态):不算失败尝试,退还占用的额度
53
+ if (e instanceof ApiError && e.code === "auth.account_disabled") {
54
+ await this.limiter.succeeded(body.login, meta.ip);
55
+ }
56
+ throw e;
57
+ }
58
+ if (!account)
59
+ throw new ApiError("auth.invalid_credentials", "Invalid login or password");
60
+ await this.limiter.succeeded(body.login, meta.ip);
61
+ const session = await this.sessions.create(account.id, meta);
62
+ setSessionCookies(reply, session, this.config());
63
+ return { account };
64
+ }
65
+ /**
66
+ * 用 `cap_rt` 换新的一对 Cookie。失败时清 Cookie;但 `auth.refresh_race` 不清——
67
+ * 并发的另一个请求刚换到了新 Cookie,这里清掉会覆盖它。
68
+ */
69
+ async refresh(req, reply) {
70
+ try {
71
+ const rt = req.cookies[REFRESH_COOKIE];
72
+ if (!rt)
73
+ throw new ApiError("auth.refresh_invalid", "Refresh token is missing");
74
+ const session = await this.sessions.refresh(rt, clientMeta(req));
75
+ const account = await this.accounts.get(session.accountId);
76
+ if (!account)
77
+ throw new ApiError("auth.refresh_invalid", "Refresh token is invalid");
78
+ setSessionCookies(reply, session, this.config());
79
+ return { account };
80
+ }
81
+ catch (e) {
82
+ if (!(e instanceof ApiError && e.code === "auth.refresh_race"))
83
+ clearSessionCookies(reply);
84
+ throw e;
85
+ }
86
+ }
87
+ /** 吊销 Cookie 对应的会话(access token 过期也接受,验签失败忽略),总是清 Cookie。 */
88
+ async logout(req, reply) {
89
+ clearSessionCookies(reply);
90
+ const at = req.cookies[ACCESS_COOKIE];
91
+ const rt = req.cookies[REFRESH_COOKIE];
92
+ if (at) {
93
+ const sid = await this.sessions.sessionIdFromAccess(at);
94
+ if (sid !== undefined)
95
+ await this.sessions.revoke(sid);
96
+ }
97
+ if (rt)
98
+ await this.sessions.revokeByRefresh(rt);
99
+ }
100
+ };
101
+ __decorate([
102
+ Post("login"),
103
+ Public(),
104
+ HttpCode(200),
105
+ __param(0, Body(new ZodPipe(LoginBody))),
106
+ __param(1, Req()),
107
+ __param(2, Res({ passthrough: true }))
108
+ ], AuthController.prototype, "login", null);
109
+ __decorate([
110
+ Post("refresh"),
111
+ Public(),
112
+ HttpCode(200),
113
+ __param(0, Req()),
114
+ __param(1, Res({ passthrough: true }))
115
+ ], AuthController.prototype, "refresh", null);
116
+ __decorate([
117
+ Post("logout"),
118
+ Public(),
119
+ HttpCode(204),
120
+ __param(0, Req()),
121
+ __param(1, Res({ passthrough: true }))
122
+ ], AuthController.prototype, "logout", null);
123
+ AuthController = __decorate([
124
+ Controller("api/v1/auth"),
125
+ __param(0, Inject(ACCOUNTS)),
126
+ __param(1, Inject(SESSIONS)),
127
+ __param(2, Inject(RATE_LIMITER)),
128
+ __param(3, Inject(KERNEL_CONFIG))
129
+ ], AuthController);
130
+ export { AuthController };
@@ -0,0 +1,41 @@
1
+ import { type CanActivate, type ExecutionContext } from "@nestjs/common";
2
+ import { Reflector } from "@nestjs/core";
3
+ import type { FastifyRequest } from "fastify";
4
+ import type { AccountsService } from "./accounts.js";
5
+ import type { ApiTokenService } from "./api-tokens.js";
6
+ import type { SessionService } from "./sessions.js";
7
+ /** CSRF 头:Cookie 认证的非安全请求(及所有公开路由的非安全请求)必须带 `X-Capybara-Csrf: 1`。 */
8
+ export declare const CSRF_HEADER = "x-capybara-csrf";
9
+ /** 解析凭据要用的服务({@link AuthGuard} 与 {@link authorizeEnterpriseAdmin} 共用)。 */
10
+ export interface AuthServices {
11
+ accounts: AccountsService;
12
+ sessions: SessionService;
13
+ tokens: ApiTokenService;
14
+ }
15
+ /**
16
+ * 在读请求体之前(Fastify `onRequest`)按 `@EnterpriseAdmin` 路由的规则认证:无凭据 / 凭据无效 → `auth.required`
17
+ * 等,Cookie 认证的非安全请求要求 CSRF 头,服务令牌与非企业管理员 → `forbidden`。插件包上传用它:
18
+ * 未认证的大请求体不被读入内存。之后 {@link AuthGuard} 照常再判一次。
19
+ */
20
+ export declare function authorizeEnterpriseAdmin(req: FastifyRequest, s: AuthServices): Promise<void>;
21
+ /**
22
+ * 全局守卫(`APP_GUARD`),默认拒绝:
23
+ * 1. `Authorization: Bearer cap_pat_…|cap_svc_…` → API 令牌;个人令牌再实时读账号状态。不做 CSRF 检查。
24
+ * 2. 否则 Cookie `cap_at` → 会话 access token(Redis 吊销标记作快速路径,再以 PG `sessions.revoked_at` 为准,
25
+ * 与账号读取合并为一条查询)→ 实时判断账号状态;非安全方法要求 CSRF 头。
26
+ * 3. 都没有:`@Public` 放行,否则 `auth.required`。`@Public` 路由上凭据无效(`ApiError`)按无凭据处理
27
+ * (便于登出 / 刷新);PG / Redis 故障等其他异常照常抛出。
28
+ * 4. 路由约束:service principal 只能访问 `@AllowService` 路由(否则 `forbidden`);
29
+ * `@SessionOnly` 要求 Web 会话:个人令牌 → `auth.session_required`,服务令牌(即使路由经 `@OrgAction`
30
+ * 隐含 `@AllowService`)→ `forbidden`;`@EnterpriseAdmin` 要求企业管理员(`forbidden`)。
31
+ * 5. `@Public` 路由的非安全方法无论是否带 Cookie 都要求 CSRF 头。
32
+ * 账号状态每个请求都从 PG 实时读取,不在进程内缓存。插件路由 `/plugins/*` 不经过 Nest,不受此守卫约束。
33
+ */
34
+ export declare class AuthGuard implements CanActivate {
35
+ private readonly reflector;
36
+ readonly accounts: AccountsService;
37
+ readonly sessions: SessionService;
38
+ readonly tokens: ApiTokenService;
39
+ constructor(reflector: Reflector, accounts: AccountsService, sessions: SessionService, tokens: ApiTokenService);
40
+ canActivate(ctx: ExecutionContext): Promise<boolean>;
41
+ }
@@ -0,0 +1,162 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
8
+ return function (target, key) { decorator(target, key, paramIndex); }
9
+ };
10
+ import { Inject, Injectable } from "@nestjs/common";
11
+ import { Reflector } from "@nestjs/core";
12
+ import { ApiError } from "../errors.js";
13
+ import { ACCOUNTS, API_TOKENS, SESSIONS } from "../http/tokens.js";
14
+ import { ACCESS_COOKIE } from "./cookies.js";
15
+ import { ALLOW_SERVICE_KEY, ENTERPRISE_ADMIN_KEY, PUBLIC_KEY, SESSION_ONLY_KEY, } from "./principal.js";
16
+ /** CSRF 头:Cookie 认证的非安全请求(及所有公开路由的非安全请求)必须带 `X-Capybara-Csrf: 1`。 */
17
+ export const CSRF_HEADER = "x-capybara-csrf";
18
+ const SAFE_METHODS = new Set(["GET", "HEAD", "OPTIONS"]);
19
+ const BEARER_RE = /^Bearer\s+(\S+)$/i;
20
+ function requireCsrf(req) {
21
+ if (req.headers[CSRF_HEADER] !== "1") {
22
+ throw new ApiError("auth.csrf", `Missing ${CSRF_HEADER} header`);
23
+ }
24
+ }
25
+ /** 解析凭据;无凭据返回 undefined,凭据无效抛对应的 ApiError。 */
26
+ async function resolvePrincipal(req, s) {
27
+ const bearer = BEARER_RE.exec(req.headers.authorization ?? "")?.[1];
28
+ if (bearer !== undefined) {
29
+ const rec = await s.tokens.authenticate(bearer);
30
+ if (!rec)
31
+ throw new ApiError("auth.required", "Authentication required");
32
+ if (rec.kind === "service") {
33
+ return {
34
+ principal: {
35
+ kind: "service",
36
+ tokenId: rec.id,
37
+ orgId: rec.orgId,
38
+ role: rec.role,
39
+ },
40
+ cookie: false,
41
+ };
42
+ }
43
+ const account = await s.accounts.get(rec.accountId);
44
+ if (!account)
45
+ throw new ApiError("auth.required", "Authentication required");
46
+ return {
47
+ principal: { kind: "user", account: requireActive(account), via: "pat", tokenId: rec.id },
48
+ cookie: false,
49
+ };
50
+ }
51
+ const at = req.cookies[ACCESS_COOKIE];
52
+ if (at) {
53
+ // 一条查询同时完成吊销检查与账号读取
54
+ const { account, sessionId } = await s.sessions.verifyAccess(at);
55
+ return {
56
+ principal: { kind: "user", account: requireActive(account), via: "session", sessionId },
57
+ cookie: true,
58
+ };
59
+ }
60
+ return undefined;
61
+ }
62
+ /**
63
+ * 在读请求体之前(Fastify `onRequest`)按 `@EnterpriseAdmin` 路由的规则认证:无凭据 / 凭据无效 → `auth.required`
64
+ * 等,Cookie 认证的非安全请求要求 CSRF 头,服务令牌与非企业管理员 → `forbidden`。插件包上传用它:
65
+ * 未认证的大请求体不被读入内存。之后 {@link AuthGuard} 照常再判一次。
66
+ */
67
+ export async function authorizeEnterpriseAdmin(req, s) {
68
+ const resolved = await resolvePrincipal(req, s);
69
+ if (!resolved)
70
+ throw new ApiError("auth.required", "Authentication required");
71
+ if (resolved.cookie && !SAFE_METHODS.has(req.method.toUpperCase()))
72
+ requireCsrf(req);
73
+ const p = resolved.principal;
74
+ if (p.kind === "service") {
75
+ throw new ApiError("forbidden", "Service tokens cannot access this endpoint");
76
+ }
77
+ if (!p.account.isEnterpriseAdmin)
78
+ throw new ApiError("forbidden", "Enterprise admin required");
79
+ }
80
+ /**
81
+ * 全局守卫(`APP_GUARD`),默认拒绝:
82
+ * 1. `Authorization: Bearer cap_pat_…|cap_svc_…` → API 令牌;个人令牌再实时读账号状态。不做 CSRF 检查。
83
+ * 2. 否则 Cookie `cap_at` → 会话 access token(Redis 吊销标记作快速路径,再以 PG `sessions.revoked_at` 为准,
84
+ * 与账号读取合并为一条查询)→ 实时判断账号状态;非安全方法要求 CSRF 头。
85
+ * 3. 都没有:`@Public` 放行,否则 `auth.required`。`@Public` 路由上凭据无效(`ApiError`)按无凭据处理
86
+ * (便于登出 / 刷新);PG / Redis 故障等其他异常照常抛出。
87
+ * 4. 路由约束:service principal 只能访问 `@AllowService` 路由(否则 `forbidden`);
88
+ * `@SessionOnly` 要求 Web 会话:个人令牌 → `auth.session_required`,服务令牌(即使路由经 `@OrgAction`
89
+ * 隐含 `@AllowService`)→ `forbidden`;`@EnterpriseAdmin` 要求企业管理员(`forbidden`)。
90
+ * 5. `@Public` 路由的非安全方法无论是否带 Cookie 都要求 CSRF 头。
91
+ * 账号状态每个请求都从 PG 实时读取,不在进程内缓存。插件路由 `/plugins/*` 不经过 Nest,不受此守卫约束。
92
+ */
93
+ let AuthGuard = class AuthGuard {
94
+ reflector;
95
+ accounts;
96
+ sessions;
97
+ tokens;
98
+ constructor(reflector, accounts, sessions, tokens) {
99
+ this.reflector = reflector;
100
+ this.accounts = accounts;
101
+ this.sessions = sessions;
102
+ this.tokens = tokens;
103
+ }
104
+ async canActivate(ctx) {
105
+ const req = ctx.switchToHttp().getRequest();
106
+ const targets = [ctx.getHandler(), ctx.getClass()];
107
+ const flag = (key) => this.reflector.getAllAndOverride(key, targets) === true;
108
+ const isPublic = flag(PUBLIC_KEY);
109
+ const unsafe = !SAFE_METHODS.has(req.method.toUpperCase());
110
+ if (isPublic && unsafe)
111
+ requireCsrf(req);
112
+ let resolved;
113
+ try {
114
+ resolved = await resolvePrincipal(req, this);
115
+ }
116
+ catch (e) {
117
+ // 公开路由上只把「凭据无效」(ApiError)视同未携带;PG / Redis 故障等照常抛出(500),
118
+ // 否则故障期间带着有效 Cookie 的请求会被当作匿名放行
119
+ if (!isPublic || !(e instanceof ApiError))
120
+ throw e;
121
+ resolved = undefined;
122
+ }
123
+ if (!resolved) {
124
+ if (isPublic)
125
+ return true;
126
+ throw new ApiError("auth.required", "Authentication required");
127
+ }
128
+ if (resolved.cookie && unsafe)
129
+ requireCsrf(req);
130
+ const p = resolved.principal;
131
+ req.principal = p;
132
+ if (isPublic)
133
+ return true;
134
+ if (p.kind === "service" && !flag(ALLOW_SERVICE_KEY)) {
135
+ throw new ApiError("forbidden", "Service tokens cannot access this endpoint");
136
+ }
137
+ if (flag(SESSION_ONLY_KEY) && p.kind === "service") {
138
+ throw new ApiError("forbidden", "Service tokens cannot access this endpoint");
139
+ }
140
+ if (flag(SESSION_ONLY_KEY) && !(p.kind === "user" && p.via === "session")) {
141
+ throw new ApiError("auth.session_required", "This endpoint requires a web session");
142
+ }
143
+ if (flag(ENTERPRISE_ADMIN_KEY) && !(p.kind === "user" && p.account.isEnterpriseAdmin)) {
144
+ throw new ApiError("forbidden", "Enterprise admin required");
145
+ }
146
+ return true;
147
+ }
148
+ };
149
+ AuthGuard = __decorate([
150
+ Injectable(),
151
+ __param(0, Inject(Reflector)),
152
+ __param(1, Inject(ACCOUNTS)),
153
+ __param(2, Inject(SESSIONS)),
154
+ __param(3, Inject(API_TOKENS))
155
+ ], AuthGuard);
156
+ export { AuthGuard };
157
+ function requireActive(account) {
158
+ if (account.status !== "active") {
159
+ throw new ApiError("auth.account_disabled", "Account is disabled");
160
+ }
161
+ return account;
162
+ }
@@ -0,0 +1,47 @@
1
+ import type { ExternalIdentity } from "@capybara-hq/plugin-sdk";
2
+ import type { Redis } from "ioredis";
3
+ import type { KernelConfig } from "../config/schema.js";
4
+ import type { KernelDb } from "../db/kernel-schema.js";
5
+ import type { ExternalIdentities } from "./external.js";
6
+ /** 绑定令牌的有效期(秒)。 */
7
+ export declare const BIND_TOKEN_TTL_SECONDS = 900;
8
+ /** 绑定确认页(网页)路径前缀:`<http.publicUrl>/bind/<token>`。 */
9
+ export declare const BIND_PAGE_PATH = "/bind/";
10
+ /** 绑定确认页展示的待绑定身份。 */
11
+ export interface PendingBinding {
12
+ connectionId: string;
13
+ source: string;
14
+ externalId: string;
15
+ displayName: string;
16
+ email?: string;
17
+ avatarUrl?: string;
18
+ }
19
+ /**
20
+ * IM 里识别不出的人:内核发一个一次性绑定链接,本人登录网页后确认,把该 IM 身份绑到当前账号。
21
+ * 令牌 `cap_bind_<32 字节>`,Redis `capk:bind:<sha256>` 15 分钟、单次有效(确认时 GETDEL)。
22
+ * 查看与确认时都复核发出链接的渠道连接仍可用(存在、未删除、其插件仍在该组织启用),否则 `bind.invalid`。框架无关。
23
+ */
24
+ export declare class IdentityBinding {
25
+ private readonly deps;
26
+ constructor(deps: {
27
+ db: KernelDb;
28
+ redis: Redis;
29
+ config: () => KernelConfig;
30
+ external: ExternalIdentities;
31
+ });
32
+ /** 生成绑定链接(渠道运行时在回绑定卡片时调用);需要 `http.publicUrl`。 */
33
+ createBindToken(args: {
34
+ connectionId: string;
35
+ identity: ExternalIdentity;
36
+ }): Promise<string>;
37
+ /** 查看待绑定的身份(不消耗令牌);无效 / 过期 / 已用 → `bind.invalid`。 */
38
+ peek(token: string): Promise<PendingBinding>;
39
+ /**
40
+ * 把令牌里的身份绑到 `accountId`:先 GETDEL 消耗令牌(并发确认只有一个拿到),复核渠道连接仍可用
41
+ * (否则 `bind.invalid`:连接删除或插件停用后,旧链接不能再绑定),再绑定;
42
+ * 已绑定他人 → `identity.taken`(令牌同样作废,需在 IM 里重新获取)。
43
+ */
44
+ bind(token: string, accountId: string): Promise<PendingBinding>;
45
+ /** 渠道连接存在、未软删除,且其插件在连接所属组织启用。 */
46
+ private connectionUsable;
47
+ }
@@ -0,0 +1,84 @@
1
+ import { createHash, randomBytes } from "node:crypto";
2
+ import { ApiError } from "../errors.js";
3
+ import { enabledExtensionsByOrg } from "../extensions/enabled.js";
4
+ /** 绑定令牌的有效期(秒)。 */
5
+ export const BIND_TOKEN_TTL_SECONDS = 900;
6
+ /** 绑定确认页(网页)路径前缀:`<http.publicUrl>/bind/<token>`。 */
7
+ export const BIND_PAGE_PATH = "/bind/";
8
+ /** 令牌前缀:日志里的路径段按 `cap_` 前缀自动打码。 */
9
+ const TOKEN_PREFIX = "cap_bind_";
10
+ const TOKEN_RE = /^cap_bind_[A-Za-z0-9_-]{43}$/;
11
+ /** Redis 里只存令牌的哈希,拿到 Redis 内容也换不出可用的绑定链接。 */
12
+ const tokenKey = (token) => `capk:bind:${createHash("sha256").update(token).digest("base64url")}`;
13
+ const invalid = () => new ApiError("bind.invalid", "Binding link is invalid or has expired");
14
+ const view = (r) => ({
15
+ connectionId: r.connectionId,
16
+ source: r.identity.source,
17
+ externalId: r.identity.externalId,
18
+ displayName: r.identity.displayName,
19
+ ...(r.identity.email !== undefined && { email: r.identity.email }),
20
+ ...(r.identity.avatarUrl !== undefined && { avatarUrl: r.identity.avatarUrl }),
21
+ });
22
+ /**
23
+ * IM 里识别不出的人:内核发一个一次性绑定链接,本人登录网页后确认,把该 IM 身份绑到当前账号。
24
+ * 令牌 `cap_bind_<32 字节>`,Redis `capk:bind:<sha256>` 15 分钟、单次有效(确认时 GETDEL)。
25
+ * 查看与确认时都复核发出链接的渠道连接仍可用(存在、未删除、其插件仍在该组织启用),否则 `bind.invalid`。框架无关。
26
+ */
27
+ export class IdentityBinding {
28
+ deps;
29
+ constructor(deps) {
30
+ this.deps = deps;
31
+ }
32
+ /** 生成绑定链接(渠道运行时在回绑定卡片时调用);需要 `http.publicUrl`。 */
33
+ async createBindToken(args) {
34
+ const publicUrl = this.deps.config().http.publicUrl;
35
+ if (!publicUrl)
36
+ throw new Error("binding links require http.publicUrl to be configured");
37
+ const token = TOKEN_PREFIX + randomBytes(32).toString("base64url");
38
+ const rec = { connectionId: args.connectionId, identity: args.identity };
39
+ await this.deps.redis.set(tokenKey(token), JSON.stringify(rec), "EX", BIND_TOKEN_TTL_SECONDS);
40
+ return `${publicUrl.replace(/\/+$/, "")}${BIND_PAGE_PATH}${token}`;
41
+ }
42
+ /** 查看待绑定的身份(不消耗令牌);无效 / 过期 / 已用 → `bind.invalid`。 */
43
+ async peek(token) {
44
+ if (!TOKEN_RE.test(token))
45
+ throw invalid();
46
+ const raw = await this.deps.redis.get(tokenKey(token));
47
+ if (raw === null)
48
+ throw invalid();
49
+ const rec = JSON.parse(raw);
50
+ if (!(await this.connectionUsable(rec.connectionId)))
51
+ throw invalid();
52
+ return view(rec);
53
+ }
54
+ /**
55
+ * 把令牌里的身份绑到 `accountId`:先 GETDEL 消耗令牌(并发确认只有一个拿到),复核渠道连接仍可用
56
+ * (否则 `bind.invalid`:连接删除或插件停用后,旧链接不能再绑定),再绑定;
57
+ * 已绑定他人 → `identity.taken`(令牌同样作废,需在 IM 里重新获取)。
58
+ */
59
+ async bind(token, accountId) {
60
+ if (!TOKEN_RE.test(token))
61
+ throw invalid();
62
+ const raw = await this.deps.redis.getdel(tokenKey(token));
63
+ if (raw === null)
64
+ throw invalid();
65
+ const rec = JSON.parse(raw);
66
+ if (!(await this.connectionUsable(rec.connectionId)))
67
+ throw invalid();
68
+ await this.deps.external.link(accountId, rec.identity);
69
+ return view(rec);
70
+ }
71
+ /** 渠道连接存在、未软删除,且其插件在连接所属组织启用。 */
72
+ async connectionUsable(connectionId) {
73
+ const row = await this.deps.db
74
+ .selectFrom("channel_connections")
75
+ .innerJoin(enabledExtensionsByOrg(this.deps.db).as("en"), (j) => j
76
+ .onRef("en.org_id", "=", "channel_connections.org_id")
77
+ .onRef("en.plugin", "=", "channel_connections.plugin"))
78
+ .select("channel_connections.id")
79
+ .where("channel_connections.id", "=", connectionId)
80
+ .where("channel_connections.deleted_at", "is", null)
81
+ .executeTakeFirst();
82
+ return row !== undefined;
83
+ }
84
+ }
@@ -0,0 +1,16 @@
1
+ import type { FastifyReply } from "fastify";
2
+ import type { KernelConfig } from "../config/schema.js";
3
+ import type { IssuedSession } from "./sessions.js";
4
+ /** access token Cookie:随所有请求发送。 */
5
+ export declare const ACCESS_COOKIE = "cap_at";
6
+ /** refresh token Cookie:只发往认证端点。 */
7
+ export declare const REFRESH_COOKIE = "cap_rt";
8
+ /** refresh Cookie 的 Path。 */
9
+ export declare const REFRESH_COOKIE_PATH = "/api/v1/auth";
10
+ /**
11
+ * 写会话 Cookie。两个 Cookie 都 HttpOnly、都**不设 Domain**(只属于当前主机);
12
+ * `cap_at` 为 SameSite=Lax、Path=/;`cap_rt` 为 SameSite=Strict、只发往 `/api/v1/auth`。
13
+ */
14
+ export declare function setSessionCookies(reply: FastifyReply, s: IssuedSession, cfg: KernelConfig): void;
15
+ /** 清除会话 Cookie(Path 必须与设置时一致才能覆盖)。 */
16
+ export declare function clearSessionCookies(reply: FastifyReply): void;
@@ -0,0 +1,32 @@
1
+ /** access token Cookie:随所有请求发送。 */
2
+ export const ACCESS_COOKIE = "cap_at";
3
+ /** refresh token Cookie:只发往认证端点。 */
4
+ export const REFRESH_COOKIE = "cap_rt";
5
+ /** refresh Cookie 的 Path。 */
6
+ export const REFRESH_COOKIE_PATH = "/api/v1/auth";
7
+ /**
8
+ * 写会话 Cookie。两个 Cookie 都 HttpOnly、都**不设 Domain**(只属于当前主机);
9
+ * `cap_at` 为 SameSite=Lax、Path=/;`cap_rt` 为 SameSite=Strict、只发往 `/api/v1/auth`。
10
+ */
11
+ export function setSessionCookies(reply, s, cfg) {
12
+ const secure = cfg.auth.cookieSecure;
13
+ reply.setCookie(ACCESS_COOKIE, s.accessToken, {
14
+ path: "/",
15
+ httpOnly: true,
16
+ sameSite: "lax",
17
+ secure,
18
+ maxAge: cfg.auth.accessTokenTtlSeconds,
19
+ });
20
+ reply.setCookie(REFRESH_COOKIE, s.refreshToken, {
21
+ path: REFRESH_COOKIE_PATH,
22
+ httpOnly: true,
23
+ sameSite: "strict",
24
+ secure,
25
+ maxAge: cfg.auth.refreshTokenTtlDays * 86400,
26
+ });
27
+ }
28
+ /** 清除会话 Cookie(Path 必须与设置时一致才能覆盖)。 */
29
+ export function clearSessionCookies(reply) {
30
+ reply.clearCookie(ACCESS_COOKIE, { path: "/" });
31
+ reply.clearCookie(REFRESH_COOKIE, { path: REFRESH_COOKIE_PATH });
32
+ }
@@ -0,0 +1,17 @@
1
+ import type { ErrorCode } from "../errors.js";
2
+ import type { ApiTokenService } from "./api-tokens.js";
3
+ import type { UserPrincipal } from "./principal.js";
4
+ import type { SessionService } from "./sessions.js";
5
+ /** 复核凭据:仍然有效返回 null,否则返回应告知客户端的错误码。 */
6
+ export type CredentialCheck = () => Promise<ErrorCode | null>;
7
+ /**
8
+ * 长连接(SSE)用的凭据复核:重新校验建立连接时使用的凭据,登出 / 吊销后连接不能继续收数据(R35)。
9
+ * - Web 会话:按 sessionId 查会话行(未吊销、未过期、仍属该账号);**不**重验 access token 的 exp,
10
+ * access token 到期但会话仍有效时连接照常保持(客户端靠刷新续期,已建立的流不受影响)。
11
+ * - 个人令牌:用建立连接时的令牌明文重新 `authenticate`(吊销 / 过期 → 失效)。
12
+ * 账号停用由调用方的可见性判定(账号须为 active)覆盖。
13
+ */
14
+ export declare function credentialCheck(p: UserPrincipal, bearer: string | undefined, deps: {
15
+ sessions: Pick<SessionService, "get">;
16
+ tokens: Pick<ApiTokenService, "authenticate">;
17
+ }): CredentialCheck;
@@ -0,0 +1,24 @@
1
+ /**
2
+ * 长连接(SSE)用的凭据复核:重新校验建立连接时使用的凭据,登出 / 吊销后连接不能继续收数据(R35)。
3
+ * - Web 会话:按 sessionId 查会话行(未吊销、未过期、仍属该账号);**不**重验 access token 的 exp,
4
+ * access token 到期但会话仍有效时连接照常保持(客户端靠刷新续期,已建立的流不受影响)。
5
+ * - 个人令牌:用建立连接时的令牌明文重新 `authenticate`(吊销 / 过期 → 失效)。
6
+ * 账号停用由调用方的可见性判定(账号须为 active)覆盖。
7
+ */
8
+ export function credentialCheck(p, bearer, deps) {
9
+ if (p.via === "session") {
10
+ const { sessionId } = p;
11
+ const accountId = p.account.id;
12
+ return async () => {
13
+ const s = await deps.sessions.get(sessionId);
14
+ return s && s.accountId === accountId ? null : "auth.session_revoked";
15
+ };
16
+ }
17
+ const { tokenId } = p;
18
+ return async () => {
19
+ if (bearer === undefined)
20
+ return "auth.required";
21
+ const rec = await deps.tokens.authenticate(bearer);
22
+ return rec && rec.id === tokenId ? null : "auth.required";
23
+ };
24
+ }
@@ -0,0 +1,14 @@
1
+ import { type Transaction } from "kysely";
2
+ import type { KernelDatabase } from "../db/kernel-schema.js";
3
+ /**
4
+ * 在调用方事务内取 `capybara.enterprise_admins` 咨询锁(事务结束释放),串行化所有企业管理员写操作
5
+ * (撤销 / 停用 / 新建管理员 / 改部署设置 / CLI 的 `capybara admin grant|revoke`)。只加锁、不鉴权:
6
+ * 没有发起账号的调用方(CLI)用它;有发起账号的用 {@link lockEnterpriseAdminsAndAuthorize}。
7
+ */
8
+ export declare function lockEnterpriseAdmins(trx: Transaction<KernelDatabase>): Promise<void>;
9
+ /**
10
+ * 企业管理员写操作的执行期复核(spec 3.6 R5):{@link lockEnterpriseAdmins} 后在锁内实时确认发起人仍是
11
+ * 活跃企业管理员,否则 `forbidden`。鉴权守卫在请求开头读到的身份可能已过期(另一个管理员刚撤销了他),
12
+ * 必须在锁内重读。
13
+ */
14
+ export declare function lockEnterpriseAdminsAndAuthorize(trx: Transaction<KernelDatabase>, actorAccountId: string): Promise<void>;