@opengeni/core 0.21.10 → 0.28.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 (132) hide show
  1. package/dist/access/index.d.ts +1 -1
  2. package/dist/application/new-session-drafts.d.ts +1 -1
  3. package/dist/application/session-commands.d.ts +2 -2
  4. package/dist/billing/limits.d.ts +1 -1
  5. package/dist/canonical-human-identities.d.ts +12 -0
  6. package/dist/canonical-human-identities.js +23 -0
  7. package/dist/canonical-human-identities.js.map +1 -0
  8. package/dist/chunk-6WKPWE5S.js +2380 -0
  9. package/dist/chunk-6WKPWE5S.js.map +1 -0
  10. package/dist/chunk-IBOEYG6N.js +34 -0
  11. package/dist/chunk-IBOEYG6N.js.map +1 -0
  12. package/dist/chunk-JJU6I5XD.js +2713 -0
  13. package/dist/chunk-JJU6I5XD.js.map +1 -0
  14. package/dist/chunk-NYPMQ7NO.js +2270 -0
  15. package/dist/chunk-NYPMQ7NO.js.map +1 -0
  16. package/dist/dependencies.d.ts +30 -6
  17. package/dist/domain/capabilities.d.ts +28 -3
  18. package/dist/domain/company-profile-durable-learning-adapter.d.ts +39 -0
  19. package/dist/domain/conversation-integrations.d.ts +225 -0
  20. package/dist/domain/durable-learning-slack-publication.d.ts +72 -0
  21. package/dist/domain/editable-artifacts/agent-application.d.ts +192 -0
  22. package/dist/domain/editable-artifacts/durable-export-postgres.d.ts +4 -0
  23. package/dist/domain/editable-artifacts/durable-export.d.ts +212 -0
  24. package/dist/domain/editable-artifacts/errors.d.ts +47 -0
  25. package/dist/domain/editable-artifacts/hash.d.ts +11 -0
  26. package/dist/domain/editable-artifacts/in-memory.d.ts +99 -0
  27. package/dist/domain/editable-artifacts/index.d.ts +14 -0
  28. package/dist/domain/editable-artifacts/ports.d.ts +341 -0
  29. package/dist/domain/editable-artifacts/postgres-adapters.d.ts +13 -0
  30. package/dist/domain/editable-artifacts/service.d.ts +105 -0
  31. package/dist/domain/editable-artifacts/snapshot-compaction.d.ts +44 -0
  32. package/dist/domain/editable-artifacts/snapshot-verifier-genesis.d.ts +50 -0
  33. package/dist/domain/editable-artifacts/snapshot-verifier-materialization.d.ts +21 -0
  34. package/dist/domain/editable-artifacts/snapshot-verifier.d.ts +118 -0
  35. package/dist/domain/editable-artifacts/types.d.ts +410 -0
  36. package/dist/domain/fiken.d.ts +35 -0
  37. package/dist/domain/memory-slack-delivery.d.ts +19 -0
  38. package/dist/domain/packs.d.ts +29 -1
  39. package/dist/domain/personal-connection-delegations.d.ts +9 -1
  40. package/dist/domain/scheduled-tasks.d.ts +2 -2
  41. package/dist/domain/session-tool-policy.d.ts +2 -2
  42. package/dist/domain/sessions.d.ts +24 -8
  43. package/dist/domain/skill-imports.d.ts +32 -0
  44. package/dist/domain/slack-publication-secret-safety.d.ts +8 -0
  45. package/dist/domain/timeline-annotations.d.ts +5 -0
  46. package/dist/domain/video-generation-capabilities.d.ts +10 -0
  47. package/dist/domain/video-generation.d.ts +47 -0
  48. package/dist/editable-artifact-live/application.d.ts +69 -0
  49. package/dist/editable-artifact-live/errors.d.ts +1 -0
  50. package/dist/editable-artifact-live/index.d.ts +8 -0
  51. package/dist/editable-artifact-live/outbox-dispatcher.d.ts +162 -0
  52. package/dist/editable-artifact-live/ports.d.ts +100 -0
  53. package/dist/editable-artifact-live/server.d.ts +71 -0
  54. package/dist/editable-artifact-live/ticket.d.ts +40 -0
  55. package/dist/editable-artifact-live/types.d.ts +213 -0
  56. package/dist/editable-artifact-live/wire.d.ts +34 -0
  57. package/dist/editable-artifact-live.d.ts +2 -0
  58. package/dist/editable-artifact-live.js +58 -0
  59. package/dist/editable-artifact-live.js.map +1 -0
  60. package/dist/editable-artifacts.d.ts +2 -0
  61. package/dist/editable-artifacts.js +179 -0
  62. package/dist/editable-artifacts.js.map +1 -0
  63. package/dist/index.d.ts +37 -26
  64. package/dist/index.js +4145 -959
  65. package/dist/index.js.map +1 -1
  66. package/dist/managed-session.d.ts +6 -2
  67. package/dist/rigs/index.d.ts +1 -1
  68. package/dist/rigs/provider-images.d.ts +31 -0
  69. package/dist/sandbox/fleet.d.ts +8 -5
  70. package/dist/sandbox/routing.d.ts +1 -0
  71. package/dist/session-authorization.d.ts +4 -2
  72. package/dist/transcription.d.ts +5 -0
  73. package/dist/workflow-wake-contract.d.ts +7 -0
  74. package/package.json +22 -10
  75. package/src/access/index.ts +14 -2
  76. package/src/application/new-session-drafts.ts +2 -0
  77. package/src/application/session-commands.ts +188 -107
  78. package/src/canonical-human-identities.ts +27 -0
  79. package/src/dependencies.ts +34 -2
  80. package/src/domain/capabilities.ts +729 -408
  81. package/src/domain/company-profile-durable-learning-adapter.ts +221 -0
  82. package/src/domain/conversation-integrations.ts +1238 -0
  83. package/src/domain/durable-learning-slack-publication.ts +202 -0
  84. package/src/domain/editable-artifacts/agent-application.ts +687 -0
  85. package/src/domain/editable-artifacts/durable-export-postgres.ts +139 -0
  86. package/src/domain/editable-artifacts/durable-export.ts +734 -0
  87. package/src/domain/editable-artifacts/errors.ts +115 -0
  88. package/src/domain/editable-artifacts/hash.ts +131 -0
  89. package/src/domain/editable-artifacts/in-memory.ts +1662 -0
  90. package/src/domain/editable-artifacts/index.ts +14 -0
  91. package/src/domain/editable-artifacts/ports.ts +462 -0
  92. package/src/domain/editable-artifacts/postgres-adapters.ts +49 -0
  93. package/src/domain/editable-artifacts/service.ts +2402 -0
  94. package/src/domain/editable-artifacts/snapshot-compaction.ts +246 -0
  95. package/src/domain/editable-artifacts/snapshot-verifier-genesis.ts +235 -0
  96. package/src/domain/editable-artifacts/snapshot-verifier-materialization.ts +74 -0
  97. package/src/domain/editable-artifacts/snapshot-verifier.ts +687 -0
  98. package/src/domain/editable-artifacts/types.ts +835 -0
  99. package/src/domain/fiken.ts +88 -0
  100. package/src/domain/insights.ts +163 -50
  101. package/src/domain/memory-slack-delivery.ts +204 -0
  102. package/src/domain/memory-slack-publication.ts +5 -2
  103. package/src/domain/packs.ts +266 -5
  104. package/src/domain/personal-connection-delegations.ts +97 -6
  105. package/src/domain/scheduled-tasks.ts +171 -29
  106. package/src/domain/session-tool-policy.ts +8 -2
  107. package/src/domain/sessions.ts +395 -148
  108. package/src/domain/skill-imports.ts +350 -0
  109. package/src/domain/slack-publication-secret-safety.ts +42 -0
  110. package/src/domain/timeline-annotations.ts +204 -0
  111. package/src/domain/video-generation-capabilities.ts +104 -0
  112. package/src/domain/video-generation.ts +249 -0
  113. package/src/editable-artifact-live/application.ts +182 -0
  114. package/src/editable-artifact-live/errors.ts +4 -0
  115. package/src/editable-artifact-live/index.ts +8 -0
  116. package/src/editable-artifact-live/outbox-dispatcher.ts +916 -0
  117. package/src/editable-artifact-live/ports.ts +139 -0
  118. package/src/editable-artifact-live/server.ts +1707 -0
  119. package/src/editable-artifact-live/ticket.ts +217 -0
  120. package/src/editable-artifact-live/types.ts +286 -0
  121. package/src/editable-artifact-live/wire.ts +95 -0
  122. package/src/editable-artifact-live.ts +2 -0
  123. package/src/editable-artifacts.ts +2 -0
  124. package/src/index.ts +15 -0
  125. package/src/managed-session.ts +19 -2
  126. package/src/rigs/index.ts +26 -19
  127. package/src/rigs/provider-images.ts +110 -0
  128. package/src/sandbox/fleet.ts +72 -66
  129. package/src/sandbox/routing.ts +6 -3
  130. package/src/session-authorization.ts +187 -52
  131. package/src/transcription.ts +5 -0
  132. package/src/workflow-wake-contract.ts +8 -0
