@capybara-hq/kernel 0.1.0-rc.6 → 0.1.0-rc.8

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 (333) hide show
  1. package/bootstrap.json +27 -3
  2. package/dist/admin/admin.controller.d.ts +8 -72
  3. package/dist/admin/admin.controller.js +21 -46
  4. package/dist/admin/admin.schemas.d.ts +57 -0
  5. package/dist/admin/admin.schemas.js +50 -0
  6. package/dist/admin/extensions.controller.d.ts +10 -0
  7. package/dist/admin/extensions.controller.js +18 -0
  8. package/dist/admin/extensions.schemas.d.ts +7 -0
  9. package/dist/admin/extensions.schemas.js +10 -0
  10. package/dist/admin/limit-defaults.d.ts +20 -0
  11. package/dist/admin/limit-defaults.js +10 -0
  12. package/dist/agents/agent-profile.service.d.ts +7 -5
  13. package/dist/agents/agent-profile.service.js +14 -9
  14. package/dist/agents/agents.controller.d.ts +7 -287
  15. package/dist/agents/agents.controller.js +7 -67
  16. package/dist/agents/agents.schemas.d.ts +389 -0
  17. package/dist/agents/agents.schemas.js +126 -0
  18. package/dist/agents/agents.service.d.ts +13 -5
  19. package/dist/agents/agents.service.js +67 -13
  20. package/dist/agents/definition.d.ts +47 -19
  21. package/dist/agents/definition.js +119 -38
  22. package/dist/agents/from-template.d.ts +2 -2
  23. package/dist/agents/from-template.js +76 -45
  24. package/dist/agents/from-template.service.d.ts +12 -0
  25. package/dist/agents/from-template.service.js +20 -3
  26. package/dist/agents/models.controller.d.ts +1 -2
  27. package/dist/agents/models.controller.js +1 -1
  28. package/dist/agents/org-templates.d.ts +13 -3
  29. package/dist/agents/org-templates.js +69 -28
  30. package/dist/agents/pending-connector-requests.d.ts +2 -0
  31. package/dist/agents/pending-connector-requests.js +1 -1
  32. package/dist/agents/pending-connectors.controller.d.ts +1 -1
  33. package/dist/agents/pending-connectors.controller.js +2 -2
  34. package/dist/agents/pending-connectors.service.d.ts +2 -2
  35. package/dist/agents/pending-connectors.service.js +19 -19
  36. package/dist/agents/profile.d.ts +18 -0
  37. package/dist/agents/profile.js +5 -1
  38. package/dist/agents/templates.controller.d.ts +8 -17
  39. package/dist/agents/templates.controller.js +13 -31
  40. package/dist/agents/templates.schemas.d.ts +20 -0
  41. package/dist/agents/templates.schemas.js +45 -0
  42. package/dist/background/background.controller.js +3 -2
  43. package/dist/background/background.schemas.d.ts +10 -0
  44. package/dist/background/background.schemas.js +16 -0
  45. package/dist/background/tasks.service.d.ts +1 -1
  46. package/dist/background/tasks.service.js +7 -2
  47. package/dist/catalog/admin-catalog.controller.d.ts +4 -57
  48. package/dist/catalog/admin-catalog.controller.js +8 -45
  49. package/dist/catalog/admin-catalog.schemas.d.ts +72 -0
  50. package/dist/catalog/admin-catalog.schemas.js +92 -0
  51. package/dist/catalog/catalog-content.d.ts +12 -2
  52. package/dist/catalog/catalog-scope.service.js +8 -2
  53. package/dist/catalog/catalog.service.d.ts +2 -0
  54. package/dist/catalog/catalog.service.js +3 -0
  55. package/dist/catalog/component-scope.controller.d.ts +3 -65
  56. package/dist/catalog/component-scope.controller.js +3 -56
  57. package/dist/catalog/component-scope.schemas.d.ts +114 -0
  58. package/dist/catalog/component-scope.schemas.js +97 -0
  59. package/dist/catalog/component-scope.service.d.ts +28 -4
  60. package/dist/catalog/component-scope.service.js +55 -3
  61. package/dist/catalog/component-state.d.ts +9 -2
  62. package/dist/catalog/component-state.js +22 -13
  63. package/dist/catalog/marketplaces.controller.d.ts +5 -35
  64. package/dist/catalog/marketplaces.controller.js +6 -34
  65. package/dist/catalog/marketplaces.schemas.d.ts +48 -0
  66. package/dist/catalog/marketplaces.schemas.js +53 -0
  67. package/dist/catalog/marketplaces.service.d.ts +15 -1
  68. package/dist/catalog/marketplaces.service.js +22 -1
  69. package/dist/catalog/org-catalog.controller.d.ts +6 -62
  70. package/dist/catalog/org-catalog.controller.js +12 -66
  71. package/dist/catalog/org-catalog.schemas.d.ts +79 -0
  72. package/dist/catalog/org-catalog.schemas.js +82 -0
  73. package/dist/catalog/org-catalog.service.d.ts +9 -2
  74. package/dist/catalog/org-catalog.service.js +38 -5
  75. package/dist/catalog/org-extension.controller.d.ts +1 -12
  76. package/dist/catalog/org-extension.controller.js +1 -10
  77. package/dist/catalog/org-extension.schemas.d.ts +15 -0
  78. package/dist/catalog/org-extension.schemas.js +22 -0
  79. package/dist/catalog/org-plugin-uploads.controller.d.ts +2 -19
  80. package/dist/catalog/org-plugin-uploads.controller.js +15 -28
  81. package/dist/catalog/org-plugin-uploads.schemas.d.ts +20 -0
  82. package/dist/catalog/org-plugin-uploads.schemas.js +32 -0
  83. package/dist/catalog/owned-items.d.ts +6 -2
  84. package/dist/catalog/owned-items.js +16 -4
  85. package/dist/catalog/platform-components.d.ts +2 -0
  86. package/dist/catalog/platform-components.js +2 -0
  87. package/dist/catalog/plugin-import.js +1 -0
  88. package/dist/catalog/plugin-install.js +1 -1
  89. package/dist/catalog/requests.service.d.ts +2 -1
  90. package/dist/catalog/requests.service.js +6 -2
  91. package/dist/channels/channels.schemas.d.ts +33 -0
  92. package/dist/channels/channels.schemas.js +34 -0
  93. package/dist/channels/connections.controller.d.ts +2 -29
  94. package/dist/channels/connections.controller.js +1 -23
  95. package/dist/channels/connections.service.d.ts +8 -2
  96. package/dist/channels/connections.service.js +23 -5
  97. package/dist/channels/inbound.js +4 -0
  98. package/dist/conversations/conversations.controller.d.ts +16 -37
  99. package/dist/conversations/conversations.controller.js +16 -56
  100. package/dist/conversations/conversations.schemas.d.ts +52 -0
  101. package/dist/conversations/conversations.schemas.js +79 -0
  102. package/dist/conversations/conversations.service.d.ts +9 -1
  103. package/dist/conversations/conversations.service.js +23 -18
  104. package/dist/conversations/events.d.ts +80 -6
  105. package/dist/conversations/events.js +60 -5
  106. package/dist/conversations/message-context.d.ts +28 -0
  107. package/dist/conversations/message-context.js +56 -0
  108. package/dist/conversations/queue.d.ts +2 -1
  109. package/dist/conversations/queue.js +11 -2
  110. package/dist/db/kernel-schema.d.ts +20 -0
  111. package/dist/environments/environments.schemas.d.ts +3 -0
  112. package/dist/environments/environments.schemas.js +14 -0
  113. package/dist/environments/environments.service.d.ts +16 -4
  114. package/dist/environments/environments.service.js +58 -13
  115. package/dist/errors.d.ts +3 -0
  116. package/dist/errors.js +3 -0
  117. package/dist/evals/evals.schemas.d.ts +110 -0
  118. package/dist/evals/evals.schemas.js +107 -0
  119. package/dist/evals/reconstruct.js +18 -11
  120. package/dist/evals/recorded-tools.d.ts +2 -1
  121. package/dist/evals/recorded-tools.js +11 -3
  122. package/dist/evals/run-replay.d.ts +8 -1
  123. package/dist/evals/run-replay.js +13 -0
  124. package/dist/evals/runs.controller.d.ts +2 -57
  125. package/dist/evals/runs.controller.js +1 -42
  126. package/dist/evals/runs.service.d.ts +6 -6
  127. package/dist/evals/runs.service.js +32 -18
  128. package/dist/evals/sets.controller.d.ts +2 -28
  129. package/dist/evals/sets.controller.js +1 -31
  130. package/dist/evals/sets.service.d.ts +7 -7
  131. package/dist/evals/sets.service.js +23 -17
  132. package/dist/evals/snapshot.d.ts +3 -2
  133. package/dist/evals/snapshot.js +17 -4
  134. package/dist/extensions/admin-ops.d.ts +5 -3
  135. package/dist/extensions/admin-ops.js +17 -12
  136. package/dist/extensions/deployment-config.d.ts +16 -1
  137. package/dist/extensions/deployment-config.js +83 -0
  138. package/dist/extensions/extensions.module.js +3 -0
  139. package/dist/extensions/host.d.ts +33 -2
  140. package/dist/extensions/host.js +107 -1
  141. package/dist/extensions/installs.d.ts +5 -0
  142. package/dist/extensions/installs.js +12 -0
  143. package/dist/extensions/org-config.d.ts +17 -2
  144. package/dist/extensions/org-config.js +23 -4
  145. package/dist/extensions/point-defaults.controller.d.ts +2 -8
  146. package/dist/extensions/point-defaults.controller.js +1 -3
  147. package/dist/extensions/point-defaults.d.ts +3 -1
  148. package/dist/extensions/point-defaults.js +4 -2
  149. package/dist/extensions/point-defaults.schemas.d.ts +9 -0
  150. package/dist/extensions/point-defaults.schemas.js +14 -0
  151. package/dist/extensions/unavailable.d.ts +49 -0
  152. package/dist/extensions/unavailable.js +113 -0
  153. package/dist/files/previewers.controller.js +2 -3
  154. package/dist/files/previewers.d.ts +1 -1
  155. package/dist/files/previewers.js +4 -4
  156. package/dist/files/previewers.schemas.d.ts +10 -0
  157. package/dist/files/previewers.schemas.js +9 -0
  158. package/dist/http/api.module.js +2 -0
  159. package/dist/identity/accounts.d.ts +43 -4
  160. package/dist/identity/accounts.js +74 -6
  161. package/dist/identity/auth.guard.js +10 -1
  162. package/dist/identity/cookies.d.ts +6 -0
  163. package/dist/identity/cookies.js +14 -0
  164. package/dist/identity/identity.module.js +3 -0
  165. package/dist/identity/initial-passwords.controller.d.ts +22 -0
  166. package/dist/identity/initial-passwords.controller.js +49 -0
  167. package/dist/identity/initial-passwords.d.ts +61 -0
  168. package/dist/identity/initial-passwords.job.d.ts +16 -0
  169. package/dist/identity/initial-passwords.job.js +46 -0
  170. package/dist/identity/initial-passwords.js +159 -0
  171. package/dist/identity/me.controller.d.ts +12 -0
  172. package/dist/identity/me.controller.js +31 -1
  173. package/dist/identity/me.schemas.d.ts +14 -0
  174. package/dist/identity/me.schemas.js +17 -0
  175. package/dist/identity/principal.d.ts +8 -0
  176. package/dist/identity/principal.js +8 -0
  177. package/dist/identity/settings.d.ts +3 -1
  178. package/dist/identity/settings.js +6 -4
  179. package/dist/inbox/inbox.schemas.d.ts +8 -0
  180. package/dist/inbox/inbox.schemas.js +11 -0
  181. package/dist/inbox/platform-inbox.controller.d.ts +1 -1
  182. package/dist/inbox/platform-inbox.controller.js +2 -2
  183. package/dist/index.d.ts +4 -0
  184. package/dist/index.js +6 -0
  185. package/dist/lifecycle/kernel-lifecycle.js +4 -0
  186. package/dist/models/enablement.d.ts +2 -0
  187. package/dist/models/enablement.js +1 -0
  188. package/dist/models/org-models.schemas.d.ts +8 -0
  189. package/dist/models/org-models.schemas.js +22 -0
  190. package/dist/models/prices.d.ts +3 -1
  191. package/dist/models/prices.js +7 -5
  192. package/dist/models/purposes.d.ts +12 -2
  193. package/dist/models/purposes.js +22 -8
  194. package/dist/orgs/orgs.controller.d.ts +2 -5
  195. package/dist/orgs/orgs.controller.js +3 -6
  196. package/dist/orgs/orgs.schemas.d.ts +8 -0
  197. package/dist/orgs/orgs.schemas.js +16 -0
  198. package/dist/orgs/orgs.service.d.ts +3 -1
  199. package/dist/orgs/orgs.service.js +6 -4
  200. package/dist/orgs/settings.service.d.ts +9 -1
  201. package/dist/orgs/settings.service.js +20 -5
  202. package/dist/overrides.d.ts +4 -0
  203. package/dist/overrides.js +2 -0
  204. package/dist/platform/errors.d.ts +21 -4
  205. package/dist/platform/errors.js +45 -6
  206. package/dist/platform/exclusions.d.ts +2 -3
  207. package/dist/platform/exclusions.js +58 -849
  208. package/dist/platform/method.js +1 -1
  209. package/dist/platform/operation.d.ts +82 -5
  210. package/dist/platform/operation.js +63 -8
  211. package/dist/platform/ops/accounts.ops.d.ts +32 -0
  212. package/dist/platform/ops/accounts.ops.js +291 -0
  213. package/dist/platform/ops/admin.ops.d.ts +36 -0
  214. package/dist/platform/ops/admin.ops.js +389 -0
  215. package/dist/platform/ops/agent-skills.ops.d.ts +24 -0
  216. package/dist/platform/ops/agent-skills.ops.js +226 -0
  217. package/dist/platform/ops/agent-templates.ops.d.ts +4 -1
  218. package/dist/platform/ops/agent-templates.ops.js +194 -14
  219. package/dist/platform/ops/agents.ops.d.ts +19 -1
  220. package/dist/platform/ops/agents.ops.js +481 -58
  221. package/dist/platform/ops/approvals.ops.d.ts +30 -0
  222. package/dist/platform/ops/approvals.ops.js +116 -0
  223. package/dist/platform/ops/background.ops.d.ts +14 -0
  224. package/dist/platform/ops/background.ops.js +134 -0
  225. package/dist/platform/ops/catalog-admin.ops.d.ts +74 -0
  226. package/dist/platform/ops/catalog-admin.ops.js +587 -0
  227. package/dist/platform/ops/channels.ops.d.ts +16 -0
  228. package/dist/platform/ops/channels.ops.js +195 -0
  229. package/dist/platform/ops/components.ops.d.ts +46 -0
  230. package/dist/platform/ops/components.ops.js +853 -0
  231. package/dist/platform/ops/connectors.ops.d.ts +4 -2
  232. package/dist/platform/ops/connectors.ops.js +68 -6
  233. package/dist/platform/ops/conversations.ops.d.ts +30 -0
  234. package/dist/platform/ops/conversations.ops.js +470 -0
  235. package/dist/platform/ops/environments.ops.d.ts +26 -0
  236. package/dist/platform/ops/environments.ops.js +289 -0
  237. package/dist/platform/ops/errors.d.ts +10 -5
  238. package/dist/platform/ops/errors.js +19 -11
  239. package/dist/platform/ops/evals.ops.d.ts +28 -0
  240. package/dist/platform/ops/evals.ops.js +783 -0
  241. package/dist/platform/ops/extensions-admin.ops.d.ts +25 -0
  242. package/dist/platform/ops/extensions-admin.ops.js +344 -0
  243. package/dist/platform/ops/extensions.ops.d.ts +7 -1
  244. package/dist/platform/ops/extensions.ops.js +248 -17
  245. package/dist/platform/ops/inbox.ops.d.ts +25 -0
  246. package/dist/platform/ops/inbox.ops.js +378 -0
  247. package/dist/platform/ops/marketplaces.ops.d.ts +7 -1
  248. package/dist/platform/ops/marketplaces.ops.js +326 -17
  249. package/dist/platform/ops/models.ops.d.ts +25 -0
  250. package/dist/platform/ops/models.ops.js +232 -0
  251. package/dist/platform/ops/org-plugins.ops.d.ts +29 -0
  252. package/dist/platform/ops/org-plugins.ops.js +329 -0
  253. package/dist/platform/ops/org-settings.ops.d.ts +16 -0
  254. package/dist/platform/ops/org-settings.ops.js +102 -0
  255. package/dist/platform/ops/orgs.ops.d.ts +28 -0
  256. package/dist/platform/ops/orgs.ops.js +295 -0
  257. package/dist/platform/ops/other-orgs.d.ts +20 -0
  258. package/dist/platform/ops/other-orgs.js +72 -0
  259. package/dist/platform/ops/platform.ops.d.ts +11 -6
  260. package/dist/platform/ops/platform.ops.js +73 -27
  261. package/dist/platform/ops/plugins.ops.d.ts +10 -8
  262. package/dist/platform/ops/plugins.ops.js +176 -77
  263. package/dist/platform/ops/previewers.ops.d.ts +14 -0
  264. package/dist/platform/ops/previewers.ops.js +109 -0
  265. package/dist/platform/ops/requests.ops.js +57 -19
  266. package/dist/platform/ops/skills.ops.d.ts +5 -1
  267. package/dist/platform/ops/skills.ops.js +129 -11
  268. package/dist/platform/ops/unavailable.d.ts +23 -0
  269. package/dist/platform/ops/unavailable.js +111 -0
  270. package/dist/platform/parity.d.ts +33 -0
  271. package/dist/platform/parity.js +272 -0
  272. package/dist/platform/platform-ops.module.d.ts +32 -0
  273. package/dist/platform/platform-ops.module.js +78 -11
  274. package/dist/platform/route-schemas.d.ts +18 -0
  275. package/dist/platform/route-schemas.js +63 -0
  276. package/dist/roles/worker.module.js +2 -0
  277. package/dist/runtime/context/build.d.ts +2 -0
  278. package/dist/runtime/context/build.js +28 -2
  279. package/dist/runtime/context/compaction.js +10 -1
  280. package/dist/runtime/context/run-context.d.ts +65 -0
  281. package/dist/runtime/context/run-context.js +215 -0
  282. package/dist/runtime/model-call.js +2 -1
  283. package/dist/runtime/providers.js +8 -1
  284. package/dist/runtime/run-context.service.d.ts +65 -0
  285. package/dist/runtime/run-context.service.js +220 -0
  286. package/dist/runtime/run-worker.d.ts +5 -0
  287. package/dist/runtime/run-worker.js +31 -6
  288. package/dist/runtime/runtime.module.js +2 -0
  289. package/dist/runtime/subagents/definition.d.ts +15 -15
  290. package/dist/runtime/subagents/definition.js +46 -115
  291. package/dist/skills/changes.controller.js +2 -1
  292. package/dist/skills/changes.service.d.ts +1 -1
  293. package/dist/skills/changes.service.js +4 -4
  294. package/dist/skills/invocable.controller.d.ts +1 -1
  295. package/dist/skills/invocable.controller.js +2 -2
  296. package/dist/skills/invoke.d.ts +2 -2
  297. package/dist/skills/invoke.js +8 -1
  298. package/dist/skills/skills.controller.d.ts +4 -13
  299. package/dist/skills/skills.controller.js +8 -24
  300. package/dist/skills/skills.schemas.d.ts +48 -0
  301. package/dist/skills/skills.schemas.js +61 -0
  302. package/dist/skills/skills.service.d.ts +11 -1
  303. package/dist/skills/skills.service.js +37 -14
  304. package/dist/time-zone.d.ts +5 -0
  305. package/dist/time-zone.js +19 -0
  306. package/dist/tools/approvals.controller.js +2 -3
  307. package/dist/tools/approvals.schemas.d.ts +21 -0
  308. package/dist/tools/approvals.schemas.js +15 -0
  309. package/dist/tools/builtin-names.d.ts +10 -8
  310. package/dist/tools/builtin-names.js +16 -11
  311. package/dist/tools/builtins/builtin-tools.d.ts +3 -1
  312. package/dist/tools/builtins/builtin-tools.js +15 -3
  313. package/dist/tools/builtins/current-time.d.ts +26 -0
  314. package/dist/tools/builtins/current-time.js +99 -0
  315. package/dist/tools/builtins/platform.d.ts +19 -2
  316. package/dist/tools/builtins/platform.js +105 -16
  317. package/dist/tools/connectors.controller.d.ts +1 -2
  318. package/dist/tools/connectors.controller.js +1 -4
  319. package/dist/tools/connectors.schemas.d.ts +12 -0
  320. package/dist/tools/connectors.schemas.js +19 -0
  321. package/dist/tools/connectors.service.d.ts +5 -2
  322. package/dist/tools/connectors.service.js +7 -5
  323. package/dist/tools/org-tool-switches.d.ts +16 -2
  324. package/dist/tools/org-tool-switches.js +26 -9
  325. package/dist/tools/pipeline.js +3 -1
  326. package/dist/tools/registry.d.ts +48 -51
  327. package/dist/tools/registry.js +222 -233
  328. package/package.json +3 -3
  329. package/src/migrations/0090_initial_passwords.sql +27 -0
  330. package/src/migrations/0091_account_time_zone.sql +4 -0
  331. package/src/migrations/0092_tools_default_on.sql +27 -0
  332. package/dist/platform/redact-orgs.d.ts +0 -7
  333. package/dist/platform/redact-orgs.js +0 -52
