@opengeni/db 0.28.9 → 0.36.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (225) hide show
  1. package/dist/attached-browser-devices.d.ts +42 -0
  2. package/dist/attempt-tool-catalogs.d.ts +16 -0
  3. package/dist/browser-auth.d.ts +299 -0
  4. package/dist/browser-downloads.d.ts +51 -0
  5. package/dist/browser-identities.d.ts +137 -0
  6. package/dist/browser-sessions.d.ts +354 -0
  7. package/dist/browser-state-artifacts.d.ts +91 -0
  8. package/dist/canonical-human-identities.d.ts +48 -0
  9. package/dist/canonical-human-identities.js +28 -0
  10. package/dist/canonical-human-identities.js.map +1 -0
  11. package/dist/capability-components.d.ts +37 -0
  12. package/dist/capability-integrations.d.ts +194 -0
  13. package/dist/chunk-5KTIEDX7.js +13200 -0
  14. package/dist/chunk-5KTIEDX7.js.map +1 -0
  15. package/dist/chunk-CQZ4QSP5.js +995 -0
  16. package/dist/chunk-CQZ4QSP5.js.map +1 -0
  17. package/dist/chunk-F32YT7MP.js +117 -0
  18. package/dist/chunk-F32YT7MP.js.map +1 -0
  19. package/dist/chunk-JC5QPLUM.js +666 -0
  20. package/dist/chunk-JC5QPLUM.js.map +1 -0
  21. package/dist/chunk-P3RE4D2B.js +3535 -0
  22. package/dist/chunk-P3RE4D2B.js.map +1 -0
  23. package/dist/chunk-TAUTWOS5.js +259 -0
  24. package/dist/chunk-TAUTWOS5.js.map +1 -0
  25. package/dist/chunk-VKLB2ZGI.js +2389 -0
  26. package/dist/chunk-VKLB2ZGI.js.map +1 -0
  27. package/dist/codemode-operations.d.ts +117 -0
  28. package/dist/codex-token-resolver.d.ts +2 -2
  29. package/dist/company-profile-schema.d.ts +798 -0
  30. package/dist/company-profile.d.ts +268 -0
  31. package/dist/computer-sessions.d.ts +109 -0
  32. package/dist/connection-token-resolver.d.ts +9 -4
  33. package/dist/database.d.ts +57 -3
  34. package/dist/editable-artifact-durable-export.d.ts +153 -0
  35. package/dist/editable-artifact-durable-export.js +788 -0
  36. package/dist/editable-artifact-durable-export.js.map +1 -0
  37. package/dist/editable-artifact-materialization.d.ts +123 -0
  38. package/dist/editable-artifacts-schema.d.ts +4152 -0
  39. package/dist/editable-artifacts.d.ts +610 -0
  40. package/dist/editable-artifacts.js +26 -0
  41. package/dist/editable-artifacts.js.map +1 -0
  42. package/dist/generated-images.d.ts +139 -0
  43. package/dist/index.d.ts +1122 -126
  44. package/dist/index.js +42329 -18407
  45. package/dist/index.js.map +1 -1
  46. package/dist/insights.d.ts +73 -10
  47. package/dist/integration-bindings.d.ts +70 -0
  48. package/dist/integration-facets.d.ts +99 -0
  49. package/dist/interaction-revisions.d.ts +14 -0
  50. package/dist/interaction-schema.d.ts +6036 -0
  51. package/dist/knowledge-source-sync-schema.d.ts +1679 -0
  52. package/dist/knowledge-source-sync.d.ts +274 -0
  53. package/dist/memory-governance.d.ts +2 -2
  54. package/dist/memory-slack-delivery.d.ts +101 -0
  55. package/dist/new-session-drafts.d.ts +2 -2
  56. package/dist/pack-components.d.ts +76 -0
  57. package/dist/pack-installations.d.ts +86 -0
  58. package/dist/persistence-errors.d.ts +3 -3
  59. package/dist/plugin-packages.d.ts +126 -0
  60. package/dist/preference-registry.d.ts +1 -1
  61. package/dist/provision-roles.d.ts +9 -1
  62. package/dist/provision-roles.js +1 -1
  63. package/dist/runtime-posture.d.ts +19 -6
  64. package/dist/schema.d.ts +22654 -9359
  65. package/dist/schema.js +209 -3
  66. package/dist/scoped-knowledge.d.ts +97 -1
  67. package/dist/session-control.d.ts +33 -7
  68. package/dist/session-queue-commands.d.ts +19 -11
  69. package/dist/session-realtime-context.d.ts +2 -2
  70. package/dist/session-realtime-ledger.d.ts +4 -4
  71. package/dist/session-realtime-mirror.d.ts +2 -2
  72. package/dist/session-realtime-state.d.ts +1 -1
  73. package/dist/session-realtime-terminal.d.ts +1 -1
  74. package/dist/session-realtime.d.ts +7 -7
  75. package/dist/session-tenancy.d.ts +44 -0
  76. package/dist/session-tenancy.js +16 -0
  77. package/dist/session-tenancy.js.map +1 -0
  78. package/dist/session-tool-call-settlement.d.ts +1 -1
  79. package/dist/slack-task-policy-schema.d.ts +847 -0
  80. package/dist/slack-task-policy.d.ts +65 -0
  81. package/dist/slack-user-link-access.d.ts +54 -0
  82. package/dist/task-notes-schema.d.ts +924 -0
  83. package/dist/task-notes.d.ts +85 -0
  84. package/dist/transcription-recordings.d.ts +2 -2
  85. package/dist/turn-initiator.d.ts +2 -2
  86. package/dist/video-generation.d.ts +225 -0
  87. package/dist/video-generation.js +68 -0
  88. package/dist/video-generation.js.map +1 -0
  89. package/dist/workspace-artifacts.d.ts +1 -1
  90. package/dist/workspace-instruction-policies.d.ts +1 -1
  91. package/dist/workspace-learning-policy-schema.d.ts +932 -0
  92. package/dist/workspace-learning-policy.d.ts +161 -0
  93. package/dist/xai-subscription.d.ts +326 -0
  94. package/drizzle/0183_model_call_provider_cost_estimates.sql +39 -0
  95. package/drizzle/0184_sandbox_drain_teardown_fence.sql +682 -0
  96. package/drizzle/0185_temporal_schedule_cleanup_outbox.sql +168 -0
  97. package/drizzle/0186_sandbox_capture_provider_contract.sql +400 -0
  98. package/drizzle/0187_generated_image_artifacts.sql +173 -0
  99. package/drizzle/0188_image_generation_retention_failure.sql +25 -0
  100. package/drizzle/0189_retained_session_image_formats.sql +13 -0
  101. package/drizzle/0190_timeline_annotations.sql +31 -0
  102. package/drizzle/0191_editable_artifact_engine.sql +3853 -0
  103. package/drizzle/0192_editable_artifact_live_tickets.sql +338 -0
  104. package/drizzle/0193_editable_artifact_authorization.sql +190 -0
  105. package/drizzle/0194_editable_artifact_durable_exports.sql +160 -0
  106. package/drizzle/0195_editable_artifact_import_authorization.sql +203 -0
  107. package/drizzle/0196_rig_provider_images.sql +152 -0
  108. package/drizzle/0197_knowledge_source_sync_schedules.sql +523 -0
  109. package/drizzle/0198_memory_slack_publication_delivery.sql +393 -0
  110. package/drizzle/0199_workspace_learning_policy.sql +980 -0
  111. package/drizzle/0201_company_profile_authority.sql +849 -0
  112. package/drizzle/0202_document_index_checkpoints.sql +85 -0
  113. package/drizzle/0203_durable_video_generation.sql +353 -0
  114. package/drizzle/0204_video_generation_funding.sql +44 -0
  115. package/drizzle/0205_attempt_tool_catalogs.sql +230 -0
  116. package/drizzle/0206_browser_sessions.sql +646 -0
  117. package/drizzle/0207_browser_identities.sql +379 -0
  118. package/drizzle/0208_attached_browser_devices.sql +165 -0
  119. package/drizzle/0209_computer_sessions.sql +575 -0
  120. package/drizzle/0210_browser_auth_network_interventions.sql +441 -0
  121. package/drizzle/0211_editable_artifact_session_links.sql +58 -0
  122. package/drizzle/0212_browser_state_transfer_hardening.sql +560 -0
  123. package/drizzle/0212_slack_installation_bindings.sql +348 -0
  124. package/drizzle/0213_browser_interaction_authority.sql +67 -0
  125. package/drizzle/0213_slack_user_link_access_requests.sql +177 -0
  126. package/drizzle/0214_browser_download_saves.sql +34 -0
  127. package/drizzle/0214_session_activity_commit_gate.sql +262 -0
  128. package/drizzle/0215_browser_controller_host.sql +385 -0
  129. package/drizzle/0215_capabilities_platform.sql +980 -0
  130. package/drizzle/0216_browser_auth_health_evidence.sql +137 -0
  131. package/drizzle/0216_pack_component_ownership.sql +235 -0
  132. package/drizzle/0217_capability_definition_delete_authority.sql +32 -0
  133. package/drizzle/0217_external_browser_auth_operations.sql +22 -0
  134. package/drizzle/0218_organization_tenancy_foundation.sql +299 -0
  135. package/drizzle/0219_organization_tenancy_managed_human_provisioning.sql +317 -0
  136. package/drizzle/0219_site_auth_maintenance_sessions.sql +234 -0
  137. package/drizzle/0220_memory_slack_append_only_cascade.sql +38 -0
  138. package/drizzle/0220_session_channels.sql +54 -0
  139. package/drizzle/0221_sessions_channel_index.sql +5 -0
  140. package/drizzle/0222_session_visibility_authority_epochs.sql +158 -0
  141. package/drizzle/0222_sessions_channel_fk.sql +89 -0
  142. package/drizzle/0223_pending_tool_event_output.sql +55 -0
  143. package/drizzle/0223_sessions_channel_fk_validate.sql +118 -0
  144. package/drizzle/0224_slack_post_outcome_reconciliation.sql +123 -0
  145. package/drizzle/0225_session_visibility_fork_activation.sql +1363 -0
  146. package/drizzle/0226_personal_codex_authority_foundation.sql +365 -0
  147. package/drizzle/0227_slack_native_actions.sql +145 -0
  148. package/drizzle/0228_interaction_controller_data_plane.sql +14 -0
  149. package/drizzle/0228_slack_task_policy.sql +400 -0
  150. package/drizzle/0229_slack_inbox_file_fact.sql +10 -0
  151. package/drizzle/0230_user_scoped_variable_sets_rigs.sql +84 -0
  152. package/drizzle/0231_integration_definition_identity_cutover.sql +271 -0
  153. package/drizzle/0232_integration_facet_authority_cutover.sql +610 -0
  154. package/drizzle/0233_skill_and_integration_authority_cutover.sql +1162 -0
  155. package/drizzle/0234_xai_subscription_authority.sql +1139 -0
  156. package/drizzle/0235_canonical_human_login_bindings.sql +920 -0
  157. package/drizzle/0236_browser_identity_lifecycle.sql +39 -0
  158. package/drizzle/0236_session_visibility_slack_policy.sql +72 -0
  159. package/drizzle/0237_interaction_transition_reaper.sql +263 -0
  160. package/drizzle/0238_goal_persistence_policy.sql +471 -0
  161. package/drizzle/0238_supergrok_realtime_model.sql +29 -0
  162. package/drizzle/0239_supergrok_video_funding.sql +50 -0
  163. package/drizzle/0239_task_tree_notes.sql +990 -0
  164. package/package.json +26 -5
  165. package/src/attached-browser-devices.ts +371 -0
  166. package/src/attempt-tool-catalogs.ts +131 -0
  167. package/src/browser-auth.ts +4373 -0
  168. package/src/browser-downloads.ts +517 -0
  169. package/src/browser-identities.ts +1385 -0
  170. package/src/browser-sessions.ts +2294 -0
  171. package/src/browser-state-artifacts.ts +449 -0
  172. package/src/canonical-human-identities.ts +317 -0
  173. package/src/capability-components.ts +166 -0
  174. package/src/capability-integrations.ts +1571 -0
  175. package/src/codemode-operations.ts +674 -0
  176. package/src/company-profile-schema.ts +143 -0
  177. package/src/company-profile.ts +968 -0
  178. package/src/computer-sessions.ts +1130 -0
  179. package/src/connection-token-resolver.ts +270 -25
  180. package/src/database.ts +468 -24
  181. package/src/editable-artifact-durable-export.ts +1201 -0
  182. package/src/editable-artifact-materialization.ts +893 -0
  183. package/src/editable-artifacts-schema.ts +879 -0
  184. package/src/editable-artifacts.ts +5404 -0
  185. package/src/generated-images.ts +740 -0
  186. package/src/index.ts +9963 -1465
  187. package/src/insights.ts +251 -23
  188. package/src/integration-bindings.ts +455 -0
  189. package/src/integration-facets.ts +862 -0
  190. package/src/interaction-revisions.ts +70 -0
  191. package/src/interaction-schema.ts +1606 -0
  192. package/src/knowledge-source-sync-schema.ts +192 -0
  193. package/src/knowledge-source-sync.ts +1922 -0
  194. package/src/memory-slack-delivery.ts +801 -0
  195. package/src/pack-components.ts +954 -0
  196. package/src/pack-installations.ts +886 -0
  197. package/src/persistence-errors.ts +4 -7
  198. package/src/plugin-packages.ts +1186 -0
  199. package/src/provision-roles.ts +534 -1
  200. package/src/runtime-posture-cli.ts +9 -0
  201. package/src/runtime-posture.ts +721 -5
  202. package/src/schema.ts +6270 -3159
  203. package/src/scoped-knowledge-schema.ts +1 -1
  204. package/src/scoped-knowledge.ts +655 -3
  205. package/src/session-control.ts +130 -42
  206. package/src/session-queue-commands.ts +265 -15
  207. package/src/session-realtime-context.ts +2 -2
  208. package/src/session-realtime-ledger.ts +3 -3
  209. package/src/session-realtime.ts +7 -7
  210. package/src/session-tenancy.ts +188 -0
  211. package/src/session-tool-call-settlement.ts +18 -3
  212. package/src/slack-task-policy-schema.ts +130 -0
  213. package/src/slack-task-policy.ts +341 -0
  214. package/src/slack-user-link-access.ts +702 -0
  215. package/src/task-notes-schema.ts +135 -0
  216. package/src/task-notes.ts +178 -0
  217. package/src/video-generation.ts +1530 -0
  218. package/src/workspace-artifacts.ts +1 -1
  219. package/src/workspace-learning-policy-schema.ts +139 -0
  220. package/src/workspace-learning-policy.ts +595 -0
  221. package/src/xai-subscription.ts +1887 -0
  222. package/dist/chunk-P6CUHXQZ.js +0 -7248
  223. package/dist/chunk-P6CUHXQZ.js.map +0 -1
  224. package/dist/chunk-VHBFHMPC.js +0 -1219
  225. package/dist/chunk-VHBFHMPC.js.map +0 -1