@@ -2,6 +2,7 @@ import type { Settings } from "@opengeni/config";
2
2
  import type {
3
3
  AccessGrant,
4
4
  McpPersonalConnectionDelegation,
5
+ KnowledgeSourceSyncAction,
5
6
  ScheduledTask,
6
7
  ScheduledTaskAgentConfig,
7
8
  Session,
@@ -9,18 +10,24 @@ import type {
9
10
  SessionAuthorizationSurface,
10
11
  CreateScheduledTaskRequest as CreateScheduledTaskPayload,
11
12
  UpdateScheduledTaskRequest as UpdateScheduledTaskPayload,
13
+ XaiProviderAccountAuthoritySnapshotV1,
12
14
  } from "@opengeni/contracts";
13
15
  import { OPENGENI_SLACK_BOT_SESSION_METADATA_KEY } from "@opengeni/contracts";
14
16
  import {
15
17
  createScheduledTask,
16
18
  deleteScheduledTask,
19
+ getConnectionMetadata,
20
+ getKnowledgeSourceForSyncAuthority,
17
21
  getNestedAgentDepthDeploymentPolicy,
18
22
  getRig,
19
23
  getScheduledTask,
20
24
  getScheduledTaskPersonalConnectionDelegations,
25
+ getSessionTurnXaiProviderAccountAuthoritySnapshot,
21
26
  getSession,
22
27
  requireWorkspace,
28
+ scopedKnowledgeScopeKey,
23
29
  updateScheduledTask,
30
+ resolveXaiProviderAccountAuthoritySnapshotForAcceptance,
24
31
  type Database,
25
32
  type UpdateScheduledTaskInput,
26
33
  } from "@opengeni/db";
@@ -94,24 +101,39 @@ export async function createValidatedScheduledTask(input: {
94
101
  sessionAuthorization?: SessionAuthorizationPort | null | undefined;
95
102
  authorizationSurface?: SessionAuthorizationSurface | undefined;
96
103
  }): Promise<ScheduledTask> {
97
- const agentConfig = await validateScheduledTaskAgentConfig({
98
- ...input,
99
- workspaceId: input.grant.workspaceId,
100
- });
104
+ // API parsing fills this default, but pack installers and older internal
105
+ // callers can still invoke the shared validator with the pre-action shape.
106
+ const action = input.payload.action ?? ({ kind: "agent_turn" } as const);
107
+ const knowledgeAction = action.kind === "knowledge_source_sync" ? action : null;
108
+ if (knowledgeAction) {
109
+ await validateKnowledgeSourceSyncAction({
110
+ db: input.db,
111
+ grant: input.grant,
112
+ action: knowledgeAction,
113
+ });
114
+ }
115
+ const agentConfig = knowledgeAction
116
+ ? input.payload.agentConfig
117
+ : await validateScheduledTaskAgentConfig({
118
+ ...input,
119
+ workspaceId: input.grant.workspaceId,
120
+ });
101
121
  const id = crypto.randomUUID();
102
122
  validateScheduledTaskSchedule(input.payload.schedule);
103
- const target = await validateScheduledTaskTarget({
104
- db: input.db,
105
- sessionAuthorization: input.sessionAuthorization,
106
- authorizationSurface: input.authorizationSurface,
107
- grant: input.grant,
108
- targetSessionId: input.payload.targetSessionId,
109
- runMode: input.payload.runMode,
110
- variableSetId: input.payload.variableSetId,
111
- rigId: input.payload.rigId,
112
- agentConfig,
113
- });
114
- if (input.payload.variableSetId) {
123
+ const target = knowledgeAction
124
+ ? null
125
+ : await validateScheduledTaskTarget({
126
+ db: input.db,
127
+ sessionAuthorization: input.sessionAuthorization,
128
+ authorizationSurface: input.authorizationSurface,
129
+ grant: input.grant,
130
+ targetSessionId: input.payload.targetSessionId,
131
+ runMode: input.payload.runMode,
132
+ variableSetId: input.payload.variableSetId,
133
+ rigId: input.payload.rigId,
134
+ agentConfig,
135
+ });
136
+ if (!knowledgeAction && input.payload.variableSetId) {
115
137
  await validateVariableSetAttachment(
116
138
  { settings: input.settings, db: input.db },
117
139
  input.grant,
@@ -124,22 +146,36 @@ export async function createValidatedScheduledTask(input: {
124
146
  // (at dispatch), so validate only that the id names a rig in the workspace —
125
147
  // NOT that it has an active version now (that is a fire-time concern). RLS
126
148
  // makes a cross-workspace id indistinguishable from missing → both 422.
127
- if (input.payload.rigId) {
149
+ if (!knowledgeAction && input.payload.rigId) {
128
150
  await requireScheduledTaskRig(input.db, input.grant.workspaceId, input.payload.rigId);
129
151
  }
130
- const runtimeSettings = await settingsWithEnabledCapabilityMcpServers(
131
- input.db,
132
- input.grant.workspaceId,
133
- input.settings,
134
- );
135
- const personalConnectionDelegations = await freezePersonalConnectionDelegations({
136
- db: input.db,
137
- workspaceId: input.grant.workspaceId,
138
- settings: runtimeSettings,
139
- tools: [...agentConfig.tools, { kind: "mcp", id: "opengeni" }],
140
- source: personalConnectionDelegationSourceForGrant(input.grant),
141
- });
152
+ const personalConnectionDelegations = knowledgeAction
153
+ ? []
154
+ : await freezePersonalConnectionDelegations({
155
+ db: input.db,
156
+ workspaceId: input.grant.workspaceId,
157
+ settings: await settingsWithEnabledCapabilityMcpServers(
158
+ input.db,
159
+ input.grant.workspaceId,
160
+ input.settings,
161
+ { subjectId: input.grant.subjectId },
162
+ ),
163
+ tools: [...agentConfig.tools, { kind: "mcp", id: "opengeni" }],
164
+ source: personalConnectionDelegationSourceForGrant(input.grant),
165
+ });
142
166
  const creationInitiator = creationInitiatorForGrant(input.grant);
167
+ const xaiProviderAccountAuthoritySnapshot: XaiProviderAccountAuthoritySnapshotV1 =
168
+ creationInitiator.actor
169
+ ? await getSessionTurnXaiProviderAccountAuthoritySnapshot(
170
+ input.db,
171
+ input.grant.workspaceId,
172
+ creationInitiator.actor.sessionId,
173
+ creationInitiator.actor.turnId,
174
+ )
175
+ : await resolveXaiProviderAccountAuthoritySnapshotForAcceptance(input.db, {
176
+ workspaceId: input.grant.workspaceId,
177
+ subjectId: input.grant.subjectId,
178
+ });
143
179
  return await createScheduledTask(input.db, {
144
180
  id,
145
181
  accountId: input.grant.accountId,
@@ -150,11 +186,13 @@ export async function createValidatedScheduledTask(input: {
150
186
  temporalScheduleId: scheduledTaskTemporalScheduleId(id),
151
187
  runMode: input.payload.runMode,
152
188
  overlapPolicy: input.payload.overlapPolicy,
189
+ action,
153
190
  agentConfig,
154
191
  ...(creationInitiator.initiator ? { createdBy: creationInitiator.initiator } : {}),
155
192
  ...(creationInitiator.context ? { createdByContext: creationInitiator.context } : {}),
156
193
  createdByActor: creationInitiator.actor ?? null,
157
194
  personalConnectionDelegations,
195
+ xaiProviderAccountAuthoritySnapshot,
158
196
  targetSessionId: target?.id ?? null,
159
197
  variableSetId: input.payload.variableSetId ?? null,
160
198
  rigId: input.payload.rigId ?? null,
@@ -301,6 +339,50 @@ export async function validatedScheduledTaskUpdate(input: {
301
339
  authorizationSurface?: SessionAuthorizationSurface | undefined;
302
340
  }): Promise<UpdateScheduledTaskInput> {
303
341
  const update: UpdateScheduledTaskInput = {};
342
+ const existingKnowledge = input.existing.action.kind === "knowledge_source_sync";
343
+ if (input.payload.action && input.payload.action.kind !== input.existing.action.kind) {
344
+ throw new HTTPException(409, {
345
+ message: "scheduled task action kind is immutable; create a new schedule",
346
+ });
347
+ }
348
+ if (existingKnowledge) {
349
+ if (
350
+ input.payload.agentConfig !== undefined ||
351
+ input.payload.runMode !== undefined ||
352
+ input.payload.targetSessionId !== undefined ||
353
+ input.payload.variableSetId !== undefined ||
354
+ input.payload.rigId !== undefined
355
+ ) {
356
+ throw new HTTPException(422, {
357
+ message: "knowledge source schedules do not accept agent/session configuration",
358
+ });
359
+ }
360
+ if (input.payload.overlapPolicy === "allow_concurrent") {
361
+ throw new HTTPException(422, {
362
+ message: "knowledge source schedules require skip or buffer_one overlap",
363
+ });
364
+ }
365
+ if (input.payload.action?.kind === "knowledge_source_sync") {
366
+ await validateKnowledgeSourceSyncAction({
367
+ db: input.db,
368
+ grant: input.grant,
369
+ action: input.payload.action,
370
+ });
371
+ update.action = input.payload.action;
372
+ }
373
+ if (input.payload.name !== undefined)
374
+ update.name = trimmedScheduledTaskName(input.payload.name);
375
+ if (input.payload.status !== undefined) update.status = input.payload.status;
376
+ if (input.payload.schedule !== undefined) {
377
+ validateScheduledTaskSchedule(input.payload.schedule);
378
+ update.schedule = input.payload.schedule;
379
+ }
380
+ if (input.payload.overlapPolicy !== undefined) {
381
+ update.overlapPolicy = input.payload.overlapPolicy;
382
+ }
383
+ if (input.payload.metadata !== undefined) update.metadata = input.payload.metadata;
384
+ return update;
385
+ }
304
386
  const existingTarget = input.existing.targetSessionId;
305
387
  const nextRunMode = input.payload.runMode ?? input.existing.runMode;
306
388
  const nextTargetSessionId =
@@ -412,6 +494,7 @@ export async function validatedScheduledTaskUpdate(input: {
412
494
  input.db,
413
495
  input.existing.workspaceId,
414
496
  input.settings,
497
+ { subjectId: input.grant.subjectId },
415
498
  );
416
499
  const personalConnectionDelegations = await freezePersonalConnectionDelegations({
417
500
  db: input.db,
@@ -517,6 +600,7 @@ export async function restoreScheduledTask(
517
600
  schedule: task.schedule,
518
601
  runMode: task.runMode,
519
602
  overlapPolicy: task.overlapPolicy,
603
+ action: task.action,
520
604
  agentConfig: task.agentConfig,
521
605
  personalConnectionDelegations: previous.personalConnectionDelegations,
522
606
  ...(task.runMode === "existing_session"
@@ -528,6 +612,63 @@ export async function restoreScheduledTask(
528
612
  });
529
613
  }
530
614
 
615
+ async function validateKnowledgeSourceSyncAction(input: {
616
+ db: Database;
617
+ grant: AccessGrant;
618
+ action: KnowledgeSourceSyncAction;
619
+ }): Promise<void> {
620
+ if (input.action.initiatingSubjectId !== input.grant.subjectId) {
621
+ throw new HTTPException(403, {
622
+ message: "knowledge source sync must preserve the exact initiating subject",
623
+ });
624
+ }
625
+ if (input.action.connection.ownerSubjectId !== input.grant.subjectId) {
626
+ throw new HTTPException(403, {
627
+ message: "knowledge source connection must belong to the initiating subject",
628
+ });
629
+ }
630
+ const resolved = await getKnowledgeSourceForSyncAuthority(input.db, {
631
+ accountId: input.grant.accountId,
632
+ workspaceId: input.grant.workspaceId,
633
+ sourceId: input.action.sourceId,
634
+ initiatingSubjectId: input.grant.subjectId,
635
+ });
636
+ if (!resolved || resolved.source.lifecycleState !== "active") {
637
+ throw new HTTPException(404, { message: "knowledge source not found" });
638
+ }
639
+ if (
640
+ resolved.source.syncGeneration !== input.action.sourceGeneration ||
641
+ resolved.source.lifecycleGeneration !== input.action.sourceLifecycleGeneration ||
642
+ scopedKnowledgeScopeKey(resolved.source.scope) !==
643
+ scopedKnowledgeScopeKey(input.action.destination)
644
+ ) {
645
+ throw new HTTPException(409, {
646
+ message: "knowledge source authority or generation changed",
647
+ });
648
+ }
649
+ const connection = await getConnectionMetadata(
650
+ input.db,
651
+ input.grant.workspaceId,
652
+ input.action.connection.connectionId,
653
+ input.grant.subjectId,
654
+ );
655
+ if (
656
+ !connection ||
657
+ connection.accountId !== input.grant.accountId ||
658
+ connection.workspaceId !== input.grant.workspaceId ||
659
+ connection.subjectId !== input.action.connection.ownerSubjectId ||
660
+ connection.version !== input.action.connection.connectionVersion ||
661
+ connection.providerDomain.toLowerCase() !==
662
+ input.action.connection.providerDomain.toLowerCase() ||
663
+ connection.kind !== input.action.connection.kind ||
664
+ connection.status !== "active"
665
+ ) {
666
+ throw new HTTPException(409, {
667
+ message: "knowledge source connection authority changed or requires reconnect",
668
+ });
669
+ }
670
+ }
671
+
531
672
  export class ScheduledTaskSyncError extends Error {
532
673
  readonly persistenceRestored: boolean;
533
674
 
@@ -647,6 +788,7 @@ async function validateScheduledTaskAgentConfig(input: {
647
788
  input.db,
648
789
  input.workspaceId,
649
790
  input.settings,
791
+ { subjectId: input.grant.subjectId },
650
792
  );
651
793
  const requestedTools = validateToolRefs(input.payload.agentConfig.tools ?? [], runtimeSettings);
652
794
  // A task whose creator did not choose tools gets the workspace's enabled
@@ -169,8 +169,11 @@ export async function workspaceSessionToolPolicyServerIds(
169
169
  db: Database,
170
170
  workspaceId: string,
171
171
  settings: Settings,
172
+ subjectId?: string,
172
173
  ): Promise<string[]> {
173
- const runtimeSettings = await settingsWithEnabledCapabilityMcpServers(db, workspaceId, settings);
174
+ const runtimeSettings = await settingsWithEnabledCapabilityMcpServers(db, workspaceId, settings, {
175
+ ...(subjectId ? { subjectId } : {}),
176
+ });
174
177
  return sortedIds(runtimeSettings.mcpServers.map((server) => server.id));
175
178
  }
176
179
 
@@ -179,8 +182,11 @@ export async function workspaceSessionToolPolicyDefaultServerIds(
179
182
  db: Database,
180
183
  workspaceId: string,
181
184
  settings: Settings,
185
+ subjectId?: string,
182
186
  ): Promise<string[]> {
183
- const runtimeSettings = await settingsWithEnabledCapabilityMcpServers(db, workspaceId, settings);
187
+ const runtimeSettings = await settingsWithEnabledCapabilityMcpServers(db, workspaceId, settings, {
188
+ ...(subjectId ? { subjectId } : {}),
189
+ });
184
190
  return defaultSessionMcpServerIds(runtimeSettings.mcpServers);
185
191
  }
186
192