@capybara-hq/kernel 0.1.0-rc.0 → 0.1.0-rc.2

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 (626) hide show
  1. package/bootstrap.json +10 -6
  2. package/dist/admin/admin.controller.d.ts +17 -17
  3. package/dist/admin/admin.controller.js +43 -26
  4. package/dist/admin/admin.module.d.ts +3 -0
  5. package/dist/admin/admin.module.js +22 -0
  6. package/dist/admin/extensions.controller.d.ts +14 -14
  7. package/dist/admin/extensions.controller.js +30 -17
  8. package/dist/admin/setup-lock.d.ts +16 -0
  9. package/dist/admin/setup-lock.js +47 -0
  10. package/dist/admin/setup.controller.d.ts +8 -8
  11. package/dist/admin/setup.controller.js +27 -25
  12. package/dist/admin/setup.service.d.ts +19 -27
  13. package/dist/admin/setup.service.js +61 -61
  14. package/dist/agents/agent-lookup.d.ts +53 -0
  15. package/dist/agents/agent-lookup.js +179 -0
  16. package/dist/agents/agents.controller.d.ts +1 -1
  17. package/dist/agents/agents.controller.js +14 -8
  18. package/dist/agents/agents.module.d.ts +7 -0
  19. package/dist/agents/agents.module.js +41 -0
  20. package/dist/agents/agents.service.d.ts +39 -58
  21. package/dist/agents/agents.service.js +261 -329
  22. package/dist/agents/definition.d.ts +8 -0
  23. package/dist/agents/definition.js +8 -0
  24. package/dist/agents/models.controller.d.ts +1 -1
  25. package/dist/agents/models.controller.js +2 -2
  26. package/dist/agents/templates.controller.d.ts +1 -1
  27. package/dist/agents/templates.controller.js +2 -2
  28. package/dist/agents/templates.d.ts +6 -8
  29. package/dist/agents/templates.js +20 -4
  30. package/dist/app.d.ts +93 -0
  31. package/dist/app.js +150 -0
  32. package/dist/catalog/admin-catalog.controller.d.ts +3 -3
  33. package/dist/catalog/admin-catalog.controller.js +27 -13
  34. package/dist/catalog/catalog-content.d.ts +185 -0
  35. package/dist/catalog/catalog-content.js +323 -0
  36. package/dist/catalog/catalog-items.d.ts +186 -0
  37. package/dist/catalog/catalog-items.js +410 -0
  38. package/dist/catalog/catalog.module.d.ts +14 -0
  39. package/dist/catalog/catalog.module.js +71 -0
  40. package/dist/catalog/catalog.service.d.ts +34 -188
  41. package/dist/catalog/catalog.service.js +155 -489
  42. package/dist/catalog/cli.d.ts +3 -2
  43. package/dist/catalog/cli.js +13 -31
  44. package/dist/catalog/job-ids.d.ts +15 -0
  45. package/dist/catalog/job-ids.js +15 -0
  46. package/dist/catalog/jobs.d.ts +27 -0
  47. package/dist/catalog/jobs.js +70 -0
  48. package/dist/catalog/locks.d.ts +24 -0
  49. package/dist/catalog/locks.js +63 -0
  50. package/dist/catalog/marketplaces.controller.d.ts +4 -4
  51. package/dist/catalog/marketplaces.controller.js +22 -11
  52. package/dist/catalog/marketplaces.service.d.ts +30 -13
  53. package/dist/catalog/marketplaces.service.js +330 -256
  54. package/dist/catalog/org-catalog.controller.d.ts +4 -3
  55. package/dist/catalog/org-catalog.controller.js +29 -14
  56. package/dist/catalog/org-catalog.service.d.ts +32 -198
  57. package/dist/catalog/org-catalog.service.js +159 -400
  58. package/dist/catalog/plugin-import.d.ts +73 -34
  59. package/dist/catalog/plugin-import.js +356 -217
  60. package/dist/catalog/plugin-install.d.ts +83 -41
  61. package/dist/catalog/plugin-install.js +421 -269
  62. package/dist/catalog/plugin-upgrade.d.ts +59 -4
  63. package/dist/catalog/plugin-upgrade.js +407 -282
  64. package/dist/catalog/requests.service.d.ts +27 -15
  65. package/dist/catalog/requests.service.js +201 -145
  66. package/dist/catalog/upgrade-targets.d.ts +4 -7
  67. package/dist/channels/actions.d.ts +6 -4
  68. package/dist/channels/actions.js +1 -1
  69. package/dist/channels/cards.d.ts +2 -2
  70. package/dist/channels/channels.module.d.ts +40 -0
  71. package/dist/channels/channels.module.js +128 -0
  72. package/dist/channels/connections.controller.d.ts +1 -1
  73. package/dist/channels/connections.controller.js +11 -6
  74. package/dist/channels/connections.service.d.ts +43 -21
  75. package/dist/channels/connections.service.js +236 -131
  76. package/dist/channels/inbound.d.ts +34 -38
  77. package/dist/channels/inbound.js +107 -41
  78. package/dist/channels/job-ids.d.ts +10 -0
  79. package/dist/channels/job-ids.js +10 -0
  80. package/dist/channels/jobs.d.ts +85 -0
  81. package/dist/channels/jobs.js +157 -0
  82. package/dist/channels/outbound.d.ts +60 -82
  83. package/dist/channels/outbound.js +165 -193
  84. package/dist/channels/supervisor.d.ts +88 -46
  85. package/dist/channels/supervisor.js +230 -132
  86. package/dist/channels/threads.d.ts +29 -8
  87. package/dist/channels/threads.js +71 -13
  88. package/dist/channels/webhook.d.ts +20 -14
  89. package/dist/channels/webhook.js +51 -20
  90. package/dist/config/load.d.ts +3 -2
  91. package/dist/config/load.js +3 -2
  92. package/dist/config/nacos-source.js +11 -2
  93. package/dist/config/schema.d.ts +16 -1
  94. package/dist/config/schema.js +54 -7
  95. package/dist/conversations/access.d.ts +29 -0
  96. package/dist/conversations/access.js +86 -0
  97. package/dist/conversations/artifacts.d.ts +10 -10
  98. package/dist/conversations/artifacts.js +35 -9
  99. package/dist/conversations/attachments.controller.d.ts +1 -1
  100. package/dist/conversations/attachments.controller.js +8 -6
  101. package/dist/conversations/attachments.module.d.ts +7 -0
  102. package/dist/conversations/attachments.module.js +25 -0
  103. package/dist/conversations/attachments.service.d.ts +30 -22
  104. package/dist/conversations/attachments.service.js +119 -46
  105. package/dist/conversations/conversations.controller.d.ts +8 -7
  106. package/dist/conversations/conversations.controller.js +59 -29
  107. package/dist/conversations/conversations.module.d.ts +8 -0
  108. package/dist/conversations/conversations.module.js +69 -0
  109. package/dist/conversations/conversations.service.d.ts +40 -38
  110. package/dist/conversations/conversations.service.js +130 -140
  111. package/dist/conversations/event-log.d.ts +28 -18
  112. package/dist/conversations/event-log.js +74 -27
  113. package/dist/conversations/files.d.ts +10 -10
  114. package/dist/conversations/files.js +37 -11
  115. package/dist/conversations/idem-keys.d.ts +5 -0
  116. package/dist/conversations/idem-keys.js +5 -0
  117. package/dist/conversations/job-ids.d.ts +6 -0
  118. package/dist/conversations/job-ids.js +6 -0
  119. package/dist/conversations/outputs-read.d.ts +11 -11
  120. package/dist/conversations/outputs-read.js +31 -7
  121. package/dist/conversations/queue.d.ts +48 -56
  122. package/dist/conversations/queue.js +13 -289
  123. package/dist/conversations/queue.service.d.ts +60 -0
  124. package/dist/conversations/queue.service.js +343 -0
  125. package/dist/conversations/sandbox-status.d.ts +13 -10
  126. package/dist/conversations/sandbox-status.js +36 -8
  127. package/dist/conversations/titles.d.ts +71 -24
  128. package/dist/conversations/titles.js +159 -62
  129. package/dist/ctx/bus.js +9 -3
  130. package/dist/ctx/create-ctx.d.ts +6 -0
  131. package/dist/ctx/create-ctx.js +7 -9
  132. package/dist/ctx/lock.d.ts +7 -3
  133. package/dist/ctx/lock.js +9 -20
  134. package/dist/ctx/queue.js +3 -2
  135. package/dist/ctx/secrets.d.ts +10 -2
  136. package/dist/ctx/secrets.js +7 -3
  137. package/dist/db/kernel-schema.d.ts +2 -2
  138. package/dist/db/pool.d.ts +5 -0
  139. package/dist/db/pool.js +1 -0
  140. package/dist/errors.d.ts +2 -0
  141. package/dist/errors.js +2 -0
  142. package/dist/evals/budget.d.ts +42 -21
  143. package/dist/evals/budget.js +114 -62
  144. package/dist/evals/evals.module.d.ts +31 -0
  145. package/dist/evals/evals.module.js +114 -0
  146. package/dist/evals/jobs.d.ts +20 -0
  147. package/dist/evals/jobs.js +45 -0
  148. package/dist/evals/run-replay.d.ts +56 -8
  149. package/dist/evals/run-replay.js +140 -80
  150. package/dist/evals/runs.controller.d.ts +1 -1
  151. package/dist/evals/runs.controller.js +17 -8
  152. package/dist/evals/runs.service.d.ts +23 -45
  153. package/dist/evals/runs.service.js +245 -234
  154. package/dist/evals/sets.controller.d.ts +1 -1
  155. package/dist/evals/sets.controller.js +17 -8
  156. package/dist/evals/sets.service.d.ts +22 -6
  157. package/dist/evals/sets.service.js +248 -194
  158. package/dist/evals/snapshot.d.ts +2 -2
  159. package/dist/evals/step-replay.d.ts +2 -2
  160. package/dist/evals/step-replay.js +1 -1
  161. package/dist/evals/trajectory.controller.d.ts +1 -1
  162. package/dist/evals/trajectory.controller.js +11 -7
  163. package/dist/evals/trajectory.service.d.ts +5 -4
  164. package/dist/evals/trajectory.service.js +30 -7
  165. package/dist/evals/worker.d.ts +44 -27
  166. package/dist/evals/worker.js +220 -120
  167. package/dist/extensions/admin-ops.d.ts +61 -33
  168. package/dist/extensions/admin-ops.js +248 -154
  169. package/dist/extensions/admin-view.d.ts +38 -27
  170. package/dist/extensions/admin-view.js +126 -55
  171. package/dist/extensions/approvals.d.ts +12 -8
  172. package/dist/extensions/approvals.js +73 -46
  173. package/dist/extensions/blobs.d.ts +27 -10
  174. package/dist/extensions/blobs.js +111 -45
  175. package/dist/extensions/bootstrap.d.ts +96 -42
  176. package/dist/extensions/bootstrap.js +303 -155
  177. package/dist/extensions/cli.d.ts +20 -10
  178. package/dist/extensions/cli.js +41 -96
  179. package/dist/extensions/config-issues.d.ts +7 -0
  180. package/dist/extensions/config-issues.js +31 -0
  181. package/dist/extensions/deployment-config-store.d.ts +49 -0
  182. package/dist/extensions/deployment-config-store.js +133 -0
  183. package/dist/extensions/deployment-config.d.ts +58 -67
  184. package/dist/extensions/deployment-config.js +202 -230
  185. package/dist/extensions/enabled.d.ts +5 -5
  186. package/dist/extensions/extensions.module.d.ts +8 -0
  187. package/dist/extensions/extensions.module.js +77 -0
  188. package/dist/extensions/hooks.d.ts +3 -2
  189. package/dist/extensions/hooks.js +1 -1
  190. package/dist/extensions/host.d.ts +72 -68
  191. package/dist/extensions/host.js +191 -152
  192. package/dist/extensions/installs.d.ts +49 -16
  193. package/dist/extensions/installs.js +128 -32
  194. package/dist/extensions/job-ids.d.ts +6 -0
  195. package/dist/extensions/job-ids.js +6 -0
  196. package/dist/extensions/lifecycle-topics.d.ts +18 -0
  197. package/dist/extensions/lifecycle-topics.js +18 -0
  198. package/dist/extensions/lifecycle.d.ts +35 -47
  199. package/dist/extensions/lifecycle.js +103 -39
  200. package/dist/extensions/locks.d.ts +33 -0
  201. package/dist/extensions/locks.js +86 -0
  202. package/dist/extensions/migrate-lock.d.ts +3 -4
  203. package/dist/extensions/org-config.controller.d.ts +1 -1
  204. package/dist/extensions/org-config.controller.js +8 -5
  205. package/dist/extensions/org-config.d.ts +48 -46
  206. package/dist/extensions/org-config.js +284 -226
  207. package/dist/extensions/registry.d.ts +50 -2
  208. package/dist/extensions/registry.js +89 -4
  209. package/dist/extensions/sources.d.ts +12 -8
  210. package/dist/extensions/sources.js +34 -13
  211. package/dist/files/files.module.d.ts +3 -0
  212. package/dist/files/files.module.js +22 -0
  213. package/dist/files/previewers.controller.d.ts +7 -2
  214. package/dist/files/previewers.controller.js +17 -9
  215. package/dist/files/previewers.d.ts +13 -18
  216. package/dist/files/previewers.js +83 -36
  217. package/dist/http/adapter.d.ts +3 -0
  218. package/dist/http/adapter.js +25 -0
  219. package/dist/http/api.module.d.ts +3 -110
  220. package/dist/http/api.module.js +47 -355
  221. package/dist/http/app.d.ts +11 -15
  222. package/dist/http/app.js +52 -47
  223. package/dist/http/error-filter.module.d.ts +5 -0
  224. package/dist/http/error-filter.module.js +18 -0
  225. package/dist/http/error.filter.js +2 -2
  226. package/dist/identity/accounts.d.ts +82 -29
  227. package/dist/identity/accounts.js +294 -175
  228. package/dist/identity/api-tokens.d.ts +11 -7
  229. package/dist/identity/api-tokens.js +71 -44
  230. package/dist/identity/audit.d.ts +7 -4
  231. package/dist/identity/audit.js +5 -1
  232. package/dist/identity/auth.controller.d.ts +11 -10
  233. package/dist/identity/auth.controller.js +31 -25
  234. package/dist/identity/auth.guard.d.ts +3 -3
  235. package/dist/identity/auth.guard.js +6 -4
  236. package/dist/identity/binding.d.ts +9 -11
  237. package/dist/identity/binding.js +41 -13
  238. package/dist/identity/enterprise-admin.d.ts +18 -12
  239. package/dist/identity/enterprise-admin.js +67 -13
  240. package/dist/identity/external-identity-lock.d.ts +17 -0
  241. package/dist/identity/external-identity-lock.js +39 -0
  242. package/dist/identity/external.d.ts +19 -15
  243. package/dist/identity/external.js +163 -125
  244. package/dist/identity/identity.module.d.ts +6 -0
  245. package/dist/identity/identity.module.js +56 -0
  246. package/dist/identity/me.controller.d.ts +16 -15
  247. package/dist/identity/me.controller.js +37 -31
  248. package/dist/identity/sessions.d.ts +12 -10
  249. package/dist/identity/sessions.js +74 -42
  250. package/dist/identity/settings.d.ts +20 -14
  251. package/dist/identity/settings.js +85 -57
  252. package/dist/identity/sso.controller.d.ts +7 -7
  253. package/dist/identity/sso.controller.js +13 -9
  254. package/dist/identity/sso.d.ts +9 -12
  255. package/dist/identity/sso.js +54 -24
  256. package/dist/inbox/inbox.module.d.ts +3 -0
  257. package/dist/inbox/inbox.module.js +22 -0
  258. package/dist/inbox/inbox.service.d.ts +7 -9
  259. package/dist/inbox/inbox.service.js +32 -11
  260. package/dist/index.d.ts +19 -12
  261. package/dist/index.js +13 -8
  262. package/dist/infra/cache/cache.module.d.ts +3 -0
  263. package/dist/infra/cache/cache.module.js +16 -0
  264. package/dist/infra/cache/cache.service.d.ts +21 -0
  265. package/dist/infra/cache/cache.service.js +80 -0
  266. package/dist/infra/cache/cacheable.decorator.d.ts +32 -0
  267. package/dist/infra/cache/cacheable.decorator.js +83 -0
  268. package/dist/infra/cli/kernel-cli.module.d.ts +66 -0
  269. package/dist/infra/cli/kernel-cli.module.js +165 -0
  270. package/dist/infra/close-within.d.ts +15 -0
  271. package/dist/infra/close-within.js +36 -0
  272. package/dist/infra/config/config.module.d.ts +13 -0
  273. package/dist/infra/config/config.module.js +39 -0
  274. package/dist/infra/config/kernel-config.service.d.ts +25 -0
  275. package/dist/infra/config/kernel-config.service.js +126 -0
  276. package/dist/infra/database/after-commit.d.ts +6 -0
  277. package/dist/infra/database/after-commit.js +9 -0
  278. package/dist/infra/database/database.module.d.ts +25 -0
  279. package/dist/infra/database/database.module.js +90 -0
  280. package/dist/infra/database/kernel-db.d.ts +22 -0
  281. package/dist/infra/database/kernel-db.js +65 -0
  282. package/dist/infra/database/transaction-host.d.ts +50 -0
  283. package/dist/infra/database/transaction-host.js +125 -0
  284. package/dist/infra/database/transactional.decorator.d.ts +15 -0
  285. package/dist/infra/database/transactional.decorator.js +27 -0
  286. package/dist/infra/database/xact-lock.d.ts +17 -0
  287. package/dist/infra/database/xact-lock.js +43 -0
  288. package/dist/infra/events/kernel-events.d.ts +96 -0
  289. package/dist/infra/events/kernel-events.js +65 -0
  290. package/dist/infra/health/health.controller.d.ts +26 -0
  291. package/dist/infra/health/health.controller.js +104 -0
  292. package/dist/infra/health/health.module.d.ts +9 -0
  293. package/dist/infra/health/health.module.js +24 -0
  294. package/dist/infra/health/health.options.d.ts +10 -0
  295. package/dist/infra/health/health.options.js +15 -0
  296. package/dist/infra/health/shutdown-state.d.ts +6 -0
  297. package/dist/infra/health/shutdown-state.js +2 -0
  298. package/dist/infra/lifecycle/graceful-shutdown.module.d.ts +6 -0
  299. package/dist/infra/lifecycle/graceful-shutdown.module.js +23 -0
  300. package/dist/infra/lifecycle/graceful-shutdown.service.d.ts +70 -0
  301. package/dist/infra/lifecycle/graceful-shutdown.service.js +135 -0
  302. package/dist/infra/lifecycle/process-guards.d.ts +52 -0
  303. package/dist/infra/lifecycle/process-guards.js +86 -0
  304. package/dist/infra/lifecycle/shutdown-signals.d.ts +30 -0
  305. package/dist/infra/lifecycle/shutdown-signals.js +48 -0
  306. package/dist/infra/lock/key-template.d.ts +13 -0
  307. package/dist/infra/lock/key-template.js +46 -0
  308. package/dist/infra/lock/lock.module.d.ts +3 -0
  309. package/dist/infra/lock/lock.module.js +16 -0
  310. package/dist/infra/lock/lock.service.d.ts +120 -0
  311. package/dist/infra/lock/lock.service.js +343 -0
  312. package/dist/infra/lock/shared-lease.d.ts +44 -0
  313. package/dist/infra/lock/shared-lease.js +121 -0
  314. package/dist/infra/lock/with-lock.decorator.d.ts +28 -0
  315. package/dist/infra/lock/with-lock.decorator.js +49 -0
  316. package/dist/infra/logging/logging.module.d.ts +16 -0
  317. package/dist/infra/logging/logging.module.js +34 -0
  318. package/dist/infra/queue/configured-processor.d.ts +18 -0
  319. package/dist/infra/queue/configured-processor.js +23 -0
  320. package/dist/infra/queue/job-failure.d.ts +18 -0
  321. package/dist/infra/queue/job-failure.js +26 -0
  322. package/dist/infra/queue/queue-shutdown.d.ts +27 -0
  323. package/dist/infra/queue/queue-shutdown.js +81 -0
  324. package/dist/infra/queue/queue.module.d.ts +16 -0
  325. package/dist/infra/queue/queue.module.js +61 -0
  326. package/dist/infra/queue/redis-connection.d.ts +7 -0
  327. package/dist/infra/queue/redis-connection.js +18 -0
  328. package/dist/infra/queue/retired-schedulers.d.ts +7 -0
  329. package/dist/infra/queue/retired-schedulers.js +9 -0
  330. package/dist/infra/queue/run-job.d.ts +16 -0
  331. package/dist/infra/queue/run-job.js +19 -0
  332. package/dist/infra/redis/redis.module.d.ts +24 -0
  333. package/dist/infra/redis/redis.module.js +87 -0
  334. package/dist/infra/schedule/cron-tick.d.ts +12 -0
  335. package/dist/infra/schedule/cron-tick.js +25 -0
  336. package/dist/infra/schedule/locked-cron.decorator.d.ts +27 -0
  337. package/dist/infra/schedule/locked-cron.decorator.js +53 -0
  338. package/dist/infra/schedule/locked-interval.d.ts +69 -0
  339. package/dist/infra/schedule/locked-interval.js +190 -0
  340. package/dist/infra/schedule/locked-tick.d.ts +90 -0
  341. package/dist/infra/schedule/locked-tick.js +137 -0
  342. package/dist/infra/schedule/schedule.module.d.ts +8 -0
  343. package/dist/infra/schedule/schedule.module.js +27 -0
  344. package/dist/infra/schedule/scheduled-runs.d.ts +69 -0
  345. package/dist/infra/schedule/scheduled-runs.js +163 -0
  346. package/dist/infra/swagger/swagger.d.ts +16 -0
  347. package/dist/infra/swagger/swagger.js +31 -0
  348. package/dist/infra/throttler/credential-throttler.d.ts +35 -0
  349. package/dist/infra/throttler/credential-throttler.js +77 -0
  350. package/dist/infra/throttler/named-throttlers.d.ts +31 -0
  351. package/dist/infra/throttler/named-throttlers.js +119 -0
  352. package/dist/infra/throttler/redis-throttler-storage.d.ts +38 -0
  353. package/dist/infra/throttler/redis-throttler-storage.js +130 -0
  354. package/dist/infra/throttler/throttler.guard.d.ts +23 -0
  355. package/dist/infra/throttler/throttler.guard.js +68 -0
  356. package/dist/infra/throttler/throttler.module.d.ts +15 -0
  357. package/dist/infra/throttler/throttler.module.js +53 -0
  358. package/dist/infra/tokens.d.ts +15 -0
  359. package/dist/infra/tokens.js +15 -0
  360. package/dist/infra/validation/create-zod-dto.d.ts +23 -0
  361. package/dist/infra/validation/create-zod-dto.js +35 -0
  362. package/dist/infra/validation/parse-with-zod.d.ts +7 -0
  363. package/dist/infra/validation/parse-with-zod.js +12 -0
  364. package/dist/infra/validation/validation.module.d.ts +3 -0
  365. package/dist/infra/validation/validation.module.js +16 -0
  366. package/dist/infra/validation/zod-params.d.ts +7 -0
  367. package/dist/infra/validation/zod-params.js +42 -0
  368. package/dist/infra/validation/zod-validation.pipe.d.ts +11 -0
  369. package/dist/infra/validation/zod-validation.pipe.js +31 -0
  370. package/dist/kernel.d.ts +9 -241
  371. package/dist/kernel.js +8 -1305
  372. package/dist/kernel.module.d.ts +17 -0
  373. package/dist/kernel.module.js +136 -0
  374. package/dist/lifecycle/kernel-lifecycle.d.ts +140 -0
  375. package/dist/lifecycle/kernel-lifecycle.js +451 -0
  376. package/dist/lifecycle/tokens.d.ts +3 -0
  377. package/dist/lifecycle/tokens.js +3 -0
  378. package/dist/log-config.d.ts +9 -0
  379. package/dist/log-config.js +27 -0
  380. package/dist/log-context.d.ts +34 -0
  381. package/dist/log-context.js +44 -0
  382. package/dist/log-loki.d.ts +34 -0
  383. package/dist/log-loki.js +145 -0
  384. package/dist/log.d.ts +41 -10
  385. package/dist/log.js +91 -17
  386. package/dist/models/models.module.d.ts +3 -0
  387. package/dist/models/models.module.js +24 -0
  388. package/dist/models/prices.d.ts +8 -2
  389. package/dist/models/prices.js +65 -37
  390. package/dist/models/purposes.controller.d.ts +1 -1
  391. package/dist/models/purposes.controller.js +5 -6
  392. package/dist/models/purposes.d.ts +35 -13
  393. package/dist/models/purposes.js +101 -51
  394. package/dist/net/public-address.js +3 -2
  395. package/dist/orgs/directory-sync.controller.d.ts +1 -1
  396. package/dist/orgs/directory-sync.controller.js +2 -2
  397. package/dist/orgs/directory-sync.d.ts +61 -31
  398. package/dist/orgs/directory-sync.js +212 -125
  399. package/dist/orgs/invitations.controller.d.ts +8 -8
  400. package/dist/orgs/invitations.controller.js +27 -26
  401. package/dist/orgs/invitations.service.d.ts +12 -9
  402. package/dist/orgs/invitations.service.js +130 -92
  403. package/dist/orgs/job-ids.d.ts +8 -0
  404. package/dist/orgs/job-ids.js +8 -0
  405. package/dist/orgs/members.service.d.ts +19 -12
  406. package/dist/orgs/members.service.js +161 -117
  407. package/dist/orgs/offboarding.d.ts +54 -57
  408. package/dist/orgs/offboarding.js +161 -71
  409. package/dist/orgs/org-lock.d.ts +28 -19
  410. package/dist/orgs/org-lock.js +81 -35
  411. package/dist/orgs/org.guard.d.ts +1 -1
  412. package/dist/orgs/org.guard.js +2 -2
  413. package/dist/orgs/orgs.controller.d.ts +13 -13
  414. package/dist/orgs/orgs.controller.js +29 -17
  415. package/dist/orgs/orgs.module.d.ts +6 -0
  416. package/dist/orgs/orgs.module.js +68 -0
  417. package/dist/orgs/orgs.service.d.ts +30 -19
  418. package/dist/orgs/orgs.service.js +139 -86
  419. package/dist/orgs/settings.controller.d.ts +1 -1
  420. package/dist/orgs/settings.controller.js +8 -6
  421. package/dist/orgs/settings.service.d.ts +14 -8
  422. package/dist/orgs/settings.service.js +75 -46
  423. package/dist/overrides.d.ts +56 -0
  424. package/dist/overrides.js +30 -0
  425. package/dist/roles/gateway-role.d.ts +43 -0
  426. package/dist/roles/gateway-role.js +98 -0
  427. package/dist/roles/gateway.module.d.ts +8 -0
  428. package/dist/roles/gateway.module.js +28 -0
  429. package/dist/roles/worker-role.d.ts +63 -0
  430. package/dist/roles/worker-role.js +144 -0
  431. package/dist/roles/worker.module.d.ts +14 -0
  432. package/dist/roles/worker.module.js +90 -0
  433. package/dist/runtime/abort.js +19 -2
  434. package/dist/runtime/checkpointer.d.ts +8 -3
  435. package/dist/runtime/checkpointer.js +87 -55
  436. package/dist/runtime/conversation-lock.d.ts +20 -11
  437. package/dist/runtime/conversation-lock.js +62 -72
  438. package/dist/runtime/hook-calls.d.ts +3 -3
  439. package/dist/runtime/hook-calls.js +1 -6
  440. package/dist/runtime/job-ids.d.ts +10 -0
  441. package/dist/runtime/job-ids.js +10 -0
  442. package/dist/runtime/langgraph-loop.js +1 -1
  443. package/dist/runtime/loop.d.ts +7 -0
  444. package/dist/runtime/loop.js +14 -0
  445. package/dist/runtime/maintenance-queue.d.ts +10 -0
  446. package/dist/runtime/maintenance-queue.js +10 -0
  447. package/dist/runtime/maintenance.d.ts +45 -74
  448. package/dist/runtime/maintenance.js +139 -136
  449. package/dist/runtime/model-call.d.ts +7 -4
  450. package/dist/runtime/model-call.js +24 -57
  451. package/dist/runtime/providers.d.ts +17 -6
  452. package/dist/runtime/providers.js +66 -25
  453. package/dist/runtime/quota.d.ts +17 -3
  454. package/dist/runtime/quota.js +27 -2
  455. package/dist/runtime/retired-schedulers.d.ts +7 -0
  456. package/dist/runtime/retired-schedulers.js +31 -0
  457. package/dist/runtime/run-control.d.ts +33 -0
  458. package/dist/runtime/run-control.js +77 -0
  459. package/dist/runtime/run-finish.d.ts +26 -17
  460. package/dist/runtime/run-finish.js +98 -51
  461. package/dist/runtime/run-jobs.d.ts +48 -0
  462. package/dist/runtime/run-jobs.js +95 -0
  463. package/dist/runtime/run-processors.d.ts +60 -0
  464. package/dist/runtime/run-processors.js +185 -0
  465. package/dist/runtime/run-queue.d.ts +32 -57
  466. package/dist/runtime/run-queue.js +291 -295
  467. package/dist/runtime/run-steps.d.ts +39 -0
  468. package/dist/runtime/run-steps.js +96 -0
  469. package/dist/runtime/run-worker.d.ts +121 -75
  470. package/dist/runtime/run-worker.js +340 -225
  471. package/dist/runtime/runtime.module.d.ts +10 -0
  472. package/dist/runtime/runtime.module.js +112 -0
  473. package/dist/runtime/step-log.d.ts +40 -0
  474. package/dist/runtime/step-log.js +94 -0
  475. package/dist/runtime/stream.controller.d.ts +5 -8
  476. package/dist/runtime/stream.controller.js +14 -12
  477. package/dist/runtime/stream.d.ts +24 -6
  478. package/dist/runtime/stream.js +78 -7
  479. package/dist/runtime/subagents/child.d.ts +3 -44
  480. package/dist/runtime/subagents/child.js +0 -79
  481. package/dist/runtime/subagents/definition.d.ts +4 -4
  482. package/dist/runtime/subagents/definition.js +2 -2
  483. package/dist/runtime/subagents/dispatch.d.ts +87 -6
  484. package/dist/runtime/subagents/dispatch.js +135 -140
  485. package/dist/runtime/subagents/limits.d.ts +9 -4
  486. package/dist/runtime/subagents/limits.js +4 -2
  487. package/dist/runtime/subagents/org-agents.d.ts +4 -4
  488. package/dist/runtime/subagents/org-agents.js +1 -1
  489. package/dist/runtime/subagents/progress.d.ts +2 -2
  490. package/dist/runtime/subagents/roster.d.ts +3 -3
  491. package/dist/runtime/subagents/roster.js +1 -1
  492. package/dist/runtime/subagents/skill-fork.d.ts +6 -7
  493. package/dist/runtime/subagents/skill-fork.js +16 -5
  494. package/dist/runtime/subagents/subagents.service.d.ts +40 -0
  495. package/dist/runtime/subagents/subagents.service.js +101 -0
  496. package/dist/runtime/usage-report.d.ts +94 -52
  497. package/dist/runtime/usage-report.js +200 -99
  498. package/dist/runtime/waits.d.ts +125 -57
  499. package/dist/runtime/waits.js +431 -208
  500. package/dist/sandbox/job-ids.d.ts +10 -0
  501. package/dist/sandbox/job-ids.js +10 -0
  502. package/dist/sandbox/jobs.d.ts +41 -0
  503. package/dist/sandbox/jobs.js +113 -0
  504. package/dist/sandbox/leases.d.ts +39 -31
  505. package/dist/sandbox/leases.js +117 -257
  506. package/dist/sandbox/providers.d.ts +19 -0
  507. package/dist/sandbox/providers.js +38 -0
  508. package/dist/sandbox/sandbox.module.d.ts +8 -0
  509. package/dist/sandbox/sandbox.module.js +30 -0
  510. package/dist/sandbox/sandbox.service.d.ts +24 -29
  511. package/dist/sandbox/sandbox.service.js +106 -75
  512. package/dist/skills/catalog.d.ts +33 -20
  513. package/dist/skills/catalog.js +96 -53
  514. package/dist/skills/changes.controller.d.ts +4 -4
  515. package/dist/skills/changes.controller.js +15 -9
  516. package/dist/skills/changes.service.d.ts +28 -18
  517. package/dist/skills/changes.service.js +421 -364
  518. package/dist/skills/invocable.controller.d.ts +1 -1
  519. package/dist/skills/invocable.controller.js +8 -5
  520. package/dist/skills/invoke.d.ts +16 -15
  521. package/dist/skills/invoke.js +48 -17
  522. package/dist/skills/skills.controller.d.ts +1 -1
  523. package/dist/skills/skills.controller.js +11 -6
  524. package/dist/skills/skills.module.d.ts +6 -0
  525. package/dist/skills/skills.module.js +30 -0
  526. package/dist/skills/skills.service.d.ts +47 -30
  527. package/dist/skills/skills.service.js +221 -158
  528. package/dist/storage/job-ids.d.ts +6 -0
  529. package/dist/storage/job-ids.js +6 -0
  530. package/dist/storage/purge.d.ts +22 -7
  531. package/dist/storage/purge.js +55 -3
  532. package/dist/storage/storage.module.d.ts +6 -0
  533. package/dist/storage/storage.module.js +23 -0
  534. package/dist/storage/storage.service.d.ts +18 -4
  535. package/dist/storage/storage.service.js +44 -3
  536. package/dist/tools/approvals.controller.d.ts +1 -1
  537. package/dist/tools/approvals.controller.js +12 -8
  538. package/dist/tools/approvals.service.d.ts +27 -25
  539. package/dist/tools/approvals.service.js +324 -258
  540. package/dist/tools/breaker.d.ts +2 -2
  541. package/dist/tools/breaker.js +21 -3
  542. package/dist/tools/builtins/ask-user.d.ts +2 -2
  543. package/dist/tools/builtins/ask-user.js +1 -1
  544. package/dist/tools/builtins/builtin-tools.d.ts +21 -0
  545. package/dist/tools/builtins/builtin-tools.js +80 -0
  546. package/dist/tools/builtins/read-tool-output.d.ts +2 -2
  547. package/dist/tools/builtins/read-tool-output.js +1 -1
  548. package/dist/tools/builtins/sandbox/bash.js +2 -2
  549. package/dist/tools/builtins/sandbox/common.d.ts +7 -4
  550. package/dist/tools/builtins/sandbox/common.js +5 -3
  551. package/dist/tools/builtins/sandbox/deliver.js +2 -2
  552. package/dist/tools/builtins/sandbox/edit.js +1 -1
  553. package/dist/tools/builtins/sandbox/glob.js +2 -2
  554. package/dist/tools/builtins/sandbox/grep.js +2 -2
  555. package/dist/tools/builtins/sandbox/read.js +1 -1
  556. package/dist/tools/builtins/sandbox/write.js +1 -1
  557. package/dist/tools/builtins/skill-load.d.ts +3 -3
  558. package/dist/tools/builtins/skill-load.js +1 -1
  559. package/dist/tools/canonical-json.d.ts +6 -0
  560. package/dist/tools/canonical-json.js +16 -0
  561. package/dist/tools/connector-content.controller.d.ts +1 -1
  562. package/dist/tools/connector-content.controller.js +11 -6
  563. package/dist/tools/connector-content.d.ts +12 -15
  564. package/dist/tools/connector-content.js +53 -18
  565. package/dist/tools/connectors.controller.d.ts +1 -1
  566. package/dist/tools/connectors.controller.js +21 -10
  567. package/dist/tools/connectors.service.d.ts +31 -13
  568. package/dist/tools/connectors.service.js +434 -344
  569. package/dist/tools/credentials.d.ts +17 -20
  570. package/dist/tools/credentials.js +55 -34
  571. package/dist/tools/drift.d.ts +29 -41
  572. package/dist/tools/drift.js +111 -79
  573. package/dist/tools/info.d.ts +12 -9
  574. package/dist/tools/info.js +33 -7
  575. package/dist/tools/job-ids.d.ts +13 -0
  576. package/dist/tools/job-ids.js +15 -0
  577. package/dist/tools/jobs.d.ts +24 -0
  578. package/dist/tools/jobs.js +69 -0
  579. package/dist/tools/oauth/flow-paths.d.ts +16 -0
  580. package/dist/tools/oauth/flow-paths.js +38 -0
  581. package/dist/tools/oauth/flow.d.ts +30 -30
  582. package/dist/tools/oauth/flow.js +109 -81
  583. package/dist/tools/oauth/oauth.controller.d.ts +3 -3
  584. package/dist/tools/oauth/oauth.controller.js +12 -9
  585. package/dist/tools/oauth/tokens.d.ts +11 -3
  586. package/dist/tools/oauth/tokens.js +15 -14
  587. package/dist/tools/outputs.d.ts +13 -4
  588. package/dist/tools/outputs.js +47 -3
  589. package/dist/tools/pipeline.d.ts +62 -46
  590. package/dist/tools/pipeline.js +145 -64
  591. package/dist/tools/policy.d.ts +2 -2
  592. package/dist/tools/questions.controller.d.ts +1 -1
  593. package/dist/tools/questions.controller.js +8 -5
  594. package/dist/tools/questions.service.d.ts +25 -24
  595. package/dist/tools/questions.service.js +201 -142
  596. package/dist/tools/registry.d.ts +30 -20
  597. package/dist/tools/registry.js +73 -37
  598. package/dist/tools/specs.d.ts +5 -4
  599. package/dist/tools/specs.js +3 -1
  600. package/dist/tools/tools.module.d.ts +10 -0
  601. package/dist/tools/tools.module.js +91 -0
  602. package/dist/ui/call-extension.d.ts +16 -0
  603. package/dist/ui/call-extension.js +38 -0
  604. package/dist/ui/embed-token.d.ts +9 -5
  605. package/dist/ui/embed-token.js +34 -6
  606. package/dist/ui/ui-stream.d.ts +22 -17
  607. package/dist/ui/ui-stream.js +72 -12
  608. package/dist/ui/ui.module.d.ts +7 -0
  609. package/dist/ui/ui.module.js +28 -0
  610. package/dist/ui/views.controller.d.ts +14 -12
  611. package/dist/ui/views.controller.js +32 -25
  612. package/dist/ui/views.d.ts +9 -57
  613. package/dist/ui/views.js +43 -45
  614. package/package.json +11 -2
  615. package/dist/http/health.controller.d.ts +0 -26
  616. package/dist/http/health.controller.js +0 -79
  617. package/dist/http/tokens.d.ts +0 -131
  618. package/dist/http/tokens.js +0 -131
  619. package/dist/http/zod.pipe.d.ts +0 -8
  620. package/dist/http/zod.pipe.js +0 -14
  621. package/dist/identity/rate-limit.d.ts +0 -55
  622. package/dist/identity/rate-limit.js +0 -121
  623. package/dist/sandbox/lifecycle.d.ts +0 -21
  624. package/dist/sandbox/lifecycle.js +0 -68
  625. /package/dist/http/{gateway.module.d.ts → gateway-routes.d.ts} +0 -0
  626. /package/dist/http/{gateway.module.js → gateway-routes.js} +0 -0