@@ -43,6 +43,7 @@ import { FilePreviewersController } from "../files/previewers.controller.js";
43
43
  import { AuthController } from "../identity/auth.controller.js";
44
44
  import { AuthGuard } from "../identity/auth.guard.js";
45
45
  import { IdentityModule } from "../identity/identity.module.js";
46
+ import { InitialPasswordsController } from "../identity/initial-passwords.controller.js";
46
47
  import { MeController } from "../identity/me.controller.js";
47
48
  import { BindController, MeIdentitiesController, SsoController, } from "../identity/sso.controller.js";
48
49
  import { InboxModule } from "../inbox/inbox.module.js";
@@ -75,6 +76,7 @@ import { UiController } from "../ui/views.controller.js";
75
76
  const CONTROLLERS = [
76
77
  AuthController,
77
78
  MeController,
79
+ InitialPasswordsController,
78
80
  OrgsController,
79
81
  OrgSettingsController,
80
82
  InvitationsController,
@@ -10,6 +10,11 @@ export interface Account {
10
10
  email: string | null;
11
11
  status: "active" | "disabled";
12
12
  isSuperAdmin: boolean;
13
+ /**
14
+ * The account signed in with a generated initial password and must set its own before anything
15
+ * else (Platform tool spec §14.5 item 2): the auth guard refuses every other route until then.
16
+ */
17
+ mustChangePassword: boolean;
13
18
  createdAt: Date;
14
19
  }
15
20
  /** 超级管理员可改的账号字段。 */
@@ -19,8 +24,8 @@ export type AccountPatch = {
19
24
  isSuperAdmin?: boolean;
20
25
  };
21
26
  /** 构造 `Account` 所需的 accounts 列(供跨表查询 select 使用)。 */
22
- export declare const ACCOUNT_COLUMNS: readonly ["accounts.id", "accounts.display_name", "accounts.email", "accounts.status", "accounts.is_super_admin", "accounts.created_at"];
23
- type AccountRow = Pick<Selectable<AccountsTable>, "id" | "display_name" | "email" | "status" | "is_super_admin" | "created_at">;
27
+ export declare const ACCOUNT_COLUMNS: readonly ["accounts.id", "accounts.display_name", "accounts.email", "accounts.status", "accounts.is_super_admin", "accounts.must_change_password", "accounts.created_at"];
28
+ type AccountRow = Pick<Selectable<AccountsTable>, "id" | "display_name" | "email" | "status" | "is_super_admin" | "must_change_password" | "created_at">;
24
29
  export declare function toAccount(r: AccountRow): Account;
25
30
  export interface LocalAccountInput {
26
31
  login: string;
@@ -28,6 +33,18 @@ export interface LocalAccountInput {
28
33
  displayName: string;
29
34
  email?: string;
30
35
  superAdmin?: boolean;
36
+ /** The account must set its own password at first sign-in (a generated initial password). */
37
+ mustChangePassword?: boolean;
38
+ }
39
+ /** Options of {@link AccountsService.createByAdmin}. */
40
+ export interface AdminCreateOptions {
41
+ /** Merged into the `account.created` audit detail (e.g. the Platform tool's `via: "agent"`). */
42
+ auditDetail?: Record<string, unknown>;
43
+ /**
44
+ * Runs in the creation's transaction right after the insert (the generated password is sealed
45
+ * there), so the account and what goes with it commit or roll back together.
46
+ */
47
+ inTransaction?: (account: Account) => Promise<void>;
31
48
  }
32
49
  /**
33
50
  * Accounts: local account creation, authentication and administration. Every write is
@@ -54,7 +71,14 @@ export declare class AccountsService {
54
71
  * `forbidden`), creates the account and audits `account.created`. The hash is computed before
55
72
  * the lock.
56
73
  */
57
- createByAdmin(input: LocalAccountInput, actorAccountId: string, actorTokenId?: string): Promise<Account>;
74
+ createByAdmin(input: LocalAccountInput, actorAccountId: string, actorTokenId?: string, opts?: AdminCreateOptions): Promise<Account>;
75
+ /**
76
+ * Whether `login` is free for a new local account (`account.login_taken` otherwise) and well
77
+ * formed (`validation_failed`): the read a caller checks before asking a person to confirm.
78
+ */
79
+ assertLoginFree(login: string): Promise<void>;
80
+ /** The local login of each account that has one (accounts without are left out). */
81
+ localLogins(accountIds: readonly string[]): Promise<Map<string, string>>;
58
82
  private createByAdminIn;
59
83
  /**
60
84
  * CLI: creates a super admin without checking whether the deployment is set up; a taken
@@ -75,6 +99,19 @@ export declare class AccountsService {
75
99
  /** 按账号 id 校验本地密码(改密码时核对旧密码);没有本地密码、超长或不符 → false。 */
76
100
  verifyPassword(accountId: string, password: string): Promise<boolean>;
77
101
  get(id: string): Promise<Account | undefined>;
102
+ /**
103
+ * A person's preferences (run context spec §3.4): `timeZone` is their time zone setting (IANA),
104
+ * null = follow the browser. Missing account → null.
105
+ */
106
+ preferences(accountId: string): Promise<{
107
+ timeZone: string | null;
108
+ }>;
109
+ /** Sets a person's preferences (the caller validated the time zone). */
110
+ setPreferences(accountId: string, prefs: {
111
+ timeZone: string | null;
112
+ }): Promise<{
113
+ timeZone: string | null;
114
+ }>;
78
115
  /** 按 id 升序分页,`after` 为上一页最后一个 id。 */
79
116
  list(opts: {
80
117
  limit: number;
@@ -97,7 +134,9 @@ export declare class AccountsService {
97
134
  * all or nothing; returns the revoked session ids, whose Redis markers the caller writes after
98
135
  * the commit (the fast path; a failure is only a warning: auth reads PG).
99
136
  */
100
- updateAccount(id: string, patch: AccountPatch, actorAccountId: string, actorTokenId?: string): Promise<{
137
+ updateAccount(id: string, patch: AccountPatch, actorAccountId: string, actorTokenId?: string, opts?: {
138
+ auditDetail?: Record<string, unknown>;
139
+ }): Promise<{
101
140
  account: Account;
102
141
  revokedSessionIds: string[];
103
142
  }>;
@@ -26,6 +26,7 @@ export const ACCOUNT_COLUMNS = [
26
26
  "accounts.email",
27
27
  "accounts.status",
28
28
  "accounts.is_super_admin",
29
+ "accounts.must_change_password",
29
30
  "accounts.created_at",
30
31
  ];
31
32
  export function toAccount(r) {
@@ -35,6 +36,7 @@ export function toAccount(r) {
35
36
  email: r.email,
36
37
  status: r.status,
37
38
  isSuperAdmin: r.is_super_admin,
39
+ mustChangePassword: r.must_change_password,
38
40
  createdAt: r.created_at,
39
41
  };
40
42
  }
@@ -87,10 +89,37 @@ let AccountsService = class AccountsService {
87
89
  * `forbidden`), creates the account and audits `account.created`. The hash is computed before
88
90
  * the lock.
89
91
  */
90
- async createByAdmin(input, actorAccountId, actorTokenId) {
91
- return this.createByAdminIn(await prepareLocal(input), actorAccountId, actorTokenId);
92
+ async createByAdmin(input, actorAccountId, actorTokenId, opts = {}) {
93
+ return this.createByAdminIn(await prepareLocal(input), actorAccountId, actorTokenId, opts);
92
94
  }
93
- async createByAdminIn(prepared, actorAccountId, actorTokenId) {
95
+ /**
96
+ * Whether `login` is free for a new local account (`account.login_taken` otherwise) and well
97
+ * formed (`validation_failed`): the read a caller checks before asking a person to confirm.
98
+ */
99
+ async assertLoginFree(login) {
100
+ const external = normalizeLogin(login);
101
+ const taken = await this.db
102
+ .selectFrom("identities")
103
+ .select("account_id")
104
+ .where("source", "=", "local")
105
+ .where("external_id", "=", external)
106
+ .executeTakeFirst();
107
+ if (taken)
108
+ throw new ApiError("account.login_taken", "Login is already taken");
109
+ }
110
+ /** The local login of each account that has one (accounts without are left out). */
111
+ async localLogins(accountIds) {
112
+ if (accountIds.length === 0)
113
+ return new Map();
114
+ const rows = await this.db
115
+ .selectFrom("identities")
116
+ .select(["account_id", "external_id"])
117
+ .where("source", "=", "local")
118
+ .where("account_id", "in", accountIds)
119
+ .execute();
120
+ return new Map(rows.map((r) => [r.account_id, r.external_id]));
121
+ }
122
+ async createByAdminIn(prepared, actorAccountId, actorTokenId, opts) {
94
123
  await this.adminLock.lockAndAuthorize(actorAccountId);
95
124
  const a = await this.insertLocal(prepared);
96
125
  await audit(this.db.db, {
@@ -98,8 +127,13 @@ let AccountsService = class AccountsService {
98
127
  ...(actorTokenId !== undefined && { actorTokenId }),
99
128
  action: "account.created",
100
129
  target: a.id,
101
- detail: { superAdmin: a.isSuperAdmin },
130
+ detail: {
131
+ superAdmin: a.isSuperAdmin,
132
+ ...(a.mustChangePassword && { mustChangePassword: true }),
133
+ ...opts.auditDetail,
134
+ },
102
135
  });
136
+ await opts.inTransaction?.(a);
103
137
  return a;
104
138
  }
105
139
  /**
@@ -164,6 +198,7 @@ let AccountsService = class AccountsService {
164
198
  "accounts.email_verified",
165
199
  "accounts.status",
166
200
  "accounts.is_super_admin",
201
+ "accounts.must_change_password",
167
202
  "accounts.created_at",
168
203
  "accounts.updated_at",
169
204
  "local_passwords.password_hash",
@@ -201,6 +236,27 @@ let AccountsService = class AccountsService {
201
236
  .executeTakeFirst();
202
237
  return row && toAccount(row);
203
238
  }
239
+ /**
240
+ * A person's preferences (run context spec §3.4): `timeZone` is their time zone setting (IANA),
241
+ * null = follow the browser. Missing account → null.
242
+ */
243
+ async preferences(accountId) {
244
+ const row = await this.db
245
+ .selectFrom("accounts")
246
+ .select("time_zone")
247
+ .where("id", "=", accountId)
248
+ .executeTakeFirst();
249
+ return { timeZone: row?.time_zone ?? null };
250
+ }
251
+ /** Sets a person's preferences (the caller validated the time zone). */
252
+ async setPreferences(accountId, prefs) {
253
+ await this.db
254
+ .updateTable("accounts")
255
+ .set({ time_zone: prefs.timeZone, updated_at: new Date() })
256
+ .where("id", "=", accountId)
257
+ .execute();
258
+ return this.preferences(accountId);
259
+ }
204
260
  /** 按 id 升序分页,`after` 为上一页最后一个 id。 */
205
261
  async list(opts) {
206
262
  let q = this.db.selectFrom("accounts").selectAll().orderBy("id").limit(opts.limit);
@@ -224,6 +280,17 @@ let AccountsService = class AccountsService {
224
280
  }
225
281
  async changePasswordIn(accountId, passwordHash, exceptSessionId) {
226
282
  await this.writePassword(accountId, passwordHash);
283
+ // the person set their own password: the generated one is no longer theirs to be shown
284
+ await this.db
285
+ .updateTable("accounts")
286
+ .set({ must_change_password: false })
287
+ .where("id", "=", accountId)
288
+ .where("must_change_password", "=", true)
289
+ .execute();
290
+ await this.db
291
+ .deleteFrom("account_initial_passwords")
292
+ .where("account_id", "=", accountId)
293
+ .execute();
227
294
  const sessions = await this.db
228
295
  .updateTable("sessions")
229
296
  .set({ revoked_at: sql `now()` })
@@ -250,7 +317,7 @@ let AccountsService = class AccountsService {
250
317
  * all or nothing; returns the revoked session ids, whose Redis markers the caller writes after
251
318
  * the commit (the fast path; a failure is only a warning: auth reads PG).
252
319
  */
253
- async updateAccount(id, patch, actorAccountId, actorTokenId) {
320
+ async updateAccount(id, patch, actorAccountId, actorTokenId, opts = {}) {
254
321
  // Every super admin write is serialized by one lock and re-checks the actor under it: two
255
322
  // admins revoking each other concurrently cannot leave none, and a just-revoked admin's
256
323
  // request in flight fails
@@ -265,7 +332,7 @@ let AccountsService = class AccountsService {
265
332
  return this.applyUpdate(before, patch, {
266
333
  actorAccountId,
267
334
  ...(actorTokenId !== undefined && { actorTokenId }),
268
- detail: patch,
335
+ detail: { ...patch, ...opts.auditDetail },
269
336
  });
270
337
  }
271
338
  /**
@@ -335,6 +402,7 @@ let AccountsService = class AccountsService {
335
402
  display_name: input.displayName,
336
403
  email: input.email ?? null,
337
404
  is_super_admin: input.superAdmin ?? false,
405
+ must_change_password: input.mustChangePassword ?? false,
338
406
  })
339
407
  .returningAll()
340
408
  .executeTakeFirstOrThrow();
@@ -13,7 +13,7 @@ import { ApiError } from "../errors.js";
13
13
  import { AccountsService } from "./accounts.js";
14
14
  import { ApiTokenService } from "./api-tokens.js";
15
15
  import { ACCESS_COOKIE } from "./cookies.js";
16
- import { ALLOW_SERVICE_KEY, PUBLIC_KEY, SESSION_ONLY_KEY, SUPER_ADMIN_KEY, } from "./principal.js";
16
+ import { ALLOW_SERVICE_KEY, PASSWORD_CHANGE_KEY, PUBLIC_KEY, SESSION_ONLY_KEY, SUPER_ADMIN_KEY, } from "./principal.js";
17
17
  import { SessionService } from "./sessions.js";
18
18
  /** CSRF 头:Cookie 认证的非安全请求(及所有公开路由的非安全请求)必须带 `X-Capybara-Csrf: 1`。 */
19
19
  export const CSRF_HEADER = "x-capybara-csrf";
@@ -76,6 +76,8 @@ export async function authorizeSuperAdmin(req, s) {
76
76
  if (p.kind === "service") {
77
77
  throw new ApiError("forbidden", "Service tokens cannot access this endpoint");
78
78
  }
79
+ if (p.account.mustChangePassword)
80
+ throw passwordChangeRequired();
79
81
  if (!p.account.isSuperAdmin)
80
82
  throw new ApiError("forbidden", "Super admin required");
81
83
  }
@@ -94,6 +96,8 @@ export async function authenticateOrgUploader(req, s) {
94
96
  if (resolved.principal.kind === "service") {
95
97
  throw new ApiError("forbidden", "Service tokens cannot access this endpoint");
96
98
  }
99
+ if (resolved.principal.account.mustChangePassword)
100
+ throw passwordChangeRequired();
97
101
  return resolved.principal;
98
102
  }
99
103
  /**
@@ -159,6 +163,9 @@ let AuthGuard = class AuthGuard {
159
163
  if (flag(SESSION_ONLY_KEY) && !(p.kind === "user" && p.via === "session")) {
160
164
  throw new ApiError("auth.session_required", "This endpoint requires a web session");
161
165
  }
166
+ if (p.kind === "user" && p.account.mustChangePassword && !flag(PASSWORD_CHANGE_KEY)) {
167
+ throw passwordChangeRequired();
168
+ }
162
169
  if (flag(SUPER_ADMIN_KEY) && !(p.kind === "user" && p.account.isSuperAdmin)) {
163
170
  throw new ApiError("forbidden", "Super admin required");
164
171
  }
@@ -173,6 +180,8 @@ AuthGuard = __decorate([
173
180
  __param(3, Inject(ApiTokenService))
174
181
  ], AuthGuard);
175
182
  export { AuthGuard };
183
+ /** An account signed in with a generated initial password reaches nothing until it changes it. */
184
+ const passwordChangeRequired = () => new ApiError("auth.password_change_required", "Set a new password first: this account signed in with a generated initial password");
176
185
  function requireActive(account) {
177
186
  if (account.status !== "active") {
178
187
  throw new ApiError("auth.account_disabled", "Account is disabled");
@@ -29,3 +29,9 @@ export declare function clearSessionCookies(reply: FastifyReply): void;
29
29
  * Path cookie and the new one sends both, the more specific Path first.
30
30
  */
31
31
  export declare function refreshCookieValues(header: string | undefined): string[];
32
+ /**
33
+ * The startup warning for an http trial that cannot sign in: session cookies are Secure but the
34
+ * configured public URL is plain http, so browsers drop them. Null when cookies are not Secure,
35
+ * or the public URL is https or unset (an unset URL says nothing about how people reach the app).
36
+ */
37
+ export declare function insecurePublicUrlWarning(cfg: KernelConfig): string | null;
@@ -68,3 +68,17 @@ export function refreshCookieValues(header) {
68
68
  }
69
69
  return out;
70
70
  }
71
+ /**
72
+ * The startup warning for an http trial that cannot sign in: session cookies are Secure but the
73
+ * configured public URL is plain http, so browsers drop them. Null when cookies are not Secure,
74
+ * or the public URL is https or unset (an unset URL says nothing about how people reach the app).
75
+ */
76
+ export function insecurePublicUrlWarning(cfg) {
77
+ const url = cfg.http.publicUrl;
78
+ if (!cfg.auth.cookieSecure || url === undefined || !url.startsWith("http://"))
79
+ return null;
80
+ const host = new URL(url).hostname;
81
+ if (host === "localhost" || host.endsWith(".localhost") || host === "127.0.0.1")
82
+ return null;
83
+ return `http.publicUrl is ${url} (plain http) while auth.cookieSecure is true: browsers drop the Secure session cookies, so sign-in will not stick. Serve the app over HTTPS, or for a short http trial set auth.cookieSecure=false (CAPYBARA_AUTH__COOKIE_SECURE=false; CAPYBARA_COOKIE_SECURE=false in the compose .env)`;
84
+ }
@@ -13,6 +13,7 @@ import { ApiTokenService } from "./api-tokens.js";
13
13
  import { IdentityBinding } from "./binding.js";
14
14
  import { ExternalIdentities } from "./external.js";
15
15
  import { ExternalIdentityLock } from "./external-identity-lock.js";
16
+ import { InitialPasswords } from "./initial-passwords.js";
16
17
  import { SessionService } from "./sessions.js";
17
18
  import { SettingsService } from "./settings.js";
18
19
  import { SsoFlow } from "./sso.js";
@@ -40,6 +41,7 @@ IdentityModule = __decorate([
40
41
  ExternalIdentities,
41
42
  IdentityBinding,
42
43
  SsoFlow,
44
+ InitialPasswords,
43
45
  ],
44
46
  exports: [
45
47
  AccountsModule,
@@ -50,6 +52,7 @@ IdentityModule = __decorate([
50
52
  ExternalIdentities,
51
53
  IdentityBinding,
52
54
  SsoFlow,
55
+ InitialPasswords,
53
56
  ],
54
57
  })
55
58
  ], IdentityModule);
@@ -0,0 +1,22 @@
1
+ import { z } from "zod";
2
+ import { type OrgContext } from "../orgs/org.guard.js";
3
+ import { InitialPasswords } from "./initial-passwords.js";
4
+ import { type Principal } from "./principal.js";
5
+ declare const ApprovalParams: z.ZodObject<{
6
+ approvalId: z.ZodString;
7
+ }, z.core.$strip>;
8
+ /**
9
+ * The generated initial password of an account the super admin's agent created (Platform tool
10
+ * spec §14.5 item 2): shown once, on the web, to the person who approved the `accounts.create`
11
+ * call. A POST because reading consumes it.
12
+ */
13
+ export declare class InitialPasswordsController {
14
+ private readonly passwords;
15
+ constructor(passwords: InitialPasswords);
16
+ reveal(principal: Principal, org: OrgContext, params: z.infer<typeof ApprovalParams>): Promise<{
17
+ accountId: string;
18
+ login: string | null;
19
+ password: string;
20
+ }>;
21
+ }
22
+ export {};
@@ -0,0 +1,49 @@
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 { Controller, HttpCode, Inject, Post } from "@nestjs/common";
11
+ import { z } from "zod";
12
+ import { createZodDto } from "../infra/validation/create-zod-dto.js";
13
+ import { ZParam } from "../infra/validation/zod-params.js";
14
+ import { CurrentOrg, OrgAction } from "../orgs/org.guard.js";
15
+ import { InitialPasswords } from "./initial-passwords.js";
16
+ import { CurrentPrincipal, requireUser, SessionOnly, SuperAdmin, } from "./principal.js";
17
+ const ApprovalParams = z.object({ approvalId: z.string().min(1).max(100) });
18
+ class ApprovalParamsDto extends createZodDto(ApprovalParams, "InitialPasswordParams") {
19
+ }
20
+ /**
21
+ * The generated initial password of an account the super admin's agent created (Platform tool
22
+ * spec §14.5 item 2): shown once, on the web, to the person who approved the `accounts.create`
23
+ * call. A POST because reading consumes it.
24
+ */
25
+ let InitialPasswordsController = class InitialPasswordsController {
26
+ passwords;
27
+ constructor(passwords) {
28
+ this.passwords = passwords;
29
+ }
30
+ async reveal(principal, org, params) {
31
+ const p = requireUser(principal);
32
+ return this.passwords.reveal(org.orgId, params.approvalId, p.account.id);
33
+ }
34
+ };
35
+ __decorate([
36
+ Post(),
37
+ HttpCode(200),
38
+ OrgAction("org.read"),
39
+ SuperAdmin(),
40
+ SessionOnly(),
41
+ __param(0, CurrentPrincipal()),
42
+ __param(1, CurrentOrg()),
43
+ __param(2, ZParam(ApprovalParamsDto))
44
+ ], InitialPasswordsController.prototype, "reveal", null);
45
+ InitialPasswordsController = __decorate([
46
+ Controller("api/v1/orgs/:orgId/approvals/:approvalId/initial-password"),
47
+ __param(0, Inject(InitialPasswords))
48
+ ], InitialPasswordsController);
49
+ export { InitialPasswordsController };
@@ -0,0 +1,61 @@
1
+ import type { Keyring } from "../ctx/secrets.js";
2
+ import type { KernelSchemaDb } from "../db/kernel-schema.js";
3
+ import { KernelDb } from "../infra/database/kernel-db.js";
4
+ import { TransactionHost } from "../infra/database/transaction-host.js";
5
+ import { type Account, AccountsService } from "./accounts.js";
6
+ /**
7
+ * How long a generated password waits for its reader. The approving person reads it right after
8
+ * the call runs; one that is never read expires (the account can still be disabled and recreated).
9
+ */
10
+ export declare const INITIAL_PASSWORD_TTL_MS: number;
11
+ /** The tool key of the approval a generated password belongs to. */
12
+ export declare const CREATE_ACCOUNT_TOOL_KEY = "Platform:accounts.create";
13
+ /** A one-time initial password, cryptographically random. */
14
+ export declare function generateInitialPassword(): string;
15
+ /** Where a generated password is delivered: the approved tool call and the person who approved. */
16
+ export interface InitialPasswordDelivery {
17
+ conversationId: string;
18
+ /** The run of the call: a call id is unique only within its run. */
19
+ runId: string;
20
+ callId: string;
21
+ /** The account that may read it: the actor who confirmed the call. */
22
+ recipientAccountId: string;
23
+ }
24
+ /**
25
+ * Accounts created with a kernel-generated one-time password (Platform tool spec §14.5 item 2).
26
+ * The password never leaves the kernel except through {@link reveal}: it is not returned to the
27
+ * caller, not written to the audit, the event log or the logs. It is sealed with the master keyring
28
+ * in the creation's transaction and read once, on the web, by the person who approved the call.
29
+ */
30
+ export declare class InitialPasswords {
31
+ private readonly db;
32
+ readonly txHost: TransactionHost;
33
+ private readonly keyring;
34
+ private readonly accounts;
35
+ constructor(db: KernelDb, txHost: TransactionHost, keyring: Keyring, accounts: AccountsService);
36
+ /**
37
+ * Creates a local account (never a super admin) with a generated password it must change at
38
+ * first sign-in, and seals the password for `to`. Returns the account only.
39
+ */
40
+ createAccount(input: {
41
+ login: string;
42
+ displayName: string;
43
+ email?: string;
44
+ }, actorAccountId: string, to: InitialPasswordDelivery, auditDetail?: Record<string, unknown>): Promise<Account>;
45
+ /** Stores the sealed password in the creation's transaction (the hourly job drops expired ones). */
46
+ private seal;
47
+ /**
48
+ * The password created by an approved `accounts.create` call, read once by the person who
49
+ * approved it (`approvalId` in `orgId`, decided by `accountId`), then deleted. Anything else (not
50
+ * that person, not approved, not run yet, read already, expired) is
51
+ * `account.initial_password_unavailable`, saying nothing about which. Audits the read (without
52
+ * the password).
53
+ */
54
+ reveal(orgId: string, approvalId: string, accountId: string): Promise<{
55
+ accountId: string;
56
+ login: string | null;
57
+ password: string;
58
+ }>;
59
+ }
60
+ /** Deletes the sealed passwords past `expires_at`; returns how many. */
61
+ export declare function deleteExpiredInitialPasswords(db: KernelSchemaDb): Promise<number>;
@@ -0,0 +1,16 @@
1
+ import { KernelDb } from "../infra/database/kernel-db.js";
2
+ import { LockService } from "../infra/lock/lock.service.js";
3
+ import type { KernelLogger } from "../log.js";
4
+ /** The hourly cleanup of expired sealed initial passwords (`@LockedCron`). */
5
+ export declare const INITIAL_PASSWORD_CLEANUP_JOB = "initial-password-cleanup";
6
+ /**
7
+ * Deletes generated initial passwords nobody read before they expired (Platform tool spec §14.5
8
+ * item 2), once per tick across replicas; the worker role's.
9
+ */
10
+ export declare class InitialPasswordCleanupJob {
11
+ private readonly db;
12
+ readonly lockService: LockService;
13
+ readonly log: KernelLogger;
14
+ constructor(db: KernelDb, lockService: LockService, log: KernelLogger);
15
+ cleanup(): Promise<void>;
16
+ }
@@ -0,0 +1,46 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
8
+ return function (target, key) { decorator(target, key, paramIndex); }
9
+ };
10
+ import { Inject, Injectable } from "@nestjs/common";
11
+ import { KernelDb } from "../infra/database/kernel-db.js";
12
+ import { LockService } from "../infra/lock/lock.service.js";
13
+ import { LockedCron } from "../infra/schedule/locked-cron.decorator.js";
14
+ import { KERNEL_LOGGER } from "../infra/tokens.js";
15
+ import { deleteExpiredInitialPasswords } from "./initial-passwords.js";
16
+ /** The hourly cleanup of expired sealed initial passwords (`@LockedCron`). */
17
+ export const INITIAL_PASSWORD_CLEANUP_JOB = "initial-password-cleanup";
18
+ /**
19
+ * Deletes generated initial passwords nobody read before they expired (Platform tool spec §14.5
20
+ * item 2), once per tick across replicas; the worker role's.
21
+ */
22
+ let InitialPasswordCleanupJob = class InitialPasswordCleanupJob {
23
+ db;
24
+ lockService;
25
+ log;
26
+ constructor(db, lockService, log) {
27
+ this.db = db;
28
+ this.lockService = lockService;
29
+ this.log = log;
30
+ }
31
+ async cleanup() {
32
+ const n = await deleteExpiredInitialPasswords(this.db.db);
33
+ if (n > 0)
34
+ this.log.info("expired initial passwords deleted", { count: n });
35
+ }
36
+ };
37
+ __decorate([
38
+ LockedCron("20 * * * *", { name: INITIAL_PASSWORD_CLEANUP_JOB })
39
+ ], InitialPasswordCleanupJob.prototype, "cleanup", null);
40
+ InitialPasswordCleanupJob = __decorate([
41
+ Injectable(),
42
+ __param(0, Inject(KernelDb)),
43
+ __param(1, Inject(LockService)),
44
+ __param(2, Inject(KERNEL_LOGGER))
45
+ ], InitialPasswordCleanupJob);
46
+ export { InitialPasswordCleanupJob };