@opengeni/db 0.31.1 → 0.36.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 (125) hide show
  1. package/dist/browser-auth.d.ts +209 -1
  2. package/dist/browser-downloads.d.ts +51 -0
  3. package/dist/browser-identities.d.ts +11 -2
  4. package/dist/browser-sessions.d.ts +83 -1
  5. package/dist/browser-state-artifacts.d.ts +75 -1
  6. package/dist/canonical-human-identities.d.ts +48 -0
  7. package/dist/canonical-human-identities.js +28 -0
  8. package/dist/canonical-human-identities.js.map +1 -0
  9. package/dist/capability-integrations.d.ts +8 -6
  10. package/dist/{chunk-MWDVXQOL.js → chunk-5KTIEDX7.js} +5773 -4212
  11. package/dist/chunk-5KTIEDX7.js.map +1 -0
  12. package/dist/chunk-FPVAD4CO.js +117 -0
  13. package/dist/chunk-FPVAD4CO.js.map +1 -0
  14. package/dist/chunk-GYO7ED2Q.js +259 -0
  15. package/dist/chunk-GYO7ED2Q.js.map +1 -0
  16. package/dist/{chunk-F5FT7BEZ.js → chunk-HSOWSYOX.js} +2 -2
  17. package/dist/{chunk-YHZXQ7HP.js → chunk-VKLB2ZGI.js} +446 -19
  18. package/dist/chunk-VKLB2ZGI.js.map +1 -0
  19. package/dist/{chunk-NBE6CHRI.js → chunk-VTPRIXKG.js} +49 -9
  20. package/dist/chunk-VTPRIXKG.js.map +1 -0
  21. package/dist/{chunk-ISI2TIUG.js → chunk-Z7VYMNPZ.js} +76 -4
  22. package/dist/chunk-Z7VYMNPZ.js.map +1 -0
  23. package/dist/database.d.ts +5 -0
  24. package/dist/editable-artifact-durable-export.js +2 -2
  25. package/dist/editable-artifacts.js +3 -3
  26. package/dist/index.d.ts +467 -29
  27. package/dist/index.js +23247 -16232
  28. package/dist/index.js.map +1 -1
  29. package/dist/insights.d.ts +23 -7
  30. package/dist/integration-bindings.d.ts +24 -24
  31. package/dist/integration-facets.d.ts +99 -0
  32. package/dist/interaction-revisions.d.ts +11 -0
  33. package/dist/interaction-schema.d.ts +698 -34
  34. package/dist/persistence-errors.d.ts +8 -0
  35. package/dist/provision-roles.js +1 -1
  36. package/dist/runtime-posture.d.ts +8 -7
  37. package/dist/schema.d.ts +9464 -5412
  38. package/dist/schema.js +51 -9
  39. package/dist/session-control.d.ts +29 -3
  40. package/dist/session-tenancy.d.ts +44 -0
  41. package/dist/session-tenancy.js +16 -0
  42. package/dist/session-tenancy.js.map +1 -0
  43. package/dist/slack-task-policy-schema.d.ts +847 -0
  44. package/dist/slack-task-policy.d.ts +65 -0
  45. package/dist/task-notes-schema.d.ts +924 -0
  46. package/dist/task-notes.d.ts +85 -0
  47. package/dist/video-generation.d.ts +9 -0
  48. package/dist/video-generation.js +5 -3
  49. package/dist/xai-subscription.d.ts +326 -0
  50. package/drizzle/0212_browser_state_transfer_hardening.sql +560 -0
  51. package/drizzle/0213_browser_interaction_authority.sql +67 -0
  52. package/drizzle/0214_browser_download_saves.sql +34 -0
  53. package/drizzle/0215_browser_controller_host.sql +385 -0
  54. package/drizzle/0216_browser_auth_health_evidence.sql +137 -0
  55. package/drizzle/0217_external_browser_auth_operations.sql +22 -0
  56. package/drizzle/0218_organization_tenancy_foundation.sql +299 -0
  57. package/drizzle/0219_organization_tenancy_managed_human_provisioning.sql +317 -0
  58. package/drizzle/0219_site_auth_maintenance_sessions.sql +234 -0
  59. package/drizzle/0220_memory_slack_append_only_cascade.sql +38 -0
  60. package/drizzle/0220_session_channels.sql +54 -0
  61. package/drizzle/0221_sessions_channel_index.sql +5 -0
  62. package/drizzle/0222_session_visibility_authority_epochs.sql +158 -0
  63. package/drizzle/0222_sessions_channel_fk.sql +89 -0
  64. package/drizzle/0223_pending_tool_event_output.sql +55 -0
  65. package/drizzle/0223_sessions_channel_fk_validate.sql +118 -0
  66. package/drizzle/0224_slack_post_outcome_reconciliation.sql +123 -0
  67. package/drizzle/0225_session_visibility_fork_activation.sql +1363 -0
  68. package/drizzle/0226_personal_codex_authority_foundation.sql +365 -0
  69. package/drizzle/0227_slack_native_actions.sql +145 -0
  70. package/drizzle/0228_interaction_controller_data_plane.sql +14 -0
  71. package/drizzle/0228_slack_task_policy.sql +400 -0
  72. package/drizzle/0229_slack_inbox_file_fact.sql +10 -0
  73. package/drizzle/0230_user_scoped_variable_sets_rigs.sql +84 -0
  74. package/drizzle/0231_integration_definition_identity_cutover.sql +271 -0
  75. package/drizzle/0232_integration_facet_authority_cutover.sql +610 -0
  76. package/drizzle/0233_skill_and_integration_authority_cutover.sql +1162 -0
  77. package/drizzle/0234_xai_subscription_authority.sql +1139 -0
  78. package/drizzle/0235_canonical_human_login_bindings.sql +920 -0
  79. package/drizzle/0236_browser_identity_lifecycle.sql +39 -0
  80. package/drizzle/0236_session_visibility_slack_policy.sql +72 -0
  81. package/drizzle/0237_interaction_transition_reaper.sql +263 -0
  82. package/drizzle/0238_goal_persistence_policy.sql +471 -0
  83. package/drizzle/0238_recover_unclaimed_session_turns.sql +307 -0
  84. package/drizzle/0238_supergrok_realtime_model.sql +29 -0
  85. package/drizzle/0239_supergrok_video_funding.sql +50 -0
  86. package/drizzle/0239_task_tree_notes.sql +990 -0
  87. package/package.json +13 -5
  88. package/src/browser-auth.ts +2600 -123
  89. package/src/browser-downloads.ts +517 -0
  90. package/src/browser-identities.ts +220 -3
  91. package/src/browser-sessions.ts +334 -45
  92. package/src/browser-state-artifacts.ts +402 -12
  93. package/src/canonical-human-identities.ts +317 -0
  94. package/src/capability-integrations.ts +121 -213
  95. package/src/database.ts +41 -1
  96. package/src/index.ts +4625 -411
  97. package/src/insights.ts +109 -28
  98. package/src/integration-bindings.ts +101 -101
  99. package/src/{integration-features.ts → integration-facets.ts} +187 -184
  100. package/src/interaction-revisions.ts +33 -3
  101. package/src/interaction-schema.ts +311 -8
  102. package/src/pack-components.ts +43 -43
  103. package/src/pack-installations.ts +0 -43
  104. package/src/persistence-errors.ts +60 -1
  105. package/src/plugin-packages.ts +9 -9
  106. package/src/provision-roles.ts +232 -0
  107. package/src/runtime-posture.ts +227 -14
  108. package/src/schema.ts +1188 -75
  109. package/src/session-control.ts +122 -37
  110. package/src/session-queue-commands.ts +78 -1
  111. package/src/session-tenancy.ts +188 -0
  112. package/src/session-tool-call-settlement.ts +9 -3
  113. package/src/slack-task-policy-schema.ts +130 -0
  114. package/src/slack-task-policy.ts +341 -0
  115. package/src/task-notes-schema.ts +135 -0
  116. package/src/task-notes.ts +178 -0
  117. package/src/video-generation.ts +90 -12
  118. package/src/workspace-artifacts.ts +1 -1
  119. package/src/xai-subscription.ts +1887 -0
  120. package/dist/chunk-ISI2TIUG.js.map +0 -1
  121. package/dist/chunk-MWDVXQOL.js.map +0 -1
  122. package/dist/chunk-NBE6CHRI.js.map +0 -1
  123. package/dist/chunk-YHZXQ7HP.js.map +0 -1
  124. package/dist/integration-features.d.ts +0 -99
  125. /package/dist/{chunk-F5FT7BEZ.js.map → chunk-HSOWSYOX.js.map} +0 -0
