@opengeni/db 0.36.0 → 1.0.1

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 (51) hide show
  1. package/dist/canonical-human-identities.js +3 -3
  2. package/dist/{chunk-P3RE4D2B.js → chunk-4SR4HKKA.js} +2 -2
  3. package/dist/{chunk-5KTIEDX7.js → chunk-6ZYKCRFO.js} +124 -16
  4. package/dist/chunk-6ZYKCRFO.js.map +1 -0
  5. package/dist/{chunk-CQZ4QSP5.js → chunk-CUPM3FGB.js} +3 -3
  6. package/dist/{chunk-TAUTWOS5.js → chunk-LTG3S6ZY.js} +2 -2
  7. package/dist/{chunk-VKLB2ZGI.js → chunk-NXAFLCQX.js} +81 -2
  8. package/dist/chunk-NXAFLCQX.js.map +1 -0
  9. package/dist/{chunk-F32YT7MP.js → chunk-WD5ROSLL.js} +2 -2
  10. package/dist/{chunk-JC5QPLUM.js → chunk-ZWREYEWA.js} +48 -3
  11. package/dist/chunk-ZWREYEWA.js.map +1 -0
  12. package/dist/editable-artifact-durable-export.d.ts +10 -0
  13. package/dist/editable-artifact-durable-export.js +18 -3
  14. package/dist/editable-artifact-durable-export.js.map +1 -1
  15. package/dist/editable-artifacts.js +3 -3
  16. package/dist/index.d.ts +69 -8
  17. package/dist/index.js +869 -75
  18. package/dist/index.js.map +1 -1
  19. package/dist/knowledge-source-sync-schema.d.ts +730 -0
  20. package/dist/knowledge-source-sync.d.ts +60 -0
  21. package/dist/persistence-errors.d.ts +8 -0
  22. package/dist/provision-roles.js +1 -1
  23. package/dist/runtime-posture.d.ts +3 -3
  24. package/dist/schema.d.ts +21 -4
  25. package/dist/schema.js +5 -1
  26. package/dist/session-queue-commands.d.ts +1 -1
  27. package/dist/session-realtime-ledger.d.ts +1 -0
  28. package/dist/session-tenancy.js +3 -3
  29. package/dist/video-generation.js +3 -3
  30. package/drizzle/0238_recover_unclaimed_session_turns.sql +307 -0
  31. package/drizzle/0240_model_context_user_messages.sql +204 -0
  32. package/drizzle/0243_google_drive_object_acl_authority.sql +554 -0
  33. package/package.json +5 -5
  34. package/src/editable-artifact-durable-export.ts +27 -0
  35. package/src/index.ts +680 -30
  36. package/src/knowledge-source-sync-schema.ts +83 -0
  37. package/src/knowledge-source-sync.ts +530 -0
  38. package/src/persistence-errors.ts +60 -1
  39. package/src/provision-roles.ts +36 -0
  40. package/src/runtime-posture.ts +49 -1
  41. package/src/schema.ts +30 -7
  42. package/src/session-queue-commands.ts +13 -14
  43. package/src/session-realtime-context.ts +16 -0
  44. package/src/session-realtime-ledger.ts +53 -1
  45. package/dist/chunk-5KTIEDX7.js.map +0 -1
  46. package/dist/chunk-JC5QPLUM.js.map +0 -1
  47. package/dist/chunk-VKLB2ZGI.js.map +0 -1
  48. /package/dist/{chunk-P3RE4D2B.js.map → chunk-4SR4HKKA.js.map} +0 -0
  49. /package/dist/{chunk-CQZ4QSP5.js.map → chunk-CUPM3FGB.js.map} +0 -0
  50. /package/dist/{chunk-TAUTWOS5.js.map → chunk-LTG3S6ZY.js.map} +0 -0
  51. /package/dist/{chunk-F32YT7MP.js.map → chunk-WD5ROSLL.js.map} +0 -0
