@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,393 @@
1
+ -- deployment-mode: rolling
2
+ SET lock_timeout = '5s';
3
+ SET statement_timeout = '30s';
4
+
5
+ CREATE TABLE "memory_slack_publication_configurations" (
6
+ "id" uuid PRIMARY KEY DEFAULT gen_random_uuid(),
7
+ "account_id" uuid NOT NULL REFERENCES "managed_accounts"("id") ON DELETE CASCADE,
8
+ "workspace_id" uuid NOT NULL REFERENCES "workspaces"("id") ON DELETE CASCADE,
9
+ "revision" integer NOT NULL,
10
+ "enabled" boolean NOT NULL,
11
+ "connection_id" uuid,
12
+ "slack_team_id" text,
13
+ "slack_channel_id" text,
14
+ "slack_channel_name" text,
15
+ "auto_importances" text[] NOT NULL DEFAULT ARRAY['major']::text[],
16
+ "review_importances" text[] NOT NULL DEFAULT ARRAY['normal']::text[],
17
+ "created_by_subject_id" text NOT NULL,
18
+ "created_at" timestamptz NOT NULL DEFAULT now(),
19
+ CONSTRAINT "memory_slack_publication_configurations_workspace_revision_uq"
20
+ UNIQUE ("workspace_id", "revision"),
21
+ CONSTRAINT "memory_slack_publication_configurations_revision_check"
22
+ CHECK ("revision" > 0),
23
+ CONSTRAINT "memory_slack_publication_configurations_destination_check"
24
+ CHECK (
25
+ NOT "enabled"
26
+ OR (
27
+ "connection_id" IS NOT NULL
28
+ AND octet_length("slack_team_id") BETWEEN 1 AND 64
29
+ AND octet_length("slack_channel_id") BETWEEN 1 AND 64
30
+ )
31
+ ),
32
+ CONSTRAINT "memory_slack_publication_configurations_channel_name_check"
33
+ CHECK (
34
+ "slack_channel_name" IS NULL
35
+ OR octet_length("slack_channel_name") BETWEEN 1 AND 256
36
+ ),
37
+ CONSTRAINT "memory_slack_publication_configurations_policy_check"
38
+ CHECK (
39
+ "auto_importances" <@ ARRAY['major', 'normal', 'minor']::text[]
40
+ AND "review_importances" <@ ARRAY['major', 'normal', 'minor']::text[]
41
+ AND cardinality("auto_importances") <= 3
42
+ AND cardinality("review_importances") <= 3
43
+ AND NOT ("auto_importances" && "review_importances")
44
+ ),
45
+ CONSTRAINT "memory_slack_publication_configurations_actor_check"
46
+ CHECK (octet_length("created_by_subject_id") BETWEEN 1 AND 1024)
47
+ );
48
+
49
+ CREATE INDEX "memory_slack_publication_configurations_workspace_created_idx"
50
+ ON "memory_slack_publication_configurations" ("workspace_id", "revision" DESC);
51
+
52
+ CREATE TABLE "memory_slack_publications" (
53
+ "id" uuid PRIMARY KEY DEFAULT gen_random_uuid(),
54
+ "account_id" uuid NOT NULL REFERENCES "managed_accounts"("id") ON DELETE CASCADE,
55
+ "workspace_id" uuid NOT NULL REFERENCES "workspaces"("id") ON DELETE CASCADE,
56
+ "configuration_id" uuid NOT NULL REFERENCES "memory_slack_publication_configurations"("id") ON DELETE RESTRICT,
57
+ "configuration_revision" integer NOT NULL,
58
+ "connection_id" uuid NOT NULL,
59
+ "slack_team_id" text NOT NULL,
60
+ "slack_channel_id" text NOT NULL,
61
+ "source_type" text NOT NULL,
62
+ "source_id" text NOT NULL,
63
+ "source_version" text,
64
+ "source_idempotency_key" text NOT NULL,
65
+ "projection" jsonb NOT NULL,
66
+ "projection_sha256" text NOT NULL,
67
+ "importance" text NOT NULL,
68
+ "delivery_mode" text NOT NULL,
69
+ "state" text NOT NULL,
70
+ "operation_id" uuid NOT NULL,
71
+ "initiator_kind" text NOT NULL,
72
+ "initiator_subject_id" text NOT NULL,
73
+ "initiating_human_subject_id" text,
74
+ "session_id" uuid,
75
+ "turn_id" uuid,
76
+ "attempt_id" uuid,
77
+ "claim_holder_id" uuid,
78
+ "claim_expires_at" timestamptz,
79
+ "attempt_count" integer NOT NULL DEFAULT 0,
80
+ "retry_at" timestamptz,
81
+ "last_error_code" text,
82
+ "slack_message_timestamp" text,
83
+ "delivered_at" timestamptz,
84
+ "terminal_at" timestamptz,
85
+ "created_at" timestamptz NOT NULL DEFAULT now(),
86
+ "updated_at" timestamptz NOT NULL DEFAULT now(),
87
+ CONSTRAINT "memory_slack_publications_source_uq"
88
+ UNIQUE ("workspace_id", "source_idempotency_key"),
89
+ CONSTRAINT "memory_slack_publications_operation_uq"
90
+ UNIQUE ("workspace_id", "operation_id"),
91
+ CONSTRAINT "memory_slack_publications_source_type_check"
92
+ CHECK ("source_type" IN ('workspace_memory', 'durable_learning')),
93
+ CONSTRAINT "memory_slack_publications_source_check"
94
+ CHECK (
95
+ octet_length("source_id") BETWEEN 1 AND 1024
96
+ AND ("source_version" IS NULL OR octet_length("source_version") BETWEEN 1 AND 512)
97
+ AND octet_length("source_idempotency_key") BETWEEN 1 AND 256
98
+ ),
99
+ CONSTRAINT "memory_slack_publications_projection_check"
100
+ CHECK (
101
+ jsonb_typeof("projection") = 'object'
102
+ AND octet_length("projection"::text) BETWEEN 2 AND 8192
103
+ AND "projection_sha256" ~ '^[0-9a-f]{64}$'
104
+ ),
105
+ CONSTRAINT "memory_slack_publications_distribution_check"
106
+ CHECK (
107
+ "importance" IN ('major', 'normal', 'minor')
108
+ AND "delivery_mode" IN ('auto', 'review')
109
+ ),
110
+ CONSTRAINT "memory_slack_publications_state_check"
111
+ CHECK (
112
+ "state" IN (
113
+ 'review_pending', 'queued', 'delivering', 'retry_wait',
114
+ 'delivered', 'rejected', 'failed', 'cancelled'
115
+ )
116
+ ),
117
+ CONSTRAINT "memory_slack_publications_destination_check"
118
+ CHECK (
119
+ "configuration_revision" > 0
120
+ AND octet_length("slack_team_id") BETWEEN 1 AND 64
121
+ AND octet_length("slack_channel_id") BETWEEN 1 AND 64
122
+ ),
123
+ CONSTRAINT "memory_slack_publications_initiator_check"
124
+ CHECK (
125
+ "initiator_kind" IN ('human', 'agent', 'service')
126
+ AND octet_length("initiator_subject_id") BETWEEN 1 AND 1024
127
+ AND (
128
+ "initiating_human_subject_id" IS NULL
129
+ OR octet_length("initiating_human_subject_id") BETWEEN 1 AND 1024
130
+ )
131
+ ),
132
+ CONSTRAINT "memory_slack_publications_claim_check"
133
+ CHECK (
134
+ ("state" = 'delivering' AND "claim_holder_id" IS NOT NULL AND "claim_expires_at" IS NOT NULL AND "retry_at" IS NULL)
135
+ OR ("state" = 'retry_wait' AND "claim_holder_id" IS NULL AND "claim_expires_at" IS NULL AND "retry_at" IS NOT NULL)
136
+ OR ("state" NOT IN ('delivering', 'retry_wait') AND "claim_holder_id" IS NULL AND "claim_expires_at" IS NULL AND "retry_at" IS NULL)
137
+ ),
138
+ CONSTRAINT "memory_slack_publications_attempt_check"
139
+ CHECK ("attempt_count" >= 0),
140
+ CONSTRAINT "memory_slack_publications_error_check"
141
+ CHECK (
142
+ "last_error_code" IS NULL
143
+ OR octet_length("last_error_code") BETWEEN 1 AND 128
144
+ ),
145
+ CONSTRAINT "memory_slack_publications_terminal_check"
146
+ CHECK (
147
+ (
148
+ "state" = 'delivered'
149
+ AND "claim_holder_id" IS NULL
150
+ AND "claim_expires_at" IS NULL
151
+ AND "retry_at" IS NULL
152
+ AND "slack_message_timestamp" IS NOT NULL
153
+ AND "delivered_at" IS NOT NULL
154
+ AND "terminal_at" IS NOT NULL
155
+ )
156
+ OR (
157
+ "state" IN ('rejected', 'failed', 'cancelled')
158
+ AND "claim_holder_id" IS NULL
159
+ AND "claim_expires_at" IS NULL
160
+ AND "retry_at" IS NULL
161
+ AND "terminal_at" IS NOT NULL
162
+ )
163
+ OR (
164
+ "state" NOT IN ('delivered', 'rejected', 'failed', 'cancelled')
165
+ AND "slack_message_timestamp" IS NULL
166
+ AND "delivered_at" IS NULL
167
+ AND "terminal_at" IS NULL
168
+ )
169
+ )
170
+ );
171
+
172
+ CREATE INDEX "memory_slack_publications_claim_idx"
173
+ ON "memory_slack_publications" ("state", "retry_at", "created_at", "id")
174
+ WHERE "state" IN ('queued', 'retry_wait', 'delivering');
175
+
176
+ CREATE INDEX "memory_slack_publications_workspace_history_idx"
177
+ ON "memory_slack_publications" ("workspace_id", "created_at" DESC, "id" DESC);
178
+
179
+ CREATE TABLE "memory_slack_publication_receipts" (
180
+ "id" uuid PRIMARY KEY DEFAULT gen_random_uuid(),
181
+ "account_id" uuid NOT NULL REFERENCES "managed_accounts"("id") ON DELETE CASCADE,
182
+ "workspace_id" uuid NOT NULL REFERENCES "workspaces"("id") ON DELETE CASCADE,
183
+ "publication_id" uuid NOT NULL REFERENCES "memory_slack_publications"("id") ON DELETE CASCADE,
184
+ "sequence" integer NOT NULL,
185
+ "kind" text NOT NULL,
186
+ "state" text NOT NULL,
187
+ "attempt_number" integer NOT NULL,
188
+ "actor_kind" text NOT NULL,
189
+ "actor_subject_id" text NOT NULL,
190
+ "operation_id" uuid NOT NULL,
191
+ "error_code" text,
192
+ "retry_at" timestamptz,
193
+ "slack_channel_id" text,
194
+ "slack_message_timestamp" text,
195
+ "created_at" timestamptz NOT NULL DEFAULT now(),
196
+ CONSTRAINT "memory_slack_publication_receipts_sequence_uq"
197
+ UNIQUE ("publication_id", "sequence"),
198
+ CONSTRAINT "memory_slack_publication_receipts_kind_check"
199
+ CHECK (
200
+ "kind" IN (
201
+ 'enqueued', 'review_approved', 'review_rejected', 'delivery_claimed',
202
+ 'retry_scheduled', 'delivered', 'failed', 'cancelled', 'manual_retry'
203
+ )
204
+ ),
205
+ CONSTRAINT "memory_slack_publication_receipts_state_check"
206
+ CHECK (
207
+ "state" IN (
208
+ 'review_pending', 'queued', 'delivering', 'retry_wait',
209
+ 'delivered', 'rejected', 'failed', 'cancelled'
210
+ )
211
+ ),
212
+ CONSTRAINT "memory_slack_publication_receipts_attempt_check"
213
+ CHECK ("sequence" > 0 AND "attempt_number" >= 0),
214
+ CONSTRAINT "memory_slack_publication_receipts_actor_check"
215
+ CHECK (
216
+ "actor_kind" IN ('human', 'agent', 'service')
217
+ AND octet_length("actor_subject_id") BETWEEN 1 AND 1024
218
+ ),
219
+ CONSTRAINT "memory_slack_publication_receipts_error_check"
220
+ CHECK ("error_code" IS NULL OR octet_length("error_code") BETWEEN 1 AND 128),
221
+ CONSTRAINT "memory_slack_publication_receipts_provider_check"
222
+ CHECK (
223
+ ("slack_channel_id" IS NULL) = ("slack_message_timestamp" IS NULL)
224
+ AND ("slack_channel_id" IS NULL OR octet_length("slack_channel_id") BETWEEN 1 AND 64)
225
+ AND (
226
+ "slack_message_timestamp" IS NULL
227
+ OR octet_length("slack_message_timestamp") BETWEEN 1 AND 64
228
+ )
229
+ )
230
+ );
231
+
232
+ CREATE INDEX "memory_slack_publication_receipts_workspace_history_idx"
233
+ ON "memory_slack_publication_receipts" ("workspace_id", "publication_id", "sequence");
234
+
235
+ DO $privileged_functions$
236
+ DECLARE data_schema text := current_schema();
237
+ BEGIN
238
+ EXECUTE format($ddl$
239
+ CREATE OR REPLACE FUNCTION opengeni_private.claim_memory_slack_publication(
240
+ p_holder uuid,
241
+ p_lease_ms integer
242
+ )
243
+ RETURNS SETOF %1$I.memory_slack_publications
244
+ LANGUAGE plpgsql
245
+ SECURITY DEFINER
246
+ SET search_path = pg_catalog
247
+ AS $function$
248
+ BEGIN
249
+ IF p_lease_ms < 1000 OR p_lease_ms > 300000 THEN
250
+ RAISE EXCEPTION 'invalid memory Slack publication claim lease';
251
+ END IF;
252
+ RETURN QUERY
253
+ WITH candidate AS (
254
+ SELECT P.id
255
+ FROM %1$I.memory_slack_publications P
256
+ WHERE (
257
+ P.state = 'queued'
258
+ ) OR (
259
+ P.state = 'retry_wait'
260
+ AND P.retry_at <= now()
261
+ ) OR (
262
+ P.state = 'delivering'
263
+ AND P.claim_expires_at <= now()
264
+ )
265
+ ORDER BY P.retry_at NULLS FIRST, P.created_at, P.id
266
+ FOR UPDATE SKIP LOCKED
267
+ LIMIT 1
268
+ ), claimed AS (
269
+ UPDATE %1$I.memory_slack_publications P
270
+ SET state = 'delivering',
271
+ claim_holder_id = p_holder,
272
+ claim_expires_at = now() + make_interval(secs => p_lease_ms::double precision / 1000),
273
+ retry_at = NULL,
274
+ attempt_count = P.attempt_count + 1,
275
+ updated_at = now()
276
+ FROM candidate C
277
+ WHERE P.id = C.id
278
+ RETURNING P.*
279
+ ), receipt AS (
280
+ INSERT INTO %1$I.memory_slack_publication_receipts (
281
+ account_id, workspace_id, publication_id, sequence, kind, state,
282
+ attempt_number, actor_kind, actor_subject_id, operation_id
283
+ )
284
+ SELECT
285
+ C.account_id, C.workspace_id, C.id,
286
+ COALESCE((
287
+ SELECT max(R.sequence)
288
+ FROM %1$I.memory_slack_publication_receipts R
289
+ WHERE R.publication_id = C.id
290
+ ), 0) + 1,
291
+ 'delivery_claimed', 'delivering', C.attempt_count,
292
+ 'service', 'memory-slack-delivery', C.operation_id
293
+ FROM claimed C
294
+ RETURNING publication_id
295
+ )
296
+ SELECT C.*
297
+ FROM claimed C
298
+ JOIN receipt R ON R.publication_id = C.id;
299
+ END
300
+ $function$
301
+ $ddl$, data_schema);
302
+ END
303
+ $privileged_functions$;
304
+
305
+ REVOKE ALL ON FUNCTION opengeni_private.claim_memory_slack_publication(uuid, integer)
306
+ FROM PUBLIC;
307
+
308
+ DO $$
309
+ BEGIN
310
+ IF EXISTS (SELECT 1 FROM pg_roles WHERE rolname = 'opengeni_app') THEN
311
+ GRANT EXECUTE ON FUNCTION
312
+ opengeni_private.claim_memory_slack_publication(uuid, integer)
313
+ TO opengeni_app;
314
+ END IF;
315
+ END $$;
316
+
317
+ CREATE OR REPLACE FUNCTION opengeni_private.reject_memory_slack_immutable_mutation()
318
+ RETURNS trigger
319
+ LANGUAGE plpgsql
320
+ AS $function$
321
+ BEGIN
322
+ RAISE EXCEPTION '% is append-only', TG_TABLE_NAME;
323
+ END;
324
+ $function$;
325
+
326
+ REVOKE ALL ON FUNCTION opengeni_private.reject_memory_slack_immutable_mutation()
327
+ FROM PUBLIC;
328
+
329
+ CREATE TRIGGER memory_slack_publication_configurations_immutable
330
+ BEFORE UPDATE OR DELETE ON "memory_slack_publication_configurations"
331
+ FOR EACH ROW EXECUTE FUNCTION opengeni_private.reject_memory_slack_immutable_mutation();
332
+
333
+ CREATE TRIGGER memory_slack_publication_receipts_immutable
334
+ BEFORE UPDATE OR DELETE ON "memory_slack_publication_receipts"
335
+ FOR EACH ROW EXECUTE FUNCTION opengeni_private.reject_memory_slack_immutable_mutation();
336
+
337
+ CREATE OR REPLACE FUNCTION opengeni_private.guard_memory_slack_publication_identity()
338
+ RETURNS trigger
339
+ LANGUAGE plpgsql
340
+ AS $function$
341
+ BEGIN
342
+ IF ROW(
343
+ NEW."account_id", NEW."workspace_id", NEW."configuration_id",
344
+ NEW."configuration_revision", NEW."connection_id", NEW."slack_team_id",
345
+ NEW."slack_channel_id", NEW."source_type", NEW."source_id",
346
+ NEW."source_version", NEW."source_idempotency_key", NEW."projection",
347
+ NEW."projection_sha256", NEW."importance", NEW."delivery_mode",
348
+ NEW."operation_id", NEW."initiator_kind", NEW."initiator_subject_id",
349
+ NEW."initiating_human_subject_id", NEW."session_id", NEW."turn_id",
350
+ NEW."attempt_id", NEW."created_at"
351
+ ) IS DISTINCT FROM ROW(
352
+ OLD."account_id", OLD."workspace_id", OLD."configuration_id",
353
+ OLD."configuration_revision", OLD."connection_id", OLD."slack_team_id",
354
+ OLD."slack_channel_id", OLD."source_type", OLD."source_id",
355
+ OLD."source_version", OLD."source_idempotency_key", OLD."projection",
356
+ OLD."projection_sha256", OLD."importance", OLD."delivery_mode",
357
+ OLD."operation_id", OLD."initiator_kind", OLD."initiator_subject_id",
358
+ OLD."initiating_human_subject_id", OLD."session_id", OLD."turn_id",
359
+ OLD."attempt_id", OLD."created_at"
360
+ ) THEN
361
+ RAISE EXCEPTION 'memory Slack publication identity is immutable';
362
+ END IF;
363
+ RETURN NEW;
364
+ END;
365
+ $function$;
366
+
367
+ REVOKE ALL ON FUNCTION opengeni_private.guard_memory_slack_publication_identity()
368
+ FROM PUBLIC;
369
+
370
+ CREATE TRIGGER memory_slack_publications_identity_immutable
371
+ BEFORE UPDATE ON "memory_slack_publications"
372
+ FOR EACH ROW EXECUTE FUNCTION opengeni_private.guard_memory_slack_publication_identity();
373
+
374
+ ALTER TABLE "memory_slack_publication_configurations" ENABLE ROW LEVEL SECURITY;
375
+ ALTER TABLE "memory_slack_publication_configurations" FORCE ROW LEVEL SECURITY;
376
+ CREATE POLICY workspace_isolation ON "memory_slack_publication_configurations"
377
+ USING (opengeni_private.workspace_rls_visible("account_id", "workspace_id"))
378
+ WITH CHECK (opengeni_private.workspace_rls_visible("account_id", "workspace_id"));
379
+
380
+ ALTER TABLE "memory_slack_publications" ENABLE ROW LEVEL SECURITY;
381
+ ALTER TABLE "memory_slack_publications" FORCE ROW LEVEL SECURITY;
382
+ CREATE POLICY workspace_isolation ON "memory_slack_publications"
383
+ USING (opengeni_private.workspace_rls_visible("account_id", "workspace_id"))
384
+ WITH CHECK (opengeni_private.workspace_rls_visible("account_id", "workspace_id"));
385
+
386
+ ALTER TABLE "memory_slack_publication_receipts" ENABLE ROW LEVEL SECURITY;
387
+ ALTER TABLE "memory_slack_publication_receipts" FORCE ROW LEVEL SECURITY;
388
+ CREATE POLICY workspace_isolation ON "memory_slack_publication_receipts"
389
+ USING (opengeni_private.workspace_rls_visible("account_id", "workspace_id"))
390
+ WITH CHECK (opengeni_private.workspace_rls_visible("account_id", "workspace_id"));
391
+
392
+ RESET statement_timeout;
393
+ RESET lock_timeout;