@jazzmind/busibox-app 3.0.18 → 3.0.20
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/components/UserDropdown.d.ts +0 -16
- package/dist/components/UserDropdown.d.ts.map +1 -1
- package/dist/components/UserDropdown.js +2 -2
- package/dist/components/UserDropdown.js.map +1 -1
- package/dist/components/auth/PasskeyRequiredWrapper.d.ts +0 -8
- package/dist/components/auth/PasskeyRequiredWrapper.d.ts.map +1 -1
- package/dist/components/auth/PasskeyRequiredWrapper.js +2 -2
- package/dist/components/auth/PasskeyRequiredWrapper.js.map +1 -1
- package/dist/components/auth/ProtectedRoute.d.ts +0 -9
- package/dist/components/auth/ProtectedRoute.d.ts.map +1 -1
- package/dist/components/auth/ProtectedRoute.js +2 -2
- package/dist/components/auth/ProtectedRoute.js.map +1 -1
- package/dist/components/auth/SessionProvider.d.ts +0 -40
- package/dist/components/auth/SessionProvider.d.ts.map +1 -1
- package/dist/components/auth/SessionProvider.js +2 -2
- package/dist/components/auth/SessionProvider.js.map +1 -1
- package/dist/components/chat/AgentBadge.d.ts +0 -5
- package/dist/components/chat/AgentBadge.d.ts.map +1 -1
- package/dist/components/chat/AgentBadge.js +2 -2
- package/dist/components/chat/AgentBadge.js.map +1 -1
- package/dist/components/chat/AgentSelectionPanel.d.ts +0 -6
- package/dist/components/chat/AgentSelectionPanel.d.ts.map +1 -1
- package/dist/components/chat/AgentSelectionPanel.js +2 -2
- package/dist/components/chat/AgentSelectionPanel.js.map +1 -1
- package/dist/components/chat/AgentSelector.d.ts +0 -6
- package/dist/components/chat/AgentSelector.d.ts.map +1 -1
- package/dist/components/chat/AgentSelector.js +2 -2
- package/dist/components/chat/AgentSelector.js.map +1 -1
- package/dist/components/chat/AgentToolSelector.d.ts +0 -7
- package/dist/components/chat/AgentToolSelector.d.ts.map +1 -1
- package/dist/components/chat/AgentToolSelector.js +2 -2
- package/dist/components/chat/AgentToolSelector.js.map +1 -1
- package/dist/components/chat/AttachmentPreview.d.ts.map +1 -1
- package/dist/components/chat/AttachmentPreview.js +0 -5
- package/dist/components/chat/AttachmentPreview.js.map +1 -1
- package/dist/components/chat/AttachmentUploader.d.ts +0 -5
- package/dist/components/chat/AttachmentUploader.d.ts.map +1 -1
- package/dist/components/chat/AttachmentUploader.js +2 -2
- package/dist/components/chat/AttachmentUploader.js.map +1 -1
- package/dist/components/chat/ChatContainer.d.ts +0 -6
- package/dist/components/chat/ChatContainer.d.ts.map +1 -1
- package/dist/components/chat/ChatContainer.js +2 -2
- package/dist/components/chat/ChatContainer.js.map +1 -1
- package/dist/components/chat/ConversationSidebar.d.ts +0 -5
- package/dist/components/chat/ConversationSidebar.d.ts.map +1 -1
- package/dist/components/chat/ConversationSidebar.js +2 -2
- package/dist/components/chat/ConversationSidebar.js.map +1 -1
- package/dist/components/chat/DeleteConversationModal.d.ts +0 -3
- package/dist/components/chat/DeleteConversationModal.d.ts.map +1 -1
- package/dist/components/chat/DeleteConversationModal.js +2 -2
- package/dist/components/chat/DeleteConversationModal.js.map +1 -1
- package/dist/components/chat/FullChatInterface.d.ts +0 -23
- package/dist/components/chat/FullChatInterface.d.ts.map +1 -1
- package/dist/components/chat/FullChatInterface.js +2 -2
- package/dist/components/chat/FullChatInterface.js.map +1 -1
- package/dist/components/chat/InsightEditModal.d.ts +0 -5
- package/dist/components/chat/InsightEditModal.d.ts.map +1 -1
- package/dist/components/chat/InsightEditModal.js +2 -2
- package/dist/components/chat/InsightEditModal.js.map +1 -1
- package/dist/components/chat/LibrarySelector.d.ts +0 -6
- package/dist/components/chat/LibrarySelector.d.ts.map +1 -1
- package/dist/components/chat/LibrarySelector.js +2 -2
- package/dist/components/chat/LibrarySelector.js.map +1 -1
- package/dist/components/chat/MessageInput.d.ts +0 -5
- package/dist/components/chat/MessageInput.d.ts.map +1 -1
- package/dist/components/chat/MessageInput.js +2 -2
- package/dist/components/chat/MessageInput.js.map +1 -1
- package/dist/components/chat/MessageList.d.ts +0 -5
- package/dist/components/chat/MessageList.d.ts.map +1 -1
- package/dist/components/chat/MessageList.js +2 -2
- package/dist/components/chat/MessageList.js.map +1 -1
- package/dist/components/chat/RawContentToggle.d.ts.map +1 -1
- package/dist/components/chat/RawContentToggle.js +0 -6
- package/dist/components/chat/RawContentToggle.js.map +1 -1
- package/dist/components/chat/SearchToggles.d.ts +0 -5
- package/dist/components/chat/SearchToggles.d.ts.map +1 -1
- package/dist/components/chat/SearchToggles.js +2 -2
- package/dist/components/chat/SearchToggles.js.map +1 -1
- package/dist/components/chat/SimpleChatInterface.d.ts +0 -25
- package/dist/components/chat/SimpleChatInterface.d.ts.map +1 -1
- package/dist/components/chat/SimpleChatInterface.js +2 -2
- package/dist/components/chat/SimpleChatInterface.js.map +1 -1
- package/dist/components/chat/ThinkingSection.d.ts +0 -7
- package/dist/components/chat/ThinkingSection.d.ts.map +1 -1
- package/dist/components/chat/ThinkingSection.js +2 -2
- package/dist/components/chat/ThinkingSection.js.map +1 -1
- package/dist/components/chat/ThinkingToggle.d.ts +0 -6
- package/dist/components/chat/ThinkingToggle.d.ts.map +1 -1
- package/dist/components/chat/ThinkingToggle.js +2 -2
- package/dist/components/chat/ThinkingToggle.js.map +1 -1
- package/dist/components/chat/ToolSelector.d.ts +0 -6
- package/dist/components/chat/ToolSelector.d.ts.map +1 -1
- package/dist/components/chat/ToolSelector.js +2 -2
- package/dist/components/chat/ToolSelector.js.map +1 -1
- package/dist/components/shared/AppIcon.d.ts.map +1 -1
- package/dist/components/shared/AppIcon.js +2 -2
- package/dist/components/shared/AppIcon.js.map +1 -1
- package/dist/components/shared/Modal.d.ts.map +1 -1
- package/dist/components/shared/Modal.js +2 -2
- package/dist/components/shared/Modal.js.map +1 -1
- package/dist/components/workflow/WorkflowList.d.ts.map +1 -1
- package/dist/components/workflow/WorkflowList.js +2 -2
- package/dist/components/workflow/WorkflowList.js.map +1 -1
- package/dist/contexts/AuthContext.d.ts.map +1 -1
- package/dist/contexts/AuthContext.js +2 -2
- package/dist/contexts/AuthContext.js.map +1 -1
- package/dist/contexts/CustomizationContext.d.ts.map +1 -1
- package/dist/contexts/CustomizationContext.js +2 -2
- package/dist/contexts/CustomizationContext.js.map +1 -1
- package/dist/contexts/ThemeContext.d.ts.map +1 -1
- package/dist/contexts/ThemeContext.js +2 -2
- package/dist/contexts/ThemeContext.js.map +1 -1
- package/dist/layout/AdminHeader.d.ts +0 -5
- package/dist/layout/AdminHeader.d.ts.map +1 -1
- package/dist/layout/AdminHeader.js +2 -2
- package/dist/layout/AdminHeader.js.map +1 -1
- package/dist/layout/Footer.d.ts +0 -5
- package/dist/layout/Footer.d.ts.map +1 -1
- package/dist/layout/Footer.js +2 -2
- package/dist/layout/Footer.js.map +1 -1
- package/dist/layout/Header.d.ts.map +1 -1
- package/dist/layout/Header.js +2 -2
- package/dist/layout/Header.js.map +1 -1
- package/dist/layout/ThemeToggle.d.ts +0 -5
- package/dist/layout/ThemeToggle.d.ts.map +1 -1
- package/dist/layout/ThemeToggle.js +2 -2
- package/dist/layout/ThemeToggle.js.map +1 -1
- package/dist/lib/authz/sso-generator.d.ts.map +1 -1
- package/dist/lib/authz/sso-generator.js +7 -4
- package/dist/lib/authz/sso-generator.js.map +1 -1
- package/dist/lib/data/index.d.ts +2 -0
- package/dist/lib/data/index.d.ts.map +1 -1
- package/dist/lib/data/index.js +2 -0
- package/dist/lib/data/index.js.map +1 -1
- package/dist/lib/data/sharing.d.ts +154 -0
- package/dist/lib/data/sharing.d.ts.map +1 -0
- package/dist/lib/data/sharing.js +293 -0
- package/dist/lib/data/sharing.js.map +1 -0
- package/dist/lib/deploy/app-config.d.ts.map +1 -1
- package/dist/lib/deploy/app-config.js +5 -1
- package/dist/lib/deploy/app-config.js.map +1 -1
- package/dist/lib/deploy/app-permissions.d.ts +2 -0
- package/dist/lib/deploy/app-permissions.d.ts.map +1 -1
- package/dist/lib/deploy/app-permissions.js +2 -0
- package/dist/lib/deploy/app-permissions.js.map +1 -1
- package/package.json +1 -1
- package/dist/lib/agent/agent-api-helpers.d.ts +0 -16
- package/dist/lib/agent/agent-api-helpers.d.ts.map +0 -1
- package/dist/lib/agent/agent-api-helpers.js +0 -50
- package/dist/lib/agent/agent-api-helpers.js.map +0 -1
- package/dist/lib/agent/api-helpers.d.ts +0 -16
- package/dist/lib/agent/api-helpers.d.ts.map +0 -1
- package/dist/lib/agent/api-helpers.js +0 -50
- package/dist/lib/agent/api-helpers.js.map +0 -1
- package/dist/lib/agent/chat-cleanup.d.ts +0 -34
- package/dist/lib/agent/chat-cleanup.d.ts.map +0 -1
- package/dist/lib/agent/chat-cleanup.js +0 -133
- package/dist/lib/agent/chat-cleanup.js.map +0 -1
- package/dist/lib/agent/client.d.ts +0 -55
- package/dist/lib/agent/client.d.ts.map +0 -1
- package/dist/lib/agent/client.js +0 -103
- package/dist/lib/agent/client.js.map +0 -1
- package/dist/lib/agent/openai.d.ts +0 -94
- package/dist/lib/agent/openai.d.ts.map +0 -1
- package/dist/lib/agent/openai.js +0 -290
- package/dist/lib/agent/openai.js.map +0 -1
- package/dist/lib/ai/dual-model-router.d.ts +0 -130
- package/dist/lib/ai/dual-model-router.d.ts.map +0 -1
- package/dist/lib/ai/dual-model-router.js +0 -413
- package/dist/lib/ai/dual-model-router.js.map +0 -1
- package/dist/lib/ai/openai.d.ts +0 -94
- package/dist/lib/ai/openai.d.ts.map +0 -1
- package/dist/lib/ai/openai.js +0 -290
- package/dist/lib/ai/openai.js.map +0 -1
- package/dist/lib/ai/tools.d.ts +0 -64
- package/dist/lib/ai/tools.d.ts.map +0 -1
- package/dist/lib/ai/tools.js +0 -159
- package/dist/lib/ai/tools.js.map +0 -1
- package/dist/lib/audit/client.d.ts +0 -138
- package/dist/lib/audit/client.d.ts.map +0 -1
- package/dist/lib/audit/client.js +0 -486
- package/dist/lib/audit/client.js.map +0 -1
- package/dist/lib/audit/index.d.ts +0 -6
- package/dist/lib/audit/index.d.ts.map +0 -1
- package/dist/lib/audit/index.js +0 -6
- package/dist/lib/audit/index.js.map +0 -1
- package/dist/lib/auth/auth-helper.d.ts +0 -167
- package/dist/lib/auth/auth-helper.d.ts.map +0 -1
- package/dist/lib/auth/auth-helper.js +0 -345
- package/dist/lib/auth/auth-helper.js.map +0 -1
- package/dist/lib/auth/auth-state-manager.d.ts +0 -201
- package/dist/lib/auth/auth-state-manager.d.ts.map +0 -1
- package/dist/lib/auth/auth-state-manager.js +0 -597
- package/dist/lib/auth/auth-state-manager.js.map +0 -1
- package/dist/lib/auth/client.d.ts +0 -276
- package/dist/lib/auth/client.d.ts.map +0 -1
- package/dist/lib/auth/client.js +0 -325
- package/dist/lib/auth/client.js.map +0 -1
- package/dist/lib/auth/index.d.ts +0 -10
- package/dist/lib/auth/index.d.ts.map +0 -1
- package/dist/lib/auth/index.js +0 -10
- package/dist/lib/auth/index.js.map +0 -1
- package/dist/lib/auth/sso-route-handler.d.ts +0 -114
- package/dist/lib/auth/sso-route-handler.d.ts.map +0 -1
- package/dist/lib/auth/sso-route-handler.js +0 -199
- package/dist/lib/auth/sso-route-handler.js.map +0 -1
- package/dist/lib/auth/sso.d.ts +0 -162
- package/dist/lib/auth/sso.d.ts.map +0 -1
- package/dist/lib/auth/sso.js +0 -282
- package/dist/lib/auth/sso.js.map +0 -1
- package/dist/lib/authz/email.d.ts +0 -65
- package/dist/lib/authz/email.d.ts.map +0 -1
- package/dist/lib/authz/email.js +0 -112
- package/dist/lib/authz/email.js.map +0 -1
- package/dist/lib/authz/permissions.d.ts +0 -109
- package/dist/lib/authz/permissions.d.ts.map +0 -1
- package/dist/lib/authz/permissions.js +0 -238
- package/dist/lib/authz/permissions.js.map +0 -1
- package/dist/lib/authz/service-audit.d.ts +0 -41
- package/dist/lib/authz/service-audit.d.ts.map +0 -1
- package/dist/lib/authz/service-audit.js +0 -60
- package/dist/lib/authz/service-audit.js.map +0 -1
- package/dist/lib/chat-server/agent-api-client.d.ts +0 -151
- package/dist/lib/chat-server/agent-api-client.d.ts.map +0 -1
- package/dist/lib/chat-server/agent-api-client.js +0 -162
- package/dist/lib/chat-server/agent-api-client.js.map +0 -1
- package/dist/lib/chat-server/attachments.d.ts +0 -118
- package/dist/lib/chat-server/attachments.d.ts.map +0 -1
- package/dist/lib/chat-server/attachments.js +0 -317
- package/dist/lib/chat-server/attachments.js.map +0 -1
- package/dist/lib/chat-server/cleanup.d.ts +0 -34
- package/dist/lib/chat-server/cleanup.d.ts.map +0 -1
- package/dist/lib/chat-server/cleanup.js +0 -133
- package/dist/lib/chat-server/cleanup.js.map +0 -1
- package/dist/lib/chat-server/conversations.d.ts +0 -159
- package/dist/lib/chat-server/conversations.d.ts.map +0 -1
- package/dist/lib/chat-server/conversations.js +0 -278
- package/dist/lib/chat-server/conversations.js.map +0 -1
- package/dist/lib/chat-server/insights.d.ts +0 -84
- package/dist/lib/chat-server/insights.d.ts.map +0 -1
- package/dist/lib/chat-server/insights.js +0 -193
- package/dist/lib/chat-server/insights.js.map +0 -1
- package/dist/lib/chat-server/messages.d.ts +0 -154
- package/dist/lib/chat-server/messages.d.ts.map +0 -1
- package/dist/lib/chat-server/messages.js +0 -282
- package/dist/lib/chat-server/messages.js.map +0 -1
- package/dist/lib/chat-server/middleware.d.ts +0 -119
- package/dist/lib/chat-server/middleware.d.ts.map +0 -1
- package/dist/lib/chat-server/middleware.js +0 -234
- package/dist/lib/chat-server/middleware.js.map +0 -1
- package/dist/lib/chat-server/models.d.ts +0 -60
- package/dist/lib/chat-server/models.d.ts.map +0 -1
- package/dist/lib/chat-server/models.js +0 -205
- package/dist/lib/chat-server/models.js.map +0 -1
- package/dist/lib/chat-server/search.d.ts +0 -89
- package/dist/lib/chat-server/search.d.ts.map +0 -1
- package/dist/lib/chat-server/search.js +0 -203
- package/dist/lib/chat-server/search.js.map +0 -1
- package/dist/lib/chat-server/sharing.d.ts +0 -70
- package/dist/lib/chat-server/sharing.d.ts.map +0 -1
- package/dist/lib/chat-server/sharing.js +0 -146
- package/dist/lib/chat-server/sharing.js.map +0 -1
- package/dist/lib/data/embeddings-app-client.d.ts +0 -37
- package/dist/lib/data/embeddings-app-client.d.ts.map +0 -1
- package/dist/lib/data/embeddings-app-client.js +0 -72
- package/dist/lib/data/embeddings-app-client.js.map +0 -1
- package/dist/lib/deploy/manifest-validator.d.ts +0 -25
- package/dist/lib/deploy/manifest-validator.d.ts.map +0 -1
- package/dist/lib/deploy/manifest-validator.js +0 -142
- package/dist/lib/deploy/manifest-validator.js.map +0 -1
- package/dist/lib/embeddings/data-client.d.ts +0 -37
- package/dist/lib/embeddings/data-client.d.ts.map +0 -1
- package/dist/lib/embeddings/data-client.js +0 -72
- package/dist/lib/embeddings/data-client.js.map +0 -1
- package/dist/lib/hooks/useMediaQuery.d.ts +0 -6
- package/dist/lib/hooks/useMediaQuery.d.ts.map +0 -1
- package/dist/lib/hooks/useMediaQuery.js +0 -18
- package/dist/lib/hooks/useMediaQuery.js.map +0 -1
- package/dist/lib/insights/client.d.ts +0 -131
- package/dist/lib/insights/client.d.ts.map +0 -1
- package/dist/lib/insights/client.js +0 -306
- package/dist/lib/insights/client.js.map +0 -1
- package/dist/lib/insights/index.d.ts +0 -5
- package/dist/lib/insights/index.d.ts.map +0 -1
- package/dist/lib/insights/index.js +0 -5
- package/dist/lib/insights/index.js.map +0 -1
- package/dist/lib/next/authz-client.d.ts +0 -120
- package/dist/lib/next/authz-client.d.ts.map +0 -1
- package/dist/lib/next/authz-client.js +0 -203
- package/dist/lib/next/authz-client.js.map +0 -1
- package/dist/lib/next/passkey.d.ts +0 -78
- package/dist/lib/next/passkey.d.ts.map +0 -1
- package/dist/lib/next/passkey.js +0 -380
- package/dist/lib/next/passkey.js.map +0 -1
- package/dist/lib/next/sso.d.ts +0 -51
- package/dist/lib/next/sso.d.ts.map +0 -1
- package/dist/lib/next/sso.js +0 -167
- package/dist/lib/next/sso.js.map +0 -1
- package/dist/lib/rbac/client.d.ts +0 -320
- package/dist/lib/rbac/client.d.ts.map +0 -1
- package/dist/lib/rbac/client.js +0 -532
- package/dist/lib/rbac/client.js.map +0 -1
- package/dist/lib/rbac/index.d.ts +0 -6
- package/dist/lib/rbac/index.d.ts.map +0 -1
- package/dist/lib/rbac/index.js +0 -6
- package/dist/lib/rbac/index.js.map +0 -1
- package/dist/lib/search/providers.d.ts +0 -105
- package/dist/lib/search/providers.d.ts.map +0 -1
- package/dist/lib/search/providers.js +0 -140
- package/dist/lib/search/providers.js.map +0 -1
- package/dist/lib/services/api-client.d.ts +0 -46
- package/dist/lib/services/api-client.d.ts.map +0 -1
- package/dist/lib/services/api-client.js +0 -80
- package/dist/lib/services/api-client.js.map +0 -1
- package/dist/lib/services/app-library.d.ts +0 -36
- package/dist/lib/services/app-library.d.ts.map +0 -1
- package/dist/lib/services/app-library.js +0 -123
- package/dist/lib/services/app-library.js.map +0 -1
- package/dist/lib/services/app-utils.d.ts +0 -22
- package/dist/lib/services/app-utils.d.ts.map +0 -1
- package/dist/lib/services/app-utils.js +0 -36
- package/dist/lib/services/app-utils.js.map +0 -1
- package/dist/lib/services/audit.d.ts +0 -41
- package/dist/lib/services/audit.d.ts.map +0 -1
- package/dist/lib/services/audit.js +0 -60
- package/dist/lib/services/audit.js.map +0 -1
- package/dist/lib/services/database-cloner.d.ts +0 -28
- package/dist/lib/services/database-cloner.d.ts.map +0 -1
- package/dist/lib/services/database-cloner.js +0 -197
- package/dist/lib/services/database-cloner.js.map +0 -1
- package/dist/lib/services/default-apps.d.ts +0 -31
- package/dist/lib/services/default-apps.d.ts.map +0 -1
- package/dist/lib/services/default-apps.js +0 -121
- package/dist/lib/services/default-apps.js.map +0 -1
- package/dist/lib/services/deploy-api-client.d.ts +0 -184
- package/dist/lib/services/deploy-api-client.d.ts.map +0 -1
- package/dist/lib/services/deploy-api-client.js +0 -208
- package/dist/lib/services/deploy-api-client.js.map +0 -1
- package/dist/lib/services/deployment-service-client.d.ts +0 -122
- package/dist/lib/services/deployment-service-client.d.ts.map +0 -1
- package/dist/lib/services/deployment-service-client.js +0 -245
- package/dist/lib/services/deployment-service-client.js.map +0 -1
- package/dist/lib/services/docs.d.ts +0 -80
- package/dist/lib/services/docs.d.ts.map +0 -1
- package/dist/lib/services/docs.js +0 -160
- package/dist/lib/services/docs.js.map +0 -1
- package/dist/lib/services/email-validation.d.ts +0 -33
- package/dist/lib/services/email-validation.d.ts.map +0 -1
- package/dist/lib/services/email-validation.js +0 -70
- package/dist/lib/services/email-validation.js.map +0 -1
- package/dist/lib/services/email.d.ts +0 -65
- package/dist/lib/services/email.d.ts.map +0 -1
- package/dist/lib/services/email.js +0 -112
- package/dist/lib/services/email.js.map +0 -1
- package/dist/lib/services/github-manifest-fetcher.d.ts +0 -74
- package/dist/lib/services/github-manifest-fetcher.d.ts.map +0 -1
- package/dist/lib/services/github-manifest-fetcher.js +0 -168
- package/dist/lib/services/github-manifest-fetcher.js.map +0 -1
- package/dist/lib/services/libraries.d.ts +0 -124
- package/dist/lib/services/libraries.d.ts.map +0 -1
- package/dist/lib/services/libraries.js +0 -507
- package/dist/lib/services/libraries.js.map +0 -1
- package/dist/lib/services/litellm.d.ts +0 -33
- package/dist/lib/services/litellm.d.ts.map +0 -1
- package/dist/lib/services/litellm.js +0 -222
- package/dist/lib/services/litellm.js.map +0 -1
- package/dist/lib/services/manifest-schema.d.ts +0 -66
- package/dist/lib/services/manifest-schema.d.ts.map +0 -1
- package/dist/lib/services/manifest-schema.js +0 -86
- package/dist/lib/services/manifest-schema.js.map +0 -1
- package/dist/lib/services/manifest-validator.d.ts +0 -25
- package/dist/lib/services/manifest-validator.d.ts.map +0 -1
- package/dist/lib/services/manifest-validator.js +0 -142
- package/dist/lib/services/manifest-validator.js.map +0 -1
- package/dist/lib/services/manifest.d.ts +0 -45
- package/dist/lib/services/manifest.d.ts.map +0 -1
- package/dist/lib/services/manifest.js +0 -137
- package/dist/lib/services/manifest.js.map +0 -1
- package/dist/lib/services/permissions.d.ts +0 -109
- package/dist/lib/services/permissions.d.ts.map +0 -1
- package/dist/lib/services/permissions.js +0 -238
- package/dist/lib/services/permissions.js.map +0 -1
- package/dist/lib/services/service-client.d.ts +0 -99
- package/dist/lib/services/service-client.d.ts.map +0 -1
- package/dist/lib/services/service-client.js +0 -146
- package/dist/lib/services/service-client.js.map +0 -1
- package/dist/lib/services/tags.d.ts +0 -37
- package/dist/lib/services/tags.d.ts.map +0 -1
- package/dist/lib/services/tags.js +0 -189
- package/dist/lib/services/tags.js.map +0 -1
- package/dist/lib/services/url-validation.d.ts +0 -22
- package/dist/lib/services/url-validation.d.ts.map +0 -1
- package/dist/lib/services/url-validation.js +0 -86
- package/dist/lib/services/url-validation.js.map +0 -1
- package/dist/lib/services/user-management.d.ts +0 -81
- package/dist/lib/services/user-management.d.ts.map +0 -1
- package/dist/lib/services/user-management.js +0 -154
- package/dist/lib/services/user-management.js.map +0 -1
- package/dist/lib/storage/index.d.ts +0 -11
- package/dist/lib/storage/index.d.ts.map +0 -1
- package/dist/lib/storage/index.js +0 -12
- package/dist/lib/storage/index.js.map +0 -1
- package/dist/lib/storage/types.d.ts +0 -61
- package/dist/lib/storage/types.d.ts.map +0 -1
- package/dist/lib/storage/types.js +0 -8
- package/dist/lib/storage/types.js.map +0 -1
- package/dist/lib/stores/app-config-store.d.ts +0 -90
- package/dist/lib/stores/app-config-store.d.ts.map +0 -1
- package/dist/lib/stores/app-config-store.js +0 -491
- package/dist/lib/stores/app-config-store.js.map +0 -1
- package/dist/lib/stores/bridge-config-store.d.ts +0 -44
- package/dist/lib/stores/bridge-config-store.d.ts.map +0 -1
- package/dist/lib/stores/bridge-config-store.js +0 -207
- package/dist/lib/stores/bridge-config-store.js.map +0 -1
- package/dist/lib/stores/chat-config-store.d.ts +0 -28
- package/dist/lib/stores/chat-config-store.d.ts.map +0 -1
- package/dist/lib/stores/chat-config-store.js +0 -152
- package/dist/lib/stores/chat-config-store.js.map +0 -1
- package/dist/lib/stores/data-settings-store.d.ts +0 -44
- package/dist/lib/stores/data-settings-store.d.ts.map +0 -1
- package/dist/lib/stores/data-settings-store.js +0 -202
- package/dist/lib/stores/data-settings-store.js.map +0 -1
- package/dist/lib/stores/email-config-store.d.ts +0 -45
- package/dist/lib/stores/email-config-store.d.ts.map +0 -1
- package/dist/lib/stores/email-config-store.js +0 -185
- package/dist/lib/stores/email-config-store.js.map +0 -1
- package/dist/lib/stores/portal-config-store.d.ts +0 -38
- package/dist/lib/stores/portal-config-store.d.ts.map +0 -1
- package/dist/lib/stores/portal-config-store.js +0 -238
- package/dist/lib/stores/portal-config-store.js.map +0 -1
- package/dist/lib/stores/video-store.d.ts +0 -91
- package/dist/lib/stores/video-store.d.ts.map +0 -1
- package/dist/lib/stores/video-store.js +0 -451
- package/dist/lib/stores/video-store.js.map +0 -1
- package/dist/lib/videos/access-control.d.ts +0 -35
- package/dist/lib/videos/access-control.d.ts.map +0 -1
- package/dist/lib/videos/access-control.js +0 -63
- package/dist/lib/videos/access-control.js.map +0 -1
- package/dist/lib/videos/agent-api-client.d.ts +0 -46
- package/dist/lib/videos/agent-api-client.d.ts.map +0 -1
- package/dist/lib/videos/agent-api-client.js +0 -75
- package/dist/lib/videos/agent-api-client.js.map +0 -1
- package/dist/lib/videos/creation.d.ts +0 -24
- package/dist/lib/videos/creation.d.ts.map +0 -1
- package/dist/lib/videos/creation.js +0 -112
- package/dist/lib/videos/creation.js.map +0 -1
- package/dist/lib/videos/expiration.d.ts +0 -13
- package/dist/lib/videos/expiration.d.ts.map +0 -1
- package/dist/lib/videos/expiration.js +0 -95
- package/dist/lib/videos/expiration.js.map +0 -1
- package/dist/lib/videos/image-resize.d.ts +0 -42
- package/dist/lib/videos/image-resize.d.ts.map +0 -1
- package/dist/lib/videos/image-resize.js +0 -106
- package/dist/lib/videos/image-resize.js.map +0 -1
- package/dist/lib/videos/processing.d.ts +0 -35
- package/dist/lib/videos/processing.d.ts.map +0 -1
- package/dist/lib/videos/processing.js +0 -154
- package/dist/lib/videos/processing.js.map +0 -1
- package/dist/lib/videos/status.d.ts +0 -2
- package/dist/lib/videos/status.d.ts.map +0 -1
- package/dist/lib/videos/status.js +0 -141
- package/dist/lib/videos/status.js.map +0 -1
- package/dist/lib/videos/upload.d.ts +0 -41
- package/dist/lib/videos/upload.d.ts.map +0 -1
- package/dist/lib/videos/upload.js +0 -118
- package/dist/lib/videos/upload.js.map +0 -1
- package/dist/lib/videos/url-normalization.d.ts +0 -29
- package/dist/lib/videos/url-normalization.d.ts.map +0 -1
- package/dist/lib/videos/url-normalization.js +0 -61
- package/dist/lib/videos/url-normalization.js.map +0 -1
- package/dist/sso/index.d.ts +0 -3
- package/dist/sso/index.d.ts.map +0 -1
- package/dist/sso/index.js +0 -3
- package/dist/sso/index.js.map +0 -1
- package/dist/sso/token.d.ts +0 -17
- package/dist/sso/token.d.ts.map +0 -1
- package/dist/sso/token.js +0 -57
- package/dist/sso/token.js.map +0 -1
- package/dist/types/sso.d.ts +0 -37
- package/dist/types/sso.d.ts.map +0 -1
- package/dist/types/sso.js +0 -2
- package/dist/types/sso.js.map +0 -1
|
@@ -1,597 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Auth State Manager for client-side apps.
|
|
3
|
-
*
|
|
4
|
-
* Provides centralized authentication state management including:
|
|
5
|
-
* - Proactive token refresh before expiration
|
|
6
|
-
* - Auth state change detection and broadcasting
|
|
7
|
-
* - Automatic redirect to portal when re-authentication is required
|
|
8
|
-
* - Event-based architecture for loose coupling
|
|
9
|
-
*
|
|
10
|
-
* This acts as a "service worker-like" auth listener that monitors
|
|
11
|
-
* authentication state and prevents users from discovering expired
|
|
12
|
-
* tokens only after submitting a request.
|
|
13
|
-
*
|
|
14
|
-
* Usage:
|
|
15
|
-
* ```typescript
|
|
16
|
-
* const authManager = createAuthStateManager({
|
|
17
|
-
* refreshEndpoint: '/api/auth/refresh',
|
|
18
|
-
* sessionEndpoint: '/api/session',
|
|
19
|
-
* portalUrl: 'https://portal.example.com',
|
|
20
|
-
* appId: 'busibox-agents',
|
|
21
|
-
* });
|
|
22
|
-
*
|
|
23
|
-
* // Start monitoring
|
|
24
|
-
* authManager.start();
|
|
25
|
-
*
|
|
26
|
-
* // Subscribe to auth state changes
|
|
27
|
-
* authManager.on('authStateChanged', (state) => {
|
|
28
|
-
* console.log('Auth state:', state.isAuthenticated);
|
|
29
|
-
* });
|
|
30
|
-
*
|
|
31
|
-
* // Subscribe to re-auth requirements
|
|
32
|
-
* authManager.on('requiresReauth', () => {
|
|
33
|
-
* // Will auto-redirect if autoRedirect is true
|
|
34
|
-
* });
|
|
35
|
-
* ```
|
|
36
|
-
*/
|
|
37
|
-
// Parse JWT payload without verification (for expiry checking)
|
|
38
|
-
function parseJWTPayload(token) {
|
|
39
|
-
try {
|
|
40
|
-
const parts = token.split('.');
|
|
41
|
-
if (parts.length !== 3)
|
|
42
|
-
return null;
|
|
43
|
-
// Handle both browser and Node.js environments
|
|
44
|
-
let decoded;
|
|
45
|
-
if (typeof window !== 'undefined' && typeof atob === 'function') {
|
|
46
|
-
decoded = atob(parts[1].replace(/-/g, '+').replace(/_/g, '/'));
|
|
47
|
-
}
|
|
48
|
-
else {
|
|
49
|
-
decoded = Buffer.from(parts[1], 'base64').toString('utf-8');
|
|
50
|
-
}
|
|
51
|
-
return JSON.parse(decoded);
|
|
52
|
-
}
|
|
53
|
-
catch {
|
|
54
|
-
return null;
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
function getTokenExpiry(token) {
|
|
58
|
-
const payload = parseJWTPayload(token);
|
|
59
|
-
if (!payload || typeof payload.exp !== 'number')
|
|
60
|
-
return null;
|
|
61
|
-
return payload.exp * 1000; // Convert to ms
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Create an auth state manager instance.
|
|
65
|
-
*/
|
|
66
|
-
export function createAuthStateManager(config) {
|
|
67
|
-
const { refreshEndpoint, sessionEndpoint, portalUrl, appId, checkIntervalMs = 30000, refreshBufferMs = 5 * 60 * 1000, // 5 minutes
|
|
68
|
-
autoRedirect = true, getToken, setToken, basePath = '', exchangeEndpoint = '/api/sso', tokenExpiresOverrideMs, } = config;
|
|
69
|
-
// Derive the silent refresh URL from portalUrl if not explicitly provided.
|
|
70
|
-
// portalUrl typically ends with '/home' (e.g., 'https://localhost/portal/home'),
|
|
71
|
-
// so strip that to get the portal base, then append the refresh API path.
|
|
72
|
-
const portalBase = portalUrl.replace(/\/home\/?$/, '');
|
|
73
|
-
const silentRefreshUrl = config.silentRefreshUrl || (portalBase ? `${portalBase}/api/sso/refresh` : '');
|
|
74
|
-
// Track when the token was first observed (for tokenExpiresOverrideMs)
|
|
75
|
-
let tokenFirstSeen = null;
|
|
76
|
-
// State
|
|
77
|
-
let state = {
|
|
78
|
-
isAuthenticated: false,
|
|
79
|
-
user: null,
|
|
80
|
-
tokenExpiresAt: null,
|
|
81
|
-
lastChecked: 0,
|
|
82
|
-
};
|
|
83
|
-
let intervalId = null;
|
|
84
|
-
let isRefreshing = false;
|
|
85
|
-
let pendingRefresh = null;
|
|
86
|
-
let isRedirecting = false; // Once set, all further auth activity is suppressed
|
|
87
|
-
let consecutive401AfterRefresh = 0; // Track when refresh "succeeds" but APIs still fail
|
|
88
|
-
const MAX_401_AFTER_REFRESH = 2; // After this many, redirect to portal
|
|
89
|
-
// Event listeners
|
|
90
|
-
const listeners = new Map();
|
|
91
|
-
function emit(event, data) {
|
|
92
|
-
const eventListeners = listeners.get(event);
|
|
93
|
-
if (eventListeners) {
|
|
94
|
-
eventListeners.forEach((callback) => {
|
|
95
|
-
try {
|
|
96
|
-
callback(data);
|
|
97
|
-
}
|
|
98
|
-
catch (error) {
|
|
99
|
-
console.error(`[AuthStateManager] Error in ${event} listener:`, error);
|
|
100
|
-
}
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
function on(event, callback) {
|
|
105
|
-
if (!listeners.has(event)) {
|
|
106
|
-
listeners.set(event, new Set());
|
|
107
|
-
}
|
|
108
|
-
listeners.get(event).add(callback);
|
|
109
|
-
return () => off(event, callback);
|
|
110
|
-
}
|
|
111
|
-
function off(event, callback) {
|
|
112
|
-
const eventListeners = listeners.get(event);
|
|
113
|
-
if (eventListeners) {
|
|
114
|
-
eventListeners.delete(callback);
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
function redirectToPortal(reason) {
|
|
118
|
-
if (typeof window === 'undefined')
|
|
119
|
-
return;
|
|
120
|
-
if (isRedirecting)
|
|
121
|
-
return; // Prevent duplicate redirects
|
|
122
|
-
isRedirecting = true;
|
|
123
|
-
// Stop all monitoring immediately so no more checks/retries fire
|
|
124
|
-
stop();
|
|
125
|
-
const currentUrl = new URL(window.location.href);
|
|
126
|
-
currentUrl.searchParams.delete('token');
|
|
127
|
-
currentUrl.searchParams.delete('returnUrl');
|
|
128
|
-
currentUrl.searchParams.delete('reason');
|
|
129
|
-
currentUrl.searchParams.delete('appId');
|
|
130
|
-
const cleanReturnUrl = currentUrl.toString();
|
|
131
|
-
const encodedReturn = encodeURIComponent(cleanReturnUrl);
|
|
132
|
-
let redirectUrl = `${portalUrl}?returnUrl=${encodedReturn}`;
|
|
133
|
-
if (reason) {
|
|
134
|
-
redirectUrl += `&reason=${encodeURIComponent(reason)}`;
|
|
135
|
-
}
|
|
136
|
-
if (appId) {
|
|
137
|
-
redirectUrl += `&appId=${encodeURIComponent(appId)}`;
|
|
138
|
-
}
|
|
139
|
-
console.log('[AuthStateManager] Redirecting to portal:', redirectUrl);
|
|
140
|
-
window.location.href = redirectUrl;
|
|
141
|
-
}
|
|
142
|
-
async function checkSession() {
|
|
143
|
-
if (isRedirecting)
|
|
144
|
-
return;
|
|
145
|
-
try {
|
|
146
|
-
const response = await fetch(sessionEndpoint, {
|
|
147
|
-
method: 'GET',
|
|
148
|
-
credentials: 'include',
|
|
149
|
-
});
|
|
150
|
-
if (!response.ok) {
|
|
151
|
-
throw new Error(`Session check failed: ${response.status}`);
|
|
152
|
-
}
|
|
153
|
-
const data = await response.json();
|
|
154
|
-
const newState = {
|
|
155
|
-
isAuthenticated: data.isAuthenticated ?? false,
|
|
156
|
-
user: data.user ?? null,
|
|
157
|
-
tokenExpiresAt: state.tokenExpiresAt, // Preserve token expiry
|
|
158
|
-
lastChecked: Date.now(),
|
|
159
|
-
};
|
|
160
|
-
// Check if token expiry from client-side token
|
|
161
|
-
if (getToken) {
|
|
162
|
-
const token = getToken();
|
|
163
|
-
if (token) {
|
|
164
|
-
const expiry = getTokenExpiry(token);
|
|
165
|
-
if (expiry) {
|
|
166
|
-
// Apply testing override if configured
|
|
167
|
-
if (tokenExpiresOverrideMs) {
|
|
168
|
-
if (!tokenFirstSeen) {
|
|
169
|
-
tokenFirstSeen = Date.now();
|
|
170
|
-
console.log(`[AuthStateManager] Testing: token override active, will expire in ${tokenExpiresOverrideMs}ms`);
|
|
171
|
-
}
|
|
172
|
-
newState.tokenExpiresAt = tokenFirstSeen + tokenExpiresOverrideMs;
|
|
173
|
-
}
|
|
174
|
-
else {
|
|
175
|
-
newState.tokenExpiresAt = expiry;
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
const stateChanged = state.isAuthenticated !== newState.isAuthenticated ||
|
|
181
|
-
state.user?.id !== newState.user?.id;
|
|
182
|
-
state = newState;
|
|
183
|
-
// Session check succeeded - reset 401 counter since things are working
|
|
184
|
-
if (state.isAuthenticated) {
|
|
185
|
-
consecutive401AfterRefresh = 0;
|
|
186
|
-
}
|
|
187
|
-
if (stateChanged) {
|
|
188
|
-
emit('authStateChanged', state);
|
|
189
|
-
}
|
|
190
|
-
// If not authenticated, try silent SSO refresh before redirecting
|
|
191
|
-
if (!state.isAuthenticated) {
|
|
192
|
-
console.log('[AuthStateManager] Session check shows not authenticated, attempting silent SSO refresh...');
|
|
193
|
-
const silentRefreshed = await silentRefreshSSO();
|
|
194
|
-
if (silentRefreshed) {
|
|
195
|
-
console.log('[AuthStateManager] Silent SSO refresh succeeded after session loss, rechecking...');
|
|
196
|
-
// Re-check session after silent refresh
|
|
197
|
-
const recheckResponse = await fetch(sessionEndpoint, {
|
|
198
|
-
method: 'GET',
|
|
199
|
-
credentials: 'include',
|
|
200
|
-
});
|
|
201
|
-
if (recheckResponse.ok) {
|
|
202
|
-
const recheckData = await recheckResponse.json();
|
|
203
|
-
if (recheckData.isAuthenticated) {
|
|
204
|
-
state = {
|
|
205
|
-
isAuthenticated: true,
|
|
206
|
-
user: recheckData.user ?? null,
|
|
207
|
-
tokenExpiresAt: state.tokenExpiresAt,
|
|
208
|
-
lastChecked: Date.now(),
|
|
209
|
-
};
|
|
210
|
-
emit('authStateChanged', state);
|
|
211
|
-
console.log('[AuthStateManager] Session restored after silent refresh');
|
|
212
|
-
return;
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
// Silent refresh failed or didn't help - redirect
|
|
217
|
-
if (autoRedirect) {
|
|
218
|
-
emit('sessionExpired', { reason: 'Session not authenticated' });
|
|
219
|
-
redirectToPortal('session_expired');
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
catch (error) {
|
|
224
|
-
console.error('[AuthStateManager] Session check failed:', error);
|
|
225
|
-
// Don't immediately redirect on network errors
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
/**
|
|
229
|
-
* Try to silently refresh the SSO token via the portal.
|
|
230
|
-
*
|
|
231
|
-
* This calls the portal's /api/sso/refresh endpoint. Since the portal and
|
|
232
|
-
* sub-apps are on the same origin, the browser automatically sends the
|
|
233
|
-
* portal's session cookie. If the portal session is still valid, it returns
|
|
234
|
-
* a fresh SSO token which we exchange locally for new cookies.
|
|
235
|
-
*
|
|
236
|
-
* Returns true if a fresh SSO token was obtained and exchanged.
|
|
237
|
-
*/
|
|
238
|
-
async function silentRefreshSSO() {
|
|
239
|
-
if (!silentRefreshUrl || !appId) {
|
|
240
|
-
console.log('[AuthStateManager] Silent refresh not available (no silentRefreshUrl or appId)');
|
|
241
|
-
return false;
|
|
242
|
-
}
|
|
243
|
-
try {
|
|
244
|
-
console.log('[AuthStateManager] Attempting silent SSO refresh via portal...');
|
|
245
|
-
// Call the portal's refresh endpoint - browser sends portal cookies automatically
|
|
246
|
-
const response = await fetch(silentRefreshUrl, {
|
|
247
|
-
method: 'POST',
|
|
248
|
-
headers: { 'Content-Type': 'application/json' },
|
|
249
|
-
body: JSON.stringify({ appName: appId }),
|
|
250
|
-
credentials: 'include',
|
|
251
|
-
});
|
|
252
|
-
if (!response.ok) {
|
|
253
|
-
const errorData = await response.json().catch(() => ({}));
|
|
254
|
-
console.log('[AuthStateManager] Silent refresh failed:', response.status, errorData);
|
|
255
|
-
return false;
|
|
256
|
-
}
|
|
257
|
-
const data = await response.json();
|
|
258
|
-
const freshToken = data?.data?.token || data?.token;
|
|
259
|
-
if (!freshToken) {
|
|
260
|
-
console.log('[AuthStateManager] Silent refresh returned no token');
|
|
261
|
-
return false;
|
|
262
|
-
}
|
|
263
|
-
console.log('[AuthStateManager] Got fresh SSO token from portal, exchanging locally...');
|
|
264
|
-
// Exchange the fresh SSO token for local session cookies
|
|
265
|
-
const exchangeResponse = await fetch(exchangeEndpoint, {
|
|
266
|
-
method: 'POST',
|
|
267
|
-
headers: { 'Content-Type': 'application/json' },
|
|
268
|
-
body: JSON.stringify({ token: freshToken }),
|
|
269
|
-
credentials: 'include',
|
|
270
|
-
});
|
|
271
|
-
if (!exchangeResponse.ok) {
|
|
272
|
-
console.log('[AuthStateManager] Local token exchange failed:', exchangeResponse.status);
|
|
273
|
-
return false;
|
|
274
|
-
}
|
|
275
|
-
// Update local token storage
|
|
276
|
-
if (setToken) {
|
|
277
|
-
setToken(freshToken);
|
|
278
|
-
}
|
|
279
|
-
// Update expiry from the fresh token
|
|
280
|
-
const expiry = getTokenExpiry(freshToken);
|
|
281
|
-
if (expiry) {
|
|
282
|
-
state = {
|
|
283
|
-
...state,
|
|
284
|
-
tokenExpiresAt: expiry,
|
|
285
|
-
};
|
|
286
|
-
}
|
|
287
|
-
// Reset the testing override timer so the new token gets a fresh window
|
|
288
|
-
if (tokenExpiresOverrideMs) {
|
|
289
|
-
tokenFirstSeen = Date.now();
|
|
290
|
-
console.log(`[AuthStateManager] Testing: reset token expiry override, next expire in ${tokenExpiresOverrideMs}ms`);
|
|
291
|
-
}
|
|
292
|
-
console.log('[AuthStateManager] Silent SSO refresh successful');
|
|
293
|
-
return true;
|
|
294
|
-
}
|
|
295
|
-
catch (error) {
|
|
296
|
-
console.error('[AuthStateManager] Silent SSO refresh error:', error);
|
|
297
|
-
return false;
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
async function refreshToken() {
|
|
301
|
-
if (isRedirecting)
|
|
302
|
-
return false;
|
|
303
|
-
// Prevent concurrent refresh attempts
|
|
304
|
-
if (isRefreshing && pendingRefresh) {
|
|
305
|
-
return pendingRefresh;
|
|
306
|
-
}
|
|
307
|
-
isRefreshing = true;
|
|
308
|
-
pendingRefresh = (async () => {
|
|
309
|
-
try {
|
|
310
|
-
const currentToken = getToken?.() ?? '';
|
|
311
|
-
const response = await fetch(refreshEndpoint, {
|
|
312
|
-
method: 'POST',
|
|
313
|
-
headers: {
|
|
314
|
-
'Content-Type': 'application/json',
|
|
315
|
-
...(currentToken ? { Authorization: `Bearer ${currentToken}` } : {}),
|
|
316
|
-
},
|
|
317
|
-
credentials: 'include',
|
|
318
|
-
});
|
|
319
|
-
const data = await response.json();
|
|
320
|
-
if (!response.ok) {
|
|
321
|
-
// Check if re-authentication is required (SSO token expired)
|
|
322
|
-
if (data.requiresReauth) {
|
|
323
|
-
console.log('[AuthStateManager] Local refresh says re-auth needed, trying silent SSO refresh...');
|
|
324
|
-
// Try silent refresh via portal before giving up
|
|
325
|
-
const silentRefreshed = await silentRefreshSSO();
|
|
326
|
-
if (silentRefreshed) {
|
|
327
|
-
// SSO token was refreshed - now retry the local refresh
|
|
328
|
-
console.log('[AuthStateManager] Silent refresh succeeded, retrying local refresh...');
|
|
329
|
-
const retryResponse = await fetch(refreshEndpoint, {
|
|
330
|
-
method: 'POST',
|
|
331
|
-
headers: { 'Content-Type': 'application/json' },
|
|
332
|
-
credentials: 'include',
|
|
333
|
-
});
|
|
334
|
-
const retryData = await retryResponse.json();
|
|
335
|
-
if (retryResponse.ok) {
|
|
336
|
-
// Update token if we have a setter
|
|
337
|
-
if (retryData.token && setToken) {
|
|
338
|
-
setToken(retryData.token);
|
|
339
|
-
}
|
|
340
|
-
const expiresIn = retryData.expiresIn ?? 900;
|
|
341
|
-
state = {
|
|
342
|
-
...state,
|
|
343
|
-
tokenExpiresAt: Date.now() + expiresIn * 1000,
|
|
344
|
-
};
|
|
345
|
-
emit('tokenRefreshed', { expiresIn });
|
|
346
|
-
console.log('[AuthStateManager] Token refreshed successfully after silent SSO refresh');
|
|
347
|
-
return true;
|
|
348
|
-
}
|
|
349
|
-
console.log('[AuthStateManager] Retry after silent refresh still failed:', retryData);
|
|
350
|
-
}
|
|
351
|
-
// Silent refresh failed too - redirect to portal
|
|
352
|
-
emit('requiresReauth', { reason: data.message || 'Token refresh failed' });
|
|
353
|
-
if (autoRedirect) {
|
|
354
|
-
redirectToPortal('token_expired');
|
|
355
|
-
}
|
|
356
|
-
return false;
|
|
357
|
-
}
|
|
358
|
-
emit('tokenRefreshFailed', { error: data.error || 'Unknown error' });
|
|
359
|
-
return false;
|
|
360
|
-
}
|
|
361
|
-
// Update token if we have a setter
|
|
362
|
-
if (data.token && setToken) {
|
|
363
|
-
setToken(data.token);
|
|
364
|
-
}
|
|
365
|
-
// Update expiry
|
|
366
|
-
const expiresIn = data.expiresIn ?? 900; // Default 15 minutes
|
|
367
|
-
state = {
|
|
368
|
-
...state,
|
|
369
|
-
tokenExpiresAt: Date.now() + expiresIn * 1000,
|
|
370
|
-
};
|
|
371
|
-
// Reset the testing override timer so the refreshed token gets a fresh window
|
|
372
|
-
if (tokenExpiresOverrideMs) {
|
|
373
|
-
tokenFirstSeen = Date.now();
|
|
374
|
-
console.log(`[AuthStateManager] Testing: reset token expiry override after refresh, next expire in ${tokenExpiresOverrideMs}ms`);
|
|
375
|
-
}
|
|
376
|
-
emit('tokenRefreshed', { expiresIn });
|
|
377
|
-
console.log('[AuthStateManager] Token refreshed successfully');
|
|
378
|
-
return true;
|
|
379
|
-
}
|
|
380
|
-
catch (error) {
|
|
381
|
-
console.error('[AuthStateManager] Token refresh failed:', error);
|
|
382
|
-
emit('tokenRefreshFailed', { error });
|
|
383
|
-
return false;
|
|
384
|
-
}
|
|
385
|
-
finally {
|
|
386
|
-
isRefreshing = false;
|
|
387
|
-
pendingRefresh = null;
|
|
388
|
-
}
|
|
389
|
-
})();
|
|
390
|
-
return pendingRefresh;
|
|
391
|
-
}
|
|
392
|
-
async function checkAndRefresh() {
|
|
393
|
-
if (isRedirecting)
|
|
394
|
-
return;
|
|
395
|
-
// First, check if we need to refresh the token proactively
|
|
396
|
-
if (state.tokenExpiresAt) {
|
|
397
|
-
const timeUntilExpiry = state.tokenExpiresAt - Date.now();
|
|
398
|
-
if (timeUntilExpiry <= 0) {
|
|
399
|
-
// Token already expired
|
|
400
|
-
console.log('[AuthStateManager] Token expired, attempting refresh');
|
|
401
|
-
const refreshed = await refreshToken();
|
|
402
|
-
if (!refreshed) {
|
|
403
|
-
// refreshToken() already handles redirect after trying silent refresh
|
|
404
|
-
return;
|
|
405
|
-
}
|
|
406
|
-
}
|
|
407
|
-
else if (timeUntilExpiry <= refreshBufferMs) {
|
|
408
|
-
// Token expiring soon, refresh proactively
|
|
409
|
-
console.log('[AuthStateManager] Token expiring soon, refreshing proactively');
|
|
410
|
-
await refreshToken();
|
|
411
|
-
}
|
|
412
|
-
}
|
|
413
|
-
// Then check session state
|
|
414
|
-
await checkSession();
|
|
415
|
-
}
|
|
416
|
-
async function handle401Response() {
|
|
417
|
-
if (isRedirecting)
|
|
418
|
-
return false;
|
|
419
|
-
console.log('[AuthStateManager] Handling 401 response');
|
|
420
|
-
// If refresh keeps "succeeding" but APIs still return 401,
|
|
421
|
-
// the underlying SSO token is expired and refresh can't fix it.
|
|
422
|
-
consecutive401AfterRefresh++;
|
|
423
|
-
if (consecutive401AfterRefresh > MAX_401_AFTER_REFRESH) {
|
|
424
|
-
console.log('[AuthStateManager] Multiple 401s after refresh - trying silent SSO refresh before redirect');
|
|
425
|
-
// Last resort: try silent SSO refresh before giving up
|
|
426
|
-
const silentRefreshed = await silentRefreshSSO();
|
|
427
|
-
if (silentRefreshed) {
|
|
428
|
-
console.log('[AuthStateManager] Silent SSO refresh succeeded, resetting 401 counter');
|
|
429
|
-
consecutive401AfterRefresh = 0;
|
|
430
|
-
// Now try the local refresh with the new SSO token
|
|
431
|
-
return refreshToken();
|
|
432
|
-
}
|
|
433
|
-
emit('requiresReauth', { reason: 'SSO token expired - refresh cannot fix' });
|
|
434
|
-
if (autoRedirect) {
|
|
435
|
-
redirectToPortal('token_expired');
|
|
436
|
-
}
|
|
437
|
-
return false;
|
|
438
|
-
}
|
|
439
|
-
// Try to refresh the token (refreshToken now includes silent SSO refresh fallback)
|
|
440
|
-
const refreshed = await refreshToken();
|
|
441
|
-
if (!refreshed) {
|
|
442
|
-
// refreshToken() already handles redirect after trying silent refresh
|
|
443
|
-
}
|
|
444
|
-
return refreshed;
|
|
445
|
-
}
|
|
446
|
-
function start() {
|
|
447
|
-
if (intervalId) {
|
|
448
|
-
console.warn('[AuthStateManager] Already started');
|
|
449
|
-
return;
|
|
450
|
-
}
|
|
451
|
-
console.log('[AuthStateManager] Starting auth state monitoring');
|
|
452
|
-
// Initial check
|
|
453
|
-
checkAndRefresh();
|
|
454
|
-
// Set up interval
|
|
455
|
-
intervalId = setInterval(checkAndRefresh, checkIntervalMs);
|
|
456
|
-
}
|
|
457
|
-
function stop() {
|
|
458
|
-
if (intervalId) {
|
|
459
|
-
clearInterval(intervalId);
|
|
460
|
-
intervalId = null;
|
|
461
|
-
console.log('[AuthStateManager] Stopped auth state monitoring');
|
|
462
|
-
}
|
|
463
|
-
}
|
|
464
|
-
function getState() {
|
|
465
|
-
return { ...state };
|
|
466
|
-
}
|
|
467
|
-
async function checkNow() {
|
|
468
|
-
await checkAndRefresh();
|
|
469
|
-
}
|
|
470
|
-
async function refreshNow() {
|
|
471
|
-
return refreshToken();
|
|
472
|
-
}
|
|
473
|
-
function isAuthenticated() {
|
|
474
|
-
return state.isAuthenticated;
|
|
475
|
-
}
|
|
476
|
-
async function logout() {
|
|
477
|
-
console.log('[AuthStateManager] Performing system-wide logout');
|
|
478
|
-
// Stop monitoring
|
|
479
|
-
stop();
|
|
480
|
-
// Clear local token
|
|
481
|
-
if (setToken) {
|
|
482
|
-
setToken(null);
|
|
483
|
-
}
|
|
484
|
-
// Clear localStorage
|
|
485
|
-
if (typeof window !== 'undefined') {
|
|
486
|
-
try {
|
|
487
|
-
localStorage.removeItem('auth_token');
|
|
488
|
-
// Clear any other auth-related items
|
|
489
|
-
const keysToRemove = Object.keys(localStorage).filter(key => key.includes('auth') || key.includes('token') || key.includes('session'));
|
|
490
|
-
keysToRemove.forEach(key => localStorage.removeItem(key));
|
|
491
|
-
}
|
|
492
|
-
catch {
|
|
493
|
-
// Ignore localStorage errors
|
|
494
|
-
}
|
|
495
|
-
// Clear sessionStorage auth items
|
|
496
|
-
try {
|
|
497
|
-
const sessionKeysToRemove = Object.keys(sessionStorage).filter(key => key.includes('auth') || key.includes('token') || key.includes('busibox'));
|
|
498
|
-
sessionKeysToRemove.forEach(key => sessionStorage.removeItem(key));
|
|
499
|
-
}
|
|
500
|
-
catch {
|
|
501
|
-
// Ignore sessionStorage errors
|
|
502
|
-
}
|
|
503
|
-
}
|
|
504
|
-
// Call the local app's logout endpoint to clear cookies
|
|
505
|
-
try {
|
|
506
|
-
await fetch('/api/logout', {
|
|
507
|
-
method: 'POST',
|
|
508
|
-
credentials: 'include',
|
|
509
|
-
});
|
|
510
|
-
}
|
|
511
|
-
catch (error) {
|
|
512
|
-
console.warn('[AuthStateManager] Local logout failed:', error);
|
|
513
|
-
}
|
|
514
|
-
// Call the portal's logout endpoint to invalidate the session system-wide
|
|
515
|
-
try {
|
|
516
|
-
await fetch(`${portalBase}/api/auth/logout`, {
|
|
517
|
-
method: 'POST',
|
|
518
|
-
credentials: 'include',
|
|
519
|
-
});
|
|
520
|
-
}
|
|
521
|
-
catch (error) {
|
|
522
|
-
console.warn('[AuthStateManager] Portal logout failed:', error);
|
|
523
|
-
// This might fail due to CORS, which is okay - we'll redirect anyway
|
|
524
|
-
}
|
|
525
|
-
// Update state
|
|
526
|
-
state = {
|
|
527
|
-
isAuthenticated: false,
|
|
528
|
-
user: null,
|
|
529
|
-
tokenExpiresAt: null,
|
|
530
|
-
lastChecked: Date.now(),
|
|
531
|
-
};
|
|
532
|
-
emit('authStateChanged', state);
|
|
533
|
-
// Redirect to portal login page (use portalBase - portalUrl may include /home)
|
|
534
|
-
if (typeof window !== 'undefined') {
|
|
535
|
-
window.location.href = `${portalBase}/login`;
|
|
536
|
-
}
|
|
537
|
-
}
|
|
538
|
-
return {
|
|
539
|
-
start,
|
|
540
|
-
stop,
|
|
541
|
-
getState,
|
|
542
|
-
checkNow,
|
|
543
|
-
refreshNow,
|
|
544
|
-
on,
|
|
545
|
-
off,
|
|
546
|
-
redirectToPortal,
|
|
547
|
-
handle401Response,
|
|
548
|
-
isAuthenticated,
|
|
549
|
-
logout,
|
|
550
|
-
};
|
|
551
|
-
}
|
|
552
|
-
// Singleton instance for global access
|
|
553
|
-
let globalAuthManager = null;
|
|
554
|
-
// Flag to indicate auth is initializing (token exchange in progress)
|
|
555
|
-
// When true, FetchWrapper should NOT trigger redirects on 401
|
|
556
|
-
let authInitializing = false;
|
|
557
|
-
/**
|
|
558
|
-
* Get or create the global auth state manager.
|
|
559
|
-
* Use this when you need app-wide auth state monitoring.
|
|
560
|
-
*/
|
|
561
|
-
export function getGlobalAuthManager(config) {
|
|
562
|
-
if (!globalAuthManager && config) {
|
|
563
|
-
globalAuthManager = createAuthStateManager(config);
|
|
564
|
-
}
|
|
565
|
-
return globalAuthManager;
|
|
566
|
-
}
|
|
567
|
-
/**
|
|
568
|
-
* Set the global auth state manager.
|
|
569
|
-
*/
|
|
570
|
-
export function setGlobalAuthManager(manager) {
|
|
571
|
-
globalAuthManager = manager;
|
|
572
|
-
}
|
|
573
|
-
/**
|
|
574
|
-
* Clear the global auth state manager.
|
|
575
|
-
*/
|
|
576
|
-
export function clearGlobalAuthManager() {
|
|
577
|
-
if (globalAuthManager) {
|
|
578
|
-
globalAuthManager.stop();
|
|
579
|
-
globalAuthManager = null;
|
|
580
|
-
}
|
|
581
|
-
}
|
|
582
|
-
/**
|
|
583
|
-
* Check if auth is currently initializing (token exchange in progress).
|
|
584
|
-
* When true, 401 responses should NOT trigger redirects - just return them as-is.
|
|
585
|
-
*/
|
|
586
|
-
export function isAuthInitializing() {
|
|
587
|
-
return authInitializing;
|
|
588
|
-
}
|
|
589
|
-
/**
|
|
590
|
-
* Set the auth initializing flag.
|
|
591
|
-
* Call with `true` before token exchange, `false` after.
|
|
592
|
-
*/
|
|
593
|
-
export function setAuthInitializing(initializing) {
|
|
594
|
-
authInitializing = initializing;
|
|
595
|
-
console.log('[AuthStateManager] Auth initializing:', initializing);
|
|
596
|
-
}
|
|
597
|
-
//# sourceMappingURL=auth-state-manager.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"auth-state-manager.js","sourceRoot":"","sources":["../../../src/lib/auth/auth-state-manager.ts"],"names":[],"mappings":"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"}
|