@opengeni/api-router 3.1.3-canary.38890816741001 → 3.3.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 (47) hide show
  1. package/dist/app.js +1 -1
  2. package/dist/{chunk-OT56OY4V.js → chunk-6CECHDZP.js} +1569 -399
  3. package/dist/{chunk-OT56OY4V.js.map → chunk-6CECHDZP.js.map} +1 -1
  4. package/dist/index.js +50 -2
  5. package/dist/index.js.map +1 -1
  6. package/dist/integrations/external-vault-providers.d.ts +29 -0
  7. package/dist/interaction-secrets-vault.d.ts +2 -2
  8. package/dist/mcp/action-descriptions.d.ts +1 -1
  9. package/dist/mcp/scheduled-task-view.d.ts +4 -4
  10. package/dist/routes/vault-providers.d.ts +4 -2
  11. package/dist/sandbox/channel-a.d.ts +10 -1
  12. package/dist/shutdown.d.ts +14 -0
  13. package/dist/site-publishing/agent-data-tools.d.ts +5 -5
  14. package/dist/site-publishing/agent-session.d.ts +3 -2
  15. package/dist/site-publishing/runtime.d.ts +7 -6
  16. package/dist/site-publishing/service.d.ts +8 -11
  17. package/dist/site-publishing/session-request-authority.d.ts +3 -0
  18. package/dist/workspace-tool-gateway-secrets.d.ts +1 -1
  19. package/package.json +25 -22
  20. package/src/access-grant-rls.ts +1 -0
  21. package/src/app.ts +14 -2
  22. package/src/http/sse.ts +5 -1
  23. package/src/index.ts +13 -1
  24. package/src/integrations/external-vault-providers.ts +136 -0
  25. package/src/interaction-secrets-vault.ts +6 -2
  26. package/src/mcp/action-catalog.gen.ts +253 -4
  27. package/src/mcp/action-descriptions.ts +32 -2
  28. package/src/mcp/action-schema-imports.gen.ts +3 -1
  29. package/src/routes/browser-sessions.ts +61 -17
  30. package/src/routes/computer-sessions.ts +102 -39
  31. package/src/routes/connections.ts +17 -0
  32. package/src/routes/insights-usage.ts +22 -0
  33. package/src/routes/sessions.ts +22 -4
  34. package/src/routes/site-runtime.ts +62 -20
  35. package/src/routes/vault-providers.ts +788 -29
  36. package/src/routes/vaults.ts +5 -1
  37. package/src/sandbox/channel-a.ts +18 -1
  38. package/src/sandbox/metrics-ingestion.ts +1 -0
  39. package/src/shutdown.ts +54 -0
  40. package/src/site-frame-guard.ts +11 -2
  41. package/src/site-publishing/agent-data-tools.ts +16 -8
  42. package/src/site-publishing/agent-session.ts +24 -6
  43. package/src/site-publishing/runtime.ts +29 -7
  44. package/src/site-publishing/service.ts +65 -77
  45. package/src/site-publishing/session-request-authority.ts +14 -0
  46. package/src/workspace-tool-gateway-secrets.ts +9 -2
  47. package/src/workspace-tool-gateway.ts +6 -2
@@ -1,6 +1,6 @@
1
1
  // Generated by scripts/public-api/action-catalog.ts. Do not edit.
2
2
  // Named imports keep unrelated response and tool validators out of the API graph.
