@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.
- package/dist/app.js +1 -1
- package/dist/{chunk-OT56OY4V.js → chunk-6CECHDZP.js} +1569 -399
- package/dist/{chunk-OT56OY4V.js.map → chunk-6CECHDZP.js.map} +1 -1
- package/dist/index.js +50 -2
- package/dist/index.js.map +1 -1
- package/dist/integrations/external-vault-providers.d.ts +29 -0
- package/dist/interaction-secrets-vault.d.ts +2 -2
- package/dist/mcp/action-descriptions.d.ts +1 -1
- package/dist/mcp/scheduled-task-view.d.ts +4 -4
- package/dist/routes/vault-providers.d.ts +4 -2
- package/dist/sandbox/channel-a.d.ts +10 -1
- package/dist/shutdown.d.ts +14 -0
- package/dist/site-publishing/agent-data-tools.d.ts +5 -5
- package/dist/site-publishing/agent-session.d.ts +3 -2
- package/dist/site-publishing/runtime.d.ts +7 -6
- package/dist/site-publishing/service.d.ts +8 -11
- package/dist/site-publishing/session-request-authority.d.ts +3 -0
- package/dist/workspace-tool-gateway-secrets.d.ts +1 -1
- package/package.json +25 -22
- package/src/access-grant-rls.ts +1 -0
- package/src/app.ts +14 -2
- package/src/http/sse.ts +5 -1
- package/src/index.ts +13 -1
- package/src/integrations/external-vault-providers.ts +136 -0
- package/src/interaction-secrets-vault.ts +6 -2
- package/src/mcp/action-catalog.gen.ts +253 -4
- package/src/mcp/action-descriptions.ts +32 -2
- package/src/mcp/action-schema-imports.gen.ts +3 -1
- package/src/routes/browser-sessions.ts +61 -17
- package/src/routes/computer-sessions.ts +102 -39
- package/src/routes/connections.ts +17 -0
- package/src/routes/insights-usage.ts +22 -0
- package/src/routes/sessions.ts +22 -4
- package/src/routes/site-runtime.ts +62 -20
- package/src/routes/vault-providers.ts +788 -29
- package/src/routes/vaults.ts +5 -1
- package/src/sandbox/channel-a.ts +18 -1
- package/src/sandbox/metrics-ingestion.ts +1 -0
- package/src/shutdown.ts +54 -0
- package/src/site-frame-guard.ts +11 -2
- package/src/site-publishing/agent-data-tools.ts +16 -8
- package/src/site-publishing/agent-session.ts +24 -6
- package/src/site-publishing/runtime.ts +29 -7
- package/src/site-publishing/service.ts +65 -77
- package/src/site-publishing/session-request-authority.ts +14 -0
- package/src/workspace-tool-gateway-secrets.ts +9 -2
- 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:
|
|
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
|
-
|
|
3179
|
-
|
|
3180
|
-
|
|
3181
|
-
|
|
3182
|
-
|
|
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 =
|
|
3220
|
+
let sourceSession: Session | null = sourceRead.value;
|
|
3186
3221
|
if (record.session.placement?.kind === "connected_machine") {
|
|
3187
|
-
|
|
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 {
|
|
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
|
-
//
|
|
1241
|
-
// the
|
|
1242
|
-
//
|
|
1243
|
-
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
|
|
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:
|
|
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
|
-
|
|
1495
|
-
|
|
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
|
-
|
|
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");
|
package/src/routes/sessions.ts
CHANGED
|
@@ -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 {
|
|
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 &&
|
|
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 (
|
|
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 (
|
|
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",
|