package/src/insights.ts CHANGED
@@ -125,6 +125,10 @@ function dayKeyUtc(value: Date): string {
125
125
  return value.toISOString().slice(0, 10);
126
126
  }
127
127
 
128
+ function hourKeyUtc(value: Date): string {
129
+ return `${value.toISOString().slice(0, 13)}:00`;
130
+ }
131
+
128
132
  export async function sumUsageQuantityInRange(
129
133
  db: Database,
130
134
  input: {
@@ -153,7 +157,7 @@ export async function sumUsageQuantityInRange(
153
157
  });
154
158
  }
155
159
 
156
- export async function sumUsageQuantityByDay(
160
+ async function sumUsageQuantityByBucket(
157
161
  db: Database,
158
162
  input: {
159
163
  workspaceId: string;
@@ -161,12 +165,21 @@ export async function sumUsageQuantityByDay(
161
165
  since: Date;
162
166
  until: Date;
163
167
  },
168
+ granularity: "day" | "hour",
164
169
  ): Promise<Map<string, number>> {
165
170
  const context = await rlsContextForWorkspace(db, input.workspaceId);
166
171
  return await withRlsContext(db, context, async (scopedDb) => {
172
+ const bucket =
173
+ granularity === "hour"
174
+ ? sql<string>`to_char(date_trunc('hour', ${schema.usageEvents.occurredAt} at time zone 'UTC'), 'YYYY-MM-DD"T"HH24:00')`
175
+ : sql<string>`to_char(date_trunc('day', ${schema.usageEvents.occurredAt} at time zone 'UTC'), 'YYYY-MM-DD')`;
176
+ const bucketGroup =
177
+ granularity === "hour"
178
+ ? sql`date_trunc('hour', ${schema.usageEvents.occurredAt} at time zone 'UTC')`
179
+ : sql`date_trunc('day', ${schema.usageEvents.occurredAt} at time zone 'UTC')`;
167
180
  const rows = await scopedDb
168
181
  .select({
169
- day: sql<string>`to_char(date_trunc('day', ${schema.usageEvents.occurredAt} at time zone 'UTC'), 'YYYY-MM-DD')`,
182
+ bucket,
170
183
  total: sql<number>`coalesce(sum(${schema.usageEvents.quantity}), 0)`,
171
184
  })
172
185
  .from(schema.usageEvents)
@@ -178,11 +191,35 @@ export async function sumUsageQuantityByDay(
178
191
  lt(schema.usageEvents.occurredAt, input.until),
179
192
  ),
180
193
  )
181
- .groupBy(sql`date_trunc('day', ${schema.usageEvents.occurredAt} at time zone 'UTC')`);
182
- return new Map(rows.map((row) => [row.day, Number(row.total)]));
194
+ .groupBy(bucketGroup);
195
+ return new Map(rows.map((row) => [row.bucket, Number(row.total)]));
183
196
  });
184
197
  }
185
198
 
199
+ export async function sumUsageQuantityByDay(
200
+ db: Database,
201
+ input: {
202
+ workspaceId: string;
203
+ eventType: string;
204
+ since: Date;
205
+ until: Date;
206
+ },
207
+ ): Promise<Map<string, number>> {
208
+ return await sumUsageQuantityByBucket(db, input, "day");
209
+ }
210
+
211
+ export async function sumUsageQuantityByHour(
212
+ db: Database,
213
+ input: {
214
+ workspaceId: string;
215
+ eventType: string;
216
+ since: Date;
217
+ until: Date;
218
+ },
219
+ ): Promise<Map<string, number>> {
220
+ return await sumUsageQuantityByBucket(db, input, "hour");
221
+ }
222
+
186
223
  export async function aggregateModelCallFacts(
187
224
  db: Database,
188
225
  input: {
@@ -249,7 +286,23 @@ export async function aggregateModelCallFacts(
249
286
  });
250
287
  }
251
288
 
252
- export async function aggregateModelCallFactsByDay(
289
+ type ModelCallFactSeriesAggregate = {
290
+ costMicros: number;
291
+ estimatedProviderCostMicros: number;
292
+ estimatedProviderCostKnownCalls: number;
293
+ inputTokens: number;
294
+ outputTokens: number;
295
+ cachedTokens: number;
296
+ cacheInputTokens: number;
297
+ cacheWriteTokens: number;
298
+ reasoningTokens: number;
299
+ totalTokens: number;
300
+ tokenKnownCalls: number;
301
+ cacheKnownCalls: number;
302
+ calls: number;
303
+ };
304
+
305
+ async function aggregateModelCallFactsByBucket(
253
306
  db: Database,
254
307
  input: {
255
308
  workspaceId: string;
@@ -258,26 +311,8 @@ export async function aggregateModelCallFactsByDay(
258
311
  provider?: string | null;
259
312
  model?: string | null;
260
313
  },
261
- ): Promise<
262
- Map<
263
- string,
264
- {
265
- costMicros: number;
266
- estimatedProviderCostMicros: number;
267
- estimatedProviderCostKnownCalls: number;
268
- inputTokens: number;
269
- outputTokens: number;
270
- cachedTokens: number;
271
- cacheInputTokens: number;
272
- cacheWriteTokens: number;
273
- reasoningTokens: number;
274
- totalTokens: number;
275
- tokenKnownCalls: number;
276
- cacheKnownCalls: number;
277
- calls: number;
278
- }
279
- >
280
- > {
314
+ granularity: "day" | "hour",
315
+ ): Promise<Map<string, ModelCallFactSeriesAggregate>> {
281
316
  const context = await rlsContextForWorkspace(db, input.workspaceId);
282
317
  return await withRlsContext(db, context, async (scopedDb) => {
283
318
  const clauses = [
@@ -287,9 +322,17 @@ export async function aggregateModelCallFactsByDay(
287
322
  ...(input.provider ? [eq(schema.modelCallFacts.provider, input.provider)] : []),
288
323
  ...(input.model ? [eq(schema.modelCallFacts.model, input.model)] : []),
289
324
  ];
325
+ const bucket =
326
+ granularity === "hour"
327
+ ? sql<string>`to_char(date_trunc('hour', ${schema.modelCallFacts.occurredAt} at time zone 'UTC'), 'YYYY-MM-DD"T"HH24:00')`
328
+ : sql<string>`to_char(date_trunc('day', ${schema.modelCallFacts.occurredAt} at time zone 'UTC'), 'YYYY-MM-DD')`;
329
+ const bucketGroup =
330
+ granularity === "hour"
331
+ ? sql`date_trunc('hour', ${schema.modelCallFacts.occurredAt} at time zone 'UTC')`
332
+ : sql`date_trunc('day', ${schema.modelCallFacts.occurredAt} at time zone 'UTC')`;
290
333
  const rows = await scopedDb
291
334
  .select({
292
- day: sql<string>`to_char(date_trunc('day', ${schema.modelCallFacts.occurredAt} at time zone 'UTC'), 'YYYY-MM-DD')`,
335
+ bucket,
293
336
  costMicros: sql<number>`coalesce(sum(${schema.modelCallFacts.pricedCostMicros}) filter (where ${schema.modelCallFacts.billingPath} = 'opengeni_credits'), 0)`,
294
337
  estimatedProviderCostMicros: sql<number>`coalesce(sum(${schema.modelCallFacts.estimatedProviderCostMicros}), 0)`,
295
338
  estimatedProviderCostKnownCalls: sql<number>`count(${schema.modelCallFacts.estimatedProviderCostMicros})::int`,
@@ -306,10 +349,10 @@ export async function aggregateModelCallFactsByDay(
306
349
  })
307
350
  .from(schema.modelCallFacts)
308
351
  .where(and(...clauses))
309
- .groupBy(sql`date_trunc('day', ${schema.modelCallFacts.occurredAt} at time zone 'UTC')`);
352
+ .groupBy(bucketGroup);
310
353
  return new Map(
311
354
  rows.map((row) => [
312
- row.day,
355
+ row.bucket,
313
356
  {
314
357
  costMicros: Number(row.costMicros),
315
358
  estimatedProviderCostMicros: Number(row.estimatedProviderCostMicros),
@@ -330,6 +373,32 @@ export async function aggregateModelCallFactsByDay(
330
373
  });
331
374
  }
332
375
 
376
+ export async function aggregateModelCallFactsByDay(
377
+ db: Database,
378
+ input: {
379
+ workspaceId: string;
380
+ since: Date;
381
+ until: Date;
382
+ provider?: string | null;
383
+ model?: string | null;
384
+ },
385
+ ): Promise<Map<string, ModelCallFactSeriesAggregate>> {
386
+ return await aggregateModelCallFactsByBucket(db, input, "day");
387
+ }
388
+
389
+ export async function aggregateModelCallFactsByHour(
390
+ db: Database,
391
+ input: {
392
+ workspaceId: string;
393
+ since: Date;
394
+ until: Date;
395
+ provider?: string | null;
396
+ model?: string | null;
397
+ },
398
+ ): Promise<Map<string, ModelCallFactSeriesAggregate>> {
399
+ return await aggregateModelCallFactsByBucket(db, input, "hour");
400
+ }
401
+
333
402
  export async function aggregateWarmSecondsByGroup(
334
403
  db: Database,
335
404
  input: InsightsTimeWindow & { workspaceId: string; limit?: number },
@@ -783,6 +852,18 @@ export function enumerateUtcDays(since: Date, until: Date): string[] {
783
852
  return days;
784
853
  }
785
854
 
855
+ export function enumerateUtcHours(since: Date, until: Date): string[] {
856
+ const hours: string[] = [];
857
+ const cursor = new Date(since);
858
+ cursor.setUTCMinutes(0, 0, 0);
859
+ const end = until.getTime();
860
+ while (cursor.getTime() < end) {
861
+ hours.push(hourKeyUtc(cursor));
862
+ cursor.setUTCHours(cursor.getUTCHours() + 1);
863
+ }
864
+ return hours;
865
+ }
866
+
786
867
  /**
787
868
  * Idempotent YTD backfill from authoritative agent.model.usage into model_call_facts.
788
869
  * Never rewrites billing rows or existing live facts (onConflictDoNothing).