3
- import { AcceptOrganizationInvitationRequest, AcceptOrganizationRecoveryCustodyRequest, AcknowledgeStreamRequest, ActivateCodexRealtimeConnectionRequest, ActivateCompanyProfileRevisionRequest, ActivatePreferenceRegistryRevisionRequest, ActivateWorkspaceInstructionPolicyRequest, AddDocumentRequest, AddWorkspaceMemberRequest, AgentInstructionReviewRequest, AgentLearningContext, ApiIntegrationOAuthStartRequest, AppendArchivedSessionEventsRequest, ApplySessionGoalRevisionRequest, ApproveSlackUserLinkAccessRequest, ArtifactCatalogKind, AtlassianLifecycleActionRequest, AttachViewerRequest, BeginSessionRealtimeRequest, BrowserActionRequest, BrowserDomReadRequest, BrowserDownloadSaveRequest, BrowserOpenTargetRequest, BrowserSessionAttachmentRequest, BrowserSessionLifecycleRequest, ChangeMachineAudienceRequest, ChangePreferenceRegistryScopeRequest, ClaudeSubscriptionOAuthCompleteRequest, ClaudeSubscriptionOAuthStartRequest, ClaudeSubscriptionSetupTokenRequest, ClearWorkspaceAllowanceRequest, CodexAppsDesignationRequest, CodexRealtimeWebrtcRequest, CodexSourceRequest, CompanyProfileDiffRequest, ComputerActionRequest, ComputerNativeCallRequest, ComputerSessionAttachmentRequest, ComputerSessionLifecycleRequest, ConfigureOrganizationRecoveryPolicyRequest, CorrectPreferenceRegistryRequest, CreateAdditionalOrganizationRequest, CreateApiKeyRequest, CreateAutomationSourceRequest, CreateAutomationTriggerRequest, CreateBillingPortalRequest, CreateBrowserIdentityRequest, CreateBrowserSessionRequest, CreateCapabilityCatalogItemRequest, CreateChannelRequest, CreateCheckoutRequest, CreateComputerSessionRequest, CreateConnectionRequest, CreateDocumentBaseRequest, CreateFeedbackRequest, CreateFileUploadRequest, CreateInteractionInterventionRequest, CreateKnowledgeDropRequest, CreateNetworkRouteRequest, CreateOrganizationApiKeyRequest, CreateOrganizationInvitationRequest, CreateOrganizationProviderCustomModelRequest, CreateOrganizationRequest, CreateOrganizationServiceAccountRequest, CreateOrganizationWebhookRequest, CreateOrganizationWorkspaceRequest, CreatePersonalApiKeyRequest, CreatePrReviewAppRegistrationRequest, CreatePrReviewRepositoryBindingRequest, CreatePreferenceRegistryProposalRequest, CreateRigRequest, CreateScheduledTaskRequest, CreateSessionRequest, CreateSiteAuthConnectionRequest, CreateWorkspaceArtifactRequest, CreateWorkspaceGatewayCustomModelRequest, CreateWorkspaceInstructionPolicyDraftRequest, CreateWorkspaceInstructionPolicyOnboardingProposalRequest, CreateWorkspaceOpenRouterCustomModelRequest, CreateWorkspaceOpperCustomModelRequest, CreateWorkspaceRequest, CreateWorkspaceWebhookRequest, DeactivatePreferenceRegistryRequest, DeleteOrganizationProviderCustomModelRequest, DeleteSessionQueueItemRequest, DeleteWorkspaceGatewayCustomModelRequest, DeleteWorkspaceOpenRouterCustomModelRequest, DeleteWorkspaceOpperCustomModelRequest, DeviceEnrollmentApproveRequest, DisableOrganizationRecoveryPolicyRequest, EditSessionQueueItemRequest, EnableCapabilityRequest, EndSessionRealtimeRequest, EnsureWorkspaceRequest, ExternalAuthInteractiveRequest, ExternalAuthRunRequest, FikenInstallRequest, FikenOAuthStartRequest, FileListRequest, ForkSessionRequest, FsDeleteRequest, FsListBatchRequest, FsListRequest, FsMkdirRequest, FsMoveRequest, FsReadRequest, FsWriteRequest, GatewayRealtimeConnectRequest, GetMyUsageRequest, GetUsageRequest, GitDiffRequest, GitLogRequest, GitReadBatchRequest, GitShowRequest, GitStatusRequest, GrantSessionAdminAccessRequest, GrantWorkspaceCreditsRequest, ImportArchivedSessionRequest, ImportLegacyWorkspaceInstructionPolicyDraftRequest, InboxItem, InboxSettings, InsightsRange, InstallApiIntegrationRequest, InstallLibrarySkillRequest, InstallPluginRequest, InstallSkillRequest, IssueUserResourceGrantRequest, KnowledgeEntryBatchReviewRequest, KnowledgeEntryListRequest, KnowledgeEntryRestoreRequest, KnowledgeEntryReviewRequest, KnowledgeEntrySaveRequest, KnowledgeReviewBatchListRequest, KnowledgeSavePreparationRequest, MachineAudiencePreviewRequest, McpConnectionDecision, MemberNotificationsSetting, MemorySlackPublicationActionRequest, MintEnrollTokenRequest, ModelConnectionAccessPolicy, MoveDocumentRequest, MoveSessionQueueItemRequest, MutateIntegrationFacetRequest, OAuthStartRequest, OpenGeniSlackBotInstallRequest, OpenMachinePrivacySettingsRequest, OrganizationModelProviderKind, OrganizationRecoveryOperationCommandRequest, OrganizationUsagePeriod, PrepareSlackUserLinkAccessRequest, PreviewApiIntegrationRequest, PreviewPluginRequest, PreviewSkillImportRequest, ProposeRigChangeRequest, PtyCloseRequest, PtyOpenRequest, PtyResizeRequest, PtyWriteRequest, PublishBrowserRevisionRequest, PublishSandboxFileArtifactRequest, PublishWorkspaceArtifactVersionRequest, PutOrganizationCredentialProviderRequest, PutOrganizationWorkspaceMemberRequest, PutWorkspaceCredentialProviderRequest, ReclassifyDocumentAuthorityRequest, RefreshScheduledTaskAccessRequest, RejectPreferenceRegistryProposalRequest, RejectSessionGoalRevisionRequest, RemoveEnrollmentRequest, RenewSessionRealtimeRequest, ReorderChannelsRequest, ReportAuthRunRequest, ResolveInteractionInterventionRequest, RetryOrganizationUserSetupDeliveryRequest, RevokeOrganizationInvitationRequest, RevokeOrganizationModelProviderConnectionRequest, RevokeOrganizationWorkspaceMemberRequest, RollbackCompanyProfileRequest, RollbackSessionGoalRevisionRequest, RollbackWorkspaceArtifactRequest, RollbackWorkspaceInstructionPolicyRequest, RotateSessionMcpCredentialsRequest, RunDocumentDefaultCollectionBackfillRequest, SandboxRecoveryRequest, SaveAtlassianSourcesRequest, SaveComposerDraftRequest, SaveNewSessionDraftRequest, SessionCodexAccountPinRequest, SessionControlRequest, SessionHumanInputRequest, SessionInboxMute, SessionMessageSearchRequest, SessionRetryRequest, SessionScopeSubjectId, SessionStatus, SessionVisibility, SetMemberAllowanceRequest, SetSessionModelAccountChoiceRequest, SetSessionUsageLimitRequest, SetWorkspaceAllowanceRequest, SetWorkspaceArtifactStatusRequest, SetWorkspaceDefaultRigRequest, SiteDataCollectionDefinitionRequest, SiteDataImportRequest, SiteDataQueryRequest, SiteDataWriteRequest, SiteLimitProfile, SitePublishWarningFix, SiteSqlExportFormat, SiteSqlImportRequest, SiteSqlMigrationRequest, SiteSqlQueryDefinitionRequest, SiteSqlRunRequest, SiteSqlSettingsRequest, SiteSqlStatementRequest, SiteTakedownRequest, SlackUserLinkAccessMutationRequest, SocialOAuthStartRequest, StartAuthRunRequest, StartOrganizationRecoveryOperationRequest, SteerSessionQueueItemRequest, SubmitComposerDraftRequest, SubscriptionAccountRenameRequest, SubscriptionAccountToggleRequest, SubscriptionConnectPollRequest, SubscriptionRotationSettingsRequest, SupergrokConnectStartRequest, SupersedePreferenceRegistryRequest, SwapActiveSandboxRequest, SyncSessionRealtimeLedgerRequest, TerminalExecRequest, TriggerAutomationManuallyRequest, UninstallApiIntegrationRequest, UninstallPluginRequest, UninstallSkillRequest, UpdateAutomationSourceRequest, UpdateAutomationTriggerRequest, UpdateBrowserIdentityRequest, UpdateChannelRequest, UpdateCompanyProfileAgentPolicyRequest, UpdateCompanyProfileRequest, UpdateConnectionRequest, UpdateConnectorToolPermissionsRequest, UpdateGitHubActionPolicyRequest, UpdateMachineOperationPolicyRequest, UpdateMemorySlackPublicationConfigurationRequest, UpdateModelAccountPreferencesRequest, UpdateNetworkRouteRequest, UpdateOpenGeniSlackBotOrganizationAccess, UpdateOrganizationAgentAdminAccessRequest, UpdateOrganizationApiKeyRequest, UpdateOrganizationIntegrationPolicyRequest, UpdateOrganizationMcpConnectionRequest, UpdateOrganizationMemberRequest, UpdateOrganizationModelAccountSettingsRequest, UpdateOrganizationModelDefaultsRequest, UpdateOrganizationNameRequest, UpdateOrganizationPrivacySettingsRequest, UpdateOrganizationPrivateSessionSettingsRequest, UpdateOrganizationRetentionPolicyRequest, UpdateOrganizationServiceAccountRequest, UpdateOrganizationWebhookRequest, UpdateOrganizationWorkspaceRequest, UpdatePrReviewAppRegistrationRequest, UpdatePrReviewRepositoryBindingRequest, UpdateRigRequest, UpdateScheduledTaskRequest, UpdateSessionAgentRequest, UpdateSessionArchiveRequest, UpdateSessionAttentionRequest, UpdateSessionChannelRequest, UpdateSessionGoalRequest, UpdateSessionMcpApprovalPolicyRequest, UpdateSessionMcpToolPermissionsRequest, UpdateSessionPinRequest, UpdateSessionRequest, UpdateSessionRetentionRequest, UpdateSessionSkillsRequest, UpdateSessionToolPolicyRequest, UpdateSessionVisibilityRequest, UpdateSiteAuthConnectionRequest, UpdateSlackChannelRoutesRequest, UpdateVideoGenerationPolicyRequest, UpdateWorkspaceArtifactVisibilityRequest, UpdateWorkspaceMemberRequest, UpdateWorkspaceModelAccountSettingsRequest, UpdateWorkspaceModelPolicyRequest, UpdateWorkspaceRequest, UpdateWorkspaceSettingsRequest, UpdateWorkspaceWebhookRequest, UpsertIntegrationFacetRequest, UpsertOrganizationModelProviderConnectionRequest, UpsertSitePublicationRequest, VerifyAuthRunRequest, ViewerHeartbeatRequest, WorkClaimSubjectType, WorkspaceInstructionPolicyDiffRequest, WorkspacePauseTimerRequest } from "@opengeni/contracts";
3
+ import { AcceptOrganizationInvitationRequest, AcceptOrganizationRecoveryCustodyRequest, AcknowledgeStreamRequest, ActivateCodexRealtimeConnectionRequest, ActivateCompanyProfileRevisionRequest, ActivatePreferenceRegistryRevisionRequest, ActivateWorkspaceInstructionPolicyRequest, AddDocumentRequest, AddWorkspaceMemberRequest, AgentInstructionReviewRequest, AgentLearningContext, ApiIntegrationOAuthStartRequest, AppendArchivedSessionEventsRequest, ApplySessionGoalRevisionRequest, ApproveSlackUserLinkAccessRequest, ArtifactCatalogKind, AtlassianLifecycleActionRequest, AttachViewerRequest, BeginSessionRealtimeRequest, BrowserActionRequest, BrowserDomReadRequest, BrowserDownloadSaveRequest, BrowserOpenTargetRequest, BrowserSessionAttachmentRequest, BrowserSessionLifecycleRequest, ChangeMachineAudienceRequest, ChangePreferenceRegistryScopeRequest, ClaudeSubscriptionOAuthCompleteRequest, ClaudeSubscriptionOAuthStartRequest, ClaudeSubscriptionSetupTokenRequest, ClearWorkspaceAllowanceRequest, CodexAppsDesignationRequest, CodexRealtimeWebrtcRequest, CodexSourceRequest, CompanyProfileDiffRequest, ComputerActionRequest, ComputerNativeCallRequest, ComputerSessionAttachmentRequest, ComputerSessionLifecycleRequest, ConfigureOrganizationRecoveryPolicyRequest, CorrectPreferenceRegistryRequest, CreateAdditionalOrganizationRequest, CreateApiKeyRequest, CreateAutomationSourceRequest, CreateAutomationTriggerRequest, CreateBillingPortalRequest, CreateBrowserIdentityRequest, CreateBrowserSessionRequest, CreateCapabilityCatalogItemRequest, CreateChannelRequest, CreateCheckoutRequest, CreateComputerSessionRequest, CreateConnectionRequest, CreateDocumentBaseRequest, CreateFeedbackRequest, CreateFileUploadRequest, CreateInteractionInterventionRequest, CreateKnowledgeDropRequest, CreateNetworkRouteRequest, CreateOrganizationApiKeyRequest, CreateOrganizationInvitationRequest, CreateOrganizationProviderCustomModelRequest, CreateOrganizationRequest, CreateOrganizationServiceAccountRequest, CreateOrganizationWebhookRequest, CreateOrganizationWorkspaceRequest, CreatePersonalApiKeyRequest, CreatePrReviewAppRegistrationRequest, CreatePrReviewRepositoryBindingRequest, CreatePreferenceRegistryProposalRequest, CreateRigRequest, CreateScheduledTaskRequest, CreateSessionRequest, CreateSiteAuthConnectionRequest, CreateWorkspaceArtifactRequest, CreateWorkspaceGatewayCustomModelRequest, CreateWorkspaceInstructionPolicyDraftRequest, CreateWorkspaceInstructionPolicyOnboardingProposalRequest, CreateWorkspaceOpenRouterCustomModelRequest, CreateWorkspaceOpperCustomModelRequest, CreateWorkspaceRequest, CreateWorkspaceWebhookRequest, DeactivatePreferenceRegistryRequest, DeleteOrganizationProviderCustomModelRequest, DeleteSessionQueueItemRequest, DeleteWorkspaceGatewayCustomModelRequest, DeleteWorkspaceOpenRouterCustomModelRequest, DeleteWorkspaceOpperCustomModelRequest, DeviceEnrollmentApproveRequest, DisableOrganizationRecoveryPolicyRequest, EditSessionQueueItemRequest, EnableCapabilityRequest, EndSessionRealtimeRequest, EnsureWorkspaceRequest, ExternalAuthInteractiveRequest, ExternalAuthRunRequest, FikenInstallRequest, FikenOAuthStartRequest, FileListRequest, ForkSessionRequest, FsDeleteRequest, FsListBatchRequest, FsListRequest, FsMkdirRequest, FsMoveRequest, FsReadRequest, FsWriteRequest, GatewayRealtimeConnectRequest, GetMyUsageRequest, GetUsageRequest, GitDiffRequest, GitLogRequest, GitReadBatchRequest, GitShowRequest, GitStatusRequest, GrantSessionAdminAccessRequest, GrantWorkspaceCreditsRequest, ImportArchivedSessionRequest, ImportLegacyWorkspaceInstructionPolicyDraftRequest, InboxItem, InboxSettings, InsightsRange, InstallApiIntegrationRequest, InstallLibrarySkillRequest, InstallPluginRequest, InstallSkillRequest, InstallVaultProviderRequest, IssueUserResourceGrantRequest, KnowledgeEntryBatchReviewRequest, KnowledgeEntryListRequest, KnowledgeEntryRestoreRequest, KnowledgeEntryReviewRequest, KnowledgeEntrySaveRequest, KnowledgeReviewBatchListRequest, KnowledgeSavePreparationRequest, MachineAudiencePreviewRequest, McpConnectionDecision, MemberNotificationsSetting, MemorySlackPublicationActionRequest, MintEnrollTokenRequest, ModelConnectionAccessPolicy, MoveDocumentRequest, MoveSessionQueueItemRequest, MutateIntegrationFacetRequest, OAuthStartRequest, OpenGeniSlackBotInstallRequest, OpenMachinePrivacySettingsRequest, OrganizationModelProviderKind, OrganizationRecoveryOperationCommandRequest, OrganizationUsagePeriod, PrepareSlackUserLinkAccessRequest, PreviewApiIntegrationRequest, PreviewPluginRequest, PreviewSkillImportRequest, ProposeRigChangeRequest, PtyCloseRequest, PtyOpenRequest, PtyResizeRequest, PtyWriteRequest, PublishBrowserRevisionRequest, PublishSandboxFileArtifactRequest, PublishWorkspaceArtifactVersionRequest, PutOrganizationCredentialProviderRequest, PutOrganizationWorkspaceMemberRequest, PutWorkspaceCredentialProviderRequest, ReclassifyDocumentAuthorityRequest, RefreshScheduledTaskAccessRequest, RejectPreferenceRegistryProposalRequest, RejectSessionGoalRevisionRequest, RemoveEnrollmentRequest, RenewSessionRealtimeRequest, ReorderChannelsRequest, ReplaceVaultProviderCredentialsRequest, ReportAuthRunRequest, ResolveInteractionInterventionRequest, RetryOrganizationUserSetupDeliveryRequest, RevokeOrganizationInvitationRequest, RevokeOrganizationModelProviderConnectionRequest, RevokeOrganizationWorkspaceMemberRequest, RollbackCompanyProfileRequest, RollbackSessionGoalRevisionRequest, RollbackWorkspaceArtifactRequest, RollbackWorkspaceInstructionPolicyRequest, RotateSessionMcpCredentialsRequest, RunDocumentDefaultCollectionBackfillRequest, SandboxRecoveryRequest, SaveAtlassianSourcesRequest, SaveComposerDraftRequest, SaveNewSessionDraftRequest, SessionCodexAccountPinRequest, SessionControlRequest, SessionHumanInputRequest, SessionInboxMute, SessionMessageSearchRequest, SessionRetryRequest, SessionScopeSubjectId, SessionStatus, SessionVisibility, SetMemberAllowanceRequest, SetSessionModelAccountChoiceRequest, SetSessionUsageLimitRequest, SetWorkspaceAllowanceRequest, SetWorkspaceArtifactStatusRequest, SetWorkspaceDefaultRigRequest, SiteDataCollectionDefinitionRequest, SiteDataImportRequest, SiteDataQueryRequest, SiteDataWriteRequest, SiteLimitProfile, SitePublishWarningFix, SiteSqlExportFormat, SiteSqlImportRequest, SiteSqlMigrationRequest, SiteSqlQueryDefinitionRequest, SiteSqlRunRequest, SiteSqlSettingsRequest, SiteSqlStatementRequest, SiteTakedownRequest, SlackUserLinkAccessMutationRequest, SocialOAuthStartRequest, StartAuthRunRequest, StartOrganizationRecoveryOperationRequest, SteerSessionQueueItemRequest, SubmitComposerDraftRequest, SubscriptionAccountRenameRequest, SubscriptionAccountToggleRequest, SubscriptionConnectPollRequest, SubscriptionRotationSettingsRequest, SupergrokConnectStartRequest, SupersedePreferenceRegistryRequest, SwapActiveSandboxRequest, SyncSessionRealtimeLedgerRequest, TerminalExecRequest, TriggerAutomationManuallyRequest, UninstallApiIntegrationRequest, UninstallPluginRequest, UninstallSkillRequest, UpdateAutomationSourceRequest, UpdateAutomationTriggerRequest, UpdateBrowserIdentityRequest, UpdateChannelRequest, UpdateCompanyProfileAgentPolicyRequest, UpdateCompanyProfileRequest, UpdateConnectionRequest, UpdateConnectorToolPermissionsRequest, UpdateGitHubActionPolicyRequest, UpdateMachineOperationPolicyRequest, UpdateMemorySlackPublicationConfigurationRequest, UpdateModelAccountPreferencesRequest, UpdateNetworkRouteRequest, UpdateOpenGeniSlackBotOrganizationAccess, UpdateOrganizationAgentAdminAccessRequest, UpdateOrganizationApiKeyRequest, UpdateOrganizationIntegrationPolicyRequest, UpdateOrganizationMcpConnectionRequest, UpdateOrganizationMemberRequest, UpdateOrganizationModelAccountSettingsRequest, UpdateOrganizationModelDefaultsRequest, UpdateOrganizationNameRequest, UpdateOrganizationPrivacySettingsRequest, UpdateOrganizationPrivateSessionSettingsRequest, UpdateOrganizationRetentionPolicyRequest, UpdateOrganizationServiceAccountRequest, UpdateOrganizationWebhookRequest, UpdateOrganizationWorkspaceRequest, UpdatePrReviewAppRegistrationRequest, UpdatePrReviewRepositoryBindingRequest, UpdateRigRequest, UpdateScheduledTaskRequest, UpdateSessionAgentRequest, UpdateSessionArchiveRequest, UpdateSessionAttentionRequest, UpdateSessionChannelRequest, UpdateSessionGoalRequest, UpdateSessionMcpApprovalPolicyRequest, UpdateSessionMcpToolPermissionsRequest, UpdateSessionPinRequest, UpdateSessionRequest, UpdateSessionRetentionRequest, UpdateSessionSkillsRequest, UpdateSessionToolPolicyRequest, UpdateSessionVisibilityRequest, UpdateSiteAuthConnectionRequest, UpdateSlackChannelRoutesRequest, UpdateVideoGenerationPolicyRequest, UpdateWorkspaceArtifactVisibilityRequest, UpdateWorkspaceMemberRequest, UpdateWorkspaceModelAccountSettingsRequest, UpdateWorkspaceModelPolicyRequest, UpdateWorkspaceRequest, UpdateWorkspaceSettingsRequest, UpdateWorkspaceWebhookRequest, UpsertIntegrationFacetRequest, UpsertOrganizationModelProviderConnectionRequest, UpsertSitePublicationRequest, VerifyAuthRunRequest, ViewerHeartbeatRequest, WorkClaimSubjectType, WorkspaceInstructionPolicyDiffRequest, WorkspacePauseTimerRequest } from "@opengeni/contracts";
4
4
 
