@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
@@ -3,7 +3,9 @@ import type { RlsStrategy } from "./database";
3
3
  import {
4
4
  RUNTIME_FULL_DML_TABLES,
5
5
  RUNTIME_READ_INSERT_TABLES,
6
+ RUNTIME_READ_INSERT_UPDATE_TABLES,
6
7
  RUNTIME_READ_ONLY_TABLES,
8
+ RUNTIME_READ_UPDATE_TABLES,
7
9
  } from "./runtime-posture";
8
10
  import {
9
11
  classifyRoleRelationships,
@@ -13,6 +15,8 @@ import {
13
15
 
14
16
  export type ProvisionResult = {
15
17
  appRole: string | null;
18
+ artifactOutboxDispatcherRole: string | null;
19
+ artifactMaterializerRole: string | null;
16
20
  hostExportRole: string | null;
17
21
  temporalRole: string | null;
18
22
  temporalDatabases: string[];
@@ -38,6 +42,12 @@ export type ProvisionRolesOptions = {
38
42
  rlsStrategy?: RlsStrategy;
39
43
  appRole?: string;
40
44
  appPassword?: string;
45
+ /** Global, EXECUTE-only artifact live-hint dispatcher capability. */
46
+ artifactOutboxDispatcherRole?: string;
47
+ artifactOutboxDispatcherPassword?: string;
48
+ /** Global, EXECUTE-only artifact materialization worker capability. */
49
+ artifactMaterializerRole?: string;
50
+ artifactMaterializerPassword?: string;
41
51
  /**
42
52
  * Optional cross-workspace projection role. It receives schema USAGE and
43
53
  * EXECUTE only on the host-export API; it receives no table privileges.
@@ -80,6 +90,24 @@ export async function provisionRoles(
80
90
  options.appRole ?? (process.env.OPENGENI_APP_DATABASE_USER?.trim() || "opengeni_app"),
81
91
  );
82
92
  const appPassword = options.appPassword ?? process.env.OPENGENI_APP_DATABASE_PASSWORD;
93
+ const artifactOutboxDispatcherRole = validateIdentifier(
94
+ "artifactOutboxDispatcherRole",
95
+ options.artifactOutboxDispatcherRole ??
96
+ (process.env.OPENGENI_ARTIFACT_OUTBOX_DATABASE_USER?.trim() ||
97
+ "opengeni_artifact_outbox_dispatcher"),
98
+ );
99
+ const artifactOutboxDispatcherPassword =
100
+ options.artifactOutboxDispatcherPassword ??
101
+ process.env.OPENGENI_ARTIFACT_OUTBOX_DATABASE_PASSWORD;
102
+ const artifactMaterializerRole = validateIdentifier(
103
+ "artifactMaterializerRole",
104
+ options.artifactMaterializerRole ??
105
+ (process.env.OPENGENI_ARTIFACT_MATERIALIZER_DATABASE_USER?.trim() ||
106
+ "opengeni_artifact_materializer"),
107
+ );
108
+ const artifactMaterializerPassword =
109
+ options.artifactMaterializerPassword ??
110
+ process.env.OPENGENI_ARTIFACT_MATERIALIZER_DATABASE_PASSWORD;
83
111
  const hostExportRole = validateIdentifier(
84
112
  "hostExportRole",
85
113
  options.hostExportRole ??
@@ -122,6 +150,40 @@ export async function provisionRoles(
122
150
  provisionedAppRole = appRole;
123
151
  }
124
152
 
153
+ let provisionedArtifactOutboxDispatcherRole: string | null = null;
154
+ if (artifactOutboxDispatcherPassword) {
155
+ await assertAppRoleSafeToNormalize(sql, artifactOutboxDispatcherRole);
156
+ await ensureRestrictedAppLoginRole(
157
+ sql,
158
+ artifactOutboxDispatcherRole,
159
+ artifactOutboxDispatcherPassword,
160
+ );
161
+ await grantArtifactCapabilityRoleIfSchemaExists(
162
+ sql,
163
+ artifactOutboxDispatcherRole,
164
+ schema,
165
+ "outbox",
166
+ );
167
+ provisionedArtifactOutboxDispatcherRole = artifactOutboxDispatcherRole;
168
+ }
169
+
170
+ let provisionedArtifactMaterializerRole: string | null = null;
171
+ if (artifactMaterializerPassword) {
172
+ await assertAppRoleSafeToNormalize(sql, artifactMaterializerRole);
173
+ await ensureRestrictedAppLoginRole(
174
+ sql,
175
+ artifactMaterializerRole,
176
+ artifactMaterializerPassword,
177
+ );
178
+ await grantArtifactCapabilityRoleIfSchemaExists(
179
+ sql,
180
+ artifactMaterializerRole,
181
+ schema,
182
+ "materializer",
183
+ );
184
+ provisionedArtifactMaterializerRole = artifactMaterializerRole;
185
+ }
186
+
125
187
  if (temporalPassword) {
126
188
  await ensureLoginRole(sql, temporalRole, temporalPassword);
127
189
  for (const database of temporalDatabases) {
@@ -141,6 +203,8 @@ export async function provisionRoles(
141
203
 
142
204
  return {
143
205
  appRole: provisionedAppRole,
206
+ artifactOutboxDispatcherRole: provisionedArtifactOutboxDispatcherRole,
207
+ artifactMaterializerRole: provisionedArtifactMaterializerRole,
144
208
  hostExportRole: hostExportPassword ? hostExportRole : null,
145
209
  temporalRole: temporalPassword ? temporalRole : null,
146
210
  temporalDatabases: temporalPassword ? temporalDatabases : [],
@@ -170,6 +234,64 @@ END $$;
170
234
  `);
171
235
  }
172
236
 
237
+ async function grantArtifactCapabilityRoleIfSchemaExists(
238
+ sql: postgres.Sql,
239
+ role: string,
240
+ dataSchema: string,
241
+ capability: "outbox" | "materializer",
242
+ ): Promise<void> {
243
+ const routines =
244
+ capability === "outbox"
245
+ ? [
246
+ "claim_editable_artifact_live_outbox(text,integer,integer,name)",
247
+ "mark_editable_artifact_live_outbox_published(text,text,integer,name)",
248
+ "renew_editable_artifact_live_outbox(text,text,integer,integer,name)",
249
+ "retry_editable_artifact_live_outbox(text,text,integer,integer,text,name)",
250
+ "dead_letter_editable_artifact_live_outbox(text,text,integer,text,name)",
251
+ "release_editable_artifact_live_outbox(text,text,integer,name)",
252
+ ]
253
+ : [
254
+ "claim_editable_artifact_materializations(text,integer,integer,name)",
255
+ "renew_editable_artifact_materialization(uuid,uuid,text,text,text,integer,integer,name)",
256
+ "succeed_editable_artifact_materialization(uuid,uuid,text,text,text,integer,text,text,text,bigint,text,text,timestamp with time zone,name)",
257
+ "fail_editable_artifact_materialization(uuid,uuid,text,text,text,integer,text,name)",
258
+ ];
259
+ const routineArray = `ARRAY[${routines.map(literal).join(", ")}]`;
260
+ await sql.unsafe(`
261
+ DO $$
262
+ DECLARE routine_signature text;
263
+ BEGIN
264
+ IF EXISTS (SELECT 1 FROM pg_namespace WHERE nspname = ${literal(dataSchema)})
265
+ AND EXISTS (SELECT 1 FROM pg_namespace WHERE nspname = 'opengeni_private')
266
+ THEN
267
+ EXECUTE format('GRANT CONNECT ON DATABASE %I TO %I', current_database(), ${literal(role)});
268
+ EXECUTE format('GRANT USAGE ON SCHEMA %I TO %I', ${literal(dataSchema)}, ${literal(role)});
269
+ EXECUTE format('GRANT USAGE ON SCHEMA opengeni_private TO %I', ${literal(role)});
270
+ EXECUTE format(
271
+ 'REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA %I FROM %I',
272
+ ${literal(dataSchema)}, ${literal(role)}
273
+ );
274
+ EXECUTE format(
275
+ 'REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA %I FROM %I',
276
+ ${literal(dataSchema)}, ${literal(role)}
277
+ );
278
+ EXECUTE format(
279
+ 'REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA opengeni_private FROM %I',
280
+ ${literal(role)}
281
+ );
282
+ FOREACH routine_signature IN ARRAY ${routineArray} LOOP
283
+ IF to_regprocedure('opengeni_private.' || routine_signature) IS NOT NULL THEN
284
+ EXECUTE format(
285
+ 'GRANT EXECUTE ON FUNCTION opengeni_private.%s TO %I',
286
+ routine_signature, ${literal(role)}
287
+ );
288
+ END IF;
289
+ END LOOP;
290
+ END IF;
291
+ END $$;
292
+ `);
293
+ }
294
+
173
295
  async function ensureLoginRole(sql: postgres.Sql, role: string, password: string): Promise<void> {
174
296
  await sql.unsafe(`
175
297
  DO $$
@@ -357,7 +479,9 @@ async function grantAppRoleIfSchemaExists(
357
479
  ): Promise<void> {
358
480
  const runtimeFullDmlTables = `ARRAY[${RUNTIME_FULL_DML_TABLES.map(literal).join(", ")}]`;
359
481
  const runtimeReadOnlyTables = `ARRAY[${RUNTIME_READ_ONLY_TABLES.map(literal).join(", ")}]`;
482
+ const runtimeReadUpdateTables = `ARRAY[${RUNTIME_READ_UPDATE_TABLES.map(literal).join(", ")}]`;
360
483
  const runtimeReadInsertTables = `ARRAY[${RUNTIME_READ_INSERT_TABLES.map(literal).join(", ")}]`;
484
+ const runtimeReadInsertUpdateTables = `ARRAY[${RUNTIME_READ_INSERT_UPDATE_TABLES.map(literal).join(", ")}]`;
361
485
  await sql.unsafe(`
362
486
  DO $$
363
487
  DECLARE
@@ -389,6 +513,16 @@ BEGIN
389
513
  );
390
514
  END IF;
391
515
  END LOOP;
516
+ FOREACH runtime_table IN ARRAY ${runtimeReadUpdateTables} LOOP
517
+ IF to_regclass(format('%I.%I', ${literal(schema)}, runtime_table)) IS NOT NULL THEN
518
+ EXECUTE format(
519
+ 'GRANT SELECT, UPDATE ON TABLE %I.%I TO %I',
520
+ ${literal(schema)},
521
+ runtime_table,
522
+ ${literal(role)}
523
+ );
524
+ END IF;
525
+ END LOOP;
392
526
  FOREACH runtime_table IN ARRAY ${runtimeReadInsertTables} LOOP
393
527
  IF to_regclass(format('%I.%I', ${literal(schema)}, runtime_table)) IS NOT NULL THEN
394
528
  EXECUTE format(
@@ -399,6 +533,16 @@ BEGIN
399
533
  );
400
534
  END IF;
401
535
  END LOOP;
536
+ FOREACH runtime_table IN ARRAY ${runtimeReadInsertUpdateTables} LOOP
537
+ IF to_regclass(format('%I.%I', ${literal(schema)}, runtime_table)) IS NOT NULL THEN
538
+ EXECUTE format(
539
+ 'GRANT SELECT, INSERT, UPDATE ON TABLE %I.%I TO %I',
540
+ ${literal(schema)},
541
+ runtime_table,
542
+ ${literal(role)}
543
+ );
544
+ END IF;
545
+ END LOOP;
402
546
  -- Migration 0110 creates this target-schema-local SECURITY DEFINER
403
547
  -- capability before opengeni_app may exist. Re-converge its exact EXECUTE
404
548
  -- grant here so the supported migrate-then-provision order is equivalent to
@@ -469,6 +613,28 @@ BEGIN
469
613
  ${literal(role)}
470
614
  );
471
615
  END IF;
616
+ IF to_regprocedure(
617
+ format(
618
+ '%I.create_task_note_for_attempt(uuid,uuid,uuid,uuid,uuid,integer,uuid,text,text,integer)',
619
+ ${literal(schema)}
620
+ )
621
+ ) IS NOT NULL THEN
622
+ EXECUTE format(
623
+ 'GRANT EXECUTE ON FUNCTION %I.create_task_note_for_attempt(uuid, uuid, uuid, uuid, uuid, integer, uuid, text, text, integer) TO %I',
624
+ ${literal(schema)},
625
+ ${literal(role)}
626
+ );
627
+ EXECUTE format(
628
+ 'GRANT EXECUTE ON FUNCTION %I.archive_task_note_for_attempt(uuid, uuid, uuid, uuid, uuid, integer, uuid, uuid, integer, text) TO %I',
629
+ ${literal(schema)},
630
+ ${literal(role)}
631
+ );
632
+ EXECUTE format(
633
+ 'GRANT EXECUTE ON FUNCTION %I.list_task_notes_for_attempt(uuid, uuid, uuid, uuid, uuid, integer, boolean, integer) TO %I',
634
+ ${literal(schema)},
635
+ ${literal(role)}
636
+ );
637
+ END IF;
472
638
  IF to_regprocedure(
473
639
  format(
474
640
  '%I.workspace_instruction_policy_get_or_create_snapshot(uuid,uuid,uuid,uuid,uuid,integer)',
@@ -481,6 +647,84 @@ BEGIN
481
647
  ${literal(role)}
482
648
  );
483
649
  END IF;
650
+ IF to_regprocedure(
651
+ format(
652
+ '%I.company_profile_apply_activation(uuid,text,uuid,uuid,uuid,uuid,bigint,text,text,text,text)',
653
+ ${literal(schema)}
654
+ )
655
+ ) IS NOT NULL THEN
656
+ EXECUTE format(
657
+ 'GRANT EXECUTE ON FUNCTION %I.company_profile_apply_activation(uuid, text, uuid, uuid, uuid, uuid, bigint, text, text, text, text) TO %I',
658
+ ${literal(schema)},
659
+ ${literal(role)}
660
+ );
661
+ END IF;
662
+ IF to_regprocedure(
663
+ format(
664
+ '%I.company_profile_get_or_create_snapshot(uuid,uuid,uuid,uuid,uuid,integer)',
665
+ ${literal(schema)}
666
+ )
667
+ ) IS NOT NULL THEN
668
+ EXECUTE format(
669
+ 'GRANT EXECUTE ON FUNCTION %I.company_profile_get_or_create_snapshot(uuid, uuid, uuid, uuid, uuid, integer) TO %I',
670
+ ${literal(schema)},
671
+ ${literal(role)}
672
+ );
673
+ END IF;
674
+ IF to_regprocedure(
675
+ format(
676
+ '%I.workspace_learning_policy_apply_activation(uuid,text,uuid,uuid,uuid,uuid,bigint,text,text,text)',
677
+ ${literal(schema)}
678
+ )
679
+ ) IS NOT NULL THEN
680
+ EXECUTE format(
681
+ 'GRANT EXECUTE ON FUNCTION %I.workspace_learning_policy_apply_activation(uuid, text, uuid, uuid, uuid, uuid, bigint, text, text, text) TO %I',
682
+ ${literal(schema)},
683
+ ${literal(role)}
684
+ );
685
+ END IF;
686
+ IF to_regprocedure(
687
+ format('%I.workspace_learning_policy_source_overrides_valid(jsonb)', ${literal(schema)})
688
+ ) IS NOT NULL THEN
689
+ EXECUTE format(
690
+ 'GRANT EXECUTE ON FUNCTION %I.workspace_learning_policy_source_overrides_valid(jsonb) TO %I',
691
+ ${literal(schema)},
692
+ ${literal(role)}
693
+ );
694
+ END IF;
695
+ IF to_regprocedure(
696
+ format('%I.workspace_learning_policy_hash(text,jsonb)', ${literal(schema)})
697
+ ) IS NOT NULL THEN
698
+ EXECUTE format(
699
+ 'GRANT EXECUTE ON FUNCTION %I.workspace_learning_policy_hash(text, jsonb) TO %I',
700
+ ${literal(schema)},
701
+ ${literal(role)}
702
+ );
703
+ END IF;
704
+ IF to_regprocedure(
705
+ format(
706
+ '%I.workspace_learning_policy_get_or_create_snapshot(uuid,uuid,uuid,uuid,uuid,integer)',
707
+ ${literal(schema)}
708
+ )
709
+ ) IS NOT NULL THEN
710
+ EXECUTE format(
711
+ 'GRANT EXECUTE ON FUNCTION %I.workspace_learning_policy_get_or_create_snapshot(uuid, uuid, uuid, uuid, uuid, integer) TO %I',
712
+ ${literal(schema)},
713
+ ${literal(role)}
714
+ );
715
+ END IF;
716
+ IF to_regprocedure(
717
+ format(
718
+ '%I.slack_task_policy_update(uuid,text,uuid,uuid,jsonb,uuid,bigint,text,text)',
719
+ ${literal(schema)}
720
+ )
721
+ ) IS NOT NULL THEN
722
+ EXECUTE format(
723
+ 'GRANT EXECUTE ON FUNCTION %I.slack_task_policy_update(uuid, text, uuid, uuid, jsonb, uuid, bigint, text, text) TO %I',
724
+ ${literal(schema)},
725
+ ${literal(role)}
726
+ );
727
+ END IF;
484
728
  IF to_regprocedure(
485
729
  format(
486
730
  '%I.scoped_knowledge_apply_lifecycle(uuid,text,uuid,text,bigint,text,text,text,text,text,text)',
@@ -493,6 +737,224 @@ BEGIN
493
737
  ${literal(role)}
494
738
  );
495
739
  END IF;
740
+ -- Migration 0197 creates this target-schema-local SECURITY DEFINER lock
741
+ -- before opengeni_app may exist. Re-converge only its exact EXECUTE grant
742
+ -- for the supported migrate-then-provision install order; keep PUBLIC
743
+ -- revoked and do not widen table privileges.
744
+ IF to_regprocedure(
745
+ format(
746
+ '%I.knowledge_source_sync_lock_authority(uuid,uuid,uuid)',
747
+ ${literal(schema)}
748
+ )
749
+ ) IS NOT NULL THEN
750
+ EXECUTE format(
751
+ 'REVOKE ALL ON FUNCTION %I.knowledge_source_sync_lock_authority(uuid, uuid, uuid) FROM PUBLIC',
752
+ ${literal(schema)}
753
+ );
754
+ EXECUTE format(
755
+ 'GRANT EXECUTE ON FUNCTION %I.knowledge_source_sync_lock_authority(uuid, uuid, uuid) TO %I',
756
+ ${literal(schema)},
757
+ ${literal(role)}
758
+ );
759
+ END IF;
760
+ IF to_regprocedure(
761
+ format(
762
+ '%I.ensure_managed_human_personal_workspace(uuid,text,uuid)',
763
+ ${literal(schema)}
764
+ )
765
+ ) IS NOT NULL THEN
766
+ EXECUTE format(
767
+ 'REVOKE ALL ON FUNCTION %I.ensure_managed_human_personal_workspace(uuid, text, uuid) FROM PUBLIC',
768
+ ${literal(schema)}
769
+ );
770
+ EXECUTE format(
771
+ 'GRANT EXECUTE ON FUNCTION %I.ensure_managed_human_personal_workspace(uuid, text, uuid) TO %I',
772
+ ${literal(schema)},
773
+ ${literal(role)}
774
+ );
775
+ END IF;
776
+ IF to_regprocedure(format('%I.ensure_canonical_human_identity(text,text)', ${literal(schema)})) IS NOT NULL THEN
777
+ EXECUTE format(
778
+ 'REVOKE ALL ON FUNCTION %I.ensure_canonical_human_identity(text, text) FROM PUBLIC',
779
+ ${literal(schema)}
780
+ );
781
+ EXECUTE format(
782
+ 'GRANT EXECUTE ON FUNCTION %I.ensure_canonical_human_identity(text, text) TO %I',
783
+ ${literal(schema)},
784
+ ${literal(role)}
785
+ );
786
+ END IF;
787
+ IF to_regprocedure(format('%I.validate_canonical_human_session(text,text,boolean)', ${literal(schema)})) IS NOT NULL THEN
788
+ EXECUTE format(
789
+ 'REVOKE ALL ON FUNCTION %I.validate_canonical_human_session(text, text, boolean) FROM PUBLIC',
790
+ ${literal(schema)}
791
+ );
792
+ EXECUTE format(
793
+ 'GRANT EXECUTE ON FUNCTION %I.validate_canonical_human_session(text, text, boolean) TO %I',
794
+ ${literal(schema)},
795
+ ${literal(role)}
796
+ );
797
+ END IF;
798
+ IF to_regprocedure(format('%I.get_canonical_human_identity_projection(text)', ${literal(schema)})) IS NOT NULL THEN
799
+ EXECUTE format(
800
+ 'REVOKE ALL ON FUNCTION %I.get_canonical_human_identity_projection(text) FROM PUBLIC',
801
+ ${literal(schema)}
802
+ );
803
+ EXECUTE format(
804
+ 'GRANT EXECUTE ON FUNCTION %I.get_canonical_human_identity_projection(text) TO %I',
805
+ ${literal(schema)},
806
+ ${literal(role)}
807
+ );
808
+ END IF;
809
+ IF to_regprocedure(format('%I.apply_canonical_human_identity_operation(uuid,text,bigint,text,uuid,text,text,text)', ${literal(schema)})) IS NOT NULL THEN
810
+ EXECUTE format(
811
+ 'REVOKE ALL ON FUNCTION %I.apply_canonical_human_identity_operation(uuid, text, bigint, text, uuid, text, text, text) FROM PUBLIC',
812
+ ${literal(schema)}
813
+ );
814
+ EXECUTE format(
815
+ 'GRANT EXECUTE ON FUNCTION %I.apply_canonical_human_identity_operation(uuid, text, bigint, text, uuid, text, text, text) TO %I',
816
+ ${literal(schema)},
817
+ ${literal(role)}
818
+ );
819
+ END IF;
820
+ -- Migration 0225 creates these target-schema-local session visibility
821
+ -- capabilities before opengeni_app may exist. Re-converge their exact
822
+ -- EXECUTE grants for migrate-then-provision installs without granting
823
+ -- blanket execution on target-schema routines.
824
+ IF to_regprocedure(
825
+ format(
826
+ '%I.session_private_actor_visible(uuid,uuid,uuid,text)',
827
+ ${literal(schema)}
828
+ )
829
+ ) IS NOT NULL THEN
830
+ EXECUTE format(
831
+ 'REVOKE ALL ON FUNCTION %I.session_private_actor_visible(uuid, uuid, uuid, text) FROM PUBLIC',
832
+ ${literal(schema)}
833
+ );
834
+ EXECUTE format(
835
+ 'GRANT EXECUTE ON FUNCTION %I.session_private_actor_visible(uuid, uuid, uuid, text) TO %I',
836
+ ${literal(schema)},
837
+ ${literal(role)}
838
+ );
839
+ END IF;
840
+ IF to_regprocedure(
841
+ format(
842
+ '%I.session_reference_visible(uuid,uuid,uuid)',
843
+ ${literal(schema)}
844
+ )
845
+ ) IS NOT NULL THEN
846
+ EXECUTE format(
847
+ 'REVOKE ALL ON FUNCTION %I.session_reference_visible(uuid, uuid, uuid) FROM PUBLIC',
848
+ ${literal(schema)}
849
+ );
850
+ EXECUTE format(
851
+ 'GRANT EXECUTE ON FUNCTION %I.session_reference_visible(uuid, uuid, uuid) TO %I',
852
+ ${literal(schema)},
853
+ ${literal(role)}
854
+ );
855
+ END IF;
856
+ IF to_regprocedure(
857
+ format(
858
+ '%I.transition_session_visibility(uuid,uuid,uuid,text,text,integer,text,text)',
859
+ ${literal(schema)}
860
+ )
861
+ ) IS NOT NULL THEN
862
+ EXECUTE format(
863
+ 'REVOKE ALL ON FUNCTION %I.transition_session_visibility(uuid, uuid, uuid, text, text, integer, text, text) FROM PUBLIC',
864
+ ${literal(schema)}
865
+ );
866
+ EXECUTE format(
867
+ 'GRANT EXECUTE ON FUNCTION %I.transition_session_visibility(uuid, uuid, uuid, text, text, integer, text, text) TO %I',
868
+ ${literal(schema)},
869
+ ${literal(role)}
870
+ );
871
+ END IF;
872
+ IF to_regprocedure(
873
+ format(
874
+ '%I.fork_session_content(uuid,uuid,uuid,text,uuid,text,text,text)',
875
+ ${literal(schema)}
876
+ )
877
+ ) IS NOT NULL THEN
878
+ EXECUTE format(
879
+ 'REVOKE ALL ON FUNCTION %I.fork_session_content(uuid, uuid, uuid, text, uuid, text, text, text) FROM PUBLIC',
880
+ ${literal(schema)}
881
+ );
882
+ EXECUTE format(
883
+ 'GRANT EXECUTE ON FUNCTION %I.fork_session_content(uuid, uuid, uuid, text, uuid, text, text, text) TO %I',
884
+ ${literal(schema)},
885
+ ${literal(role)}
886
+ );
887
+ END IF;
888
+ IF to_regprocedure(
889
+ format(
890
+ '%I.create_xai_subscription_credential(uuid,uuid,text,text,text,text,text,text,text,timestamptz)',
891
+ ${literal(schema)}
892
+ )
893
+ ) IS NOT NULL THEN
894
+ EXECUTE format(
895
+ 'REVOKE ALL ON FUNCTION %I.create_xai_subscription_credential(uuid, uuid, text, text, text, text, text, text, text, timestamptz) FROM PUBLIC',
896
+ ${literal(schema)}
897
+ );
898
+ EXECUTE format(
899
+ 'GRANT EXECUTE ON FUNCTION %I.create_xai_subscription_credential(uuid, uuid, text, text, text, text, text, text, text, timestamptz) TO %I',
900
+ ${literal(schema)},
901
+ ${literal(role)}
902
+ );
903
+ EXECUTE format(
904
+ 'REVOKE ALL ON FUNCTION %I.disconnect_xai_subscription_credential(uuid, uuid, text, uuid, jsonb) FROM PUBLIC',
905
+ ${literal(schema)}
906
+ );
907
+ EXECUTE format(
908
+ 'GRANT EXECUTE ON FUNCTION %I.disconnect_xai_subscription_credential(uuid, uuid, text, uuid, jsonb) TO %I',
909
+ ${literal(schema)},
910
+ ${literal(role)}
911
+ );
912
+ EXECUTE format(
913
+ 'REVOKE ALL ON FUNCTION %I.resolve_xai_authority_pool(uuid, uuid, text, jsonb) FROM PUBLIC',
914
+ ${literal(schema)}
915
+ );
916
+ EXECUTE format(
917
+ 'GRANT EXECUTE ON FUNCTION %I.resolve_xai_authority_pool(uuid, uuid, text, jsonb) TO %I',
918
+ ${literal(schema)},
919
+ ${literal(role)}
920
+ );
921
+ EXECUTE format(
922
+ 'REVOKE ALL ON FUNCTION %I.revalidate_xai_subscription_authority(uuid, text, uuid, jsonb) FROM PUBLIC',
923
+ ${literal(schema)}
924
+ );
925
+ EXECUTE format(
926
+ 'GRANT EXECUTE ON FUNCTION %I.revalidate_xai_subscription_authority(uuid, text, uuid, jsonb) TO %I',
927
+ ${literal(schema)},
928
+ ${literal(role)}
929
+ );
930
+ EXECUTE format(
931
+ 'REVOKE ALL ON FUNCTION %I.xai_provider_account_authority_snapshot_v1_valid(jsonb) FROM PUBLIC',
932
+ ${literal(schema)}
933
+ );
934
+ EXECUTE format(
935
+ 'GRANT EXECUTE ON FUNCTION %I.xai_provider_account_authority_snapshot_v1_valid(jsonb) TO %I',
936
+ ${literal(schema)},
937
+ ${literal(role)}
938
+ );
939
+ EXECUTE format(
940
+ 'REVOKE ALL ON FUNCTION %I.xai_subscription_authority_live(uuid, uuid, text, uuid, text, uuid, uuid, bigint) FROM PUBLIC',
941
+ ${literal(schema)}
942
+ );
943
+ EXECUTE format(
944
+ 'GRANT EXECUTE ON FUNCTION %I.xai_subscription_authority_live(uuid, uuid, text, uuid, text, uuid, uuid, bigint) TO %I',
945
+ ${literal(schema)},
946
+ ${literal(role)}
947
+ );
948
+ EXECUTE format(
949
+ 'REVOKE ALL ON FUNCTION %I.xai_subscription_pool_visible(uuid, uuid, text, text, uuid) FROM PUBLIC',
950
+ ${literal(schema)}
951
+ );
952
+ EXECUTE format(
953
+ 'GRANT EXECUTE ON FUNCTION %I.xai_subscription_pool_visible(uuid, uuid, text, text, uuid) TO %I',
954
+ ${literal(schema)},
955
+ ${literal(role)}
956
+ );
957
+ END IF;
496
958
  IF to_regprocedure(
497
959
  format(
498
960
  '%I.scoped_knowledge_advance_source_acl(uuid,uuid,bigint,bigint,uuid,text,text,text,text,text,text)',
@@ -548,10 +1010,81 @@ BEGIN
548
1010
  EXECUTE format('REVOKE CREATE ON SCHEMA opengeni_private FROM %I', ${literal(role)});
549
1011
  EXECUTE format('GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA opengeni_private TO %I', ${literal(role)});
550
1012
  EXECUTE format(
551
- 'ALTER DEFAULT PRIVILEGES FOR ROLE %I IN SCHEMA opengeni_private GRANT EXECUTE ON FUNCTIONS TO %I',
1013
+ 'ALTER DEFAULT PRIVILEGES FOR ROLE %I IN SCHEMA opengeni_private REVOKE EXECUTE ON FUNCTIONS FROM %I',
552
1014
  owner_role,
553
1015
  ${literal(role)}
554
1016
  );
1017
+ -- Global cross-workspace artifact workers are separate capabilities. Never
1018
+ -- let the generic tenant-scoped app role inherit them from the historical
1019
+ -- blanket grant of already-installed helpers.
1020
+ IF to_regprocedure('opengeni_private.claim_editable_artifact_live_outbox(text,integer,integer,name)') IS NOT NULL THEN
1021
+ EXECUTE format(
1022
+ 'REVOKE EXECUTE ON FUNCTION opengeni_private.claim_editable_artifact_live_outbox(text, integer, integer, name) FROM %I',
1023
+ ${literal(role)}
1024
+ );
1025
+ EXECUTE format(
1026
+ 'REVOKE EXECUTE ON FUNCTION opengeni_private.mark_editable_artifact_live_outbox_published(text, text, integer, name) FROM %I',
1027
+ ${literal(role)}
1028
+ );
1029
+ EXECUTE format(
1030
+ 'REVOKE EXECUTE ON FUNCTION opengeni_private.renew_editable_artifact_live_outbox(text, text, integer, integer, name) FROM %I',
1031
+ ${literal(role)}
1032
+ );
1033
+ EXECUTE format(
1034
+ 'REVOKE EXECUTE ON FUNCTION opengeni_private.retry_editable_artifact_live_outbox(text, text, integer, integer, text, name) FROM %I',
1035
+ ${literal(role)}
1036
+ );
1037
+ EXECUTE format(
1038
+ 'REVOKE EXECUTE ON FUNCTION opengeni_private.dead_letter_editable_artifact_live_outbox(text, text, integer, text, name) FROM %I',
1039
+ ${literal(role)}
1040
+ );
1041
+ EXECUTE format(
1042
+ 'REVOKE EXECUTE ON FUNCTION opengeni_private.release_editable_artifact_live_outbox(text, text, integer, name) FROM %I',
1043
+ ${literal(role)}
1044
+ );
1045
+ END IF;
1046
+ IF to_regprocedure('opengeni_private.claim_editable_artifact_materializations(text,integer,integer,name)') IS NOT NULL THEN
1047
+ EXECUTE format(
1048
+ 'REVOKE EXECUTE ON FUNCTION opengeni_private.claim_editable_artifact_materializations(text, integer, integer, name) FROM %I',
1049
+ ${literal(role)}
1050
+ );
1051
+ EXECUTE format(
1052
+ 'REVOKE EXECUTE ON FUNCTION opengeni_private.renew_editable_artifact_materialization(uuid, uuid, text, text, text, integer, integer, name) FROM %I',
1053
+ ${literal(role)}
1054
+ );
1055
+ EXECUTE format(
1056
+ 'REVOKE EXECUTE ON FUNCTION opengeni_private.succeed_editable_artifact_materialization(uuid, uuid, text, text, text, integer, text, text, text, bigint, text, text, timestamptz, name) FROM %I',
1057
+ ${literal(role)}
1058
+ );
1059
+ EXECUTE format(
1060
+ 'REVOKE EXECUTE ON FUNCTION opengeni_private.fail_editable_artifact_materialization(uuid, uuid, text, text, text, integer, text, name) FROM %I',
1061
+ ${literal(role)}
1062
+ );
1063
+ END IF;
1064
+ IF to_regprocedure('opengeni_private.consume_editable_artifact_live_ticket(text,name)') IS NOT NULL THEN
1065
+ EXECUTE format(
1066
+ 'REVOKE EXECUTE ON FUNCTION opengeni_private.resolve_editable_artifact_ticket_data_schema(name) FROM %I',
1067
+ ${literal(role)}
1068
+ );
1069
+ EXECUTE format(
1070
+ 'GRANT EXECUTE ON FUNCTION opengeni_private.put_editable_artifact_live_ticket(text, uuid, uuid, text, text, text, text, text, text, text, text, integer, text, boolean, integer, timestamptz, timestamptz, name) TO %I',
1071
+ ${literal(role)}
1072
+ );
1073
+ EXECUTE format(
1074
+ 'GRANT EXECUTE ON FUNCTION opengeni_private.consume_editable_artifact_live_ticket(text, name) TO %I',
1075
+ ${literal(role)}
1076
+ );
1077
+ EXECUTE format(
1078
+ 'GRANT EXECUTE ON FUNCTION opengeni_private.cleanup_expired_editable_artifact_live_tickets(integer, name) TO %I',
1079
+ ${literal(role)}
1080
+ );
1081
+ END IF;
1082
+ IF to_regprocedure('opengeni_private.authorize_editable_artifact_actor(uuid,uuid,text,text,text,text,text,text,integer,text,text,name)') IS NOT NULL THEN
1083
+ EXECUTE format(
1084
+ 'GRANT EXECUTE ON FUNCTION opengeni_private.authorize_editable_artifact_actor(uuid, uuid, text, text, text, text, text, text, integer, text, text, name) TO %I',
1085
+ ${literal(role)}
1086
+ );
1087
+ END IF;
555
1088
  END IF;
556
1089
  END $$;
557
1090
  `);
@@ -4,9 +4,12 @@ import {
4
4
  createDb,
5
5
  FORCE_RLS_TABLES,
6
6
  PROTECTED_NO_DIRECT_DML_TABLES,
7
+ RUNTIME_TARGET_SCHEMA_CAPABILITY_ROUTINES,
7
8
  RUNTIME_FULL_DML_TABLES,
8
9
  RUNTIME_READ_INSERT_TABLES,
10
+ RUNTIME_READ_INSERT_UPDATE_TABLES,
9
11
  RUNTIME_READ_ONLY_TABLES,
12
+ RUNTIME_READ_UPDATE_TABLES,
10
13
  } from "./index";
11
14
 
12
15
  const settings = getSettings();
@@ -48,8 +51,14 @@ try {
48
51
  !table.trigger,
49
52
  ).length,
50
53
  declaredReadOnlyTables: RUNTIME_READ_ONLY_TABLES.length,
54
+ declaredReadUpdateTables: RUNTIME_READ_UPDATE_TABLES.length,
51
55
  declaredReadInsertTables: RUNTIME_READ_INSERT_TABLES.length,
56
+ declaredReadInsertUpdateTables: RUNTIME_READ_INSERT_UPDATE_TABLES.length,
52
57
  declaredProtectedNoDirectDmlTables: PROTECTED_NO_DIRECT_DML_TABLES.length,
58
+ declaredTargetSchemaCapabilities: RUNTIME_TARGET_SCHEMA_CAPABILITY_ROUTINES.length,
59
+ executableTargetSchemaCapabilities: posture.targetRoutines.filter(
60
+ (routine) => routine.execute && !routine.publicExecute && routine.securityDefiner,
61
+ ).length,
53
62
  }),
54
63
  );
55
64
  } finally {