@capybara-hq/kernel 0.0.0-stage → 0.1.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (637) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +2 -0
  3. package/README.md +20 -2
  4. package/bootstrap.json +26 -0
  5. package/dist/admin/admin.controller.d.ts +139 -0
  6. package/dist/admin/admin.controller.js +238 -0
  7. package/dist/admin/extensions.controller.d.ts +100 -0
  8. package/dist/admin/extensions.controller.js +226 -0
  9. package/dist/admin/setup.controller.d.ts +36 -0
  10. package/dist/admin/setup.controller.js +106 -0
  11. package/dist/admin/setup.service.d.ts +47 -0
  12. package/dist/admin/setup.service.js +90 -0
  13. package/dist/agents/agents.controller.d.ts +205 -0
  14. package/dist/agents/agents.controller.js +144 -0
  15. package/dist/agents/agents.service.d.ts +177 -0
  16. package/dist/agents/agents.service.js +677 -0
  17. package/dist/agents/definition.d.ts +198 -0
  18. package/dist/agents/definition.js +152 -0
  19. package/dist/agents/models.controller.d.ts +13 -0
  20. package/dist/agents/models.controller.js +31 -0
  21. package/dist/agents/templates.controller.d.ts +15 -0
  22. package/dist/agents/templates.controller.js +37 -0
  23. package/dist/agents/templates.d.ts +83 -0
  24. package/dist/agents/templates.js +173 -0
  25. package/dist/catalog/admin-catalog.controller.d.ts +143 -0
  26. package/dist/catalog/admin-catalog.controller.js +245 -0
  27. package/dist/catalog/catalog.service.d.ts +430 -0
  28. package/dist/catalog/catalog.service.js +882 -0
  29. package/dist/catalog/claude/agents.d.ts +27 -0
  30. package/dist/catalog/claude/agents.js +270 -0
  31. package/dist/catalog/claude/commands.d.ts +50 -0
  32. package/dist/catalog/claude/commands.js +179 -0
  33. package/dist/catalog/claude/manifest.d.ts +69 -0
  34. package/dist/catalog/claude/manifest.js +134 -0
  35. package/dist/catalog/claude/marketplace.d.ts +35 -0
  36. package/dist/catalog/claude/marketplace.js +194 -0
  37. package/dist/catalog/claude/mcp.d.ts +33 -0
  38. package/dist/catalog/claude/mcp.js +226 -0
  39. package/dist/catalog/claude/report.d.ts +86 -0
  40. package/dist/catalog/claude/report.js +121 -0
  41. package/dist/catalog/claude/translate.d.ts +56 -0
  42. package/dist/catalog/claude/translate.js +857 -0
  43. package/dist/catalog/cli.d.ts +46 -0
  44. package/dist/catalog/cli.js +211 -0
  45. package/dist/catalog/git-source.d.ts +127 -0
  46. package/dist/catalog/git-source.js +520 -0
  47. package/dist/catalog/marketplace-fetch.d.ts +99 -0
  48. package/dist/catalog/marketplace-fetch.js +203 -0
  49. package/dist/catalog/marketplaces.controller.d.ts +97 -0
  50. package/dist/catalog/marketplaces.controller.js +197 -0
  51. package/dist/catalog/marketplaces.service.d.ts +340 -0
  52. package/dist/catalog/marketplaces.service.js +1217 -0
  53. package/dist/catalog/org-catalog.controller.d.ts +128 -0
  54. package/dist/catalog/org-catalog.controller.js +277 -0
  55. package/dist/catalog/org-catalog.service.d.ts +246 -0
  56. package/dist/catalog/org-catalog.service.js +625 -0
  57. package/dist/catalog/plugin-import.d.ts +436 -0
  58. package/dist/catalog/plugin-import.js +1069 -0
  59. package/dist/catalog/plugin-install.d.ts +447 -0
  60. package/dist/catalog/plugin-install.js +1333 -0
  61. package/dist/catalog/plugin-package.d.ts +143 -0
  62. package/dist/catalog/plugin-package.js +382 -0
  63. package/dist/catalog/plugin-upgrade.d.ts +222 -0
  64. package/dist/catalog/plugin-upgrade.js +1219 -0
  65. package/dist/catalog/requests.service.d.ts +162 -0
  66. package/dist/catalog/requests.service.js +504 -0
  67. package/dist/catalog/schema-path.d.ts +7 -0
  68. package/dist/catalog/schema-path.js +63 -0
  69. package/dist/catalog/upgrade-targets.d.ts +59 -0
  70. package/dist/catalog/upgrade-targets.js +90 -0
  71. package/dist/catalog/versions.d.ts +31 -0
  72. package/dist/catalog/versions.js +44 -0
  73. package/dist/channels/actions.d.ts +37 -0
  74. package/dist/channels/actions.js +121 -0
  75. package/dist/channels/cards.d.ts +44 -0
  76. package/dist/channels/cards.js +156 -0
  77. package/dist/channels/connections.controller.d.ts +59 -0
  78. package/dist/channels/connections.controller.js +115 -0
  79. package/dist/channels/connections.service.d.ts +187 -0
  80. package/dist/channels/connections.service.js +534 -0
  81. package/dist/channels/features.d.ts +12 -0
  82. package/dist/channels/features.js +22 -0
  83. package/dist/channels/inbound.d.ts +120 -0
  84. package/dist/channels/inbound.js +332 -0
  85. package/dist/channels/outbound.d.ts +140 -0
  86. package/dist/channels/outbound.js +1126 -0
  87. package/dist/channels/phrases.d.ts +100 -0
  88. package/dist/channels/phrases.js +81 -0
  89. package/dist/channels/supervisor.d.ts +182 -0
  90. package/dist/channels/supervisor.js +625 -0
  91. package/dist/channels/threads.d.ts +29 -0
  92. package/dist/channels/threads.js +104 -0
  93. package/dist/channels/webhook-url.d.ts +16 -0
  94. package/dist/channels/webhook-url.js +34 -0
  95. package/dist/channels/webhook.controller.d.ts +19 -0
  96. package/dist/channels/webhook.controller.js +72 -0
  97. package/dist/channels/webhook.d.ts +73 -0
  98. package/dist/channels/webhook.js +274 -0
  99. package/dist/config/docs.d.ts +9 -0
  100. package/dist/config/docs.js +85 -0
  101. package/dist/config/env.d.ts +6 -0
  102. package/dist/config/env.js +73 -0
  103. package/dist/config/fields.d.ts +42 -0
  104. package/dist/config/fields.js +214 -0
  105. package/dist/config/file-source.d.ts +3 -0
  106. package/dist/config/file-source.js +31 -0
  107. package/dist/config/load.d.ts +20 -0
  108. package/dist/config/load.js +98 -0
  109. package/dist/config/nacos-source.d.ts +31 -0
  110. package/dist/config/nacos-source.js +229 -0
  111. package/dist/config/schema.d.ts +237 -0
  112. package/dist/config/schema.js +1192 -0
  113. package/dist/config/sources.d.ts +18 -0
  114. package/dist/config/sources.js +59 -0
  115. package/dist/config/types.d.ts +9 -0
  116. package/dist/config/types.js +7 -0
  117. package/dist/conversations/artifacts.d.ts +52 -0
  118. package/dist/conversations/artifacts.js +137 -0
  119. package/dist/conversations/attachments.controller.d.ts +28 -0
  120. package/dist/conversations/attachments.controller.js +96 -0
  121. package/dist/conversations/attachments.service.d.ts +180 -0
  122. package/dist/conversations/attachments.service.js +578 -0
  123. package/dist/conversations/conversations.controller.d.ts +288 -0
  124. package/dist/conversations/conversations.controller.js +607 -0
  125. package/dist/conversations/conversations.service.d.ts +321 -0
  126. package/dist/conversations/conversations.service.js +754 -0
  127. package/dist/conversations/event-log.d.ts +122 -0
  128. package/dist/conversations/event-log.js +259 -0
  129. package/dist/conversations/events.d.ts +856 -0
  130. package/dist/conversations/events.js +639 -0
  131. package/dist/conversations/files.d.ts +92 -0
  132. package/dist/conversations/files.js +213 -0
  133. package/dist/conversations/outputs-read.d.ts +34 -0
  134. package/dist/conversations/outputs-read.js +37 -0
  135. package/dist/conversations/queue.d.ts +169 -0
  136. package/dist/conversations/queue.js +527 -0
  137. package/dist/conversations/sandbox-status.d.ts +21 -0
  138. package/dist/conversations/sandbox-status.js +24 -0
  139. package/dist/conversations/selection.d.ts +46 -0
  140. package/dist/conversations/selection.js +75 -0
  141. package/dist/conversations/titles.d.ts +93 -0
  142. package/dist/conversations/titles.js +423 -0
  143. package/dist/ctx/bus.d.ts +16 -0
  144. package/dist/ctx/bus.js +101 -0
  145. package/dist/ctx/create-ctx.d.ts +109 -0
  146. package/dist/ctx/create-ctx.js +592 -0
  147. package/dist/ctx/kv.d.ts +4 -0
  148. package/dist/ctx/kv.js +31 -0
  149. package/dist/ctx/lock.d.ts +4 -0
  150. package/dist/ctx/lock.js +39 -0
  151. package/dist/ctx/namespace.d.ts +6 -0
  152. package/dist/ctx/namespace.js +12 -0
  153. package/dist/ctx/queue.d.ts +25 -0
  154. package/dist/ctx/queue.js +151 -0
  155. package/dist/ctx/secrets.d.ts +45 -0
  156. package/dist/ctx/secrets.js +175 -0
  157. package/dist/db/kernel-schema.d.ts +1122 -0
  158. package/dist/db/kernel-schema.js +5 -0
  159. package/dist/db/migrator.d.ts +28 -0
  160. package/dist/db/migrator.js +140 -0
  161. package/dist/db/pool.d.ts +21 -0
  162. package/dist/db/pool.js +28 -0
  163. package/dist/db/sql-statements.d.ts +34 -0
  164. package/dist/db/sql-statements.js +168 -0
  165. package/dist/errors.d.ts +211 -0
  166. package/dist/errors.js +213 -0
  167. package/dist/evals/budget.d.ts +61 -0
  168. package/dist/evals/budget.js +181 -0
  169. package/dist/evals/diff.d.ts +55 -0
  170. package/dist/evals/diff.js +133 -0
  171. package/dist/evals/judge.d.ts +53 -0
  172. package/dist/evals/judge.js +149 -0
  173. package/dist/evals/plan.d.ts +47 -0
  174. package/dist/evals/plan.js +77 -0
  175. package/dist/evals/reconstruct.d.ts +137 -0
  176. package/dist/evals/reconstruct.js +322 -0
  177. package/dist/evals/recorded-tools.d.ts +54 -0
  178. package/dist/evals/recorded-tools.js +167 -0
  179. package/dist/evals/run-replay.d.ts +86 -0
  180. package/dist/evals/run-replay.js +502 -0
  181. package/dist/evals/runs.controller.d.ts +100 -0
  182. package/dist/evals/runs.controller.js +199 -0
  183. package/dist/evals/runs.service.d.ts +275 -0
  184. package/dist/evals/runs.service.js +836 -0
  185. package/dist/evals/sets.controller.d.ts +61 -0
  186. package/dist/evals/sets.controller.js +183 -0
  187. package/dist/evals/sets.service.d.ts +128 -0
  188. package/dist/evals/sets.service.js +558 -0
  189. package/dist/evals/snapshot.d.ts +76 -0
  190. package/dist/evals/snapshot.js +207 -0
  191. package/dist/evals/step-replay.d.ts +113 -0
  192. package/dist/evals/step-replay.js +181 -0
  193. package/dist/evals/trajectory.controller.d.ts +41 -0
  194. package/dist/evals/trajectory.controller.js +88 -0
  195. package/dist/evals/trajectory.d.ts +144 -0
  196. package/dist/evals/trajectory.js +338 -0
  197. package/dist/evals/trajectory.service.d.ts +108 -0
  198. package/dist/evals/trajectory.service.js +323 -0
  199. package/dist/evals/worker.d.ts +101 -0
  200. package/dist/evals/worker.js +790 -0
  201. package/dist/extensions/admin-ops.d.ts +105 -0
  202. package/dist/extensions/admin-ops.js +353 -0
  203. package/dist/extensions/admin-view.d.ts +79 -0
  204. package/dist/extensions/admin-view.js +327 -0
  205. package/dist/extensions/approvals.d.ts +119 -0
  206. package/dist/extensions/approvals.js +205 -0
  207. package/dist/extensions/blobs.d.ts +45 -0
  208. package/dist/extensions/blobs.js +160 -0
  209. package/dist/extensions/bootstrap.d.ts +176 -0
  210. package/dist/extensions/bootstrap.js +535 -0
  211. package/dist/extensions/cli.d.ts +61 -0
  212. package/dist/extensions/cli.js +165 -0
  213. package/dist/extensions/config-json-schema.d.ts +9 -0
  214. package/dist/extensions/config-json-schema.js +73 -0
  215. package/dist/extensions/deployment-config.d.ts +138 -0
  216. package/dist/extensions/deployment-config.js +394 -0
  217. package/dist/extensions/enabled.d.ts +31 -0
  218. package/dist/extensions/enabled.js +55 -0
  219. package/dist/extensions/hooks.d.ts +161 -0
  220. package/dist/extensions/hooks.js +425 -0
  221. package/dist/extensions/host.d.ts +577 -0
  222. package/dist/extensions/host.js +2071 -0
  223. package/dist/extensions/inflight.d.ts +69 -0
  224. package/dist/extensions/inflight.js +277 -0
  225. package/dist/extensions/installs.d.ts +166 -0
  226. package/dist/extensions/installs.js +253 -0
  227. package/dist/extensions/instance.d.ts +167 -0
  228. package/dist/extensions/instance.js +329 -0
  229. package/dist/extensions/ledger.d.ts +30 -0
  230. package/dist/extensions/ledger.js +50 -0
  231. package/dist/extensions/lifecycle.d.ts +80 -0
  232. package/dist/extensions/lifecycle.js +152 -0
  233. package/dist/extensions/migrate-lock.d.ts +51 -0
  234. package/dist/extensions/migrate-lock.js +100 -0
  235. package/dist/extensions/org-config.controller.d.ts +24 -0
  236. package/dist/extensions/org-config.controller.js +59 -0
  237. package/dist/extensions/org-config.d.ts +169 -0
  238. package/dist/extensions/org-config.js +520 -0
  239. package/dist/extensions/package.d.ts +115 -0
  240. package/dist/extensions/package.js +246 -0
  241. package/dist/extensions/permission-set.d.ts +117 -0
  242. package/dist/extensions/permission-set.js +184 -0
  243. package/dist/extensions/permission-view.d.ts +194 -0
  244. package/dist/extensions/permission-view.js +284 -0
  245. package/dist/extensions/registry.d.ts +24 -0
  246. package/dist/extensions/registry.js +56 -0
  247. package/dist/extensions/resolve.d.ts +12 -0
  248. package/dist/extensions/resolve.js +71 -0
  249. package/dist/extensions/sources.d.ts +69 -0
  250. package/dist/extensions/sources.js +120 -0
  251. package/dist/extensions/sync.d.ts +40 -0
  252. package/dist/extensions/sync.js +242 -0
  253. package/dist/files/previewers.controller.d.ts +46 -0
  254. package/dist/files/previewers.controller.js +105 -0
  255. package/dist/files/previewers.d.ts +100 -0
  256. package/dist/files/previewers.js +250 -0
  257. package/dist/http/api.module.d.ts +114 -0
  258. package/dist/http/api.module.js +448 -0
  259. package/dist/http/app.d.ts +77 -0
  260. package/dist/http/app.js +220 -0
  261. package/dist/http/error.filter.d.ts +21 -0
  262. package/dist/http/error.filter.js +85 -0
  263. package/dist/http/gateway.module.d.ts +15 -0
  264. package/dist/http/gateway.module.js +13 -0
  265. package/dist/http/health.controller.d.ts +26 -0
  266. package/dist/http/health.controller.js +79 -0
  267. package/dist/http/nest-logger.d.ts +20 -0
  268. package/dist/http/nest-logger.js +28 -0
  269. package/dist/http/plugin-dispatch.d.ts +68 -0
  270. package/dist/http/plugin-dispatch.js +200 -0
  271. package/dist/http/tokens.d.ts +131 -0
  272. package/dist/http/tokens.js +131 -0
  273. package/dist/http/zod.pipe.d.ts +8 -0
  274. package/dist/http/zod.pipe.js +14 -0
  275. package/dist/identity/accounts.d.ts +93 -0
  276. package/dist/identity/accounts.js +367 -0
  277. package/dist/identity/api-tokens.d.ts +73 -0
  278. package/dist/identity/api-tokens.js +197 -0
  279. package/dist/identity/audit.d.ts +23 -0
  280. package/dist/identity/audit.js +41 -0
  281. package/dist/identity/auth.controller.d.ts +40 -0
  282. package/dist/identity/auth.controller.js +130 -0
  283. package/dist/identity/auth.guard.d.ts +41 -0
  284. package/dist/identity/auth.guard.js +162 -0
  285. package/dist/identity/binding.d.ts +47 -0
  286. package/dist/identity/binding.js +84 -0
  287. package/dist/identity/cookies.d.ts +16 -0
  288. package/dist/identity/cookies.js +32 -0
  289. package/dist/identity/credential-check.d.ts +17 -0
  290. package/dist/identity/credential-check.js +24 -0
  291. package/dist/identity/enterprise-admin.d.ts +14 -0
  292. package/dist/identity/enterprise-admin.js +27 -0
  293. package/dist/identity/external.d.ts +106 -0
  294. package/dist/identity/external.js +337 -0
  295. package/dist/identity/hash.d.ts +2 -0
  296. package/dist/identity/hash.js +3 -0
  297. package/dist/identity/login.d.ts +6 -0
  298. package/dist/identity/login.js +20 -0
  299. package/dist/identity/me.controller.d.ts +61 -0
  300. package/dist/identity/me.controller.js +159 -0
  301. package/dist/identity/passwords.d.ts +6 -0
  302. package/dist/identity/passwords.js +37 -0
  303. package/dist/identity/principal.d.ts +56 -0
  304. package/dist/identity/principal.js +38 -0
  305. package/dist/identity/rate-limit.d.ts +55 -0
  306. package/dist/identity/rate-limit.js +121 -0
  307. package/dist/identity/sessions.d.ts +84 -0
  308. package/dist/identity/sessions.js +306 -0
  309. package/dist/identity/settings.d.ts +121 -0
  310. package/dist/identity/settings.js +248 -0
  311. package/dist/identity/sso.controller.d.ts +59 -0
  312. package/dist/identity/sso.controller.js +192 -0
  313. package/dist/identity/sso.d.ts +83 -0
  314. package/dist/identity/sso.js +202 -0
  315. package/dist/inbox/inbox.service.d.ts +43 -0
  316. package/dist/inbox/inbox.service.js +57 -0
  317. package/dist/index.d.ts +69 -0
  318. package/dist/index.js +67 -0
  319. package/dist/kernel.d.ts +259 -0
  320. package/dist/kernel.js +1326 -0
  321. package/dist/log-config.d.ts +9 -0
  322. package/dist/log-config.js +27 -0
  323. package/dist/log-context.d.ts +32 -0
  324. package/dist/log-context.js +40 -0
  325. package/dist/log-loki.d.ts +34 -0
  326. package/dist/log-loki.js +145 -0
  327. package/dist/log.d.ts +79 -0
  328. package/dist/log.js +303 -0
  329. package/dist/models/prices.d.ts +53 -0
  330. package/dist/models/prices.js +121 -0
  331. package/dist/models/purposes.controller.d.ts +19 -0
  332. package/dist/models/purposes.controller.js +56 -0
  333. package/dist/models/purposes.d.ts +140 -0
  334. package/dist/models/purposes.js +267 -0
  335. package/dist/net/proxy.d.ts +44 -0
  336. package/dist/net/proxy.js +162 -0
  337. package/dist/net/public-address.d.ts +60 -0
  338. package/dist/net/public-address.js +272 -0
  339. package/dist/net/safe-fetch.d.ts +38 -0
  340. package/dist/net/safe-fetch.js +140 -0
  341. package/dist/orgs/directory-sync.controller.d.ts +14 -0
  342. package/dist/orgs/directory-sync.controller.js +40 -0
  343. package/dist/orgs/directory-sync.d.ts +166 -0
  344. package/dist/orgs/directory-sync.js +558 -0
  345. package/dist/orgs/invitations.controller.d.ts +58 -0
  346. package/dist/orgs/invitations.controller.js +137 -0
  347. package/dist/orgs/invitations.service.d.ts +80 -0
  348. package/dist/orgs/invitations.service.js +217 -0
  349. package/dist/orgs/members.service.d.ts +63 -0
  350. package/dist/orgs/members.service.js +234 -0
  351. package/dist/orgs/offboarding.d.ts +141 -0
  352. package/dist/orgs/offboarding.js +398 -0
  353. package/dist/orgs/org-lock.d.ts +32 -0
  354. package/dist/orgs/org-lock.js +46 -0
  355. package/dist/orgs/org.guard.d.ts +35 -0
  356. package/dist/orgs/org.guard.js +95 -0
  357. package/dist/orgs/orgs.controller.d.ts +78 -0
  358. package/dist/orgs/orgs.controller.js +192 -0
  359. package/dist/orgs/orgs.service.d.ts +61 -0
  360. package/dist/orgs/orgs.service.js +209 -0
  361. package/dist/orgs/roles.d.ts +13 -0
  362. package/dist/orgs/roles.js +58 -0
  363. package/dist/orgs/settings.controller.d.ts +20 -0
  364. package/dist/orgs/settings.controller.js +53 -0
  365. package/dist/orgs/settings.service.d.ts +120 -0
  366. package/dist/orgs/settings.service.js +178 -0
  367. package/dist/packages/npm.d.ts +50 -0
  368. package/dist/packages/npm.js +218 -0
  369. package/dist/packages/provenance.d.ts +47 -0
  370. package/dist/packages/provenance.js +147 -0
  371. package/dist/packages/tgz.d.ts +76 -0
  372. package/dist/packages/tgz.js +225 -0
  373. package/dist/runtime/abort.d.ts +32 -0
  374. package/dist/runtime/abort.js +71 -0
  375. package/dist/runtime/checkpointer.d.ts +32 -0
  376. package/dist/runtime/checkpointer.js +243 -0
  377. package/dist/runtime/context/build.d.ts +254 -0
  378. package/dist/runtime/context/build.js +693 -0
  379. package/dist/runtime/context/claude-tools.d.ts +11 -0
  380. package/dist/runtime/context/claude-tools.js +24 -0
  381. package/dist/runtime/context/compaction.d.ts +26 -0
  382. package/dist/runtime/context/compaction.js +195 -0
  383. package/dist/runtime/context/pairing.d.ts +11 -0
  384. package/dist/runtime/context/pairing.js +82 -0
  385. package/dist/runtime/context/reminders.d.ts +5 -0
  386. package/dist/runtime/context/reminders.js +11 -0
  387. package/dist/runtime/context/skills.d.ts +105 -0
  388. package/dist/runtime/context/skills.js +283 -0
  389. package/dist/runtime/context/tokens.d.ts +19 -0
  390. package/dist/runtime/context/tokens.js +104 -0
  391. package/dist/runtime/conversation-lock.d.ts +40 -0
  392. package/dist/runtime/conversation-lock.js +97 -0
  393. package/dist/runtime/hook-calls.d.ts +84 -0
  394. package/dist/runtime/hook-calls.js +136 -0
  395. package/dist/runtime/langgraph-loop.d.ts +52 -0
  396. package/dist/runtime/langgraph-loop.js +247 -0
  397. package/dist/runtime/loop.d.ts +93 -0
  398. package/dist/runtime/loop.js +7 -0
  399. package/dist/runtime/maintenance.d.ts +80 -0
  400. package/dist/runtime/maintenance.js +148 -0
  401. package/dist/runtime/media-cache.d.ts +21 -0
  402. package/dist/runtime/media-cache.js +51 -0
  403. package/dist/runtime/model-call.d.ts +176 -0
  404. package/dist/runtime/model-call.js +1049 -0
  405. package/dist/runtime/providers.d.ts +86 -0
  406. package/dist/runtime/providers.js +224 -0
  407. package/dist/runtime/quota.d.ts +29 -0
  408. package/dist/runtime/quota.js +70 -0
  409. package/dist/runtime/run-finish.d.ts +45 -0
  410. package/dist/runtime/run-finish.js +69 -0
  411. package/dist/runtime/run-queue.d.ts +121 -0
  412. package/dist/runtime/run-queue.js +493 -0
  413. package/dist/runtime/run-worker.d.ts +138 -0
  414. package/dist/runtime/run-worker.js +806 -0
  415. package/dist/runtime/stream.controller.d.ts +34 -0
  416. package/dist/runtime/stream.controller.js +122 -0
  417. package/dist/runtime/stream.d.ts +63 -0
  418. package/dist/runtime/stream.js +262 -0
  419. package/dist/runtime/subagents/child.d.ts +80 -0
  420. package/dist/runtime/subagents/child.js +225 -0
  421. package/dist/runtime/subagents/definition.d.ts +103 -0
  422. package/dist/runtime/subagents/definition.js +392 -0
  423. package/dist/runtime/subagents/dispatch.d.ts +69 -0
  424. package/dist/runtime/subagents/dispatch.js +502 -0
  425. package/dist/runtime/subagents/limits.d.ts +23 -0
  426. package/dist/runtime/subagents/limits.js +34 -0
  427. package/dist/runtime/subagents/org-agents.d.ts +50 -0
  428. package/dist/runtime/subagents/org-agents.js +70 -0
  429. package/dist/runtime/subagents/preamble.d.ts +7 -0
  430. package/dist/runtime/subagents/preamble.js +11 -0
  431. package/dist/runtime/subagents/progress.d.ts +26 -0
  432. package/dist/runtime/subagents/progress.js +36 -0
  433. package/dist/runtime/subagents/roster.d.ts +55 -0
  434. package/dist/runtime/subagents/roster.js +111 -0
  435. package/dist/runtime/subagents/skill-fork.d.ts +123 -0
  436. package/dist/runtime/subagents/skill-fork.js +259 -0
  437. package/dist/runtime/usage-report.d.ts +163 -0
  438. package/dist/runtime/usage-report.js +551 -0
  439. package/dist/runtime/waits.d.ts +233 -0
  440. package/dist/runtime/waits.js +883 -0
  441. package/dist/sandbox/leases.d.ts +169 -0
  442. package/dist/sandbox/leases.js +515 -0
  443. package/dist/sandbox/lifecycle.d.ts +21 -0
  444. package/dist/sandbox/lifecycle.js +68 -0
  445. package/dist/sandbox/sandbox.service.d.ts +249 -0
  446. package/dist/sandbox/sandbox.service.js +908 -0
  447. package/dist/skills/catalog.d.ts +149 -0
  448. package/dist/skills/catalog.js +405 -0
  449. package/dist/skills/changes.controller.d.ts +56 -0
  450. package/dist/skills/changes.controller.js +136 -0
  451. package/dist/skills/changes.service.d.ts +175 -0
  452. package/dist/skills/changes.service.js +805 -0
  453. package/dist/skills/invocable.controller.d.ts +23 -0
  454. package/dist/skills/invocable.controller.js +50 -0
  455. package/dist/skills/invocation-keys.d.ts +23 -0
  456. package/dist/skills/invocation-keys.js +44 -0
  457. package/dist/skills/invoke.d.ts +135 -0
  458. package/dist/skills/invoke.js +286 -0
  459. package/dist/skills/package.d.ts +87 -0
  460. package/dist/skills/package.js +227 -0
  461. package/dist/skills/skills.controller.d.ts +40 -0
  462. package/dist/skills/skills.controller.js +110 -0
  463. package/dist/skills/skills.service.d.ts +192 -0
  464. package/dist/skills/skills.service.js +567 -0
  465. package/dist/storage/prefix.d.ts +36 -0
  466. package/dist/storage/prefix.js +104 -0
  467. package/dist/storage/purge.d.ts +27 -0
  468. package/dist/storage/purge.js +75 -0
  469. package/dist/storage/storage.service.d.ts +44 -0
  470. package/dist/storage/storage.service.js +145 -0
  471. package/dist/text.d.ts +13 -0
  472. package/dist/text.js +13 -0
  473. package/dist/tools/approvals.controller.d.ts +53 -0
  474. package/dist/tools/approvals.controller.js +128 -0
  475. package/dist/tools/approvals.service.d.ts +172 -0
  476. package/dist/tools/approvals.service.js +568 -0
  477. package/dist/tools/breaker.d.ts +28 -0
  478. package/dist/tools/breaker.js +72 -0
  479. package/dist/tools/builtins/agent.d.ts +81 -0
  480. package/dist/tools/builtins/agent.js +223 -0
  481. package/dist/tools/builtins/ask-user.d.ts +28 -0
  482. package/dist/tools/builtins/ask-user.js +139 -0
  483. package/dist/tools/builtins/read-tool-output.d.ts +18 -0
  484. package/dist/tools/builtins/read-tool-output.js +108 -0
  485. package/dist/tools/builtins/sandbox/bash.d.ts +16 -0
  486. package/dist/tools/builtins/sandbox/bash.js +137 -0
  487. package/dist/tools/builtins/sandbox/common.d.ts +116 -0
  488. package/dist/tools/builtins/sandbox/common.js +306 -0
  489. package/dist/tools/builtins/sandbox/deliver.d.ts +5 -0
  490. package/dist/tools/builtins/sandbox/deliver.js +180 -0
  491. package/dist/tools/builtins/sandbox/edit.d.ts +4 -0
  492. package/dist/tools/builtins/sandbox/edit.js +98 -0
  493. package/dist/tools/builtins/sandbox/glob-match.d.ts +25 -0
  494. package/dist/tools/builtins/sandbox/glob-match.js +240 -0
  495. package/dist/tools/builtins/sandbox/glob.d.ts +4 -0
  496. package/dist/tools/builtins/sandbox/glob.js +104 -0
  497. package/dist/tools/builtins/sandbox/grep.d.ts +9 -0
  498. package/dist/tools/builtins/sandbox/grep.js +133 -0
  499. package/dist/tools/builtins/sandbox/index.d.ts +12 -0
  500. package/dist/tools/builtins/sandbox/index.js +27 -0
  501. package/dist/tools/builtins/sandbox/names.d.ts +7 -0
  502. package/dist/tools/builtins/sandbox/names.js +20 -0
  503. package/dist/tools/builtins/sandbox/read.d.ts +8 -0
  504. package/dist/tools/builtins/sandbox/read.js +121 -0
  505. package/dist/tools/builtins/sandbox/write.d.ts +4 -0
  506. package/dist/tools/builtins/sandbox/write.js +88 -0
  507. package/dist/tools/builtins/skill-load.d.ts +53 -0
  508. package/dist/tools/builtins/skill-load.js +446 -0
  509. package/dist/tools/builtins/skill-write.d.ts +59 -0
  510. package/dist/tools/builtins/skill-write.js +244 -0
  511. package/dist/tools/builtins/tool-search.d.ts +31 -0
  512. package/dist/tools/builtins/tool-search.js +171 -0
  513. package/dist/tools/connector-content.controller.d.ts +34 -0
  514. package/dist/tools/connector-content.controller.js +78 -0
  515. package/dist/tools/connector-content.d.ts +104 -0
  516. package/dist/tools/connector-content.js +267 -0
  517. package/dist/tools/connectors.controller.d.ts +210 -0
  518. package/dist/tools/connectors.controller.js +234 -0
  519. package/dist/tools/connectors.service.d.ts +303 -0
  520. package/dist/tools/connectors.service.js +1102 -0
  521. package/dist/tools/credentials.d.ts +139 -0
  522. package/dist/tools/credentials.js +351 -0
  523. package/dist/tools/drift.d.ts +141 -0
  524. package/dist/tools/drift.js +539 -0
  525. package/dist/tools/elicitation.d.ts +81 -0
  526. package/dist/tools/elicitation.js +266 -0
  527. package/dist/tools/endpoint.d.ts +18 -0
  528. package/dist/tools/endpoint.js +115 -0
  529. package/dist/tools/info.d.ts +67 -0
  530. package/dist/tools/info.js +113 -0
  531. package/dist/tools/naming.d.ts +27 -0
  532. package/dist/tools/naming.js +47 -0
  533. package/dist/tools/oauth/discovery.d.ts +65 -0
  534. package/dist/tools/oauth/discovery.js +307 -0
  535. package/dist/tools/oauth/flow.d.ts +63 -0
  536. package/dist/tools/oauth/flow.js +237 -0
  537. package/dist/tools/oauth/oauth.controller.d.ts +31 -0
  538. package/dist/tools/oauth/oauth.controller.js +95 -0
  539. package/dist/tools/oauth/tokens.d.ts +111 -0
  540. package/dist/tools/oauth/tokens.js +258 -0
  541. package/dist/tools/outputs.d.ts +61 -0
  542. package/dist/tools/outputs.js +156 -0
  543. package/dist/tools/pipeline.d.ts +322 -0
  544. package/dist/tools/pipeline.js +1236 -0
  545. package/dist/tools/policy.d.ts +60 -0
  546. package/dist/tools/policy.js +236 -0
  547. package/dist/tools/questions.controller.d.ts +24 -0
  548. package/dist/tools/questions.controller.js +58 -0
  549. package/dist/tools/questions.service.d.ts +103 -0
  550. package/dist/tools/questions.service.js +295 -0
  551. package/dist/tools/redact.d.ts +20 -0
  552. package/dist/tools/redact.js +60 -0
  553. package/dist/tools/registry.d.ts +246 -0
  554. package/dist/tools/registry.js +481 -0
  555. package/dist/tools/resources.d.ts +16 -0
  556. package/dist/tools/resources.js +76 -0
  557. package/dist/tools/specs.d.ts +14 -0
  558. package/dist/tools/specs.js +31 -0
  559. package/dist/tools/validate.d.ts +20 -0
  560. package/dist/tools/validate.js +183 -0
  561. package/dist/tools/view.d.ts +43 -0
  562. package/dist/tools/view.js +225 -0
  563. package/dist/ui/embed-token.d.ts +31 -0
  564. package/dist/ui/embed-token.js +132 -0
  565. package/dist/ui/registry.d.ts +58 -0
  566. package/dist/ui/registry.js +90 -0
  567. package/dist/ui/ui-stream.d.ts +37 -0
  568. package/dist/ui/ui-stream.js +162 -0
  569. package/dist/ui/views.controller.d.ts +81 -0
  570. package/dist/ui/views.controller.js +261 -0
  571. package/dist/ui/views.d.ts +155 -0
  572. package/dist/ui/views.js +306 -0
  573. package/dist/version.d.ts +5 -0
  574. package/dist/version.js +6 -0
  575. package/package.json +69 -3
  576. package/src/migrations/0001_init.sql +8 -0
  577. package/src/migrations/0002_secrets.sql +8 -0
  578. package/src/migrations/0003_identity.sql +117 -0
  579. package/src/migrations/0004_plugin_org_config_nullable.sql +3 -0
  580. package/src/migrations/0005_agents.sql +27 -0
  581. package/src/migrations/0006_conversations.sql +37 -0
  582. package/src/migrations/0007_checkpoints.sql +26 -0
  583. package/src/migrations/0008_runs_trigger_seq.sql +3 -0
  584. package/src/migrations/0009_runs_active_unique.sql +4 -0
  585. package/src/migrations/0010_tools.sql +125 -0
  586. package/src/migrations/0011_approvals_spec.sql +10 -0
  587. package/src/migrations/0012_run_waits.sql +24 -0
  588. package/src/migrations/0013_app_tools_source.sql +4 -0
  589. package/src/migrations/0014_tool_specs.sql +8 -0
  590. package/src/migrations/0015_tool_drift.sql +20 -0
  591. package/src/migrations/0016_plugin_permissions.sql +11 -0
  592. package/src/migrations/0017_identity_sources.sql +6 -0
  593. package/src/migrations/0018_channels.sql +74 -0
  594. package/src/migrations/0019_identity_trust.sql +17 -0
  595. package/src/migrations/0020_channel_card_lookup.sql +10 -0
  596. package/src/migrations/0021_org_storage_purge.sql +9 -0
  597. package/src/migrations/0022_attachments.sql +29 -0
  598. package/src/migrations/0023_sandboxes.sql +37 -0
  599. package/src/migrations/0024_skills.sql +46 -0
  600. package/src/migrations/0025_skills_catalog_idx.sql +6 -0
  601. package/src/migrations/0026_skill_changes.sql +34 -0
  602. package/src/migrations/0027_model_prices.sql +18 -0
  603. package/src/migrations/0028_evals.sql +105 -0
  604. package/src/migrations/0029_model_purposes.sql +18 -0
  605. package/src/migrations/0030_plugin_installs.sql +73 -0
  606. package/src/migrations/0031_plugin_snapshot_source.sql +6 -0
  607. package/src/migrations/0032_plugin_deployment_configs.sql +10 -0
  608. package/src/migrations/0033_rename_apps_to_connectors.sql +25 -0
  609. package/src/migrations/0034_directory.sql +49 -0
  610. package/src/migrations/0035_catalogs.sql +40 -0
  611. package/src/migrations/0036_app_import_staging.sql +17 -0
  612. package/src/migrations/0037_directory_installs.sql +92 -0
  613. package/src/migrations/0038_channel_inbound_mode.sql +6 -0
  614. package/src/migrations/0039_channel_card_pending.sql +8 -0
  615. package/src/migrations/0040_usage_report_sweep.sql +10 -0
  616. package/src/migrations/0041_rename_plugins_to_extensions.sql +38 -0
  617. package/src/migrations/0042_rename_directory_to_catalog.sql +80 -0
  618. package/src/migrations/0043_rename_app_installs_to_plugin_installs.sql +20 -0
  619. package/src/migrations/0044_catalog_one_kind.sql +90 -0
  620. package/src/migrations/0045_plugin_dependencies.sql +9 -0
  621. package/src/migrations/0046_git_sources.sql +25 -0
  622. package/src/migrations/0047_marketplace_entry_heads.sql +7 -0
  623. package/src/migrations/0048_marketplace_entry_trees.sql +8 -0
  624. package/src/migrations/0049_plugin_upgrades.sql +37 -0
  625. package/src/migrations/0050_bootstrap.sql +53 -0
  626. package/src/migrations/0051_claude_compat.sql +26 -0
  627. package/src/migrations/0052_conversations_account_agent_idx.sql +5 -0
  628. package/src/migrations/0053_subagents.sql +73 -0
  629. package/src/migrations/0054_subagent_wait_expiry.sql +7 -0
  630. package/src/migrations/0055_subagent_parent_indexes.sql +10 -0
  631. package/src/migrations/0056_approval_reason.sql +3 -0
  632. package/src/migrations/0057_conversation_titles.sql +11 -0
  633. package/src/migrations/0058_conversation_selection.sql +4 -0
  634. package/src/migrations/0059_conversation_queue.sql +22 -0
  635. package/src/migrations/0060_file_previewers.sql +10 -0
  636. package/src/migrations/0061_queue_selection.sql +5 -0
  637. package/src/migrations/0062_queued_skill.sql +8 -0