@@ -0,0 +1,204 @@
1
+ -- deployment-mode: maintenance
2
+ -- One-way semantic cutover: application-provided per-message context becomes
3
+ -- ordinary user-role model content. Renaming the legacy columns hard-fences old
4
+ -- workers, which would otherwise continue mutating the persistent instruction
5
+ -- prefix and defeat prompt caching.
6
+
7
+ SET LOCAL lock_timeout = '5s';
8
+ SET LOCAL statement_timeout = '10min';
9
+
10
+ -- Reject mixed-version writers before locking, then repeat after the locks to
11
+ -- close the connect-before-lock race. Keep API and workers stopped until the new
12
+ -- application version is active.
13
+ DO $model_context_writer_drain_before_lock$
14
+ BEGIN
15
+ IF EXISTS (SELECT 1 FROM pg_roles WHERE rolname = 'opengeni_app')
16
+ AND EXISTS (
17
+ SELECT 1
18
+ FROM pg_stat_activity
19
+ WHERE datname = current_database()
20
+ AND usename = 'opengeni_app'
21
+ AND pid <> pg_backend_pid()
22
+ )
23
+ THEN
24
+ RAISE EXCEPTION
25
+ 'model-context user-message activation requires all opengeni_app sessions to be stopped'
26
+ USING ERRCODE = '55000';
27
+ END IF;
28
+ END
29
+ $model_context_writer_drain_before_lock$;
30
+
31
+ LOCK TABLE "sessions" IN ACCESS EXCLUSIVE MODE;
32
+ LOCK TABLE "session_turns" IN ACCESS EXCLUSIVE MODE;
33
+ LOCK TABLE "session_realtime_entries" IN ACCESS EXCLUSIVE MODE;
34
+ LOCK TABLE "slack_interactions" IN ACCESS EXCLUSIVE MODE;
35
+
36
+ DO $model_context_writer_drain_after_lock$
37
+ BEGIN
38
+ IF EXISTS (SELECT 1 FROM pg_roles WHERE rolname = 'opengeni_app')
39
+ AND EXISTS (
40
+ SELECT 1
41
+ FROM pg_stat_activity
42
+ WHERE datname = current_database()
43
+ AND usename = 'opengeni_app'
44
+ AND pid <> pg_backend_pid()
45
+ )
46
+ THEN
47
+ RAISE EXCEPTION
48
+ 'model-context user-message activation requires all opengeni_app sessions to be stopped'
49
+ USING ERRCODE = '55000';
50
+ END IF;
51
+ END
52
+ $model_context_writer_drain_after_lock$;
53
+
54
+ -- A queued turn has not entered model history yet, so the new worker can append
55
+ -- its context correctly when it claims the turn. A live/resumable turn may have
56
+ -- already shown the context only through the removed instruction-prefix path;
57
+ -- fail rather than silently resume it with different model-visible history.
58
+ DO $model_context_live_turn_guard$
59
+ BEGIN
60
+ IF EXISTS (
61
+ SELECT 1
62
+ FROM "session_turns"
63
+ WHERE "turn_instructions" IS NOT NULL
64
+ AND "status" IN ('running', 'requires_action', 'recovering', 'waiting_capacity')
65
+ )
66
+ THEN
67
+ RAISE EXCEPTION
68
+ 'model-context user-message activation requires legacy context-bearing live turns to settle or be superseded'
69
+ USING ERRCODE = '55000';
70
+ END IF;
71
+ END
72
+ $model_context_live_turn_guard$;
73
+
74
+ -- Completed historical turns retain their original conversation truth: their
75
+ -- context was model-visible only through the legacy exact-turn prefix and must
76
+ -- not be rewritten into later persistent history. Only queued turns cross the
77
+ -- cutover into the new same-message semantics; live/resumable turns are rejected
78
+ -- above so no attempt can straddle both representations.
79
+
80
+ -- Slack safety restrictions formerly rode the same legacy per-turn prefix. Move
81
+ -- them to durable session-level authority before that prefix is removed. Match
82
+ -- the reservation identity as well as bound routes so a create-before-bind crash
83
+ -- cannot strand an existing Slack session without its safety policy. Preserve any
84
+ -- pre-existing session persona exactly, and fail rather than truncate it.
85
+ DO $model_context_slack_session_policy$
86
+ DECLARE
87
+ slack_policy CONSTANT text := $slack_policy$This session is an OpenGeni Slack task surface. Treat Slack message and thread context as task-local unless a separate explicit authorized user action says otherwise. Execute direct, safe, sufficiently specified requests immediately. Ask one concise clarifying question only when materially required information is missing or the requested action is risky, irreversible, or authorization-sensitive. Do not write Slack context to Documents, Knowledge, Memory, preferences, Workspace Charter, instructions, or policy unless a separate explicit authorized user action requests it. Never expose private reasoning, credentials, secrets, raw logs, or unbounded output. Keep user-visible output concise, bounded, and safe to send back to Slack.$slack_policy$;
88
+ BEGIN
89
+ IF EXISTS (
90
+ SELECT 1
91
+ FROM "sessions" session_row
92
+ WHERE EXISTS (
93
+ SELECT 1
94
+ FROM "slack_interactions" interaction
95
+ WHERE interaction."session_reservation_id" = session_row."id"
96
+ )
97
+ AND NULLIF(btrim(session_row."instructions"), '') IS NOT NULL
98
+ AND position(slack_policy in session_row."instructions") = 0
99
+ AND char_length(session_row."instructions") + 2 + char_length(slack_policy) > 32768
100
+ )
101
+ THEN
102
+ RAISE EXCEPTION
103
+ 'model-context activation cannot append Slack session safety instructions within the session instruction bound'
104
+ USING ERRCODE = '22001';
105
+ END IF;
106
+
107
+ UPDATE "sessions" session_row
108
+ SET "instructions" = CASE
109
+ WHEN NULLIF(btrim(session_row."instructions"), '') IS NULL THEN slack_policy
110
+ WHEN position(slack_policy in session_row."instructions") > 0 THEN session_row."instructions"
111
+ ELSE session_row."instructions" || E'\n\n' || slack_policy
112
+ END
113
+ WHERE EXISTS (
114
+ SELECT 1
115
+ FROM "slack_interactions" interaction
116
+ WHERE interaction."session_reservation_id" = session_row."id"
117
+ );
118
+ END
119
+ $model_context_slack_session_policy$;
120
+
121
+ ALTER TABLE "sessions"
122
+ RENAME COLUMN "initial_turn_instructions" TO "initial_model_context";
123
+
124
+ ALTER TABLE "session_turns"
125
+ RENAME COLUMN "turn_instructions" TO "model_context";
126
+
127
+ -- Match JavaScript String.prototype.trim() plus UTF-16 .length for every
128
+ -- PostgreSQL-representable string. PostgreSQL text excludes lone surrogates,
129
+ -- while astral code points count as two JavaScript code units.
130
+ CREATE OR REPLACE FUNCTION opengeni_private.model_context_value_valid(value text)
131
+ RETURNS boolean
132
+ LANGUAGE plpgsql
133
+ IMMUTABLE
134
+ STRICT
135
+ SET search_path = pg_catalog, pg_temp
136
+ AS $body$
137
+ DECLARE code_units integer;
138
+ BEGIN
139
+ IF value = '' OR value <> btrim(
140
+ value,
141
+ U&'\0009\000A\000B\000C\000D\0020\00A0\1680\2000\2001\2002\2003\2004\2005\2006\2007\2008\2009\200A\2028\2029\202F\205F\3000\FEFF'
142
+ )
143
+ THEN
144
+ RETURN false;
145
+ END IF;
146
+ SELECT sum(CASE WHEN ascii(character) > 65535 THEN 2 ELSE 1 END)::integer
147
+ INTO code_units
148
+ FROM unnest(string_to_array(value, NULL)) AS characters(character);
149
+ RETURN code_units BETWEEN 1 AND 32768;
150
+ EXCEPTION WHEN others THEN
151
+ RETURN false;
152
+ END;
153
+ $body$;
154
+
155
+ REVOKE ALL ON FUNCTION opengeni_private.model_context_value_valid(text) FROM PUBLIC;
156
+ DO $model_context_function_grant$
157
+ BEGIN
158
+ IF EXISTS (SELECT 1 FROM pg_roles WHERE rolname = 'opengeni_app') THEN
159
+ GRANT EXECUTE ON FUNCTION opengeni_private.model_context_value_valid(text)
160
+ TO opengeni_app;
161
+ END IF;
162
+ END
163
+ $model_context_function_grant$;
164
+
165
+ ALTER TABLE "sessions"
166
+ ADD CONSTRAINT "sessions_initial_model_context_check"
167
+ CHECK (
168
+ "initial_model_context" IS NULL
169
+ OR opengeni_private.model_context_value_valid("initial_model_context")
170
+ ) NOT VALID;
171
+
172
+ ALTER TABLE "session_turns"
173
+ ADD CONSTRAINT "session_turns_model_context_check"
174
+ CHECK (
175
+ "model_context" IS NULL
176
+ OR opengeni_private.model_context_value_valid("model_context")
177
+ ) NOT VALID;
178
+
179
+ ALTER TABLE "session_realtime_entries"
180
+ ADD COLUMN "model_context" text;
181
+
182
+ ALTER TABLE "sessions" VALIDATE CONSTRAINT "sessions_initial_model_context_check";
183
+ ALTER TABLE "session_turns" VALIDATE CONSTRAINT "session_turns_model_context_check";
184
+
185
+ ALTER TABLE "session_realtime_entries"
186
+ ADD CONSTRAINT "session_realtime_entries_model_context_check"
187
+ CHECK (
188
+ "model_context" IS NULL
189
+ OR (
190
+ "direction" = 'provider_in'
191
+ AND "kind" IN ('delegation_call', 'user_transcript', 'assistant_transcript')
192
+ AND opengeni_private.model_context_value_valid("model_context")
193
+ )
194
+ ) NOT VALID;
195
+
196
+ ALTER TABLE "session_realtime_entries"
197
+ VALIDATE CONSTRAINT "session_realtime_entries_model_context_check";
198
+
199
+ COMMENT ON COLUMN "sessions"."initial_model_context" IS
200
+ 'Application context frozen with the winning initial user message; ordinary model-visible user-role content, omitted by standard timeline rendering.';
201
+ COMMENT ON COLUMN "session_turns"."model_context" IS
202
+ 'Application context for the exact accepted user message; copied into canonical model history at first claim.';
203
+ COMMENT ON COLUMN "session_realtime_entries"."model_context" IS
204
+ 'Application context attached to an exact provider-in delegation or finalized transcript and materialized as ordinary user-role content.';