@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,159 @@
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, Delete, Get, HttpCode, Inject, Param, Post, Put, Req, Res, } from "@nestjs/common";
11
+ import { z } from "zod";
12
+ import { ApiError } from "../errors.js";
13
+ import { ACCOUNTS, API_TOKENS, KERNEL_LOG, ORGS, RATE_LIMITER, SESSIONS } from "../http/tokens.js";
14
+ import { ZodPipe } from "../http/zod.pipe.js";
15
+ import { FutureIsoDate } from "./api-tokens.js";
16
+ import { clientMeta } from "./auth.controller.js";
17
+ import { MAX_PASSWORD_LENGTH } from "./login.js";
18
+ import { CurrentPrincipal, requireUser, SessionOnly } from "./principal.js";
19
+ /** 改密码时同一账号在窗口内允许核对旧密码的次数。 */
20
+ const CHANGE_PASSWORD_LIMIT_PER_ACCOUNT = 10;
21
+ const ChangePasswordBody = z.object({
22
+ currentPassword: z.string().min(1),
23
+ newPassword: z.string().min(12).max(MAX_PASSWORD_LENGTH),
24
+ });
25
+ const TokenBody = z.object({
26
+ name: z.string().min(1).max(100),
27
+ expiresAt: FutureIsoDate.optional(),
28
+ });
29
+ const CurrentOrgBody = z.object({ orgId: z.string().min(1).nullable() });
30
+ /** 当前用户(`/api/v1/me`)。 */
31
+ let MeController = class MeController {
32
+ accounts;
33
+ sessions;
34
+ orgs;
35
+ tokens;
36
+ limiter;
37
+ log;
38
+ constructor(accounts, sessions, orgs, tokens, limiter, log) {
39
+ this.accounts = accounts;
40
+ this.sessions = sessions;
41
+ this.orgs = orgs;
42
+ this.tokens = tokens;
43
+ this.limiter = limiter;
44
+ this.log = log;
45
+ }
46
+ async me(principal) {
47
+ const p = requireUser(principal);
48
+ const currentOrgId = p.via === "session" ? ((await this.sessions.get(p.sessionId))?.currentOrgId ?? null) : null;
49
+ const memberships = (await this.orgs.listForAccount(p.account.id)).map((o) => ({
50
+ orgId: o.id,
51
+ slug: o.slug,
52
+ name: o.name,
53
+ role: o.role,
54
+ }));
55
+ return { account: p.account, via: p.via, currentOrgId, memberships };
56
+ }
57
+ /** 切换当前组织(仅 Web 会话);`null` 清空。非成员或已软删除的组织 → `org.not_found`。 */
58
+ async setCurrentOrg(principal, body) {
59
+ const p = requireUser(principal);
60
+ if (p.via !== "session") {
61
+ throw new ApiError("auth.session_required", "This endpoint requires a web session");
62
+ }
63
+ await this.sessions.switchCurrentOrg(p.sessionId, p.account.id, body.orgId);
64
+ }
65
+ /**
66
+ * 改密码:核对旧密码;成功后吊销该账号除当前会话外的所有会话,并吊销其全部个人访问令牌(R24)——
67
+ * 三者在同一个 PG 事务里生效,之后再尽力写 Redis 吊销标记。
68
+ * 核对前先占用限流额度(scope `acct`:按账号 id 10 次、按客户端 IP 50 次,与登录的 IP 额度分开),
69
+ * 防止拿到会话的人无限次猜旧密码;超限 → 429 `auth.rate_limited`,核对成功后清零账号计数。
70
+ */
71
+ async changePassword(principal, body, req, reply) {
72
+ const p = requireUser(principal);
73
+ if (p.via !== "session") {
74
+ throw new ApiError("auth.session_required", "This endpoint requires a web session");
75
+ }
76
+ const { ip } = clientMeta(req);
77
+ const rl = await this.limiter.reserveScoped("acct", p.account.id, ip, CHANGE_PASSWORD_LIMIT_PER_ACCOUNT);
78
+ if (!rl.allowed) {
79
+ reply.header("retry-after", String(rl.retryAfterSeconds));
80
+ throw new ApiError("auth.rate_limited", "Too many failed password attempts; try again later");
81
+ }
82
+ if (!(await this.accounts.verifyPassword(p.account.id, body.currentPassword))) {
83
+ throw new ApiError("auth.invalid_credentials", "Current password is incorrect");
84
+ }
85
+ await this.limiter.succeededScoped("acct", p.account.id, ip);
86
+ // 新密码、吊销其他会话(PG revoked_at)与个人令牌在同一个 PG 事务里完成
87
+ const revoked = await this.accounts.changePassword(p.account.id, body.newPassword, p.sessionId);
88
+ try {
89
+ await this.sessions.markRevoked(revoked);
90
+ }
91
+ catch (err) {
92
+ // Redis 标记只是快速路径:鉴权每次都查 PG revoked_at,这些会话已经无法使用
93
+ this.log.warn("failed to write session revocation markers after password change", {
94
+ accountId: p.account.id,
95
+ err,
96
+ });
97
+ }
98
+ }
99
+ async createToken(principal, body) {
100
+ const p = requireUser(principal);
101
+ return this.tokens.createPersonal(p.account.id, body);
102
+ }
103
+ async listTokens(principal) {
104
+ const p = requireUser(principal);
105
+ return { tokens: await this.tokens.list({ accountId: p.account.id }) };
106
+ }
107
+ async revokeToken(principal, tokenId) {
108
+ const p = requireUser(principal);
109
+ await this.tokens.revoke(tokenId, { accountId: p.account.id });
110
+ }
111
+ };
112
+ __decorate([
113
+ Get(),
114
+ __param(0, CurrentPrincipal())
115
+ ], MeController.prototype, "me", null);
116
+ __decorate([
117
+ Put("current-org"),
118
+ SessionOnly(),
119
+ HttpCode(204),
120
+ __param(0, CurrentPrincipal()),
121
+ __param(1, Body(new ZodPipe(CurrentOrgBody)))
122
+ ], MeController.prototype, "setCurrentOrg", null);
123
+ __decorate([
124
+ Put("password"),
125
+ SessionOnly(),
126
+ HttpCode(204),
127
+ __param(0, CurrentPrincipal()),
128
+ __param(1, Body(new ZodPipe(ChangePasswordBody))),
129
+ __param(2, Req()),
130
+ __param(3, Res({ passthrough: true }))
131
+ ], MeController.prototype, "changePassword", null);
132
+ __decorate([
133
+ Post("tokens"),
134
+ SessionOnly(),
135
+ __param(0, CurrentPrincipal()),
136
+ __param(1, Body(new ZodPipe(TokenBody)))
137
+ ], MeController.prototype, "createToken", null);
138
+ __decorate([
139
+ Get("tokens"),
140
+ SessionOnly(),
141
+ __param(0, CurrentPrincipal())
142
+ ], MeController.prototype, "listTokens", null);
143
+ __decorate([
144
+ Delete("tokens/:tokenId"),
145
+ SessionOnly(),
146
+ HttpCode(204),
147
+ __param(0, CurrentPrincipal()),
148
+ __param(1, Param("tokenId"))
149
+ ], MeController.prototype, "revokeToken", null);
150
+ MeController = __decorate([
151
+ Controller("api/v1/me"),
152
+ __param(0, Inject(ACCOUNTS)),
153
+ __param(1, Inject(SESSIONS)),
154
+ __param(2, Inject(ORGS)),
155
+ __param(3, Inject(API_TOKENS)),
156
+ __param(4, Inject(RATE_LIMITER)),
157
+ __param(5, Inject(KERNEL_LOG))
158
+ ], MeController);
159
+ export { MeController };
@@ -0,0 +1,6 @@
1
+ /** 哈希密码,格式 `scrypt$1$N$r$p$<salt b64>$<hash b64>`。 */
2
+ export declare function hashPassword(plain: string): Promise<string>;
3
+ /** 校验密码;格式不认识(含参数不符)一律返回 false,不抛错。 */
4
+ export declare function verifyPassword(stored: string, plain: string): Promise<boolean>;
5
+ /** 账号不存在时也跑一次校验,防止按耗时枚举登录名。 */
6
+ export declare const DUMMY_PASSWORD_HASH: string;
@@ -0,0 +1,37 @@
1
+ import { randomBytes, scrypt, timingSafeEqual } from "node:crypto";
2
+ const N = 32768;
3
+ const R = 8;
4
+ const P = 1;
5
+ const KEYLEN = 32;
6
+ const MAXMEM = 64 * 1024 * 1024;
7
+ function derive(plain, salt) {
8
+ return new Promise((resolve, reject) => {
9
+ scrypt(plain, salt, KEYLEN, { N, r: R, p: P, maxmem: MAXMEM }, (err, key) => err ? reject(err) : resolve(key));
10
+ });
11
+ }
12
+ /** 哈希密码,格式 `scrypt$1$N$r$p$<salt b64>$<hash b64>`。 */
13
+ export async function hashPassword(plain) {
14
+ const salt = randomBytes(16);
15
+ const hash = await derive(plain, salt);
16
+ return `scrypt$1$${N}$${R}$${P}$${salt.toString("base64")}$${hash.toString("base64")}`;
17
+ }
18
+ /** 校验密码;格式不认识(含参数不符)一律返回 false,不抛错。 */
19
+ export async function verifyPassword(stored, plain) {
20
+ const parts = stored.split("$");
21
+ if (parts.length !== 7 || parts[0] !== "scrypt" || parts[1] !== "1")
22
+ return false;
23
+ if (parts[2] !== String(N) || parts[3] !== String(R) || parts[4] !== String(P))
24
+ return false;
25
+ const salt = Buffer.from(parts[5] ?? "", "base64");
26
+ const expected = Buffer.from(parts[6] ?? "", "base64");
27
+ if (salt.length === 0 || expected.length !== KEYLEN)
28
+ return false;
29
+ try {
30
+ return timingSafeEqual(await derive(plain, salt), expected);
31
+ }
32
+ catch {
33
+ return false;
34
+ }
35
+ }
36
+ /** 账号不存在时也跑一次校验,防止按耗时枚举登录名。 */
37
+ export const DUMMY_PASSWORD_HASH = `scrypt$1$${N}$${R}$${P}$${Buffer.alloc(16, 1).toString("base64")}$${Buffer.alloc(KEYLEN, 2).toString("base64")}`;
@@ -0,0 +1,56 @@
1
+ import type { Account } from "./accounts.js";
2
+ /** 一个请求的调用者:Web 会话或个人令牌代表的账号,或属于某组织的服务令牌。 */
3
+ export type Principal = {
4
+ kind: "user";
5
+ account: Account;
6
+ via: "session";
7
+ sessionId: string;
8
+ } | {
9
+ kind: "user";
10
+ account: Account;
11
+ via: "pat";
12
+ tokenId: string;
13
+ } | {
14
+ kind: "service";
15
+ tokenId: string;
16
+ orgId: string;
17
+ role: "admin" | "member" | "guest";
18
+ };
19
+ /** user principal。 */
20
+ export type UserPrincipal = Extract<Principal, {
21
+ kind: "user";
22
+ }>;
23
+ declare module "fastify" {
24
+ interface FastifyRequest {
25
+ /** 由 AuthGuard 设置;`@Public` 路由上无凭据时为 undefined。 */
26
+ principal?: Principal;
27
+ }
28
+ }
29
+ export declare const PUBLIC_KEY = "capybara:auth:public";
30
+ export declare const SESSION_ONLY_KEY = "capybara:auth:session-only";
31
+ export declare const ENTERPRISE_ADMIN_KEY = "capybara:auth:enterprise-admin";
32
+ export declare const ALLOW_SERVICE_KEY = "capybara:auth:allow-service";
33
+ /**
34
+ * 不要求凭据:无凭据时放行(principal 为 undefined);带了有效凭据仍解析,无效凭据按无凭据处理。
35
+ * 非安全方法照样要求 `X-Capybara-Csrf: 1`(防登录 CSRF)。新增公开路由必须同时更新 public-routes 元测试的清单。
36
+ */
37
+ export declare const Public: () => MethodDecorator & ClassDecorator;
38
+ /** 仅接受 Web 会话(`via: "session"`);个人令牌 → `auth.session_required`。 */
39
+ export declare const SessionOnly: () => MethodDecorator;
40
+ /** 仅企业管理员(user principal 且 `isEnterpriseAdmin`);否则 `forbidden`。 */
41
+ export declare const EnterpriseAdmin: () => MethodDecorator & ClassDecorator;
42
+ /**
43
+ * 允许服务令牌(service principal)访问。默认拒绝:未标注的路由只接受 user principal,service → `forbidden`。
44
+ * 组织级路由由 OrgGuard 再核对令牌所属组织与角色。
45
+ */
46
+ export declare const AllowService: () => MethodDecorator & ClassDecorator;
47
+ /** 参数装饰器:取 AuthGuard 放在 `req.principal` 上的调用者。 */
48
+ export declare const CurrentPrincipal: () => ParameterDecorator;
49
+ /**
50
+ * 收窄为 user principal;service → `forbidden`。
51
+ * principal 缺失说明路由被误标 `@Public()`(非公开路由上 AuthGuard 必然已设置 principal):
52
+ * 抛普通 Error(500)让错误显形,而不是在 handler 里补一个 `auth.required` 掩盖它(public-routes 元测试靠此发现误标)。
53
+ */
54
+ export declare function requireUser(p: Principal | undefined): UserPrincipal;
55
+ /** 个人令牌发起的请求返回令牌 id(供审计 `actor_token_id`),Web 会话返回 undefined。 */
56
+ export declare function patTokenId(p: UserPrincipal): string | undefined;
@@ -0,0 +1,38 @@
1
+ import { createParamDecorator, SetMetadata } from "@nestjs/common";
2
+ import { ApiError } from "../errors.js";
3
+ export const PUBLIC_KEY = "capybara:auth:public";
4
+ export const SESSION_ONLY_KEY = "capybara:auth:session-only";
5
+ export const ENTERPRISE_ADMIN_KEY = "capybara:auth:enterprise-admin";
6
+ export const ALLOW_SERVICE_KEY = "capybara:auth:allow-service";
7
+ /**
8
+ * 不要求凭据:无凭据时放行(principal 为 undefined);带了有效凭据仍解析,无效凭据按无凭据处理。
9
+ * 非安全方法照样要求 `X-Capybara-Csrf: 1`(防登录 CSRF)。新增公开路由必须同时更新 public-routes 元测试的清单。
10
+ */
11
+ export const Public = () => SetMetadata(PUBLIC_KEY, true);
12
+ /** 仅接受 Web 会话(`via: "session"`);个人令牌 → `auth.session_required`。 */
13
+ export const SessionOnly = () => SetMetadata(SESSION_ONLY_KEY, true);
14
+ /** 仅企业管理员(user principal 且 `isEnterpriseAdmin`);否则 `forbidden`。 */
15
+ export const EnterpriseAdmin = () => SetMetadata(ENTERPRISE_ADMIN_KEY, true);
16
+ /**
17
+ * 允许服务令牌(service principal)访问。默认拒绝:未标注的路由只接受 user principal,service → `forbidden`。
18
+ * 组织级路由由 OrgGuard 再核对令牌所属组织与角色。
19
+ */
20
+ export const AllowService = () => SetMetadata(ALLOW_SERVICE_KEY, true);
21
+ /** 参数装饰器:取 AuthGuard 放在 `req.principal` 上的调用者。 */
22
+ export const CurrentPrincipal = createParamDecorator((_data, ctx) => ctx.switchToHttp().getRequest().principal);
23
+ /**
24
+ * 收窄为 user principal;service → `forbidden`。
25
+ * principal 缺失说明路由被误标 `@Public()`(非公开路由上 AuthGuard 必然已设置 principal):
26
+ * 抛普通 Error(500)让错误显形,而不是在 handler 里补一个 `auth.required` 掩盖它(public-routes 元测试靠此发现误标)。
27
+ */
28
+ export function requireUser(p) {
29
+ if (!p)
30
+ throw new Error("requireUser: no principal; is this route wrongly marked @Public()?");
31
+ if (p.kind !== "user")
32
+ throw new ApiError("forbidden", "This endpoint requires a user");
33
+ return p;
34
+ }
35
+ /** 个人令牌发起的请求返回令牌 id(供审计 `actor_token_id`),Web 会话返回 undefined。 */
36
+ export function patTokenId(p) {
37
+ return p.via === "pat" ? p.tokenId : undefined;
38
+ }
@@ -0,0 +1,55 @@
1
+ import type { Redis } from "ioredis";
2
+ /** 计数窗口(秒):首次尝试起算,窗口内累计。 */
3
+ export declare const LOGIN_FAIL_WINDOW_SECONDS = 900;
4
+ /** 同一(登录名, 客户端 IP)在窗口内允许的尝试次数(成功登录会清零)。 */
5
+ export declare const LOGIN_FAIL_LIMIT_PER_LOGIN_IP = 10;
6
+ /** 同一客户端 IP 在窗口内允许的尝试次数(跨登录名,防撞库;成功登录退还一次)。 */
7
+ export declare const LOGIN_FAIL_LIMIT_PER_IP = 50;
8
+ /** 同一登录名在窗口内跨所有 IP 允许的尝试次数(防分布式爆破单个账号;成功登录会清零)。 */
9
+ export declare const LOGIN_FAIL_LIMIT_PER_LOGIN = 100;
10
+ export type RateLimitResult = {
11
+ allowed: true;
12
+ } | {
13
+ allowed: false;
14
+ retryAfterSeconds: number;
15
+ };
16
+ /** 登录计数键。 */
17
+ export declare const loginFailKey: {
18
+ /** (登录名, IP):阈值 10。 */
19
+ loginIp: (login: string, ip: string) => string;
20
+ /** 客户端 IP(跨登录名):阈值 50。 */
21
+ ip: (ip: string) => string;
22
+ /** 单登录名全局(跨 IP):阈值 100。 */
23
+ login: (login: string) => string;
24
+ };
25
+ /** 其他凭据核对接口(改密码 `acct`、初始化令牌 `setup`、接受邀请 `inv`)的计数键,与登录的额度分开。 */
26
+ export declare const scopedKey: {
27
+ key: (scope: string, key: string) => string;
28
+ ip: (scope: string, ip: string) => string;
29
+ };
30
+ /**
31
+ * 凭据尝试限流,计数在 Redis 中、所有副本共享,窗口 900s。
32
+ *
33
+ * 登录(`reserve`)按三个键计数,任一超限即拒绝:
34
+ * - (登录名, IP)10 次——攻击者从一个 IP 打满某登录名的额度,不影响本人从别的 IP 登录(R25);
35
+ * - 客户端 IP 50 次(跨登录名,防撞库);
36
+ * - 单登录名 100 次(跨 IP,防分布式爆破)。
37
+ * 校验密码**之前**先原子地占用一次尝试,并发请求也无法绕过上限;登录成功后 `succeeded`
38
+ * 清掉该登录名的两个计数并退还一次 IP 额度(成功登录不消耗 IP 预算)。
39
+ *
40
+ * `reserveScoped` 供其他核对凭据的接口复用:按 `(scope, key)`(上限 `limit`)与 scope 内的 IP
41
+ * (上限 `ipLimit`,默认同登录的 50)两个键计数;IP 计数与登录的 IP 额度分开
42
+ * (改密码失败不会挤占同 NAT 下他人的登录额度)。
43
+ *
44
+ * 被拒绝的尝试不递增任何计数(攻击者在一个维度上被拒后,无法继续推高其他维度的计数),窗口到期自然清零。
45
+ */
46
+ export declare class LoginRateLimiter {
47
+ private readonly redis;
48
+ constructor(redis: Redis);
49
+ reserve(login: string, ip: string): Promise<RateLimitResult>;
50
+ succeeded(login: string, ip: string): Promise<void>;
51
+ reserveScoped(scope: string, key: string, ip: string, limit: number, ipLimit?: number): Promise<RateLimitResult>;
52
+ /** 核对成功:删 `(scope, key)` 计数,scope 内 IP 计数减一。 */
53
+ succeededScoped(scope: string, key: string, ip: string): Promise<void>;
54
+ private reserveKeys;
55
+ }
@@ -0,0 +1,121 @@
1
+ import { createHash } from "node:crypto";
2
+ /** 计数窗口(秒):首次尝试起算,窗口内累计。 */
3
+ export const LOGIN_FAIL_WINDOW_SECONDS = 900;
4
+ /** 同一(登录名, 客户端 IP)在窗口内允许的尝试次数(成功登录会清零)。 */
5
+ export const LOGIN_FAIL_LIMIT_PER_LOGIN_IP = 10;
6
+ /** 同一客户端 IP 在窗口内允许的尝试次数(跨登录名,防撞库;成功登录退还一次)。 */
7
+ export const LOGIN_FAIL_LIMIT_PER_IP = 50;
8
+ /** 同一登录名在窗口内跨所有 IP 允许的尝试次数(防分布式爆破单个账号;成功登录会清零)。 */
9
+ export const LOGIN_FAIL_LIMIT_PER_LOGIN = 100;
10
+ /**
11
+ * 原子地「先查后增」:ARGV[1] 为窗口秒数,ARGV[i + 1] 为 KEYS[i] 的上限。
12
+ * 先读全部计数,任一已达上限即拒绝,且**不递增任何键**(被拒绝的尝试不消耗其他计数,
13
+ * 否则从一个 IP 被拒的请求会继续推高单登录名全局计数,把本人从别的 IP 也锁住);
14
+ * 都未达上限才逐个 INCR,并在首次计数或键没有 TTL 时设 EXPIRE(保证计数键一定带 TTL)。
15
+ * 返回 `{1}`(放行)或 `{0, retryTtl}`(拒绝;retryTtl 为已达上限的键中最大的剩余 TTL)。
16
+ */
17
+ const RESERVE = `
18
+ local retry = -1
19
+ for i, key in ipairs(KEYS) do
20
+ local n = tonumber(redis.call('GET', key) or '0')
21
+ if n >= tonumber(ARGV[i + 1]) then
22
+ local ttl = redis.call('TTL', key)
23
+ if ttl > retry then retry = ttl end
24
+ if retry < 1 then retry = 1 end
25
+ end
26
+ end
27
+ if retry > 0 then
28
+ return {0, retry}
29
+ end
30
+ for i, key in ipairs(KEYS) do
31
+ local n = redis.call('INCR', key)
32
+ if n == 1 or redis.call('TTL', key) < 0 then
33
+ redis.call('EXPIRE', key, ARGV[1])
34
+ end
35
+ end
36
+ return {1}
37
+ `;
38
+ /**
39
+ * 删除除最后一个之外的全部键;最后一个(IP 计数)存在时减一,减到 0 及以下即删除
40
+ * (不会凭空建出无 TTL 的负数键)。
41
+ */
42
+ const SUCCEEDED = `
43
+ for i = 1, #KEYS - 1 do
44
+ redis.call('DEL', KEYS[i])
45
+ end
46
+ local ip = KEYS[#KEYS]
47
+ if redis.call('EXISTS', ip) == 1 then
48
+ if redis.call('DECR', ip) <= 0 then
49
+ redis.call('DEL', ip)
50
+ end
51
+ end
52
+ return 0
53
+ `;
54
+ const sha256 = (s) => createHash("sha256").update(s).digest("hex");
55
+ /** 登录名按与本地账号相同的方式粗规范化(不校验格式),使大小写 / 空白变体共用计数。 */
56
+ const loginHash = (login) => sha256(login.normalize("NFKC").trim().toLowerCase());
57
+ /** 登录计数键。 */
58
+ export const loginFailKey = {
59
+ /** (登录名, IP):阈值 10。 */
60
+ loginIp: (login, ip) => `capk:login-fail:li:${loginHash(login)}:${sha256(ip)}`,
61
+ /** 客户端 IP(跨登录名):阈值 50。 */
62
+ ip: (ip) => `capk:login-fail:ip:${ip}`,
63
+ /** 单登录名全局(跨 IP):阈值 100。 */
64
+ login: (login) => `capk:login-fail:l:${loginHash(login)}`,
65
+ };
66
+ /** 其他凭据核对接口(改密码 `acct`、初始化令牌 `setup`、接受邀请 `inv`)的计数键,与登录的额度分开。 */
67
+ export const scopedKey = {
68
+ key: (scope, key) => `capk:rl:${scope}:k:${sha256(key)}`,
69
+ ip: (scope, ip) => `capk:rl:${scope}:ip:${ip}`,
70
+ };
71
+ /**
72
+ * 凭据尝试限流,计数在 Redis 中、所有副本共享,窗口 900s。
73
+ *
74
+ * 登录(`reserve`)按三个键计数,任一超限即拒绝:
75
+ * - (登录名, IP)10 次——攻击者从一个 IP 打满某登录名的额度,不影响本人从别的 IP 登录(R25);
76
+ * - 客户端 IP 50 次(跨登录名,防撞库);
77
+ * - 单登录名 100 次(跨 IP,防分布式爆破)。
78
+ * 校验密码**之前**先原子地占用一次尝试,并发请求也无法绕过上限;登录成功后 `succeeded`
79
+ * 清掉该登录名的两个计数并退还一次 IP 额度(成功登录不消耗 IP 预算)。
80
+ *
81
+ * `reserveScoped` 供其他核对凭据的接口复用:按 `(scope, key)`(上限 `limit`)与 scope 内的 IP
82
+ * (上限 `ipLimit`,默认同登录的 50)两个键计数;IP 计数与登录的 IP 额度分开
83
+ * (改密码失败不会挤占同 NAT 下他人的登录额度)。
84
+ *
85
+ * 被拒绝的尝试不递增任何计数(攻击者在一个维度上被拒后,无法继续推高其他维度的计数),窗口到期自然清零。
86
+ */
87
+ export class LoginRateLimiter {
88
+ redis;
89
+ constructor(redis) {
90
+ this.redis = redis;
91
+ }
92
+ async reserve(login, ip) {
93
+ return this.reserveKeys([
94
+ [loginFailKey.loginIp(login, ip), LOGIN_FAIL_LIMIT_PER_LOGIN_IP],
95
+ [loginFailKey.ip(ip), LOGIN_FAIL_LIMIT_PER_IP],
96
+ [loginFailKey.login(login), LOGIN_FAIL_LIMIT_PER_LOGIN],
97
+ ]);
98
+ }
99
+ async succeeded(login, ip) {
100
+ await this.redis.eval(SUCCEEDED, 3, loginFailKey.loginIp(login, ip), loginFailKey.login(login), loginFailKey.ip(ip));
101
+ }
102
+ async reserveScoped(scope, key, ip, limit, ipLimit = LOGIN_FAIL_LIMIT_PER_IP) {
103
+ return this.reserveKeys([
104
+ [scopedKey.key(scope, key), limit],
105
+ [scopedKey.ip(scope, ip), ipLimit],
106
+ ]);
107
+ }
108
+ /** 核对成功:删 `(scope, key)` 计数,scope 内 IP 计数减一。 */
109
+ async succeededScoped(scope, key, ip) {
110
+ await this.redis.eval(SUCCEEDED, 2, scopedKey.key(scope, key), scopedKey.ip(scope, ip));
111
+ }
112
+ async reserveKeys(keys) {
113
+ const out = (await this.redis.eval(RESERVE, keys.length, ...keys.map(([k]) => k), LOGIN_FAIL_WINDOW_SECONDS, ...keys.map(([, limit]) => limit)));
114
+ if (out[0] === 1)
115
+ return { allowed: true };
116
+ return { allowed: false, retryAfterSeconds: clampTtl(out[1] ?? LOGIN_FAIL_WINDOW_SECONDS) };
117
+ }
118
+ }
119
+ function clampTtl(ttl) {
120
+ return Math.min(Math.max(ttl, 1), LOGIN_FAIL_WINDOW_SECONDS);
121
+ }
@@ -0,0 +1,84 @@
1
+ import type { Redis } from "ioredis";
2
+ import type { Keyring } from "../ctx/secrets.js";
3
+ import type { KernelDb } from "../db/kernel-schema.js";
4
+ import { type Account } from "./accounts.js";
5
+ export interface IssuedSession {
6
+ sessionId: string;
7
+ accountId: string;
8
+ accessToken: string;
9
+ refreshToken: string;
10
+ accessExpiresAt: Date;
11
+ refreshExpiresAt: Date;
12
+ }
13
+ /** 旧 refresh token 在被轮换后多久内重放视为并发刷新(不吊销会话)。 */
14
+ export declare const REFRESH_RACE_GRACE_MS = 30000;
15
+ /**
16
+ * Web 会话服务:短期 access token(HS256 JWT,密钥由主密钥环派生)+ PG 中可吊销、一次一换的 refresh token。
17
+ * 吊销会在 Redis 写 `capk:revoked-sid:<sid>`(TTL 覆盖任何配置下 access token 的最长剩余寿命),使所有副本立即拒绝该会话的 access token;
18
+ * 验证 access token 时还会读 PG 的 `sessions.revoked_at`,Redis 丢数据也不会让已吊销的会话复活。
19
+ * 框架无关,由调用方注入依赖。
20
+ */
21
+ export declare class SessionService {
22
+ private readonly db;
23
+ private readonly redis;
24
+ private readonly opts;
25
+ private readonly keys;
26
+ constructor(db: KernelDb, redis: Redis, keyring: Keyring, opts: {
27
+ accessTtlSeconds: number;
28
+ refreshTtlDays: number;
29
+ });
30
+ /**
31
+ * 新建会话。传入 `trx` 时会话行在调用方的事务里写入(如初始化、凭邀请注册:与账号同一事务,
32
+ * 失败整体回滚);Cookie 由调用方在提交之后再设置。
33
+ */
34
+ create(accountId: string, meta: {
35
+ userAgent?: string;
36
+ ip?: string;
37
+ }, trx?: KernelDb): Promise<IssuedSession>;
38
+ refresh(refreshToken: string, meta: {
39
+ userAgent?: string;
40
+ ip?: string;
41
+ }): Promise<IssuedSession>;
42
+ /** 旧 refresh token 未能轮换:区分并发刷新(宽限期内)与重放(吊销会话)。 */
43
+ private rejectRefresh;
44
+ /**
45
+ * 验证 access token 并读出会话所属账号(不判断账号状态,由调用方决定)。
46
+ * Redis 吊销标记是快速路径;PG 的 `sessions.revoked_at` 才是事实来源——Redis 被清空 / 故障切换丢数据时,
47
+ * 已登出或因改密码被吊销的会话不能复活(spec 8.1)。吊销检查与账号读取合并为一条按主键的 JOIN 查询。
48
+ */
49
+ verifyAccess(accessToken: string): Promise<{
50
+ accountId: string;
51
+ sessionId: string;
52
+ account: Account;
53
+ }>;
54
+ /**
55
+ * 只验签不看过期,供登出使用:过期的 token 也接受(取 `JWTExpired` 里已验签的 payload);
56
+ * 签名无效或缺 sid 返回 undefined。
57
+ */
58
+ sessionIdFromAccess(accessToken: string): Promise<string | undefined>;
59
+ /** 按 refresh token 吊销其当前会话(供登出使用);无匹配则什么都不做。 */
60
+ revokeByRefresh(refreshToken: string): Promise<void>;
61
+ revoke(sessionId: string): Promise<void>;
62
+ revokeAllForAccount(accountId: string, exceptSessionId?: string): Promise<number>;
63
+ /**
64
+ * 给已在 PG 中吊销的会话写 Redis 吊销标记(快速路径);任一写入失败即抛出。
65
+ * 鉴权以 PG `revoked_at` 为准,调用方可以把这一步当作尽力而为。
66
+ */
67
+ markRevoked(sessionIds: string[]): Promise<void>;
68
+ /** 设当前组织;会话已吊销、已过期或不存在 → `auth.session_revoked`。 */
69
+ setCurrentOrg(sessionId: string, orgId: string | null): Promise<void>;
70
+ /**
71
+ * 切换当前组织(Web 会话):同一事务内先 `SELECT … FROM memberships WHERE org_id = $1 AND account_id = $2 FOR SHARE`
72
+ * 锁住这一条成员关系(且组织未软删除),再写会话——与「移出成员」(DELETE memberships 后清空会话当前组织)互斥,
73
+ * 不会留下指向已移出组织的 `current_org_id`。非成员或组织已软删除 → `org.not_found`;`null` 清空,不查成员关系。
74
+ */
75
+ switchCurrentOrg(sessionId: string, accountId: string, orgId: string | null): Promise<void>;
76
+ /** 有效(未吊销且未过期)的会话;否则返回 undefined。 */
77
+ get(sessionId: string): Promise<{
78
+ id: string;
79
+ accountId: string;
80
+ currentOrgId: string | null;
81
+ } | undefined>;
82
+ private readonly keyFor;
83
+ private issue;
84
+ }