@@ -8,28 +8,33 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
8
8
  return function (target, key) { decorator(target, key, paramIndex); }
9
9
  };
10
10
  import { createHash, timingSafeEqual } from "node:crypto";
11
- import { Body, Controller, Get, HttpCode, Inject, Post, Req, Res } from "@nestjs/common";
11
+ import { Controller, Get, HttpCode, Inject, Post, Req, Res } from "@nestjs/common";
12
12
  import { z } from "zod";
13
13
  import { ApiError } from "../errors.js";
14
- import { KERNEL_CONFIG, RATE_LIMITER, SESSIONS, SETUP } from "../http/tokens.js";
15
- import { ZodPipe } from "../http/zod.pipe.js";
16
14
  import { clientMeta } from "../identity/auth.controller.js";
17
15
  import { setSessionCookies } from "../identity/cookies.js";
18
16
  import { MAX_PASSWORD_LENGTH } from "../identity/login.js";
19
17
  import { Public } from "../identity/principal.js";
20
- const SetupBody = z.object({
18
+ import { SessionService } from "../identity/sessions.js";
19
+ import { KernelConfigService } from "../infra/config/kernel-config.service.js";
20
+ import { CredentialThrottler } from "../infra/throttler/credential-throttler.js";
21
+ import { createZodDto } from "../infra/validation/create-zod-dto.js";
22
+ import { ZBody } from "../infra/validation/zod-params.js";
23
+ import { SetupService } from "./setup.service.js";
24
+ const SetupSchema = z.object({
21
25
  login: z.string().min(1).max(64),
22
26
  password: z.string().min(1).max(MAX_PASSWORD_LENGTH),
23
27
  displayName: z.string().trim().min(1).max(100),
24
28
  orgName: z.string().max(100).optional(),
25
29
  setupToken: z.string().max(1024).optional(),
26
30
  });
31
+ class SetupBody extends createZodDto(SetupSchema, "SetupBody") {
32
+ }
27
33
  /**
28
- * 初始化令牌的限流(scope `setup`):同一客户端 IP 10 次、全部署合计 100 次 / 900s
29
- * (合计上限防换 IP 爆破;令牌本身应足够长,正常情况下打不满)。
34
+ * The setup token's credential throttlers: 10 per client IP, 100 for the whole deployment per
35
+ * 900 s (the total stops guessing from many IPs; a long token never hits it in normal use).
30
36
  */
31
- const SETUP_TOKEN_LIMIT_TOTAL = 100;
32
- const SETUP_TOKEN_LIMIT_PER_IP = 10;
37
+ const SETUP_THROTTLERS = ["setup-token", "setup-ip"];
33
38
  const sha256 = (s) => createHash("sha256").update(s, "utf8").digest();
34
39
  /** 常数时间比较:两边先取 SHA-256,长度恒等,不因长度不同提前返回或抛错。 */
35
40
  function tokenMatches(given, expected) {
@@ -40,12 +45,12 @@ let SetupController = class SetupController {
40
45
  setup;
41
46
  sessions;
42
47
  config;
43
- limiter;
44
- constructor(setup, sessions, config, limiter) {
48
+ throttler;
49
+ constructor(setup, sessions, config, throttler) {
45
50
  this.setup = setup;
46
51
  this.sessions = sessions;
47
52
  this.config = config;
48
- this.limiter = limiter;
53
+ this.throttler = throttler;
49
54
  }
50
55
  async status() {
51
56
  return this.setup.status();
@@ -56,19 +61,14 @@ let SetupController = class SetupController {
56
61
  * 核对前先占用限流额度,超限 → 429 `auth.rate_limited`,核对通过后退还。
57
62
  */
58
63
  async complete(body, req, reply) {
59
- const cfg = this.config();
64
+ const cfg = this.config.get();
60
65
  const expected = cfg.auth.setupToken;
61
66
  if (expected !== undefined) {
62
- const { ip } = clientMeta(req);
63
- const rl = await this.limiter.reserveScoped("setup", "token", ip, SETUP_TOKEN_LIMIT_TOTAL, SETUP_TOKEN_LIMIT_PER_IP);
64
- if (!rl.allowed) {
65
- reply.header("retry-after", String(rl.retryAfterSeconds));
66
- throw new ApiError("auth.rate_limited", "Too many setup attempts; try again later");
67
- }
67
+ await this.throttler.reserve(SETUP_THROTTLERS, req, reply);
68
68
  if (!tokenMatches(body.setupToken, expected)) {
69
69
  throw new ApiError("setup.token_invalid", "Setup token is missing or invalid");
70
70
  }
71
- await this.limiter.succeededScoped("setup", "token", ip);
71
+ await this.throttler.succeeded(SETUP_THROTTLERS, req);
72
72
  }
73
73
  // 会话行与账号 / 组织在同一事务里写入;Cookie 在提交之后才设置
74
74
  const meta = clientMeta(req);
@@ -77,7 +77,9 @@ let SetupController = class SetupController {
77
77
  password: body.password,
78
78
  displayName: body.displayName,
79
79
  orgName: body.orgName,
80
- }, (trx, account) => this.sessions.create(account.id, meta, trx));
80
+ },
81
+ // runs in the setup's transaction
82
+ (account) => this.sessions.create(account.id, meta));
81
83
  if (!session)
82
84
  throw new Error("setup completed without a session");
83
85
  setSessionCookies(reply, session, cfg);
@@ -92,15 +94,15 @@ __decorate([
92
94
  Post(),
93
95
  Public(),
94
96
  HttpCode(201),
95
- __param(0, Body(new ZodPipe(SetupBody))),
97
+ __param(0, ZBody(SetupBody)),
96
98
  __param(1, Req()),
97
99
  __param(2, Res({ passthrough: true }))
98
100
  ], SetupController.prototype, "complete", null);
99
101
  SetupController = __decorate([
100
102
  Controller("api/v1/setup"),
101
- __param(0, Inject(SETUP)),
102
- __param(1, Inject(SESSIONS)),
103
- __param(2, Inject(KERNEL_CONFIG)),
104
- __param(3, Inject(RATE_LIMITER))
103
+ __param(0, Inject(SetupService)),
104
+ __param(1, Inject(SessionService)),
105
+ __param(2, Inject(KernelConfigService)),
106
+ __param(3, Inject(CredentialThrottler))
105
107
  ], SetupController);
106
108
  export { SetupController };
@@ -1,47 +1,39 @@
1
- import type { Transaction } from "kysely";
2
- import type { KernelDatabase, KernelDb } from "../db/kernel-schema.js";
3
- import type { Account, AccountsService } from "../identity/accounts.js";
4
- import type { Org, OrgsService } from "../orgs/orgs.service.js";
5
- /** 初始化向导与 CLI 建企业管理员。框架无关,由调用方注入依赖。 */
1
+ import { type Account, AccountsService } from "../identity/accounts.js";
2
+ import { KernelDb } from "../infra/database/kernel-db.js";
3
+ import { TransactionHost } from "../infra/database/transaction-host.js";
4
+ import { type Org, OrgsService } from "../orgs/orgs.service.js";
5
+ import { SetupLock } from "./setup-lock.js";
6
+ /**
7
+ * The setup wizard. The CLI's enterprise admin creation (`createEnterpriseAdmin`,
8
+ * `createEnterpriseAdminIfNone`) is on `AccountsService`, under the same {@link SetupLock}.
9
+ */
6
10
  export declare class SetupService {
7
11
  private readonly db;
12
+ readonly txHost: TransactionHost;
13
+ private readonly setupLock;
8
14
  private readonly accounts;
9
15
  private readonly orgs;
10
- constructor(db: KernelDb, accounts: AccountsService, orgs: OrgsService);
16
+ constructor(db: KernelDb, txHost: TransactionHost, setupLock: SetupLock, accounts: AccountsService, orgs: OrgsService);
11
17
  /** 不存在活跃企业管理员即需要初始化(每次实时查 PG,不缓存)。 */
12
18
  status(): Promise<{
13
19
  needsSetup: boolean;
14
20
  }>;
15
21
  /**
16
- * 完成初始化:单个事务内先取咨询锁串行化并发的初始化请求,锁内再确认没有活跃企业管理员,
17
- * 然后建企业管理员账号、(给了 `orgName` 时)建组织并以其为 owner。任一步失败整体回滚。
18
- * 给了 `inTx` 时在同一事务的最后调用它(初始化向导用它建会话),结果放在 `extra`;它失败同样整体回滚。
22
+ * Completes the setup in one transaction: {@link SetupLock} serializes concurrent setups, and
23
+ * under it there must still be no active enterprise admin; then creates the enterprise admin
24
+ * and (with `orgName`) an org it owns. Any failure rolls everything back. `inTx` runs last in the
25
+ * same transaction (the wizard creates the session there), its result is `extra`; its failure
26
+ * rolls back too.
19
27
  */
20
28
  complete<T = undefined>(input: {
21
29
  login: string;
22
30
  password: string;
23
31
  displayName: string;
24
32
  orgName?: string | undefined;
25
- }, inTx?: (trx: Transaction<KernelDatabase>, account: Account) => Promise<T>): Promise<{
33
+ }, inTx?: (account: Account) => Promise<T>): Promise<{
26
34
  account: Account;
27
35
  org?: Org;
28
36
  extra: T | undefined;
29
37
  }>;
30
- /** CLI 用:直接建企业管理员,不检查是否已初始化;登录名已存在 → `account.login_taken`。 */
31
- createEnterpriseAdmin(input: EnterpriseAdminInput): Promise<Account>;
32
- /**
33
- * CLI `admin create --if-none`: create an enterprise admin only when no active one exists. The
34
- * check and the insert run in one transaction under the same advisory lock as {@link complete},
35
- * so concurrent runs (and a concurrent web setup) create exactly one. Returns undefined when an
36
- * active enterprise admin already exists; a taken login still throws `account.login_taken`.
37
- */
38
- createEnterpriseAdminIfNone(input: EnterpriseAdminInput): Promise<Account | undefined>;
39
- private insertEnterpriseAdmin;
40
- }
41
- /** Input of the CLI enterprise admin creation. */
42
- export interface EnterpriseAdminInput {
43
- login: string;
44
- password: string;
45
- displayName: string;
46
- email?: string | undefined;
38
+ private completeIn;
47
39
  }
@@ -1,14 +1,36 @@
1
- import { sql } from "kysely";
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
8
+ return function (target, key) { decorator(target, key, paramIndex); }
9
+ };
10
+ import { Inject, Injectable } from "@nestjs/common";
2
11
  import { ApiError } from "../errors.js";
12
+ import { AccountsService } from "../identity/accounts.js";
3
13
  import { audit } from "../identity/audit.js";
14
+ import { KernelDb } from "../infra/database/kernel-db.js";
15
+ import { TransactionHost } from "../infra/database/transaction-host.js";
16
+ import { Transactional } from "../infra/database/transactional.decorator.js";
17
+ import { OrgsService } from "../orgs/orgs.service.js";
18
+ import { SetupLock } from "./setup-lock.js";
4
19
  const alreadyCompleted = () => new ApiError("setup.already_completed", "Deployment is already set up");
5
- /** 初始化向导与 CLI 建企业管理员。框架无关,由调用方注入依赖。 */
6
- export class SetupService {
20
+ /**
21
+ * The setup wizard. The CLI's enterprise admin creation (`createEnterpriseAdmin`,
22
+ * `createEnterpriseAdminIfNone`) is on `AccountsService`, under the same {@link SetupLock}.
23
+ */
24
+ let SetupService = class SetupService {
7
25
  db;
26
+ txHost;
27
+ setupLock;
8
28
  accounts;
9
29
  orgs;
10
- constructor(db, accounts, orgs) {
30
+ constructor(db, txHost, setupLock, accounts, orgs) {
11
31
  this.db = db;
32
+ this.txHost = txHost;
33
+ this.setupLock = setupLock;
12
34
  this.accounts = accounts;
13
35
  this.orgs = orgs;
14
36
  }
@@ -17,74 +39,52 @@ export class SetupService {
17
39
  return { needsSetup: (await this.accounts.countEnterpriseAdmins()) === 0 };
18
40
  }
19
41
  /**
20
- * 完成初始化:单个事务内先取咨询锁串行化并发的初始化请求,锁内再确认没有活跃企业管理员,
21
- * 然后建企业管理员账号、(给了 `orgName` 时)建组织并以其为 owner。任一步失败整体回滚。
22
- * 给了 `inTx` 时在同一事务的最后调用它(初始化向导用它建会话),结果放在 `extra`;它失败同样整体回滚。
42
+ * Completes the setup in one transaction: {@link SetupLock} serializes concurrent setups, and
43
+ * under it there must still be no active enterprise admin; then creates the enterprise admin
44
+ * and (with `orgName`) an org it owns. Any failure rolls everything back. `inTx` runs last in the
45
+ * same transaction (the wizard creates the session there), its result is `extra`; its failure
46
+ * rolls back too.
23
47
  */
24
48
  async complete(input, inTx) {
25
- // 先做一次廉价的预检查(已初始化的部署不白跑 scrypt),再在 BEGIN 之前算好哈希:
26
- // 不在持有咨询锁的事务里跑 scrypt;锁内仍会复核
49
+ // A cheap pre-check first (a set-up deployment does not run scrypt for nothing), then the hash
50
+ // before BEGIN: no scrypt inside the transaction holding the lock; the check runs again under it
27
51
  if ((await this.accounts.countEnterpriseAdmins()) > 0)
28
52
  throw alreadyCompleted();
29
53
  const passwordHash = await this.accounts.hashNewPassword(input.password);
30
- return this.db.transaction().execute(async (trx) => {
31
- await sql `SELECT pg_advisory_xact_lock(hashtext('capybara.setup'))`.execute(trx);
32
- if ((await this.accounts.countEnterpriseAdmins(trx)) > 0)
33
- throw alreadyCompleted();
34
- const account = await this.accounts.createLocal({
35
- login: input.login,
36
- password: input.password,
37
- displayName: input.displayName,
38
- enterpriseAdmin: true,
39
- }, trx, passwordHash);
40
- const org = input.orgName !== undefined
41
- ? await this.orgs.create({ name: input.orgName }, account, { trx })
42
- : undefined;
43
- await audit(trx, {
44
- actorAccountId: account.id,
45
- action: "deployment.setup_completed",
46
- target: account.id,
47
- ...(org && { orgId: org.id, detail: { orgId: org.id } }),
48
- });
49
- const extra = inTx ? await inTx(trx, account) : undefined;
50
- return { account, ...(org && { org }), extra };
51
- });
52
- }
53
- /** CLI 用:直接建企业管理员,不检查是否已初始化;登录名已存在 → `account.login_taken`。 */
54
- async createEnterpriseAdmin(input) {
55
- const passwordHash = await this.accounts.hashNewPassword(input.password);
56
- return this.db
57
- .transaction()
58
- .execute((trx) => this.insertEnterpriseAdmin(trx, input, passwordHash));
59
- }
60
- /**
61
- * CLI `admin create --if-none`: create an enterprise admin only when no active one exists. The
62
- * check and the insert run in one transaction under the same advisory lock as {@link complete},
63
- * so concurrent runs (and a concurrent web setup) create exactly one. Returns undefined when an
64
- * active enterprise admin already exists; a taken login still throws `account.login_taken`.
65
- */
66
- async createEnterpriseAdminIfNone(input) {
67
- const passwordHash = await this.accounts.hashNewPassword(input.password);
68
- return this.db.transaction().execute(async (trx) => {
69
- await sql `SELECT pg_advisory_xact_lock(hashtext('capybara.setup'))`.execute(trx);
70
- if ((await this.accounts.countEnterpriseAdmins(trx)) > 0)
71
- return undefined;
72
- return this.insertEnterpriseAdmin(trx, input, passwordHash);
73
- });
54
+ return this.completeIn(input, passwordHash, inTx);
74
55
  }
75
- async insertEnterpriseAdmin(trx, input, passwordHash) {
56
+ async completeIn(input, passwordHash, inTx) {
57
+ await this.setupLock.lock();
58
+ if ((await this.accounts.countEnterpriseAdmins()) > 0)
59
+ throw alreadyCompleted();
76
60
  const account = await this.accounts.createLocal({
77
61
  login: input.login,
78
62
  password: input.password,
79
63
  displayName: input.displayName,
80
64
  enterpriseAdmin: true,
81
- ...(input.email !== undefined && { email: input.email }),
82
- }, trx, passwordHash);
83
- await audit(trx, {
84
- action: "account.created",
65
+ }, passwordHash);
66
+ const org = input.orgName !== undefined
67
+ ? await this.orgs.create({ name: input.orgName }, account)
68
+ : undefined;
69
+ await audit(this.db.db, {
70
+ actorAccountId: account.id,
71
+ action: "deployment.setup_completed",
85
72
  target: account.id,
86
- detail: { enterpriseAdmin: true, via: "cli" },
73
+ ...(org && { orgId: org.id, detail: { orgId: org.id } }),
87
74
  });
88
- return account;
75
+ const extra = inTx ? await inTx(account) : undefined;
76
+ return { account, ...(org && { org }), extra };
89
77
  }
90
- }
78
+ };
79
+ __decorate([
80
+ Transactional()
81
+ ], SetupService.prototype, "completeIn", null);
82
+ SetupService = __decorate([
83
+ Injectable(),
84
+ __param(0, Inject(KernelDb)),
85
+ __param(1, Inject(TransactionHost)),
86
+ __param(2, Inject(SetupLock)),
87
+ __param(3, Inject(AccountsService)),
88
+ __param(4, Inject(OrgsService))
89
+ ], SetupService);
90
+ export { SetupService };
@@ -0,0 +1,53 @@
1
+ import { type ExpressionBuilder } from "kysely";
2
+ import type { KernelDatabase, KernelSchemaDb } from "../db/kernel-schema.js";
3
+ import { KernelDb } from "../infra/database/kernel-db.js";
4
+ import { type AgentDefinition } from "./definition.js";
5
+ export declare const AGENT_VISIBILITIES: readonly ["private", "org", "members"];
6
+ export type AgentVisibility = (typeof AGENT_VISIBILITIES)[number];
7
+ /** 对外的 agent 视图:当前版本的定义 + 元数据;`memberIds` 只在 visibility='members' 时为数组。 */
8
+ export interface AgentView {
9
+ id: string;
10
+ orgId: string;
11
+ ownerAccountId: string;
12
+ visibility: AgentVisibility;
13
+ currentVersion: number;
14
+ definition: AgentDefinition;
15
+ memberIds: string[] | null;
16
+ /** 负责人离职后被转给组织所有者、等待管理员重新指派。 */
17
+ needsReassignment: boolean;
18
+ createdAt: Date;
19
+ updatedAt: Date;
20
+ }
21
+ /**
22
+ * 可见性判定(`canUse`)的 SQL 条件:agent 未删除、所属组织未删除,且
23
+ * - viewer 为账号:仍是该组织成员(含访客),并且是负责人 / visibility='org' / 在 agent_members 名单中;
24
+ * - viewer 为 null(该组织的服务令牌):只认 visibility='org'。
25
+ */
26
+ export declare function visibleTo(viewerAccountId: string | null): (eb: ExpressionBuilder<KernelDatabase, "agents">) => import("kysely").ExpressionWrapper<KernelDatabase, "agents", import("kysely").SqlBool>;
27
+ /**
28
+ * Whether the live agent `agentId` is visible to `accountId` under the normal visibility rule
29
+ * ({@link visibleTo}: owner, `visibility = 'org'`, or listed in `agent_members`, while a member of
30
+ * the live org). Deleted agents are never visible.
31
+ */
32
+ export declare function isAgentVisibleTo(db: KernelSchemaDb, agentId: string, accountId: string): Promise<boolean>;
33
+ /**
34
+ * Reads agents for a viewer (the visibility rule {@link visibleTo}): the part of `AgentsService`
35
+ * the conversations, the skill invoker and the attachments read, with no dependency on the
36
+ * services that write agents (it breaks the agents ↔ skills module cycle, spec §3 (a)). Reads go
37
+ * through `KernelDb`, so inside a transaction they see its writes.
38
+ */
39
+ export declare class AgentLookup {
40
+ private readonly db;
41
+ constructor(db: KernelDb);
42
+ /** 取对 viewer 可见的 agent;`viewerAccountId = null` 表示该组织的服务令牌。不可见 → `agent.not_found`。 */
43
+ get(orgId: string, agentId: string, viewerAccountId: string | null): Promise<AgentView>;
44
+ /** 组织内对 viewer 可见的全部 agent(按创建时间)。 */
45
+ listVisible(orgId: string, viewerAccountId: string | null): Promise<AgentView[]>;
46
+ /** One agent's view (no visibility check: the caller did it); missing → `agent.not_found`. */
47
+ view(agentId: string): Promise<AgentView>;
48
+ /** 按给定 id 顺序组装视图(调用方已完成可见性判定)。 */
49
+ views(ids: string[]): Promise<AgentView[]>;
50
+ }
51
+ /** The one {@link AgentLookup} (database only). */
52
+ export declare class AgentLookupModule {
53
+ }
@@ -0,0 +1,179 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
8
+ return function (target, key) { decorator(target, key, paramIndex); }
9
+ };
10
+ import { Inject, Injectable, Module } from "@nestjs/common";
11
+ import { sql } from "kysely";
12
+ import { ApiError } from "../errors.js";
13
+ import { KernelDb } from "../infra/database/kernel-db.js";
14
+ import { normalizeStoredDefinition } from "./definition.js";
15
+ export const AGENT_VISIBILITIES = ["private", "org", "members"];
16
+ const notFound = () => new ApiError("agent.not_found", "Agent not found");
17
+ /**
18
+ * 可见性判定(`canUse`)的 SQL 条件:agent 未删除、所属组织未删除,且
19
+ * - viewer 为账号:仍是该组织成员(含访客),并且是负责人 / visibility='org' / 在 agent_members 名单中;
20
+ * - viewer 为 null(该组织的服务令牌):只认 visibility='org'。
21
+ */
22
+ export function visibleTo(viewerAccountId) {
23
+ return (eb) => {
24
+ const orgLive = eb.exists(eb
25
+ .selectFrom("orgs")
26
+ .select(sql `1`.as("one"))
27
+ .whereRef("orgs.id", "=", "agents.org_id")
28
+ .where("orgs.deleted_at", "is", null));
29
+ if (viewerAccountId === null) {
30
+ return eb.and([orgLive, eb("agents.visibility", "=", "org")]);
31
+ }
32
+ return eb.and([
33
+ orgLive,
34
+ eb.exists(eb
35
+ .selectFrom("memberships")
36
+ .select(sql `1`.as("one"))
37
+ .whereRef("memberships.org_id", "=", "agents.org_id")
38
+ .where("memberships.account_id", "=", viewerAccountId)),
39
+ eb.or([
40
+ eb("agents.owner_account_id", "=", viewerAccountId),
41
+ eb("agents.visibility", "=", "org"),
42
+ eb.and([
43
+ eb("agents.visibility", "=", "members"),
44
+ eb.exists(eb
45
+ .selectFrom("agent_members")
46
+ .select(sql `1`.as("one"))
47
+ .whereRef("agent_members.agent_id", "=", "agents.id")
48
+ .where("agent_members.account_id", "=", viewerAccountId)),
49
+ ]),
50
+ ]),
51
+ ]);
52
+ };
53
+ }
54
+ /**
55
+ * Whether the live agent `agentId` is visible to `accountId` under the normal visibility rule
56
+ * ({@link visibleTo}: owner, `visibility = 'org'`, or listed in `agent_members`, while a member of
57
+ * the live org). Deleted agents are never visible.
58
+ */
59
+ export async function isAgentVisibleTo(db, agentId, accountId) {
60
+ const row = await db
61
+ .selectFrom("agents")
62
+ .select("id")
63
+ .where("id", "=", agentId)
64
+ .where("deleted_at", "is", null)
65
+ .where(visibleTo(accountId))
66
+ .executeTakeFirst();
67
+ return row !== undefined;
68
+ }
69
+ /**
70
+ * Reads agents for a viewer (the visibility rule {@link visibleTo}): the part of `AgentsService`
71
+ * the conversations, the skill invoker and the attachments read, with no dependency on the
72
+ * services that write agents (it breaks the agents ↔ skills module cycle, spec §3 (a)). Reads go
73
+ * through `KernelDb`, so inside a transaction they see its writes.
74
+ */
75
+ let AgentLookup = class AgentLookup {
76
+ db;
77
+ constructor(db) {
78
+ this.db = db;
79
+ }
80
+ /** 取对 viewer 可见的 agent;`viewerAccountId = null` 表示该组织的服务令牌。不可见 → `agent.not_found`。 */
81
+ async get(orgId, agentId, viewerAccountId) {
82
+ const row = await this.db
83
+ .selectFrom("agents")
84
+ .select("id")
85
+ .where("id", "=", agentId)
86
+ .where("org_id", "=", orgId)
87
+ .where("deleted_at", "is", null)
88
+ .where(visibleTo(viewerAccountId))
89
+ .executeTakeFirst();
90
+ if (!row)
91
+ throw notFound();
92
+ return this.view(agentId);
93
+ }
94
+ /** 组织内对 viewer 可见的全部 agent(按创建时间)。 */
95
+ async listVisible(orgId, viewerAccountId) {
96
+ const rows = await this.db
97
+ .selectFrom("agents")
98
+ .select("id")
99
+ .where("org_id", "=", orgId)
100
+ .where("deleted_at", "is", null)
101
+ .where(visibleTo(viewerAccountId))
102
+ .orderBy("created_at")
103
+ .orderBy("id")
104
+ .execute();
105
+ return this.views(rows.map((r) => r.id));
106
+ }
107
+ /** One agent's view (no visibility check: the caller did it); missing → `agent.not_found`. */
108
+ async view(agentId) {
109
+ const views = await this.views([agentId]);
110
+ const v = views[0];
111
+ if (!v)
112
+ throw notFound();
113
+ return v;
114
+ }
115
+ /** 按给定 id 顺序组装视图(调用方已完成可见性判定)。 */
116
+ async views(ids) {
117
+ if (ids.length === 0)
118
+ return [];
119
+ const db = this.db;
120
+ const rows = await db
121
+ .selectFrom("agents")
122
+ .innerJoin("agent_versions", (j) => j
123
+ .onRef("agent_versions.agent_id", "=", "agents.id")
124
+ .onRef("agent_versions.version", "=", "agents.current_version"))
125
+ .select([
126
+ "agents.id",
127
+ "agents.org_id",
128
+ "agents.owner_account_id",
129
+ "agents.visibility",
130
+ "agents.current_version",
131
+ "agents.needs_reassignment",
132
+ "agents.created_at",
133
+ "agents.updated_at",
134
+ "agent_versions.definition",
135
+ ])
136
+ .where("agents.id", "in", ids)
137
+ .execute();
138
+ const memberRows = await db
139
+ .selectFrom("agent_members")
140
+ .select(["agent_id", "account_id"])
141
+ .where("agent_id", "in", ids)
142
+ .orderBy("account_id")
143
+ .execute();
144
+ const byId = new Map(rows.map((r) => [r.id, r]));
145
+ return ids.flatMap((id) => {
146
+ const r = byId.get(id);
147
+ if (!r)
148
+ return [];
149
+ return [
150
+ {
151
+ id: r.id,
152
+ orgId: r.org_id,
153
+ ownerAccountId: r.owner_account_id,
154
+ visibility: r.visibility,
155
+ currentVersion: r.current_version,
156
+ definition: normalizeStoredDefinition(r.definition),
157
+ memberIds: r.visibility === "members"
158
+ ? memberRows.filter((m) => m.agent_id === id).map((m) => m.account_id)
159
+ : null,
160
+ needsReassignment: r.needs_reassignment,
161
+ createdAt: r.created_at,
162
+ updatedAt: r.updated_at,
163
+ },
164
+ ];
165
+ });
166
+ }
167
+ };
168
+ AgentLookup = __decorate([
169
+ Injectable(),
170
+ __param(0, Inject(KernelDb))
171
+ ], AgentLookup);
172
+ export { AgentLookup };
173
+ /** The one {@link AgentLookup} (database only). */
174
+ let AgentLookupModule = class AgentLookupModule {
175
+ };
176
+ AgentLookupModule = __decorate([
177
+ Module({ providers: [AgentLookup], exports: [AgentLookup] })
178
+ ], AgentLookupModule);
179
+ export { AgentLookupModule };
@@ -1,7 +1,7 @@
1
1
  import { z } from "zod";
2
2
  import { type Principal } from "../identity/principal.js";
3
3
  import { type OrgContext } from "../orgs/org.guard.js";
4
- import { type AgentsService, type AgentVersionSummary, type AgentView, type AgentWarning } from "./agents.service.js";
4
+ import { AgentsService, type AgentVersionSummary, type AgentView, type AgentWarning } from "./agents.service.js";
5
5
  declare const OwnerBody: z.ZodObject<{
6
6
  accountId: z.ZodString;
7
7
  }, z.core.$strict>;
@@ -7,13 +7,13 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
7
7
  var __param = (this && this.__param) || function (paramIndex, decorator) {
8
8
  return function (target, key) { decorator(target, key, paramIndex); }
9
9
  };
10
- import { Body, Controller, Delete, Get, HttpCode, Inject, Param, Patch, Post, } from "@nestjs/common";
10
+ import { Controller, Delete, Get, HttpCode, Inject, Param, Patch, Post } from "@nestjs/common";
11
11
  import { z } from "zod";
12
- import { AGENTS } from "../http/tokens.js";
13
- import { ZodPipe } from "../http/zod.pipe.js";
14
12
  import { CurrentPrincipal, patTokenId, requireUser, } from "../identity/principal.js";
13
+ import { createZodDto } from "../infra/validation/create-zod-dto.js";
14
+ import { ZBody } from "../infra/validation/zod-params.js";
15
15
  import { CurrentOrg, OrgAction } from "../orgs/org.guard.js";
16
- import { AGENT_VISIBILITIES, } from "./agents.service.js";
16
+ import { AGENT_VISIBILITIES, AgentsService, } from "./agents.service.js";
17
17
  import { AgentDefinitionSchema, AgentToolRef, DEFAULT_AGENT_TOOLS } from "./definition.js";
18
18
  const MemberIds = z.array(z.string().min(1).max(100)).max(1000);
19
19
  const OwnerBody = z.object({ accountId: z.string().min(1).max(100) }).strict();
@@ -42,6 +42,12 @@ const UpdateBody = z
42
42
  .strict();
43
43
  /** 服务令牌没有账号:以 null 作为 viewer,只看到 visibility='org' 的 agent。 */
44
44
  const viewerOf = (p) => (p.kind === "user" ? p.account.id : null);
45
+ class AgentCreateBodyDto extends createZodDto(CreateBody, "AgentCreateBody") {
46
+ }
47
+ class AgentUpdateBodyDto extends createZodDto(UpdateBody, "AgentUpdateBody") {
48
+ }
49
+ class AgentOwnerBodyDto extends createZodDto(OwnerBody, "AgentOwnerBody") {
50
+ }
45
51
  /**
46
52
  * Agent 定义(`/api/v1/orgs/:orgId/agents`)。读用 `agents.use`(访客与服务令牌可用),
47
53
  * 写用 `agents.create`(member 以上、HUMAN_ONLY),修改 / 删除的负责人或管理员判定在服务的组织行锁内完成。
@@ -90,7 +96,7 @@ __decorate([
90
96
  OrgAction("agents.create"),
91
97
  __param(0, CurrentPrincipal()),
92
98
  __param(1, CurrentOrg()),
93
- __param(2, Body(new ZodPipe(CreateBody)))
99
+ __param(2, ZBody(AgentCreateBodyDto))
94
100
  ], AgentsController.prototype, "create", null);
95
101
  __decorate([
96
102
  Get(),
@@ -111,7 +117,7 @@ __decorate([
111
117
  __param(0, CurrentPrincipal()),
112
118
  __param(1, CurrentOrg()),
113
119
  __param(2, Param("agentId")),
114
- __param(3, Body(new ZodPipe(UpdateBody)))
120
+ __param(3, ZBody(AgentUpdateBodyDto))
115
121
  ], AgentsController.prototype, "update", null);
116
122
  __decorate([
117
123
  Delete(":agentId"),
@@ -128,7 +134,7 @@ __decorate([
128
134
  __param(0, CurrentPrincipal()),
129
135
  __param(1, CurrentOrg()),
130
136
  __param(2, Param("agentId")),
131
- __param(3, Body(new ZodPipe(OwnerBody)))
137
+ __param(3, ZBody(AgentOwnerBodyDto))
132
138
  ], AgentsController.prototype, "reassign", null);
133
139
  __decorate([
134
140
  Get(":agentId/versions"),
@@ -139,6 +145,6 @@ __decorate([
139
145
  ], AgentsController.prototype, "versions", null);
140
146
  AgentsController = __decorate([
141
147
  Controller("api/v1/orgs/:orgId/agents"),
142
- __param(0, Inject(AGENTS))
148
+ __param(0, Inject(AgentsService))
143
149
  ], AgentsController);
144
150
  export { AgentsController };
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Agents: the one {@link AgentsService} (definitions, versions, visibility; writes under the org
3
+ * row lock) and the plugin agent templates. Reads for a viewer are {@link AgentLookupModule}'s
4
+ * (re-exported), which the conversations and the skill invoker use without this module.
5
+ */
6
+ export declare class AgentsModule {
7
+ }