@@ -0,0 +1,259 @@
1
+ import {
2
+ nestedPostgresSqlState,
3
+ rawRows
4
+ } from "./chunk-JC5QPLUM.js";
5
+
6
+ // src/canonical-human-identities.ts
7
+ import { createHash } from "crypto";
8
+ import {
9
+ CanonicalHumanIdentityMutationResponse,
10
+ CanonicalHumanIdentityProjection
11
+ } from "@opengeni/contracts/canonical-human-identities";
12
+ import { sql } from "drizzle-orm";
13
+ var CanonicalHumanIdentityConflictError = class extends Error {
14
+ name = "CanonicalHumanIdentityConflictError";
15
+ code = "CANONICAL_HUMAN_IDENTITY_CONFLICT";
16
+ constructor() {
17
+ super("The canonical human identity changed in another request");
18
+ }
19
+ };
20
+ var CanonicalHumanIdentityOperationReuseError = class extends Error {
21
+ name = "CanonicalHumanIdentityOperationReuseError";
22
+ code = "CANONICAL_HUMAN_IDENTITY_OPERATION_REUSED";
23
+ constructor() {
24
+ super("The canonical human identity operation id was already used for another request");
25
+ }
26
+ };
27
+ var CanonicalHumanIdentityNotFoundError = class extends Error {
28
+ name = "CanonicalHumanIdentityNotFoundError";
29
+ constructor(message = "Canonical human identity was not found") {
30
+ super(message);
31
+ }
32
+ };
33
+ var CanonicalHumanIdentityAuthorityError = class extends Error {
34
+ name = "CanonicalHumanIdentityAuthorityError";
35
+ };
36
+ function deterministicOperationId(seed) {
37
+ const bytes = createHash("sha256").update(seed, "utf8").digest().subarray(0, 16);
38
+ bytes[6] = bytes[6] & 15 | 80;
39
+ bytes[8] = bytes[8] & 63 | 128;
40
+ const hex = bytes.toString("hex");
41
+ return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;
42
+ }
43
+ function projectionValue(value) {
44
+ if (typeof value === "string") return JSON.parse(value);
45
+ return value;
46
+ }
47
+ function mapSqlError(error) {
48
+ const state = nestedPostgresSqlState(error);
49
+ if (state === "40001") throw new CanonicalHumanIdentityConflictError();
50
+ if (state === "23505") throw new CanonicalHumanIdentityOperationReuseError();
51
+ if (state === "P0002") throw new CanonicalHumanIdentityNotFoundError();
52
+ if (state === "42501") {
53
+ throw new CanonicalHumanIdentityAuthorityError(
54
+ error instanceof Error ? error.message : "Canonical human identity authority denied"
55
+ );
56
+ }
57
+ throw error;
58
+ }
59
+ async function ensureCanonicalHumanIdentity(db, input) {
60
+ try {
61
+ const [row] = await rawRows(
62
+ db,
63
+ sql`
64
+ select
65
+ identity_id as "identityId",
66
+ identity_revision as "identityRevision",
67
+ auth_revision as "authRevision",
68
+ identity_status as "identityStatus"
69
+ from ensure_canonical_human_identity(${input.authUserId}, ${input.displayName})
70
+ `
71
+ );
72
+ if (!row) throw new CanonicalHumanIdentityNotFoundError();
73
+ return {
74
+ identityId: row.identityId,
75
+ identityRevision: Number(row.identityRevision),
76
+ authRevision: Number(row.authRevision),
77
+ identityStatus: row.identityStatus
78
+ };
79
+ } catch (error) {
80
+ mapSqlError(error);
81
+ }
82
+ }
83
+ async function ensureCanonicalHumanIdentityForAuthUser(db, authUserId) {
84
+ const [user] = await rawRows(
85
+ db,
86
+ sql`
87
+ select coalesce(nullif(btrim(name), ''), email) as "displayName"
88
+ from auth_users
89
+ where id = ${authUserId}
90
+ limit 1
91
+ `
92
+ );
93
+ if (!user) throw new CanonicalHumanIdentityNotFoundError("Authentication user was not found");
94
+ return await ensureCanonicalHumanIdentity(db, {
95
+ authUserId,
96
+ displayName: user.displayName
97
+ });
98
+ }
99
+ async function synchronizeCanonicalHumanLoginBindings(db, authUserId) {
100
+ let authority = await ensureCanonicalHumanIdentityForAuthUser(db, authUserId);
101
+ const accounts = await rawRows(
102
+ db,
103
+ sql`
104
+ select
105
+ id,
106
+ lower(provider_id) as "providerId",
107
+ account_id as "providerAccountId"
108
+ from auth_identities
109
+ where user_id = ${authUserId}
110
+ order by created_at, id
111
+ `
112
+ );
113
+ for (const account of accounts) {
114
+ for (let attempt = 0; attempt < 4; attempt += 1) {
115
+ const projection = await getCanonicalHumanIdentityProjection(db, authUserId);
116
+ if (projection.activeIdentity.status !== "active") {
117
+ return {
118
+ identityId: projection.activeIdentity.id,
119
+ identityRevision: projection.activeIdentity.identityRevision,
120
+ authRevision: projection.activeIdentity.authRevision,
121
+ identityStatus: projection.activeIdentity.status
122
+ };
123
+ }
124
+ const existing = projection.loginBindings.find(
125
+ (binding) => binding.providerId === account.providerId && binding.providerAccountId === account.providerAccountId
126
+ );
127
+ if (existing?.status === "active") {
128
+ authority = {
129
+ identityId: projection.activeIdentity.id,
130
+ identityRevision: projection.activeIdentity.identityRevision,
131
+ authRevision: projection.activeIdentity.authRevision,
132
+ identityStatus: projection.activeIdentity.status
133
+ };
134
+ break;
135
+ }
136
+ try {
137
+ const result = await applyCanonicalHumanIdentityOperation(db, {
138
+ operationId: deterministicOperationId(
139
+ `canonical-human-account-link
140
+ ${account.id}
141
+ ${projection.activeIdentity.identityRevision}`
142
+ ),
143
+ authUserId,
144
+ expectedIdentityRevision: projection.activeIdentity.identityRevision,
145
+ operationType: "link",
146
+ providerId: account.providerId,
147
+ providerAccountId: account.providerAccountId,
148
+ reason: "Synchronize verified authentication account"
149
+ });
150
+ authority = {
151
+ identityId: result.identity.activeIdentity.id,
152
+ identityRevision: result.identity.activeIdentity.identityRevision,
153
+ authRevision: result.identity.activeIdentity.authRevision,
154
+ identityStatus: result.identity.activeIdentity.status
155
+ };
156
+ break;
157
+ } catch (error) {
158
+ if (error instanceof CanonicalHumanIdentityConflictError && attempt < 3) continue;
159
+ if (error instanceof CanonicalHumanIdentityAuthorityError) {
160
+ const currentProjection = await getCanonicalHumanIdentityProjection(db, authUserId);
161
+ if (currentProjection.activeIdentity.status !== "active") {
162
+ return {
163
+ identityId: currentProjection.activeIdentity.id,
164
+ identityRevision: currentProjection.activeIdentity.identityRevision,
165
+ authRevision: currentProjection.activeIdentity.authRevision,
166
+ identityStatus: currentProjection.activeIdentity.status
167
+ };
168
+ }
169
+ }
170
+ throw error;
171
+ }
172
+ }
173
+ }
174
+ return authority;
175
+ }
176
+ async function validateCanonicalHumanSession(db, input) {
177
+ try {
178
+ const [row] = await rawRows(
179
+ db,
180
+ sql`
181
+ select validate_canonical_human_session(
182
+ ${input.authSessionId},
183
+ ${input.authUserId},
184
+ ${input.allowRecovery ?? false}
185
+ ) as valid
186
+ `
187
+ );
188
+ return row?.valid === true;
189
+ } catch (error) {
190
+ mapSqlError(error);
191
+ }
192
+ }
193
+ async function getCanonicalHumanIdentityProjection(db, authUserId) {
194
+ try {
195
+ const [row] = await rawRows(
196
+ db,
197
+ sql`
198
+ select get_canonical_human_identity_projection(${authUserId}) as projection
199
+ `
200
+ );
201
+ if (row?.projection === null || row?.projection === void 0) {
202
+ throw new CanonicalHumanIdentityNotFoundError();
203
+ }
204
+ return CanonicalHumanIdentityProjection.parse(projectionValue(row.projection));
205
+ } catch (error) {
206
+ if (error instanceof CanonicalHumanIdentityNotFoundError) throw error;
207
+ mapSqlError(error);
208
+ }
209
+ }
210
+ async function applyCanonicalHumanIdentityOperation(db, input) {
211
+ try {
212
+ const [row] = await rawRows(
213
+ db,
214
+ sql`
215
+ select
216
+ outcome,
217
+ identity_id as "identityId",
218
+ identity_revision as "identityRevision",
219
+ auth_revision as "authRevision"
220
+ from apply_canonical_human_identity_operation(
221
+ ${input.operationId},
222
+ ${input.authUserId},
223
+ ${input.expectedIdentityRevision},
224
+ ${input.operationType},
225
+ ${input.bindingId ?? null},
226
+ ${input.providerId ?? null},
227
+ ${input.providerAccountId ?? null},
228
+ ${input.reason}
229
+ )
230
+ `
231
+ );
232
+ if (!row) throw new CanonicalHumanIdentityNotFoundError();
233
+ const identity = await getCanonicalHumanIdentityProjection(db, input.authUserId);
234
+ return CanonicalHumanIdentityMutationResponse.parse({
235
+ outcome: row.outcome,
236
+ operationId: input.operationId,
237
+ identity
238
+ });
239
+ } catch (error) {
240
+ if (error instanceof CanonicalHumanIdentityConflictError || error instanceof CanonicalHumanIdentityOperationReuseError || error instanceof CanonicalHumanIdentityNotFoundError || error instanceof CanonicalHumanIdentityAuthorityError) {
241
+ throw error;
242
+ }
243
+ mapSqlError(error);
244
+ }
245
+ }
246
+
247
+ export {
248
+ CanonicalHumanIdentityConflictError,
249
+ CanonicalHumanIdentityOperationReuseError,
250
+ CanonicalHumanIdentityNotFoundError,
251
+ CanonicalHumanIdentityAuthorityError,
252
+ ensureCanonicalHumanIdentity,
253
+ ensureCanonicalHumanIdentityForAuthUser,
254
+ synchronizeCanonicalHumanLoginBindings,
255
+ validateCanonicalHumanSession,
256
+ getCanonicalHumanIdentityProjection,
257
+ applyCanonicalHumanIdentityOperation
258
+ };
259
+ //# sourceMappingURL=chunk-TAUTWOS5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/canonical-human-identities.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport {\n CanonicalHumanIdentityMutationResponse,\n CanonicalHumanIdentityProjection,\n type CanonicalHumanIdentityMutationOutcome,\n type CanonicalHumanIdentityMutationResponse as CanonicalHumanIdentityMutationResponseType,\n type CanonicalHumanIdentityProjection as CanonicalHumanIdentityProjectionType,\n} from \"@opengeni/contracts/canonical-human-identities\";\nimport { sql } from \"drizzle-orm\";\nimport type { Database } from \"./database\";\nimport { rawRows } from \"./database\";\nimport { nestedPostgresSqlState } from \"./persistence-errors\";\n\nexport type CanonicalHumanSessionAuthority = {\n identityId: string;\n identityRevision: number;\n authRevision: number;\n identityStatus: \"active\" | \"recovery_required\" | \"disputed\" | \"disabled\";\n};\n\nexport class CanonicalHumanIdentityConflictError extends Error {\n readonly name = \"CanonicalHumanIdentityConflictError\";\n readonly code = \"CANONICAL_HUMAN_IDENTITY_CONFLICT\";\n\n constructor() {\n super(\"The canonical human identity changed in another request\");\n }\n}\n\nexport class CanonicalHumanIdentityOperationReuseError extends Error {\n readonly name = \"CanonicalHumanIdentityOperationReuseError\";\n readonly code = \"CANONICAL_HUMAN_IDENTITY_OPERATION_REUSED\";\n\n constructor() {\n super(\"The canonical human identity operation id was already used for another request\");\n }\n}\n\nexport class CanonicalHumanIdentityNotFoundError extends Error {\n readonly name = \"CanonicalHumanIdentityNotFoundError\";\n\n constructor(message = \"Canonical human identity was not found\") {\n super(message);\n }\n}\n\nexport class CanonicalHumanIdentityAuthorityError extends Error {\n readonly name = \"CanonicalHumanIdentityAuthorityError\";\n}\n\nfunction deterministicOperationId(seed: string): string {\n const bytes = createHash(\"sha256\").update(seed, \"utf8\").digest().subarray(0, 16);\n bytes[6] = (bytes[6]! & 0x0f) | 0x50;\n bytes[8] = (bytes[8]! & 0x3f) | 0x80;\n const hex = bytes.toString(\"hex\");\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n}\n\nfunction projectionValue(value: unknown): unknown {\n if (typeof value === \"string\") return JSON.parse(value);\n return value;\n}\n\nfunction mapSqlError(error: unknown): never {\n const state = nestedPostgresSqlState(error);\n if (state === \"40001\") throw new CanonicalHumanIdentityConflictError();\n if (state === \"23505\") throw new CanonicalHumanIdentityOperationReuseError();\n if (state === \"P0002\") throw new CanonicalHumanIdentityNotFoundError();\n if (state === \"42501\") {\n throw new CanonicalHumanIdentityAuthorityError(\n error instanceof Error ? error.message : \"Canonical human identity authority denied\",\n );\n }\n throw error;\n}\n\nexport async function ensureCanonicalHumanIdentity(\n db: Database,\n input: { authUserId: string; displayName: string },\n): Promise<CanonicalHumanSessionAuthority> {\n try {\n const [row] = await rawRows<{\n identityId: string;\n identityRevision: number | string;\n authRevision: number | string;\n identityStatus: CanonicalHumanSessionAuthority[\"identityStatus\"];\n }>(\n db,\n sql`\n select\n identity_id as \"identityId\",\n identity_revision as \"identityRevision\",\n auth_revision as \"authRevision\",\n identity_status as \"identityStatus\"\n from ensure_canonical_human_identity(${input.authUserId}, ${input.displayName})\n `,\n );\n if (!row) throw new CanonicalHumanIdentityNotFoundError();\n return {\n identityId: row.identityId,\n identityRevision: Number(row.identityRevision),\n authRevision: Number(row.authRevision),\n identityStatus: row.identityStatus,\n };\n } catch (error) {\n mapSqlError(error);\n }\n}\n\nexport async function ensureCanonicalHumanIdentityForAuthUser(\n db: Database,\n authUserId: string,\n): Promise<CanonicalHumanSessionAuthority> {\n const [user] = await rawRows<{ displayName: string }>(\n db,\n sql`\n select coalesce(nullif(btrim(name), ''), email) as \"displayName\"\n from auth_users\n where id = ${authUserId}\n limit 1\n `,\n );\n if (!user) throw new CanonicalHumanIdentityNotFoundError(\"Authentication user was not found\");\n return await ensureCanonicalHumanIdentity(db, {\n authUserId,\n displayName: user.displayName,\n });\n}\n\nexport async function synchronizeCanonicalHumanLoginBindings(\n db: Database,\n authUserId: string,\n): Promise<CanonicalHumanSessionAuthority> {\n let authority = await ensureCanonicalHumanIdentityForAuthUser(db, authUserId);\n const accounts = await rawRows<{\n id: string;\n providerId: string;\n providerAccountId: string;\n }>(\n db,\n sql`\n select\n id,\n lower(provider_id) as \"providerId\",\n account_id as \"providerAccountId\"\n from auth_identities\n where user_id = ${authUserId}\n order by created_at, id\n `,\n );\n\n for (const account of accounts) {\n for (let attempt = 0; attempt < 4; attempt += 1) {\n const projection = await getCanonicalHumanIdentityProjection(db, authUserId);\n if (projection.activeIdentity.status !== \"active\") {\n return {\n identityId: projection.activeIdentity.id,\n identityRevision: projection.activeIdentity.identityRevision,\n authRevision: projection.activeIdentity.authRevision,\n identityStatus: projection.activeIdentity.status,\n };\n }\n const existing = projection.loginBindings.find(\n (binding) =>\n binding.providerId === account.providerId &&\n binding.providerAccountId === account.providerAccountId,\n );\n if (existing?.status === \"active\") {\n authority = {\n identityId: projection.activeIdentity.id,\n identityRevision: projection.activeIdentity.identityRevision,\n authRevision: projection.activeIdentity.authRevision,\n identityStatus: projection.activeIdentity.status,\n };\n break;\n }\n try {\n const result = await applyCanonicalHumanIdentityOperation(db, {\n operationId: deterministicOperationId(\n `canonical-human-account-link\\n${account.id}\\n${projection.activeIdentity.identityRevision}`,\n ),\n authUserId,\n expectedIdentityRevision: projection.activeIdentity.identityRevision,\n operationType: \"link\",\n providerId: account.providerId,\n providerAccountId: account.providerAccountId,\n reason: \"Synchronize verified authentication account\",\n });\n authority = {\n identityId: result.identity.activeIdentity.id,\n identityRevision: result.identity.activeIdentity.identityRevision,\n authRevision: result.identity.activeIdentity.authRevision,\n identityStatus: result.identity.activeIdentity.status,\n };\n break;\n } catch (error) {\n if (error instanceof CanonicalHumanIdentityConflictError && attempt < 3) continue;\n if (error instanceof CanonicalHumanIdentityAuthorityError) {\n const currentProjection = await getCanonicalHumanIdentityProjection(db, authUserId);\n if (currentProjection.activeIdentity.status !== \"active\") {\n return {\n identityId: currentProjection.activeIdentity.id,\n identityRevision: currentProjection.activeIdentity.identityRevision,\n authRevision: currentProjection.activeIdentity.authRevision,\n identityStatus: currentProjection.activeIdentity.status,\n };\n }\n }\n throw error;\n }\n }\n }\n return authority;\n}\n\nexport async function validateCanonicalHumanSession(\n db: Database,\n input: { authSessionId: string; authUserId: string; allowRecovery?: boolean },\n): Promise<boolean> {\n try {\n const [row] = await rawRows<{ valid: boolean }>(\n db,\n sql`\n select validate_canonical_human_session(\n ${input.authSessionId},\n ${input.authUserId},\n ${input.allowRecovery ?? false}\n ) as valid\n `,\n );\n return row?.valid === true;\n } catch (error) {\n mapSqlError(error);\n }\n}\n\nexport async function getCanonicalHumanIdentityProjection(\n db: Database,\n authUserId: string,\n): Promise<CanonicalHumanIdentityProjectionType> {\n try {\n const [row] = await rawRows<{ projection: unknown }>(\n db,\n sql`\n select get_canonical_human_identity_projection(${authUserId}) as projection\n `,\n );\n if (row?.projection === null || row?.projection === undefined) {\n throw new CanonicalHumanIdentityNotFoundError();\n }\n return CanonicalHumanIdentityProjection.parse(projectionValue(row.projection));\n } catch (error) {\n if (error instanceof CanonicalHumanIdentityNotFoundError) throw error;\n mapSqlError(error);\n }\n}\n\nexport type ApplyCanonicalHumanIdentityOperationInput = {\n operationId: string;\n authUserId: string;\n expectedIdentityRevision: number;\n operationType: \"link\" | \"unlink\" | \"begin_recovery\" | \"recover\";\n bindingId?: string | null;\n providerId?: string | null;\n providerAccountId?: string | null;\n reason: string;\n};\n\nexport async function applyCanonicalHumanIdentityOperation(\n db: Database,\n input: ApplyCanonicalHumanIdentityOperationInput,\n): Promise<CanonicalHumanIdentityMutationResponseType> {\n try {\n const [row] = await rawRows<{\n outcome: CanonicalHumanIdentityMutationOutcome;\n identityId: string;\n identityRevision: number | string;\n authRevision: number | string;\n }>(\n db,\n sql`\n select\n outcome,\n identity_id as \"identityId\",\n identity_revision as \"identityRevision\",\n auth_revision as \"authRevision\"\n from apply_canonical_human_identity_operation(\n ${input.operationId},\n ${input.authUserId},\n ${input.expectedIdentityRevision},\n ${input.operationType},\n ${input.bindingId ?? null},\n ${input.providerId ?? null},\n ${input.providerAccountId ?? null},\n ${input.reason}\n )\n `,\n );\n if (!row) throw new CanonicalHumanIdentityNotFoundError();\n const identity = await getCanonicalHumanIdentityProjection(db, input.authUserId);\n return CanonicalHumanIdentityMutationResponse.parse({\n outcome: row.outcome,\n operationId: input.operationId,\n identity,\n });\n } catch (error) {\n if (\n error instanceof CanonicalHumanIdentityConflictError ||\n error instanceof CanonicalHumanIdentityOperationReuseError ||\n error instanceof CanonicalHumanIdentityNotFoundError ||\n error instanceof CanonicalHumanIdentityAuthorityError\n ) {\n throw error;\n }\n mapSqlError(error);\n }\n}\n"],"mappings":"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","names":[]}