@@ -0,0 +1,398 @@
1
+ import { sql } from "kysely";
2
+ import { ApiError } from "../errors.js";
3
+ import { enabledExtensionsQuery } from "../extensions/enabled.js";
4
+ import { audit } from "../identity/audit.js";
5
+ /** 兜底扫描:维护队列任务名、job scheduler id(不含 `:`)、周期与每次条数。 */
6
+ export const OFFBOARD_SWEEP_JOB = "offboard-sweep";
7
+ export const OFFBOARD_SWEEP_SCHEDULER_ID = "offboard-sweep-every-10m";
8
+ export const OFFBOARD_SWEEP_EVERY_MS = 600_000;
9
+ export const OFFBOARD_SWEEP_BATCH = 500;
10
+ /** 一次兜底扫描最多翻的页数(每页 {@link OFFBOARD_SWEEP_BATCH} 条),防止单次任务无限长。 */
11
+ export const OFFBOARD_SWEEP_MAX_PAGES = 20;
12
+ /** 已经广播中止的运行的标记保留时长(秒),长于扫描周期:期间扫描不再重复广播。 */
13
+ export const OFFBOARD_ABORT_MARK_TTL_SECONDS = 1800;
14
+ /** 「已请求中止」标记(Redis 键)。 */
15
+ export const offboardAbortKey = (runId) => `capk:offboard-abort:${runId}`;
16
+ const ACTIVE = ["queued", "running", "waiting"];
17
+ /** 通讯录同步加入的成员关系的 `source` 前缀(`directory:<插件名>`)。 */
18
+ const DIRECTORY_SOURCE_PREFIX = "directory:";
19
+ /**
20
+ * 成员离职(spec 3.3):管理员移出、本人离开与通讯录同步共用这一条路径,全部写入在调用方的同一个事务内,
21
+ * 要么都生效要么都不生效。Redis 吊销标记、事件发布与中止进行中的运行是提交后的尽力而为({@link afterCommit}),
22
+ * 漏掉的运行由兜底扫描({@link sweep}:发起人已不是该组织成员的进行中运行)中止。框架无关。
23
+ *
24
+ * 已接受的窄窗口:离职提交时正在进行的 OAuth token 刷新(`Credentials` 刷新锁内)可能在提交之后把此人的
25
+ * 个人凭据重新写回(upsert)。凭据只在此人以成员身份调用工具时使用,而其运行已被中止、成员关系已删除,
26
+ * 残留的凭据不会被使用;重新加入组织后会被新的连接覆盖。
27
+ */
28
+ export class Offboarding {
29
+ deps;
30
+ constructor(deps) {
31
+ this.deps = deps;
32
+ deps.maintenance?.schedule({
33
+ id: OFFBOARD_SWEEP_SCHEDULER_ID,
34
+ name: OFFBOARD_SWEEP_JOB,
35
+ everyMs: () => OFFBOARD_SWEEP_EVERY_MS,
36
+ });
37
+ deps.maintenance?.handle(OFFBOARD_SWEEP_JOB, async () => {
38
+ await this.sweep();
39
+ });
40
+ }
41
+ /**
42
+ * 在事务 `t` 内(调用方应已锁组织行——顺序:组织行 → 成员关系,并完成「最后一个 owner」等前置检查):
43
+ * 1. 删除成员关系(非成员 → `member.not_found`;删后组织没有 owner → `org.last_owner`),清空指向该组织的会话当前组织;
44
+ * 2. 吊销该账号**全部**会话与个人令牌(令牌与会话是账号级的,无法只吊销「该组织下」的,按保守处理);
45
+ * 3. 删除其在该组织所有连接器上的个人凭据;
46
+ * 4. 取消其作为处理人的 pending 审批与提问(写 cancelled 事件),记下此人在该组织进行中的运行(提交后中止);
47
+ * 5. 其负责的该组织 agent 转给组织所有者(最早加入的 owner)并置 `needs_reassignment = true`;
48
+ * 6. 归档其在该组织各渠道连接上的 IM 话题行(重新加入后在 IM 里开始新的对话,不接着旧会话),
49
+ * 删除其在该组织的「以后都允许」工具授权(`tool_grants`);
50
+ * 7. 手动移出或本人离开(不是同步判定离职)时写通讯录排除(Ruling A20 / A24):对该组织启用的每个通讯录插件,
51
+ * 以及成员关系自身的 `directory:<插件>` 来源,不论此人当初是不是由通讯录加入(手动重新加入后再被移出也不会被同步加回);
52
+ * 同步不再把此人加回,直到有人手动重新加入({@link MembersService.add} 删除排除);
53
+ * 8. 审计 `org.member.offboarded`;
54
+ * 9. 记下此人在该组织对话里还没销毁的沙箱(提交后销毁,尽力而为)。
55
+ */
56
+ async offboard(t, orgId, accountId, reason, actor = {}) {
57
+ const deleted = await t
58
+ .deleteFrom("memberships")
59
+ .where("org_id", "=", orgId)
60
+ .where("account_id", "=", accountId)
61
+ .returning(["role", "source"])
62
+ .executeTakeFirst();
63
+ if (!deleted)
64
+ throw new ApiError("member.not_found", "Member not found");
65
+ // lock the member's agents in id order, right after the membership and before anything that
66
+ // appends to a conversation (approvals, questions lock conversation rows): a dispatch takes
67
+ // FOR SHARE on two agent rows in id order and then appends to the parent conversation, so
68
+ // offboarding goes agents -> conversations the same way (batch 10 m4, batch 11 m1); an UPDATE
69
+ // alone would lock in scan order. These rows (and the conversations below) are updated, never
70
+ // deleted or re-keyed, so NO KEY UPDATE: it still excludes FOR SHARE and other writers, but not
71
+ // the foreign key checks (FOR KEY SHARE) of a transaction that writes rows referencing them,
72
+ // which may already hold a conversation row this transaction waits for (40P01)
73
+ await t
74
+ .selectFrom("agents")
75
+ .select("id")
76
+ .where("org_id", "=", orgId)
77
+ .where("owner_account_id", "=", accountId)
78
+ .where("deleted_at", "is", null)
79
+ .orderBy("id")
80
+ .forNoKeyUpdate()
81
+ .execute();
82
+ // then the member's conversations in id order, before any of their queue rows (final review
83
+ // m2): queue dispatch, send-now and remove lock a conversation, then its queue rows; deleting
84
+ // the rows first and updating the conversations after could deadlock with them (40P01)
85
+ await t
86
+ .selectFrom("conversations")
87
+ .select("id")
88
+ .where("org_id", "=", orgId)
89
+ .where("account_id", "=", accountId)
90
+ .orderBy("id")
91
+ .forNoKeyUpdate()
92
+ .execute();
93
+ const owner = await t
94
+ .selectFrom("memberships")
95
+ .select("account_id")
96
+ .where("org_id", "=", orgId)
97
+ .where("role", "=", "owner")
98
+ .orderBy("created_at")
99
+ .orderBy("account_id")
100
+ .limit(1)
101
+ .executeTakeFirst();
102
+ if (!owner) {
103
+ throw new ApiError("org.last_owner", "An organization must keep at least one owner");
104
+ }
105
+ await t
106
+ .updateTable("sessions")
107
+ .set({ current_org_id: null })
108
+ .where("account_id", "=", accountId)
109
+ .where("current_org_id", "=", orgId)
110
+ .execute();
111
+ const sessions = await t
112
+ .updateTable("sessions")
113
+ .set({ revoked_at: sql `now()` })
114
+ .where("account_id", "=", accountId)
115
+ .where("revoked_at", "is", null)
116
+ .returning("id")
117
+ .execute();
118
+ const tokens = await t
119
+ .updateTable("api_tokens")
120
+ .set({ revoked_at: sql `now()` })
121
+ .where("kind", "=", "personal")
122
+ .where("account_id", "=", accountId)
123
+ .where("revoked_at", "is", null)
124
+ .returning("id")
125
+ .execute();
126
+ const credentials = await this.deps.credentials.clearAccount(orgId, accountId, t);
127
+ const approvals = await this.deps.approvals.cancelPendingFor(t, orgId, accountId);
128
+ const questions = await this.deps.questions.cancelPendingFor(t, orgId, accountId);
129
+ const notify = new Map(approvals.seqs);
130
+ for (const [c, seq] of questions.seqs)
131
+ notify.set(c, Math.max(notify.get(c) ?? 0, seq));
132
+ const runs = await t
133
+ .selectFrom("runs")
134
+ .innerJoin("conversations", "conversations.id", "runs.conversation_id")
135
+ .select(["runs.id", "runs.conversation_id", "runs.status"])
136
+ .where("conversations.org_id", "=", orgId)
137
+ // 评测回放的隐藏对话由评测 worker 驱动(不执行工具),随评测运行停下,不在这里中止。
138
+ // 评测运行的创建者离开组织也不取消评测运行(Ruling S1-b):管理员发起的评测运行是组织的工作,
139
+ // 只有取消、删除评测集、删除组织或 agent 才会停下(见 evals/budget.ts cancelEvalRuns)
140
+ // a removed member's sub-agents run with their identity and credentials: stopped too
141
+ .where("conversations.kind", "in", ["chat", "subagent"])
142
+ .where("runs.status", "in", ACTIVE)
143
+ .where((eb) => eb.or([
144
+ eb("runs.trigger_account_id", "=", accountId),
145
+ eb("conversations.account_id", "=", accountId),
146
+ ]))
147
+ .execute();
148
+ const agents = await t
149
+ .updateTable("agents")
150
+ .set({
151
+ owner_account_id: owner.account_id,
152
+ needs_reassignment: true,
153
+ updated_at: sql `now()`,
154
+ })
155
+ .where("org_id", "=", orgId)
156
+ .where("owner_account_id", "=", accountId)
157
+ .where("deleted_at", "is", null)
158
+ .returning("id")
159
+ .execute();
160
+ const threads = await t
161
+ .updateTable("channel_threads")
162
+ .set({ archived_at: sql `now()` })
163
+ .where("account_id", "=", accountId)
164
+ .where("archived_at", "is", null)
165
+ .where("connection_id", "in", (eb) => eb.selectFrom("channel_connections").select("id").where("org_id", "=", orgId))
166
+ .executeTakeFirst();
167
+ const grants = await t
168
+ .deleteFrom("tool_grants")
169
+ .where("org_id", "=", orgId)
170
+ .where("account_id", "=", accountId)
171
+ .executeTakeFirst();
172
+ const excluded = reason === "directory" ? [] : await this.exclusionPlugins(t, orgId, deleted.source);
173
+ if (excluded.length > 0) {
174
+ await t
175
+ .insertInto("directory_exclusions")
176
+ .values(excluded.map((plugin) => ({
177
+ org_id: orgId,
178
+ account_id: accountId,
179
+ plugin,
180
+ created_by: actor.actorAccountId ?? null,
181
+ })))
182
+ .onConflict((oc) => oc.columns(["org_id", "account_id", "plugin"]).doNothing())
183
+ .execute();
184
+ }
185
+ // Queued messages never go out after their author leaves (they also hold `@` resource bodies
186
+ // read with the person's credentials): deleted here, so no dispatch can pick them up.
187
+ const queued = await t
188
+ .deleteFrom("conversation_queue")
189
+ .where("conversation_id", "in", (eb) => eb
190
+ .selectFrom("conversations")
191
+ .select("id")
192
+ .where("org_id", "=", orgId)
193
+ .where("account_id", "=", accountId))
194
+ .returning("conversation_id")
195
+ .execute();
196
+ const queueConversations = [...new Set(queued.map((r) => r.conversation_id))];
197
+ if (queueConversations.length > 0) {
198
+ await t
199
+ .updateTable("conversations")
200
+ .set({ queue_paused: false, queue_pause_reason: null })
201
+ .where("id", "in", queueConversations)
202
+ .execute();
203
+ }
204
+ const sandboxes = await t
205
+ .selectFrom("sandboxes")
206
+ .innerJoin("conversations", "conversations.id", "sandboxes.conversation_id")
207
+ .select("sandboxes.conversation_id")
208
+ .where("conversations.org_id", "=", orgId)
209
+ .where("conversations.account_id", "=", accountId)
210
+ .where("sandboxes.status", "<>", "destroyed")
211
+ .execute();
212
+ await audit(t, {
213
+ ...(actor.actorAccountId !== undefined && { actorAccountId: actor.actorAccountId }),
214
+ ...(actor.actorTokenId !== undefined && { actorTokenId: actor.actorTokenId }),
215
+ orgId,
216
+ action: "org.member.offboarded",
217
+ target: accountId,
218
+ detail: {
219
+ reason,
220
+ role: deleted.role,
221
+ sessionsRevoked: sessions.length,
222
+ tokensRevoked: tokens.length,
223
+ credentialsDeleted: credentials,
224
+ approvalsCancelled: approvals.records.length,
225
+ questionsCancelled: questions.records.length,
226
+ runsToStop: runs.length,
227
+ agentsReassigned: agents.map((a) => a.id),
228
+ newOwner: agents.length > 0 ? owner.account_id : null,
229
+ channelThreadsArchived: Number(threads.numUpdatedRows),
230
+ toolGrantsDeleted: Number(grants.numDeletedRows),
231
+ ...(excluded.length > 0 && { directoryExcluded: excluded }),
232
+ ...(sandboxes.length > 0 && { sandboxesToDestroy: sandboxes.length }),
233
+ ...(queued.length > 0 && { queuedMessagesDeleted: queued.length }),
234
+ },
235
+ });
236
+ return {
237
+ role: deleted.role,
238
+ revokedSessionIds: sessions.map((s) => s.id),
239
+ notify,
240
+ runs: runs.map((r) => ({
241
+ conversationId: r.conversation_id,
242
+ runId: r.id,
243
+ status: r.status,
244
+ })),
245
+ newOwnerId: agents.length > 0 ? owner.account_id : null,
246
+ sandboxConversations: sandboxes.map((r) => r.conversation_id),
247
+ queueConversations,
248
+ };
249
+ }
250
+ /** 要写排除的通讯录插件:该组织启用的已加载通讯录插件 ∪ 成员关系自身的 `directory:<插件>` 来源,去重排序。 */
251
+ async exclusionPlugins(t, orgId, source) {
252
+ const out = new Set();
253
+ if (source?.startsWith(DIRECTORY_SOURCE_PREFIX)) {
254
+ out.add(source.slice(DIRECTORY_SOURCE_PREFIX.length));
255
+ }
256
+ const loaded = this.deps.directoryPlugins?.() ?? [];
257
+ if (loaded.length > 0) {
258
+ const rows = await t
259
+ .selectFrom(enabledExtensionsQuery(t, orgId).as("en"))
260
+ .select("en.plugin")
261
+ .where("en.plugin", "in", loaded)
262
+ .execute();
263
+ for (const r of rows)
264
+ out.add(r.plugin);
265
+ }
266
+ return [...out].sort();
267
+ }
268
+ /**
269
+ * 提交之后:写会话吊销标记、发布 cancelled 事件、中止此人在该组织进行中的运行、投递销毁其对话沙箱的任务。
270
+ * 每步失败只记 warn。
271
+ */
272
+ async afterCommit(r) {
273
+ const { sessions, eventLog, log } = this.deps;
274
+ try {
275
+ await sessions?.markRevoked(r.revokedSessionIds);
276
+ }
277
+ catch (err) {
278
+ log?.warn("offboarding: cannot write session revocation markers", { err });
279
+ }
280
+ for (const [conversationId, seq] of r.notify) {
281
+ try {
282
+ await eventLog?.notify(conversationId, seq);
283
+ }
284
+ catch (err) {
285
+ log?.warn("offboarding: event notify failed", { conversationId, err });
286
+ }
287
+ }
288
+ for (const conversationId of r.queueConversations) {
289
+ try {
290
+ await eventLog?.publishChanged?.(conversationId, "queue");
291
+ }
292
+ catch (err) {
293
+ log?.warn("offboarding: queue change notify failed", { conversationId, err });
294
+ }
295
+ }
296
+ for (const run of r.runs)
297
+ await this.stopRun(run);
298
+ if (r.sandboxConversations.length > 0 && this.deps.sandboxes) {
299
+ try {
300
+ await this.deps.sandboxes.destroy(r.sandboxConversations);
301
+ }
302
+ catch (err) {
303
+ log?.warn("offboarding: cannot schedule sandbox destruction", {
304
+ count: r.sandboxConversations.length,
305
+ err,
306
+ });
307
+ }
308
+ }
309
+ }
310
+ /**
311
+ * 中止一个运行,顺序同会话中止接口:waiting → 直接取消等待并写终态;孤儿 → 直接写终态;
312
+ * 否则经 Redis 广播中止(运行所在副本收到后结束;尚未开始的运行开始时补查中止标记)。失败只记 warn。
313
+ * 不像会话中止那样随后起新一轮运行:离职者的待处理消息不再处理。
314
+ */
315
+ async stopRun(run) {
316
+ const ctl = this.deps.runs;
317
+ if (!ctl)
318
+ return;
319
+ try {
320
+ if (run.status === "waiting" &&
321
+ (await ctl.abortWaiting(run.conversationId, run.runId, null))) {
322
+ return;
323
+ }
324
+ if (await ctl.abortIfOrphaned(run.conversationId, run.runId, null))
325
+ return;
326
+ await ctl.requestAbort(run.runId, null);
327
+ // 广播中止的运行要等所在副本到达步骤边界才真正结束:广播成功后记标记,扫描在其有效期内不再重复广播
328
+ // (广播失败不记,下一轮扫描重试)
329
+ await this.deps.redis
330
+ ?.set(offboardAbortKey(run.runId), "1", "EX", OFFBOARD_ABORT_MARK_TTL_SECONDS)
331
+ .catch((err) => this.deps.log?.warn("offboarding: cannot mark abort", { err }));
332
+ }
333
+ catch (err) {
334
+ this.deps.log?.warn("offboarding: cannot stop run", { runId: run.runId, err });
335
+ }
336
+ }
337
+ /**
338
+ * 兜底扫描(维护队列每 10 分钟):进行中、且发起人已不是该会话所属组织成员的运行 → 中止
339
+ * (提交后的中止没做成时,如进程崩溃)。按 `(runs.created_at, runs.id)` 键集分页翻完(每页 500 条,
340
+ * 至多 20 页):经广播中止、尚未真正结束的运行仍是进行中,若只取前 500 条,超过 500 条卡住的运行会
341
+ * 一直占满这一页,后面的永远轮不到。已广播中止、仍带 `capk:offboard-abort:<runId>` 标记(30 分钟)的运行跳过,
342
+ * 不每轮重复广播;标记过期仍未结束的再处理一次。返回本次处理(未跳过)的运行数。
343
+ * 现任成员(含匿名访客这样的 guest 成员)发起的运行不受影响。
344
+ */
345
+ async sweep() {
346
+ const { db } = this.deps;
347
+ if (!db || !this.deps.runs)
348
+ return 0;
349
+ const batch = this.deps.sweepBatch ?? OFFBOARD_SWEEP_BATCH;
350
+ // 游标的时间用文本保存完整的微秒精度(JS Date 只有毫秒,会让同一行再被取到)
351
+ let after;
352
+ let total = 0;
353
+ for (let page = 0; page < OFFBOARD_SWEEP_MAX_PAGES; page++) {
354
+ const cursor = after;
355
+ const rows = await db
356
+ .selectFrom("runs")
357
+ .innerJoin("conversations", "conversations.id", "runs.conversation_id")
358
+ .select(["runs.id", "runs.conversation_id", "runs.status"])
359
+ .select(sql `runs.created_at::text`.as("created_at_text"))
360
+ .where("runs.status", "in", ACTIVE)
361
+ // a removed member's sub-agents run with their identity and credentials: stopped too
362
+ .where("conversations.kind", "in", ["chat", "subagent"])
363
+ .where(({ not, exists, selectFrom }) => not(exists(selectFrom("memberships")
364
+ .select(sql `1`.as("one"))
365
+ .whereRef("memberships.org_id", "=", "conversations.org_id")
366
+ .whereRef("memberships.account_id", "=", "runs.trigger_account_id"))))
367
+ .$if(cursor !== undefined, (q) => q.where(sql `(runs.created_at, runs.id) > (${cursor?.createdAt}::timestamptz, ${cursor?.id})`))
368
+ .orderBy("runs.created_at")
369
+ .orderBy("runs.id")
370
+ .limit(batch)
371
+ .execute();
372
+ for (const r of rows) {
373
+ if (await this.recentlyAborted(r.id))
374
+ continue;
375
+ total++;
376
+ this.deps.log?.warn("offboard sweep: stopping run of a former member", { runId: r.id });
377
+ await this.stopRun({
378
+ conversationId: r.conversation_id,
379
+ runId: r.id,
380
+ status: r.status,
381
+ });
382
+ }
383
+ const last = rows[rows.length - 1];
384
+ if (rows.length < batch || !last)
385
+ break;
386
+ after = { createdAt: last.created_at_text, id: last.id };
387
+ }
388
+ return total;
389
+ }
390
+ async recentlyAborted(runId) {
391
+ try {
392
+ return (await this.deps.redis?.exists(offboardAbortKey(runId))) === 1;
393
+ }
394
+ catch {
395
+ return false;
396
+ }
397
+ }
398
+ }
@@ -0,0 +1,32 @@
1
+ import type { Transaction } from "kysely";
2
+ import type { KernelDatabase } from "../db/kernel-schema.js";
3
+ import { type OrgAction, type OrgRole } from "./roles.js";
4
+ type Trx = Transaction<KernelDatabase>;
5
+ /** 被锁组织的元数据(审计记录改动前的值用)。 */
6
+ export interface LockedOrg {
7
+ slug: string;
8
+ name: string;
9
+ }
10
+ /**
11
+ * `SELECT … FROM capybara.orgs WHERE id = $1 AND deleted_at IS NULL FOR NO KEY UPDATE`:锁住组织行,
12
+ * 串行化同一组织的成员 / 邀请 / 令牌 / 配置写操作。组织不存在或已软删除时返回 undefined。
13
+ *
14
+ * NO KEY UPDATE, not UPDATE: the holders still exclude each other (and `FOR SHARE` readers), but a
15
+ * foreign key check against the org row (`FOR KEY SHARE`, taken by every insert of a row that
16
+ * references the org, and by an update of a row the same transaction already wrote) is not blocked.
17
+ * With FOR UPDATE, offboarding (org row, then the member's conversations) deadlocked with an event
18
+ * log append (a conversation row, then the org foreign key check).
19
+ */
20
+ export declare function tryLockOrg(t: Trx, orgId: string): Promise<LockedOrg | undefined>;
21
+ /** 同 `tryLockOrg`,组织不存在或已软删除 → `org.not_found`。 */
22
+ export declare function lockOrg(t: Trx, orgId: string): Promise<LockedOrg>;
23
+ /**
24
+ * 依赖角色的组织写操作的执行期复核(spec 3.6 R5):锁组织行,并在锁内实时重读发起人的角色。
25
+ * 组织不存在或已软删除 → `org.not_found`;发起人不是成员或角色不足以执行 `action` → `forbidden`。
26
+ * 服务只接收发起人账号 id,不接收调用方传入的角色。
27
+ */
28
+ export declare function lockOrgAndAuthorize(t: Trx, orgId: string, actorAccountId: string, action: OrgAction): Promise<{
29
+ org: LockedOrg;
30
+ role: OrgRole;
31
+ }>;
32
+ export {};
@@ -0,0 +1,46 @@
1
+ import { ApiError } from "../errors.js";
2
+ import { can } from "./roles.js";
3
+ /**
4
+ * `SELECT … FROM capybara.orgs WHERE id = $1 AND deleted_at IS NULL FOR NO KEY UPDATE`:锁住组织行,
5
+ * 串行化同一组织的成员 / 邀请 / 令牌 / 配置写操作。组织不存在或已软删除时返回 undefined。
6
+ *
7
+ * NO KEY UPDATE, not UPDATE: the holders still exclude each other (and `FOR SHARE` readers), but a
8
+ * foreign key check against the org row (`FOR KEY SHARE`, taken by every insert of a row that
9
+ * references the org, and by an update of a row the same transaction already wrote) is not blocked.
10
+ * With FOR UPDATE, offboarding (org row, then the member's conversations) deadlocked with an event
11
+ * log append (a conversation row, then the org foreign key check).
12
+ */
13
+ export async function tryLockOrg(t, orgId) {
14
+ return t
15
+ .selectFrom("orgs")
16
+ .select(["slug", "name"])
17
+ .where("id", "=", orgId)
18
+ .where("deleted_at", "is", null)
19
+ .forNoKeyUpdate()
20
+ .executeTakeFirst();
21
+ }
22
+ /** 同 `tryLockOrg`,组织不存在或已软删除 → `org.not_found`。 */
23
+ export async function lockOrg(t, orgId) {
24
+ const org = await tryLockOrg(t, orgId);
25
+ if (!org)
26
+ throw new ApiError("org.not_found", "Organization not found");
27
+ return org;
28
+ }
29
+ /**
30
+ * 依赖角色的组织写操作的执行期复核(spec 3.6 R5):锁组织行,并在锁内实时重读发起人的角色。
31
+ * 组织不存在或已软删除 → `org.not_found`;发起人不是成员或角色不足以执行 `action` → `forbidden`。
32
+ * 服务只接收发起人账号 id,不接收调用方传入的角色。
33
+ */
34
+ export async function lockOrgAndAuthorize(t, orgId, actorAccountId, action) {
35
+ const org = await lockOrg(t, orgId);
36
+ const m = await t
37
+ .selectFrom("memberships")
38
+ .select("role")
39
+ .where("org_id", "=", orgId)
40
+ .where("account_id", "=", actorAccountId)
41
+ .executeTakeFirst();
42
+ if (!m || !can(m.role, action)) {
43
+ throw new ApiError("forbidden", "Insufficient organization role");
44
+ }
45
+ return { org, role: m.role };
46
+ }
@@ -0,0 +1,35 @@
1
+ import { type CanActivate, type ExecutionContext } from "@nestjs/common";
2
+ import { Reflector } from "@nestjs/core";
3
+ import type { KernelDb } from "../db/kernel-schema.js";
4
+ import { type OrgAction as Action, type OrgRole } from "./roles.js";
5
+ /** OrgGuard 放在请求上的组织上下文。 */
6
+ export interface OrgContext {
7
+ orgId: string;
8
+ role: OrgRole;
9
+ }
10
+ declare module "fastify" {
11
+ interface FastifyRequest {
12
+ /** 由 OrgGuard 设置(仅 `@OrgAction` 路由)。 */
13
+ org?: OrgContext;
14
+ }
15
+ }
16
+ export declare const ORG_ACTION_KEY = "capybara:org:action";
17
+ /**
18
+ * 组织级路由:声明所需动作,读路径参数 `:orgId`,由 OrgGuard(在全局 AuthGuard 之后)判定。
19
+ * 隐含 `@AllowService()`:服务令牌能到达 OrgGuard,再由它核对所属组织与 HUMAN_ONLY。
20
+ */
21
+ export declare function OrgAction(action: Action): MethodDecorator & ClassDecorator;
22
+ /** 参数装饰器:取 OrgGuard 放在 `req.org` 上的 `{ orgId, role }`。 */
23
+ export declare const CurrentOrg: () => ParameterDecorator;
24
+ /**
25
+ * 组织守卫:每个请求实时从 PG 读组织与成员角色(不缓存)。
26
+ * - 组织不存在、已软删除、或调用者不是成员 → 404 `org.not_found`(不泄露组织是否存在)。
27
+ * - user principal 的角色取 memberships;service principal 只认令牌所属组织,角色取令牌上的 role。
28
+ * - HUMAN_ONLY 动作遇到 service principal → 403 `forbidden`;角色不足 → 403 `forbidden`。
29
+ */
30
+ export declare class OrgGuard implements CanActivate {
31
+ private readonly reflector;
32
+ private readonly db;
33
+ constructor(reflector: Reflector, db: KernelDb);
34
+ canActivate(ctx: ExecutionContext): Promise<boolean>;
35
+ }
@@ -0,0 +1,95 @@
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 { applyDecorators, createParamDecorator, Inject, Injectable, SetMetadata, UseGuards, } from "@nestjs/common";
11
+ import { Reflector } from "@nestjs/core";
12
+ import { ApiError } from "../errors.js";
13
+ import { KERNEL_DB } from "../http/tokens.js";
14
+ import { AllowService } from "../identity/principal.js";
15
+ import { can, HUMAN_ONLY } from "./roles.js";
16
+ export const ORG_ACTION_KEY = "capybara:org:action";
17
+ /**
18
+ * 组织级路由:声明所需动作,读路径参数 `:orgId`,由 OrgGuard(在全局 AuthGuard 之后)判定。
19
+ * 隐含 `@AllowService()`:服务令牌能到达 OrgGuard,再由它核对所属组织与 HUMAN_ONLY。
20
+ */
21
+ export function OrgAction(action) {
22
+ return applyDecorators(SetMetadata(ORG_ACTION_KEY, action), AllowService(), UseGuards(OrgGuard));
23
+ }
24
+ /** 参数装饰器:取 OrgGuard 放在 `req.org` 上的 `{ orgId, role }`。 */
25
+ export const CurrentOrg = createParamDecorator((_data, ctx) => ctx.switchToHttp().getRequest().org);
26
+ const notFound = () => new ApiError("org.not_found", "Organization not found");
27
+ /**
28
+ * 组织守卫:每个请求实时从 PG 读组织与成员角色(不缓存)。
29
+ * - 组织不存在、已软删除、或调用者不是成员 → 404 `org.not_found`(不泄露组织是否存在)。
30
+ * - user principal 的角色取 memberships;service principal 只认令牌所属组织,角色取令牌上的 role。
31
+ * - HUMAN_ONLY 动作遇到 service principal → 403 `forbidden`;角色不足 → 403 `forbidden`。
32
+ */
33
+ let OrgGuard = class OrgGuard {
34
+ reflector;
35
+ db;
36
+ constructor(reflector, db) {
37
+ this.reflector = reflector;
38
+ this.db = db;
39
+ }
40
+ async canActivate(ctx) {
41
+ const action = this.reflector.getAllAndOverride(ORG_ACTION_KEY, [
42
+ ctx.getHandler(),
43
+ ctx.getClass(),
44
+ ]);
45
+ if (!action)
46
+ throw new Error("OrgGuard: route has no @OrgAction()");
47
+ const req = ctx.switchToHttp().getRequest();
48
+ const p = req.principal;
49
+ if (!p)
50
+ throw new Error("OrgGuard: no principal; is this route wrongly marked @Public()?");
51
+ const orgId = req.params.orgId;
52
+ if (!orgId)
53
+ throw new Error("OrgGuard: route has no :orgId parameter");
54
+ let role;
55
+ if (p.kind === "service") {
56
+ if (p.orgId !== orgId)
57
+ throw notFound();
58
+ const live = await this.db
59
+ .selectFrom("orgs")
60
+ .select("id")
61
+ .where("id", "=", orgId)
62
+ .where("deleted_at", "is", null)
63
+ .executeTakeFirst();
64
+ if (!live)
65
+ throw notFound();
66
+ if (HUMAN_ONLY.has(action)) {
67
+ throw new ApiError("forbidden", "Service tokens cannot perform this action");
68
+ }
69
+ role = p.role;
70
+ }
71
+ else {
72
+ const m = await this.db
73
+ .selectFrom("memberships")
74
+ .innerJoin("orgs", "orgs.id", "memberships.org_id")
75
+ .select("memberships.role")
76
+ .where("memberships.org_id", "=", orgId)
77
+ .where("memberships.account_id", "=", p.account.id)
78
+ .where("orgs.deleted_at", "is", null)
79
+ .executeTakeFirst();
80
+ if (!m)
81
+ throw notFound();
82
+ role = m.role;
83
+ }
84
+ if (!can(role, action))
85
+ throw new ApiError("forbidden", "Insufficient organization role");
86
+ req.org = { orgId, role };
87
+ return true;
88
+ }
89
+ };
90
+ OrgGuard = __decorate([
91
+ Injectable(),
92
+ __param(0, Inject(Reflector)),
93
+ __param(1, Inject(KERNEL_DB))
94
+ ], OrgGuard);
95
+ export { OrgGuard };