5
5
  export const ACTION_REQUEST_SCHEMAS: Readonly<Record<string, unknown>> = {
6
6
  AcceptOrganizationInvitationRequest,
@@ -129,6 +129,7 @@ export const ACTION_REQUEST_SCHEMAS: Readonly<Record<string, unknown>> = {
129
129
  InstallLibrarySkillRequest,
130
130
  InstallPluginRequest,
131
131
  InstallSkillRequest,
132
+ InstallVaultProviderRequest,
132
133
  IssueUserResourceGrantRequest,
133
134
  KnowledgeEntryBatchReviewRequest,
134
135
  KnowledgeEntryListRequest,
@@ -174,6 +175,7 @@ export const ACTION_REQUEST_SCHEMAS: Readonly<Record<string, unknown>> = {
174
175
  RemoveEnrollmentRequest,
175
176
  RenewSessionRealtimeRequest,
176
177
  ReorderChannelsRequest,
178
+ ReplaceVaultProviderCredentialsRequest,
177
179
  ReportAuthRunRequest,
178
180
  ResolveInteractionInterventionRequest,
179
181
  RetryOrganizationUserSetupDeliveryRequest,
@@ -151,6 +151,7 @@ import {
151
151
  import {
152
152
  requireAccessGrant,
153
153
  requireSessionAuthorization,
154
+ withSessionAuthorizationReadReuse,
154
155
  recordWorkspaceUsage,
155
156
  requireLimit,
156
157
  relayConfigFromSettings,
@@ -2834,6 +2835,7 @@ export function registerBrowserSessionRoutes(
2834
2835
  enrollment.agentCapabilities.operationResourcePolicy === true,
2835
2836
  operationCpuQuotaSupported: enrollment.agentCapabilities.operationCpuQuota === true,
2836
2837
  transactionalFsWriteSupported: enrollment.agentCapabilities.transactionalFsWrite === true,
2838
+ browserControlHttpSupported: enrollment.agentCapabilities.browserControlHttp === true,
2837
2839
  ...(deps.settings.agentOpStreamEnabled === true &&
2838
2840
  enrollment.opStream === true &&
2839
2841
  deps.bus.getOpStreamConnection
@@ -3157,16 +3159,40 @@ export function registerBrowserSessionRoutes(
3157
3159
  browserSessionId: string,
3158
3160
  authorizationOperation: SessionAuthorizationOperation,
3159
3161
  channelOperation: ChannelAOperation,
3160
- callback: (input: {
3161
- client: BrowserControlClient;
3162
- sessionClient: ReturnType<BrowserControlClient["sessionClient"]>;
3163
- record: BrowserSessionControlRecord;
3164
- binding: NonNullable<BrowserSessionControlRecord["session"]["controller"]>;
3165
- placement: BrowserPlacement;
3166
- sourceAuthorization: ResolvedSessionAuthorization | null;
3167
- }) => Promise<T>,
3162
+ callback: ActiveBrowserControllerCallback<T>,
3168
3163
  recoverMissing = true,
3169
3164
  stages?: InteractionRouteStages,
3165
+ ): Promise<T> {
3166
+ // The source-session check and the machine-route check that follows it
3167
+ // prove the same live agent attempt; they share those reads. Everything
3168
+ // from the controller call onward reads fresh.
3169
+ return await withSessionAuthorizationReadReuse((authorizationReads) =>
3170
+ withActiveBrowserControllerReads(
3171
+ context,
3172
+ grant,
3173
+ workspaceId,
3174
+ browserSessionId,
3175
+ authorizationOperation,
3176
+ channelOperation,
3177
+ callback,
3178
+ recoverMissing,
3179
+ stages,
3180
+ authorizationReads,
3181
+ ),
3182
+ );
3183
+ }
3184
+
3185
+ async function withActiveBrowserControllerReads<T>(
3186
+ context: Context,
3187
+ grant: AccessGrant,
3188
+ workspaceId: string,
3189
+ browserSessionId: string,
3190
+ authorizationOperation: SessionAuthorizationOperation,
3191
+ channelOperation: ChannelAOperation,
3192
+ callback: ActiveBrowserControllerCallback<T>,
3193
+ recoverMissing: boolean,
3194
+ stages: InteractionRouteStages | undefined,
3195
+ authorizationReads: { handOffToToolDispatch(): void },
3170
3196
  ): Promise<T> {
3171
3197
  try {
3172
3198
  const record = await getBrowserSessionControlRecord(deps.db, {
@@ -3175,17 +3201,25 @@ export function registerBrowserSessionRoutes(
3175
3201
  browserSessionId,
3176
3202
  });
3177
3203
  stages?.mark("record");
3178
- const sourceAuthorization = await authorizeSourceSession(
3179
- deps,
3180
- grant,
3181
- record.sourceSessionId,
3182
- authorizationOperation,
3183
- );
3204
+ // A Connected Machine (or any placement without a cached controller URL)
3205
+ // always needs the source session; read it alongside authorization. A
3206
+ // denial still wins, and the session is only used once authorized.
3207
+ const sourceSessionNeeded =
3208
+ record.session.placement?.kind === "connected_machine" ||
3209
+ !record.controllerHostSandboxGroupId;
3210
+ const [authorized, sourceRead] = await Promise.allSettled([
3211
+ authorizeSourceSession(deps, grant, record.sourceSessionId, authorizationOperation),
3212
+ sourceSessionNeeded
3213
+ ? requireSourceSession(deps, workspaceId, record.sourceSessionId)
3214
+ : Promise.resolve(null),
3215
+ ]);
3216
+ if (authorized.status === "rejected") throw authorized.reason;
3217
+ if (sourceRead.status === "rejected") throw sourceRead.reason;
3218
+ const sourceAuthorization = authorized.value;
3184
3219
  stages?.mark("authorize");
3185
- let sourceSession: Session | null = null;
3220
+ let sourceSession: Session | null = sourceRead.value;
3186
3221
  if (record.session.placement?.kind === "connected_machine") {
3187
- sourceSession = await requireSourceSession(deps, workspaceId, record.sourceSessionId);
3188
- if (sourceSession.activeSandboxId !== record.session.placement.sandboxId) {
3222
+ if (sourceSession?.activeSandboxId !== record.session.placement.sandboxId) {
3189
3223
  return await throwBrowserSourcePlacementChanged(
3190
3224
  grant,
3191
3225
  record.sourceSessionId,
@@ -3217,6 +3251,7 @@ export function registerBrowserSessionRoutes(
3217
3251
  placement: BrowserPlacement,
3218
3252
  provisionedClient?: BrowserControlClient,
3219
3253
  ): Promise<T> => {
3254
+ authorizationReads.handOffToToolDispatch();
3220
3255
  // An active binding already proves browserd was provisioned. Reusing
3221
3256
  // it avoids restarting/checking the sidecar on every live input.
3222
3257
  const client = provisionedClient ?? connectController(deps, grant, record, placement);
@@ -4631,6 +4666,15 @@ async function settleBrowserRevisionCaptureFailure(
4631
4666
  });
4632
4667
  }
4633
4668
 
4669
+ type ActiveBrowserControllerCallback<T> = (input: {
4670
+ client: BrowserControlClient;
4671
+ sessionClient: ReturnType<BrowserControlClient["sessionClient"]>;
4672
+ record: BrowserSessionControlRecord;
4673
+ binding: NonNullable<BrowserSessionControlRecord["session"]["controller"]>;
4674
+ placement: BrowserPlacement;
4675
+ sourceAuthorization: ResolvedSessionAuthorization | null;
4676
+ }) => Promise<T>;
4677
+
4634
4678
  async function requireSourceSession(
4635
4679
  deps: ApiRouteDeps,
4636
4680
  workspaceId: string,
@@ -58,12 +58,14 @@ import {
58
58
  terminalizeStaleConnectedInteractionPlacement,
59
59
  touchComputerSessionController,
60
60
  type ComputerSessionControlRecord,
61
+ type EnrollmentRecord,
61
62
  type LeaseSnapshot,
62
63
  } from "@opengeni/db";
63
64
  import {
64
65
  hasPermission,
65
66
  requireAccessGrant,
66
67
  requireSessionAuthorization,
68
+ withSessionAuthorizationReadReuse,
67
69
  relayConfigFromSettings,
68
70
  resolveChannelAMachineConnection,
69
71
  resolveSessionSandboxRuntime,
@@ -125,7 +127,12 @@ import {
125
127
  observeComputerFrameEvidenceMismatch,
126
128
  observeLifecycleResult,
127
129
  } from "../interaction-metrics";
128
- import { withChannelA, withChannelARead, type ChannelAOperation } from "../sandbox/channel-a";
130
+ import {
131
+ withChannelA,
132
+ withChannelARead,
133
+ type ChannelAHandle,
134
+ type ChannelAOperation,
135
+ } from "../sandbox/channel-a";
129
136
  import { USER_CONTENT_SECURITY_HEADERS } from "../http/user-content";
130
137
  import { wrongInteractionPlacementMessage } from "./interaction-placement-message";
131
138
  import {
@@ -144,6 +151,14 @@ type ComputerPlacement = {
144
151
  screenControlAllowed?: boolean;
145
152
  };
146
153
 
154
+ type ActiveComputerControllerCallback<T> = (input: {
155
+ client: BrowserControlClient;
156
+ sessionClient: ReturnType<BrowserControlClient["computerSessionClient"]>;
157
+ record: ComputerSessionControlRecord;
158
+ binding: NonNullable<ComputerSessionControlRecord["session"]["controller"]>;
159
+ placement: ComputerPlacement;
160
+ }) => Promise<T>;
161
+
147
162
  const MODEL_COMPUTER_FRAME_MAX_BYTES = 256 * 1024;
148
163
 
149
164
  type ComputerFrameCaptureClient = {
@@ -1117,6 +1132,38 @@ export function registerComputerSessionRoutes(
1117
1132
  },
1118
1133
  );
1119
1134
 
1135
+ async function routedMachineConnection(
1136
+ handle: ChannelAHandle,
1137
+ grant: AccessGrant,
1138
+ sourceSession: Session,
1139
+ sandboxId: string,
1140
+ ): Promise<EnrollmentRecord | null> {
1141
+ const machineAuthority = await handle.machineAuthority();
1142
+ const sandbox = await getSandbox(
1143
+ deps.db,
1144
+ {
1145
+ accountId: grant.accountId,
1146
+ workspaceId: sourceSession.workspaceId,
1147
+ subjectId: machineAuthority.subjectId,
1148
+ },
1149
+ sandboxId,
1150
+ );
1151
+ if (sandbox?.kind !== "selfhosted" || !sandbox.enrollmentId) {
1152
+ throw new ComputerSessionStateError("Connected Machine placement is unavailable");
1153
+ }
1154
+ return await resolveChannelAMachineConnection(
1155
+ deps.db,
1156
+ {
1157
+ accountId: grant.accountId,
1158
+ workspaceId: sourceSession.workspaceId,
1159
+ sessionId: sourceSession.id,
1160
+ machineWorkspaceId: sandbox.workspaceId,
1161
+ enrollmentId: sandbox.enrollmentId,
1162
+ },
1163
+ machineAuthority,
1164
+ );
1165
+ }
1166
+
1120
1167
  async function withComputerPlacement<T>(
1121
1168
  sourceSession: Session,
1122
1169
  grant: AccessGrant,
@@ -1174,6 +1221,7 @@ export function registerComputerSessionRoutes(
1174
1221
  enrollment.agentCapabilities.operationResourcePolicy === true,
1175
1222
  operationCpuQuotaSupported: enrollment.agentCapabilities.operationCpuQuota === true,
1176
1223
  transactionalFsWriteSupported: enrollment.agentCapabilities.transactionalFsWrite === true,
1224
+ browserControlHttpSupported: enrollment.agentCapabilities.browserControlHttp === true,
1177
1225
  ...(deps.settings.agentOpStreamEnabled === true &&
1178
1226
  enrollment.opStream === true &&
1179
1227
  deps.bus.getOpStreamConnection
@@ -1237,33 +1285,15 @@ export function registerComputerSessionRoutes(
1237
1285
  const resolved = await handle.routingSession.prime();
1238
1286
  let screenControlAllowed = false;
1239
1287
  if (operation !== "computer.end" && resolved.kind === "selfhosted" && resolved.sandboxId) {
1240
- // Look the routed machine up as the routing did: an agent acts for
1241
- // the person who started its turn, so a personal (Only me) machine
1242
- // stays reachable, subject to that attempt's per-chat permission.
1243
- const machineAuthority = await handle.machineAuthority();
1244
- const sandbox = await getSandbox(
1245
- deps.db,
1246
- {
1247
- accountId: grant.accountId,
1248
- workspaceId: sourceSession.workspaceId,
1249
- subjectId: machineAuthority.subjectId,
1250
- },
1251
- resolved.sandboxId,
1252
- );
1253
- if (sandbox?.kind !== "selfhosted" || !sandbox.enrollmentId) {
1254
- throw new ComputerSessionStateError("Connected Machine placement is unavailable");
1255
- }
1256
- const enrollment = await resolveChannelAMachineConnection(
1257
- deps.db,
1258
- {
1259
- accountId: grant.accountId,
1260
- workspaceId: sourceSession.workspaceId,
1261
- sessionId: sourceSession.id,
1262
- machineWorkspaceId: sandbox.workspaceId,
1263
- enrollmentId: sandbox.enrollmentId,
1264
- },
1265
- machineAuthority,
1266
- );
1288
+ // The request already resolved this machine's live runner when it
1289
+ // pinned the route; otherwise look the routed machine up as the
1290
+ // routing did: an agent acts for the person who started its turn, so
1291
+ // a personal (Only me) machine stays reachable, subject to that
1292
+ // attempt's per-chat permission.
1293
+ const enrollment =
1294
+ handle.pinnedMachine?.sandboxId === resolved.sandboxId
1295
+ ? handle.pinnedMachine.enrollment
1296
+ : await routedMachineConnection(handle, grant, sourceSession, resolved.sandboxId);
1267
1297
  if (!enrollment?.connectionInstanceId) {
1268
1298
  throw new ComputerSessionStateError("Connected Machine is unavailable");
1269
1299
  }
@@ -1476,14 +1506,37 @@ export function registerComputerSessionRoutes(
1476
1506
  computerSessionId: string,
1477
1507
  authorizationOperation: SessionAuthorizationOperation,
1478
1508
  channelOperation: ChannelAOperation,
1479
- callback: (input: {
1480
- client: BrowserControlClient;
1481
- sessionClient: ReturnType<BrowserControlClient["computerSessionClient"]>;
1482
- record: ComputerSessionControlRecord;
1483
- binding: NonNullable<ComputerSessionControlRecord["session"]["controller"]>;
1484
- placement: ComputerPlacement;
1485
- }) => Promise<T>,
1509
+ callback: ActiveComputerControllerCallback<T>,
1486
1510
  recoverMissing = true,
1511
+ ): Promise<T> {
1512
+ // The source-session check and the machine-route check that follows it
1513
+ // prove the same live agent attempt; they share those reads. Everything
1514
+ // from the controller call onward reads fresh.
1515
+ return await withSessionAuthorizationReadReuse((authorizationReads) =>
1516
+ withActiveComputerControllerReads(
1517
+ context,
1518
+ grant,
1519
+ workspaceId,
1520
+ computerSessionId,
1521
+ authorizationOperation,
1522
+ channelOperation,
1523
+ callback,
1524
+ recoverMissing,
1525
+ authorizationReads,
1526
+ ),
1527
+ );
1528
+ }
1529
+
1530
+ async function withActiveComputerControllerReads<T>(
1531
+ context: Context,
1532
+ grant: AccessGrant,
1533
+ workspaceId: string,
1534
+ computerSessionId: string,
1535
+ authorizationOperation: SessionAuthorizationOperation,
1536
+ channelOperation: ChannelAOperation,
1537
+ callback: ActiveComputerControllerCallback<T>,
1538
+ recoverMissing: boolean,
1539
+ authorizationReads: { handOffToToolDispatch(): void },
1487
1540
  ): Promise<T> {
1488
1541
  try {
1489
1542
  const record = await getComputerSessionControlRecord(deps.db, {
@@ -1491,11 +1544,20 @@ export function registerComputerSessionRoutes(
1491
1544
  workspaceId,
1492
1545
  computerSessionId,
1493
1546
  });
1494
- await authorizeSourceSession(deps, grant, record.sourceSessionId, authorizationOperation);
1495
- let sourceSession: Session | null = null;
1547
+ // Only a cached managed controller can skip the source session; read it
1548
+ // alongside authorization otherwise. A denial still wins.
1549
+ const sourceSessionNeeded = record.session.placement?.kind !== "sandbox_group";
1550
+ const [authorized, sourceRead] = await Promise.allSettled([
1551
+ authorizeSourceSession(deps, grant, record.sourceSessionId, authorizationOperation),
1552
+ sourceSessionNeeded
1553
+ ? requireSourceSession(deps, workspaceId, record.sourceSessionId)
1554
+ : Promise.resolve(null),
1555
+ ]);
1556
+ if (authorized.status === "rejected") throw authorized.reason;
1557
+ if (sourceRead.status === "rejected") throw sourceRead.reason;
1558
+ let sourceSession: Session | null = sourceRead.value;
1496
1559
  if (record.session.placement?.kind === "connected_machine") {
1497
- sourceSession = await requireSourceSession(deps, workspaceId, record.sourceSessionId);
1498
- if (sourceSession.activeSandboxId !== record.session.placement.sandboxId) {
1560
+ if (sourceSession?.activeSandboxId !== record.session.placement.sandboxId) {
1499
1561
  return await throwComputerSourcePlacementChanged(
1500
1562
  grant,
1501
1563
  record.sourceSessionId,
@@ -1517,6 +1579,7 @@ export function registerComputerSessionRoutes(
1517
1579
  throw new ComputerSessionStateError("ComputerSession controller authority changed");
1518
1580
  }
1519
1581
  const run = async (placement: ComputerPlacement): Promise<T> => {
1582
+ authorizationReads.handOffToToolDispatch();
1520
1583
  // The active controller binding is the provisioning fence. Live
1521
1584
  // input connects to it directly instead of re-ensuring the sidecar.
1522
1585
  const client = connectController(grant, record, placement);
@@ -89,6 +89,7 @@ import {
89
89
  listOwnConnectionAccountsForGrant,
90
90
  hasReservedFikenMetadata,
91
91
  ONEPASSWORD_CREDENTIAL_ROLE,
92
+ EXTERNAL_VAULT_CREDENTIAL_ROLE,
92
93
  hasReservedOpenGeniSlackBotMetadata,
93
94
  isOpenGeniSlackBotConnection,
94
95
  openGeniSlackBotMetadata,
@@ -1043,6 +1044,7 @@ export function registerConnectionRoutes(app: Hono, deps: ApiRouteDeps): void {
1043
1044
  c.req.param("connectionId"),
1044
1045
  grant.subjectId,
1045
1046
  );
1047
+ assertNotReservedExternalVaultMetadata(existing?.metadata);
1046
1048
  if (existing && isOpenGeniSlackBotConnection(existing)) {
1047
1049
  const destination = ConnectorDocumentDestinationSelection.safeParse(
1048
1050
  payload.metadata?.documentDestination,
@@ -1359,6 +1361,7 @@ export function registerConnectionRoutes(app: Hono, deps: ApiRouteDeps): void {
1359
1361
  if (!existing) {
1360
1362
  throw new HTTPException(404, { message: "connection not found" });
1361
1363
  }
1364
+ assertNotReservedExternalVaultMetadata(existing.metadata);
1362
1365
  const expectedVersion = c.req.query("expectedVersion");
1363
1366
  if (expectedVersion !== undefined) {
1364
1367
  if (!/^[1-9]\d*$/.test(expectedVersion) || !Number.isSafeInteger(Number(expectedVersion))) {
@@ -1973,6 +1976,7 @@ function assertNotReservedFikenMetadata(metadata: Record<string, unknown> | unde
1973
1976
  }
1974
1977
 
1975
1978
  function assertNotReservedOnePasswordMetadata(metadata: Record<string, unknown> | undefined): void {
1979
+ assertNotReservedExternalVaultMetadata(metadata);
1976
1980
  if (metadata?.credentialRole === ONEPASSWORD_CREDENTIAL_ROLE) {
1977
1981
  throw new HTTPException(422, {
1978
1982
  message: "1Password connections are created by the verified 1Password install flow",
@@ -1980,6 +1984,19 @@ function assertNotReservedOnePasswordMetadata(metadata: Record<string, unknown>
1980
1984
  }
1981
1985
  }
1982
1986
 
1987
+ function assertNotReservedExternalVaultMetadata(
1988
+ metadata: Record<string, unknown> | undefined,
1989
+ ): void {
1990
+ if (
1991
+ metadata?.credentialRole === EXTERNAL_VAULT_CREDENTIAL_ROLE ||
1992
+ metadata?.vaultProvider !== undefined
1993
+ ) {
1994
+ throw new HTTPException(422, {
1995
+ message: "Vault connections are managed through the verified vault connection flow",
1996
+ });
1997
+ }
1998
+ }
1999
+
1983
2000
  function assertNotReservedApiIntegrationOAuthMetadata(
1984
2001
  metadata: Record<string, unknown> | undefined,
1985
2002
  ): void {
@@ -1,6 +1,8 @@
1
1
  import {
2
2
  InsightsCallsResponse,
3
3
  InsightsUsageResponse,
4
+ InsightsSiteUsageQuery,
5
+ InsightsSiteUsageResponse,
4
6
  OrganizationInsightsCallsQuery,
5
7
  OrganizationInsightsUsageQuery,
6
8
  WorkspaceInsightsCallsQuery,
@@ -10,10 +12,12 @@ import type { AccessContext } from "@opengeni/contracts";
10
12
  import {
11
13
  accountScopedApiKeyWorkspaceAuthority,
12
14
  getInsightsUsage,
15
+ getInsightsSiteUsage,
13
16
  hasPermission,
14
17
  listInsightsCalls,
15
18
  requireAccessContext,
16
19
  requireAccessGrant,
20
+ siteViewerForGrant,
17
21
  type ApiRouteDeps,
18
22
  type InsightsQueryScope,
19
23
  } from "@opengeni/core";
@@ -221,6 +225,24 @@ export function registerInsightsUsageRoutes(app: Hono, deps: ApiRouteDeps): void
221
225
  });
222
226
  }
223
227
 
228
+ app.get("/v1/workspaces/:workspaceId/insights/sites", async (c) => {
229
+ const workspaceId = c.req.param("workspaceId");
230
+ const grant = await requireAccessGrant(c, deps, workspaceId, "workspace:admin");
231
+ const query = InsightsSiteUsageQuery.safeParse(insightsQueryParameters(c.req.queries()));
232
+ if (!query.success) throw new HTTPException(400, { message: "invalid Site Insights query" });
233
+ const viewer = await siteViewerForGrant(deps.db, grant);
234
+ const response = await insightsWithFriendlyTimeout(() =>
235
+ getInsightsSiteUsage(deps.db, {
236
+ accountId: grant.accountId,
237
+ workspaceId,
238
+ query: query.data,
239
+ viewerSubjectId: viewer.subjectId,
240
+ }),
241
+ );
242
+ c.header("cache-control", "private, no-store");
243
+ return c.json(InsightsSiteUsageResponse.parse(response));
244
+ });
245
+
224
246
  app.get("/v1/workspaces/:workspaceId/insights/usage", async (c) => {
225
247
  const workspaceId = c.req.param("workspaceId");
226
248
  const grant = await requireAccessGrant(c, deps, workspaceId, "workspace:admin");
@@ -30,7 +30,12 @@ import {
30
30
  SITE_FRAME_SESSION_CREATE_FIELDS,
31
31
  siteFrameBodyRefusal,
32
32
  } from "@opengeni/contracts/site-session-http";
33
- import { requireWorkspace, scheduledSessionIds } from "@opengeni/db";
33
+ import {
34
+ requireWorkspace,
35
+ scheduledSessionIds,
36
+ currentSiteViewerRlsContext,
37
+ nestedPostgresSqlState,
38
+ } from "@opengeni/db";
34
39
  import {
35
40
  currentSiteSessionOrigin,
36
41
  isVerifiedDelegatedHumanAuthorization,
@@ -329,6 +334,7 @@ import {
329
334
  } from "@opengeni/core";
330
335
  import type { ApiRouteDeps } from "@opengeni/core";
331
336
  import { SessionRetryConflictError } from "@opengeni/db";
337
+ import { reauthorizeSiteSessionRequest } from "../site-publishing/session-request-authority";
332
338
  import {
333
339
  attachViewer,
334
340
  detachViewer,
@@ -761,7 +767,7 @@ export function registerSessionRoutes(app: Hono, deps: SessionRouteDeps): void {
761
767
  // nothing else: the session gets the minimal Site profile. Only the Site
762
768
  // itself, running its published agent as `site:<siteId>`, chooses tools.
763
769
  const siteOrigin = origin ?? currentSiteSessionOrigin();
764
- if (siteOrigin && grant.subjectId !== `site:${siteOrigin.siteId}`) {
770
+ if (siteOrigin && currentSiteViewerRlsContext()?.siteId !== siteOrigin.siteId) {
765
771
  const refused = siteFrameBodyRefusal("sessions.create", "/sessions", payload);
766
772
  if (refused)
767
773
  return c.json(
@@ -778,6 +784,11 @@ export function registerSessionRoutes(app: Hono, deps: SessionRouteDeps): void {
778
784
  siteId: siteOrigin.siteId,
779
785
  versionId: siteOrigin.versionId ?? null,
780
786
  });
787
+ // Ordinary Site viewers use native Only-me ownership. An agent preview
788
+ // inherits its parent's native visibility; the Site audience binding
789
+ // additionally restricts that execution to the parent's real owner.
790
+ if (grant.principalKind !== "agent_attempt")
791
+ (payload as Record<string, unknown>).visibility = "private";
781
792
  }
782
793
  const create = () =>
783
794
  createSessionForRequest(deps, grant, workspaceId, payload, authorization);
@@ -3597,6 +3608,7 @@ export function registerSessionRoutes(app: Hono, deps: SessionRouteDeps): void {
3597
3608
  reauthorizeAfterMs:
3598
3609
  authorization?.reauthorizeAfterMs ?? SESSION_AUTHORIZATION_DEFAULT_REAUTHORIZE_MS,
3599
3610
  reauthorize: async () => {
3611
+ await reauthorizeSiteSessionRequest(c.req.raw);
3600
3612
  const freshGrant = await requireFreshAccessGrant(c, deps, workspaceId, "sessions:read");
3601
3613
  await requireSessionAuthorization(deps, freshGrant, {
3602
3614
  sessionId,
@@ -5671,7 +5683,10 @@ export function sessionTenancyHttpError(error: unknown): Error {
5671
5683
  retryable: false,
5672
5684
  });
5673
5685
  }
5674
- if (error instanceof SessionTenancyNotActivatedError) {
5686
+ if (
5687
+ error instanceof SessionTenancyNotActivatedError ||
5688
+ nestedPostgresSqlState(error) === "P0793"
5689
+ ) {
5675
5690
  return new ApiHttpError(409, {
5676
5691
  code: "conflict",
5677
5692
  message: "Only-me chats are not enabled for this organization.",
@@ -6552,7 +6567,10 @@ export function sessionCreateErrorResponse(c: Context, error: unknown): Response
6552
6567
  403,
6553
6568
  );
6554
6569
  }
6555
- if (error instanceof SessionTenancyNotActivatedError) {
6570
+ if (
6571
+ error instanceof SessionTenancyNotActivatedError ||
6572
+ nestedPostgresSqlState(error) === "P0793"
6573
+ ) {
6556
6574
  return c.json(
6557
6575
  {
6558
6576
  code: "SESSION_TENANCY_NOT_ACTIVATED",