@object-ui/app-shell 6.2.3 → 7.1.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/CHANGELOG.md +1229 -0
- package/README.md +292 -0
- package/dist/assistant/assistantBus.d.ts +72 -0
- package/dist/assistant/assistantBus.js +133 -0
- package/dist/chrome/CommandPalette.d.ts +1 -1
- package/dist/chrome/CommandPalette.js +26 -22
- package/dist/chrome/ConditionalAuthWrapper.d.ts +1 -1
- package/dist/chrome/ConsoleToaster.d.ts +1 -1
- package/dist/chrome/ConsoleToaster.js +3 -1
- package/dist/chrome/ErrorBoundary.d.ts +1 -1
- package/dist/chrome/KeyboardShortcutsDialog.d.ts +1 -1
- package/dist/chrome/KeyboardShortcutsDialog.js +16 -5
- package/dist/chrome/LoadingScreen.d.ts +1 -1
- package/dist/chrome/LoadingScreen.js +22 -26
- package/dist/chrome/RouteFader.d.ts +1 -1
- package/dist/chrome/ThemeProvider.d.ts +1 -1
- package/dist/components/ManagedByBadge.d.ts +1 -1
- package/dist/console/AppContent.d.ts +1 -1
- package/dist/console/AppContent.js +184 -39
- package/dist/console/ConsoleShell.d.ts +7 -7
- package/dist/console/ConsoleShell.js +32 -3
- package/dist/console/ai/AiChatPage.d.ts +88 -1
- package/dist/console/ai/AiChatPage.js +747 -66
- package/dist/console/ai/ConversationsSidebar.d.ts +26 -1
- package/dist/console/ai/ConversationsSidebar.js +149 -34
- package/dist/console/ai/LiveCanvas.d.ts +28 -0
- package/dist/console/ai/LiveCanvas.js +80 -0
- package/dist/console/ai/reconcileTurn.d.ts +8 -0
- package/dist/console/ai/reconcileTurn.js +20 -0
- package/dist/console/auth/AuthPageLayout.d.ts +1 -1
- package/dist/console/auth/ForgotPasswordPage.d.ts +1 -1
- package/dist/console/auth/LoginPage.d.ts +1 -1
- package/dist/console/auth/RegisterPage.d.ts +1 -1
- package/dist/console/auth/RegisterPage.js +23 -3
- package/dist/console/cloud-connection/CloudConnectionPanel.d.ts +1 -0
- package/dist/console/cloud-connection/CloudConnectionPanel.js +169 -0
- package/dist/console/home/AppCard.d.ts +1 -1
- package/dist/console/home/AppCard.js +6 -12
- package/dist/console/home/HomeAppsStrip.d.ts +8 -0
- package/dist/console/home/HomeAppsStrip.js +61 -0
- package/dist/console/home/HomeLayout.d.ts +1 -1
- package/dist/console/home/HomeLayout.js +3 -1
- package/dist/console/home/HomePage.d.ts +1 -2
- package/dist/console/home/HomePage.js +149 -21
- package/dist/console/home/HomeRail.d.ts +22 -0
- package/dist/console/home/HomeRail.js +62 -0
- package/dist/console/home/QuickActions.d.ts +1 -1
- package/dist/console/home/QuickActions.js +3 -11
- package/dist/console/home/RecentApps.d.ts +1 -1
- package/dist/console/home/RecentApps.js +2 -2
- package/dist/console/home/StarredApps.d.ts +1 -1
- package/dist/console/home/StarredApps.js +2 -2
- package/dist/console/marketplace/InstalledListWidget.d.ts +1 -0
- package/dist/console/marketplace/InstalledListWidget.js +93 -0
- package/dist/console/marketplace/MarkdownText.d.ts +1 -1
- package/dist/console/marketplace/MarketplaceAccessDenied.d.ts +1 -1
- package/dist/console/marketplace/MarketplaceInstalledPage.d.ts +8 -14
- package/dist/console/marketplace/MarketplaceInstalledPage.js +14 -66
- package/dist/console/marketplace/MarketplacePackagePage.d.ts +1 -1
- package/dist/console/marketplace/MarketplacePackagePage.js +249 -8
- package/dist/console/marketplace/MarketplacePage.d.ts +1 -1
- package/dist/console/marketplace/MarketplacePage.js +60 -3
- package/dist/console/marketplace/PackageIcon.d.ts +1 -1
- package/dist/console/marketplace/PluginDisclosure.d.ts +14 -0
- package/dist/console/marketplace/PluginDisclosure.js +38 -0
- package/dist/console/marketplace/marketplaceApi.d.ts +123 -0
- package/dist/console/marketplace/marketplaceApi.js +254 -1
- package/dist/console/organizations/CreateWorkspaceDialog.d.ts +1 -1
- package/dist/console/organizations/OrganizationsLayout.d.ts +1 -1
- package/dist/console/organizations/OrganizationsPage.d.ts +1 -1
- package/dist/console/organizations/manage/AcceptInvitationPage.d.ts +1 -1
- package/dist/console/organizations/manage/InvitationsPage.d.ts +1 -1
- package/dist/console/organizations/manage/InviteMemberDialog.d.ts +1 -1
- package/dist/console/organizations/manage/MembersPage.d.ts +1 -1
- package/dist/console/organizations/manage/OrganizationLayout.d.ts +1 -1
- package/dist/console/organizations/manage/SettingsPage.d.ts +1 -1
- package/dist/context/CommandPaletteProvider.d.ts +44 -0
- package/dist/context/CommandPaletteProvider.js +71 -0
- package/dist/context/FavoritesProvider.d.ts +1 -1
- package/dist/context/NavigationContext.d.ts +1 -1
- package/dist/context/RecentItemsProvider.d.ts +2 -2
- package/dist/context/UserStateAdapters.d.ts +1 -1
- package/dist/context/index.d.ts +2 -0
- package/dist/context/index.js +1 -0
- package/dist/hooks/index.d.ts +5 -2
- package/dist/hooks/index.js +4 -1
- package/dist/hooks/useActionModal.d.ts +53 -0
- package/dist/hooks/useActionModal.js +111 -0
- package/dist/hooks/useChatConversation.d.ts +137 -4
- package/dist/hooks/useChatConversation.js +316 -25
- package/dist/hooks/useConsoleActionRuntime.d.ts +70 -0
- package/dist/hooks/useConsoleActionRuntime.js +564 -0
- package/dist/hooks/useConversationList.js +61 -3
- package/dist/hooks/useHomeInbox.d.ts +13 -0
- package/dist/hooks/useHomeInbox.js +142 -0
- package/dist/hooks/useNavPins.js +17 -23
- package/dist/hooks/useNavigationSync.d.ts +33 -0
- package/dist/hooks/useNavigationSync.js +98 -12
- package/dist/hooks/useReconcileOnError.d.ts +40 -0
- package/dist/hooks/useReconcileOnError.js +37 -0
- package/dist/hooks/useRecordApprovals.d.ts +18 -19
- package/dist/hooks/useRecordApprovals.js +24 -40
- package/dist/hooks/useResponsiveSidebar.js +14 -5
- package/dist/hooks/useSettleSignal.d.ts +19 -0
- package/dist/hooks/useSettleSignal.js +20 -0
- package/dist/hooks/useTrackRouteAsRecent.js +35 -0
- package/dist/hooks/useUrlOverlay.d.ts +62 -0
- package/dist/hooks/useUrlOverlay.js +88 -0
- package/dist/index.d.ts +18 -8
- package/dist/index.js +17 -5
- package/dist/layout/ActivityFeed.d.ts +1 -1
- package/dist/layout/AppHeader.d.ts +3 -2
- package/dist/layout/AppHeader.js +237 -72
- package/dist/layout/AppSidebar.d.ts +2 -1
- package/dist/layout/AppSidebar.js +26 -46
- package/dist/layout/AppSwitcher.d.ts +2 -1
- package/dist/layout/AppSwitcher.js +9 -5
- package/dist/layout/AuthPageLayout.d.ts +1 -1
- package/dist/layout/ConnectionStatus.d.ts +1 -1
- package/dist/layout/ConnectionStatus.js +9 -6
- package/dist/layout/ConsoleChatbotFab.d.ts +19 -1
- package/dist/layout/ConsoleChatbotFab.js +16 -2
- package/dist/layout/ConsoleFloatingChatbot.d.ts +34 -2
- package/dist/layout/ConsoleFloatingChatbot.js +391 -41
- package/dist/layout/ConsoleLayout.d.ts +1 -1
- package/dist/layout/ConsoleLayout.js +27 -11
- package/dist/layout/ContextSelectors.d.ts +44 -0
- package/dist/layout/ContextSelectors.js +242 -0
- package/dist/layout/InboxPopover.d.ts +6 -1
- package/dist/layout/InboxPopover.js +25 -6
- package/dist/layout/LocaleSwitcher.d.ts +1 -1
- package/dist/layout/LocalizedSidebarTrigger.d.ts +2 -0
- package/dist/layout/LocalizedSidebarTrigger.js +15 -0
- package/dist/layout/MobileViewSwitcherContext.d.ts +1 -1
- package/dist/layout/ModeToggle.d.ts +1 -1
- package/dist/layout/PageHeader.d.ts +1 -1
- package/dist/layout/UnifiedSidebar.d.ts +2 -1
- package/dist/layout/UnifiedSidebar.js +116 -15
- package/dist/layout/agentPicker.d.ts +56 -0
- package/dist/layout/agentPicker.js +40 -0
- package/dist/observability/index.d.ts +1 -0
- package/dist/observability/index.js +1 -0
- package/dist/observability/settleSignal.d.ts +64 -0
- package/dist/observability/settleSignal.js +131 -0
- package/dist/preview/CommitTimeline.d.ts +15 -0
- package/dist/preview/CommitTimeline.js +82 -0
- package/dist/preview/DraftChangesPanel.d.ts +19 -0
- package/dist/preview/DraftChangesPanel.js +114 -0
- package/dist/preview/DraftPreviewBar.d.ts +8 -0
- package/dist/preview/DraftPreviewBar.js +86 -0
- package/dist/preview/PreviewDraftEmptyState.d.ts +16 -0
- package/dist/preview/PreviewDraftEmptyState.js +47 -0
- package/dist/preview/PreviewModeContext.d.ts +57 -0
- package/dist/preview/PreviewModeContext.js +99 -0
- package/dist/preview/UnpublishedAppBar.d.ts +8 -0
- package/dist/preview/UnpublishedAppBar.js +83 -0
- package/dist/preview/commitHistory.d.ts +28 -0
- package/dist/preview/commitHistory.js +48 -0
- package/dist/preview/draftStatus.d.ts +20 -0
- package/dist/preview/draftStatus.js +27 -0
- package/dist/preview/usePublishAllDrafts.d.ts +18 -0
- package/dist/preview/usePublishAllDrafts.js +106 -0
- package/dist/providers/AdapterProvider.d.ts +1 -1
- package/dist/providers/AdapterProvider.js +6 -1
- package/dist/providers/ExpressionProvider.d.ts +1 -1
- package/dist/providers/MetadataProvider.d.ts +17 -2
- package/dist/providers/MetadataProvider.js +192 -12
- package/dist/runtime-config.d.ts +46 -2
- package/dist/runtime-config.js +39 -2
- package/dist/services/builtinComponents.js +68 -59
- package/dist/skeletons/SkeletonDashboard.d.ts +1 -1
- package/dist/skeletons/SkeletonDetail.d.ts +1 -1
- package/dist/skeletons/SkeletonGrid.d.ts +1 -1
- package/dist/utils/appRoute.d.ts +21 -0
- package/dist/utils/appRoute.js +25 -0
- package/dist/utils/deriveRelatedLists.d.ts +54 -0
- package/dist/utils/deriveRelatedLists.js +91 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.js +3 -0
- package/dist/utils/managedByEmptyState.d.ts +8 -1
- package/dist/utils/managedByEmptyState.js +13 -7
- package/dist/utils/preferLocal.d.ts +18 -0
- package/dist/utils/preferLocal.js +24 -0
- package/dist/views/ActionConfirmDialog.d.ts +1 -1
- package/dist/views/ActionConfirmDialog.js +3 -1
- package/dist/views/ActionParamDialog.d.ts +6 -1
- package/dist/views/ActionParamDialog.js +9 -3
- package/dist/views/ActionResultDialog.d.ts +13 -0
- package/dist/views/ActionResultDialog.js +134 -0
- package/dist/views/ComponentNavView.d.ts +14 -1
- package/dist/views/CreateViewDialog.d.ts +1 -1
- package/dist/views/DashboardConfigPanel.d.ts +28 -0
- package/dist/views/DashboardConfigPanel.js +81 -0
- package/dist/views/DashboardView.d.ts +4 -3
- package/dist/views/DashboardView.js +38 -239
- package/dist/views/FlowRunner.d.ts +31 -0
- package/dist/views/FlowRunner.js +121 -0
- package/dist/views/InterfaceListPage.d.ts +49 -0
- package/dist/views/InterfaceListPage.js +347 -0
- package/dist/views/MetadataInspector.d.ts +2 -2
- package/dist/views/ObjectView.d.ts +1 -1
- package/dist/views/ObjectView.js +209 -532
- package/dist/views/PageView.d.ts +8 -3
- package/dist/views/PageView.js +45 -32
- package/dist/views/RecordDetailView.d.ts +1 -1
- package/dist/views/RecordDetailView.js +363 -148
- package/dist/views/RecordFormPage.d.ts +1 -1
- package/dist/views/RecordFormPage.js +26 -1
- package/dist/views/ReportConfigPanel.d.ts +37 -0
- package/dist/views/ReportConfigPanel.js +85 -0
- package/dist/views/ReportView.d.ts +1 -1
- package/dist/views/ReportView.js +116 -7
- package/dist/views/RuntimeDraftBar.d.ts +30 -0
- package/dist/views/RuntimeDraftBar.js +112 -0
- package/dist/views/ScreenView.d.ts +70 -0
- package/dist/views/ScreenView.js +73 -0
- package/dist/views/SearchResultsPage.d.ts +1 -1
- package/dist/views/SearchResultsPage.js +8 -18
- package/dist/views/ViewConfigPanel.d.ts +24 -17
- package/dist/views/ViewConfigPanel.js +121 -77
- package/dist/views/index.d.ts +1 -1
- package/dist/views/index.js +1 -1
- package/dist/views/metadata-admin/AuditPanel.d.ts +28 -0
- package/dist/views/metadata-admin/AuditPanel.js +79 -0
- package/dist/views/metadata-admin/DiagnosticsPage.d.ts +20 -0
- package/dist/views/metadata-admin/DiagnosticsPage.js +69 -0
- package/dist/views/metadata-admin/DirectoryPage.d.ts +16 -1
- package/dist/views/metadata-admin/DirectoryPage.js +101 -24
- package/dist/views/metadata-admin/DraftReviewPanel.d.ts +33 -0
- package/dist/views/metadata-admin/DraftReviewPanel.js +77 -0
- package/dist/views/metadata-admin/EmbeddedItemEditor.d.ts +17 -1
- package/dist/views/metadata-admin/EmbeddedItemEditor.js +15 -8
- package/dist/views/metadata-admin/JsonSourceEditor.d.ts +39 -0
- package/dist/views/metadata-admin/JsonSourceEditor.js +196 -0
- package/dist/views/metadata-admin/LayeredDiff.d.ts +39 -1
- package/dist/views/metadata-admin/LayeredDiff.js +171 -5
- package/dist/views/metadata-admin/MetadataDetailDrawer.d.ts +15 -1
- package/dist/views/metadata-admin/MetadataTypeActions.d.ts +48 -0
- package/dist/views/metadata-admin/MetadataTypeActions.js +165 -0
- package/dist/views/metadata-admin/PackagesPage.d.ts +18 -0
- package/dist/views/metadata-admin/PackagesPage.js +403 -0
- package/dist/views/metadata-admin/PageShell.d.ts +1 -1
- package/dist/views/metadata-admin/PageShell.js +9 -4
- package/dist/views/metadata-admin/PermissionMatrixEditor.d.ts +35 -1
- package/dist/views/metadata-admin/QuickFind.d.ts +21 -1
- package/dist/views/metadata-admin/QuickFind.js +6 -3
- package/dist/views/metadata-admin/RelatedPanel.d.ts +24 -1
- package/dist/views/metadata-admin/RelatedPanel.js +20 -18
- package/dist/views/metadata-admin/ResourceEditPage.d.ts +40 -1
- package/dist/views/metadata-admin/ResourceEditPage.js +1250 -60
- package/dist/views/metadata-admin/ResourceHistoryPage.d.ts +39 -1
- package/dist/views/metadata-admin/ResourceHistoryPage.js +66 -16
- package/dist/views/metadata-admin/ResourceListPage.d.ts +13 -1
- package/dist/views/metadata-admin/ResourceListPage.js +258 -30
- package/dist/views/metadata-admin/ResourceRouter.d.ts +23 -1
- package/dist/views/metadata-admin/SchemaForm.d.ts +34 -1
- package/dist/views/metadata-admin/SchemaForm.js +559 -49
- package/dist/views/metadata-admin/StudioHomePage.d.ts +22 -0
- package/dist/views/metadata-admin/StudioHomePage.js +205 -0
- package/dist/views/metadata-admin/anchors.js +255 -24
- package/dist/views/metadata-admin/clientValidation.d.ts +50 -0
- package/dist/views/metadata-admin/clientValidation.js +169 -0
- package/dist/views/metadata-admin/color-variant-field.d.ts +30 -0
- package/dist/views/metadata-admin/color-variant-field.js +38 -0
- package/dist/views/metadata-admin/createDerive.d.ts +75 -0
- package/dist/views/metadata-admin/createDerive.js +179 -0
- package/dist/views/metadata-admin/dashboard-schema.d.ts +12 -0
- package/dist/views/metadata-admin/dashboard-schema.js +80 -0
- package/dist/views/metadata-admin/datasource/DatasourceResourcePage.d.ts +35 -0
- package/dist/views/metadata-admin/datasource/DatasourceResourcePage.js +327 -0
- package/dist/views/metadata-admin/datasource/register.d.ts +1 -0
- package/dist/views/metadata-admin/datasource/register.js +24 -0
- package/dist/views/metadata-admin/default-inspector-registry.d.ts +49 -0
- package/dist/views/metadata-admin/default-inspector-registry.js +8 -0
- package/dist/views/metadata-admin/default-schemas.js +115 -10
- package/dist/views/metadata-admin/external/ExternalDatasourcePanel.d.ts +27 -0
- package/dist/views/metadata-admin/external/ExternalDatasourcePanel.js +69 -0
- package/dist/views/metadata-admin/external/ImportObjectDialog.d.ts +27 -0
- package/dist/views/metadata-admin/external/ImportObjectDialog.js +77 -0
- package/dist/views/metadata-admin/external/SchemaBrowser.d.ts +16 -0
- package/dist/views/metadata-admin/external/SchemaBrowser.js +74 -0
- package/dist/views/metadata-admin/external/ValidationPanel.d.ts +16 -0
- package/dist/views/metadata-admin/external/ValidationPanel.js +68 -0
- package/dist/views/metadata-admin/external/api.d.ts +100 -0
- package/dist/views/metadata-admin/external/api.js +124 -0
- package/dist/views/metadata-admin/i18n.d.ts +1 -0
- package/dist/views/metadata-admin/i18n.js +1252 -2
- package/dist/views/metadata-admin/index.d.ts +8 -5
- package/dist/views/metadata-admin/index.js +12 -2
- package/dist/views/metadata-admin/inspector-registry.d.ts +51 -0
- package/dist/views/metadata-admin/inspector-registry.js +11 -0
- package/dist/views/metadata-admin/inspectors/ActionDefaultInspector.d.ts +30 -0
- package/dist/views/metadata-admin/inspectors/ActionDefaultInspector.js +180 -0
- package/dist/views/metadata-admin/inspectors/AppNavInspector.d.ts +16 -0
- package/dist/views/metadata-admin/inspectors/AppNavInspector.js +110 -0
- package/dist/views/metadata-admin/inspectors/ConditionBuilder.d.ts +29 -0
- package/dist/views/metadata-admin/inspectors/ConditionBuilder.js +154 -0
- package/dist/views/metadata-admin/inspectors/DashboardDefaultInspector.d.ts +28 -0
- package/dist/views/metadata-admin/inspectors/DashboardDefaultInspector.js +110 -0
- package/dist/views/metadata-admin/inspectors/DashboardWidgetInspector.d.ts +18 -0
- package/dist/views/metadata-admin/inspectors/DashboardWidgetInspector.js +139 -0
- package/dist/views/metadata-admin/inspectors/DatasetDefaultInspector.d.ts +21 -0
- package/dist/views/metadata-admin/inspectors/DatasetDefaultInspector.js +221 -0
- package/dist/views/metadata-admin/inspectors/FlowEdgeInspector.d.ts +16 -0
- package/dist/views/metadata-admin/inspectors/FlowEdgeInspector.js +126 -0
- package/dist/views/metadata-admin/inspectors/FlowInspector.d.ts +12 -0
- package/dist/views/metadata-admin/inspectors/FlowInspector.js +9 -0
- package/dist/views/metadata-admin/inspectors/FlowKeyValueField.d.ts +30 -0
- package/dist/views/metadata-admin/inspectors/FlowKeyValueField.js +125 -0
- package/dist/views/metadata-admin/inspectors/FlowNodeConfigField.d.ts +18 -0
- package/dist/views/metadata-admin/inspectors/FlowNodeConfigField.js +40 -0
- package/dist/views/metadata-admin/inspectors/FlowNodeInspector.d.ts +14 -0
- package/dist/views/metadata-admin/inspectors/FlowNodeInspector.js +205 -0
- package/dist/views/metadata-admin/inspectors/FlowObjectListField.d.ts +26 -0
- package/dist/views/metadata-admin/inspectors/FlowObjectListField.js +105 -0
- package/dist/views/metadata-admin/inspectors/FlowReferenceField.d.ts +83 -0
- package/dist/views/metadata-admin/inspectors/FlowReferenceField.js +181 -0
- package/dist/views/metadata-admin/inspectors/FlowStringListField.d.ts +21 -0
- package/dist/views/metadata-admin/inspectors/FlowStringListField.js +60 -0
- package/dist/views/metadata-admin/inspectors/InspectorComboField.d.ts +40 -0
- package/dist/views/metadata-admin/inspectors/InspectorComboField.js +61 -0
- package/dist/views/metadata-admin/inspectors/ObjectDefaultInspector.d.ts +21 -0
- package/dist/views/metadata-admin/inspectors/ObjectDefaultInspector.js +55 -0
- package/dist/views/metadata-admin/inspectors/ObjectFieldInspector.d.ts +23 -0
- package/dist/views/metadata-admin/inspectors/ObjectFieldInspector.js +365 -0
- package/dist/views/metadata-admin/inspectors/PageBlockInspector.d.ts +48 -0
- package/dist/views/metadata-admin/inspectors/PageBlockInspector.js +332 -0
- package/dist/views/metadata-admin/inspectors/ReportDefaultInspector.d.ts +58 -0
- package/dist/views/metadata-admin/inspectors/ReportDefaultInspector.js +218 -0
- package/dist/views/metadata-admin/inspectors/ViewColumnInspector.d.ts +19 -0
- package/dist/views/metadata-admin/inspectors/ViewColumnInspector.js +144 -0
- package/dist/views/metadata-admin/inspectors/ViewInspector.d.ts +19 -0
- package/dist/views/metadata-admin/inspectors/ViewInspector.js +21 -0
- package/dist/views/metadata-admin/inspectors/ViewVariantInspector.d.ts +54 -0
- package/dist/views/metadata-admin/inspectors/ViewVariantInspector.js +191 -0
- package/dist/views/metadata-admin/inspectors/_shared.d.ts +128 -0
- package/dist/views/metadata-admin/inspectors/_shared.js +113 -0
- package/dist/views/metadata-admin/inspectors/datasetFilterCondition.d.ts +24 -0
- package/dist/views/metadata-admin/inspectors/datasetFilterCondition.js +97 -0
- package/dist/views/metadata-admin/inspectors/expression-validate.d.ts +26 -0
- package/dist/views/metadata-admin/inspectors/expression-validate.js +66 -0
- package/dist/views/metadata-admin/inspectors/flow-node-config.d.ts +143 -0
- package/dist/views/metadata-admin/inspectors/flow-node-config.js +506 -0
- package/dist/views/metadata-admin/inspectors/index.d.ts +1 -0
- package/dist/views/metadata-admin/inspectors/index.js +45 -0
- package/dist/views/metadata-admin/inspectors/json-schema-to-fields.d.ts +40 -0
- package/dist/views/metadata-admin/inspectors/json-schema-to-fields.js +227 -0
- package/dist/views/metadata-admin/inspectors/useDatasetFields.d.ts +72 -0
- package/dist/views/metadata-admin/inspectors/useDatasetFields.js +0 -0
- package/dist/views/metadata-admin/issuePath.d.ts +22 -0
- package/dist/views/metadata-admin/issuePath.js +65 -0
- package/dist/views/metadata-admin/mergeServerFields.d.ts +65 -0
- package/dist/views/metadata-admin/mergeServerFields.js +56 -0
- package/dist/views/metadata-admin/package-scope.d.ts +26 -0
- package/dist/views/metadata-admin/package-scope.js +43 -0
- package/dist/views/metadata-admin/preview-registry.d.ts +55 -0
- package/dist/views/metadata-admin/previews/ActionPreview.d.ts +25 -0
- package/dist/views/metadata-admin/previews/ActionPreview.js +238 -0
- package/dist/views/metadata-admin/previews/AddWidgetPicker.d.ts +12 -0
- package/dist/views/metadata-admin/previews/AddWidgetPicker.js +56 -0
- package/dist/views/metadata-admin/previews/AgentPreview.d.ts +24 -0
- package/dist/views/metadata-admin/previews/AgentPreview.js +100 -0
- package/dist/views/metadata-admin/previews/AppNavCanvas.d.ts +31 -0
- package/dist/views/metadata-admin/previews/AppNavCanvas.js +260 -0
- package/dist/views/metadata-admin/previews/AppPreview.d.ts +16 -1
- package/dist/views/metadata-admin/previews/AppPreview.js +23 -14
- package/dist/views/metadata-admin/previews/BookPreview.d.ts +20 -0
- package/dist/views/metadata-admin/previews/BookPreview.js +132 -0
- package/dist/views/metadata-admin/previews/DashboardPreview.d.ts +16 -1
- package/dist/views/metadata-admin/previews/DashboardPreview.js +110 -8
- package/dist/views/metadata-admin/previews/DatasetPreview.d.ts +18 -0
- package/dist/views/metadata-admin/previews/DatasetPreview.js +105 -0
- package/dist/views/metadata-admin/previews/DatasourcePreview.d.ts +23 -0
- package/dist/views/metadata-admin/previews/DatasourcePreview.js +68 -0
- package/dist/views/metadata-admin/previews/EmailTemplatePreview.d.ts +14 -1
- package/dist/views/metadata-admin/previews/FieldStub.d.ts +30 -0
- package/dist/views/metadata-admin/previews/FieldStub.js +104 -0
- package/dist/views/metadata-admin/previews/FieldsListEditor.d.ts +50 -0
- package/dist/views/metadata-admin/previews/FieldsListEditor.js +97 -0
- package/dist/views/metadata-admin/previews/FlowCanvas.d.ts +49 -0
- package/dist/views/metadata-admin/previews/FlowCanvas.js +416 -0
- package/dist/views/metadata-admin/previews/FlowPreview.d.ts +20 -0
- package/dist/views/metadata-admin/previews/FlowPreview.js +120 -0
- package/dist/views/metadata-admin/previews/FlowRunsPanel.d.ts +46 -0
- package/dist/views/metadata-admin/previews/FlowRunsPanel.js +97 -0
- package/dist/views/metadata-admin/previews/FlowSimulatorPanel.d.ts +25 -0
- package/dist/views/metadata-admin/previews/FlowSimulatorPanel.js +204 -0
- package/dist/views/metadata-admin/previews/JobPreview.d.ts +28 -0
- package/dist/views/metadata-admin/previews/JobPreview.js +290 -0
- package/dist/views/metadata-admin/previews/ObjectFormCanvas.d.ts +30 -0
- package/dist/views/metadata-admin/previews/ObjectFormCanvas.js +547 -0
- package/dist/views/metadata-admin/previews/ObjectPreview.d.ts +14 -1
- package/dist/views/metadata-admin/previews/ObjectPreview.js +5 -30
- package/dist/views/metadata-admin/previews/OutlineStrip.d.ts +32 -0
- package/dist/views/metadata-admin/previews/OutlineStrip.js +8 -0
- package/dist/views/metadata-admin/previews/PageBlockCanvas.d.ts +49 -0
- package/dist/views/metadata-admin/previews/PageBlockCanvas.js +510 -0
- package/dist/views/metadata-admin/previews/PagePreview.d.ts +10 -1
- package/dist/views/metadata-admin/previews/PagePreview.js +200 -5
- package/dist/views/metadata-admin/previews/PermissionPreview.d.ts +27 -0
- package/dist/views/metadata-admin/previews/PermissionPreview.js +115 -0
- package/dist/views/metadata-admin/previews/PreviewShell.d.ts +29 -6
- package/dist/views/metadata-admin/previews/PreviewShell.js +16 -3
- package/dist/views/metadata-admin/previews/ReportPreview.d.ts +18 -1
- package/dist/views/metadata-admin/previews/ReportPreview.js +23 -15
- package/dist/views/metadata-admin/previews/RolePreview.d.ts +19 -0
- package/dist/views/metadata-admin/previews/RolePreview.js +14 -0
- package/dist/views/metadata-admin/previews/ScreenPreview.d.ts +38 -0
- package/dist/views/metadata-admin/previews/ScreenPreview.js +61 -0
- package/dist/views/metadata-admin/previews/SkillPreview.d.ts +22 -0
- package/dist/views/metadata-admin/previews/SkillPreview.js +34 -0
- package/dist/views/metadata-admin/previews/ToolPreview.d.ts +25 -0
- package/dist/views/metadata-admin/previews/ToolPreview.js +122 -0
- package/dist/views/metadata-admin/previews/TranslationPreview.d.ts +25 -0
- package/dist/views/metadata-admin/previews/TranslationPreview.js +52 -0
- package/dist/views/metadata-admin/previews/ValidationPreview.d.ts +27 -0
- package/dist/views/metadata-admin/previews/ValidationPreview.js +110 -0
- package/dist/views/metadata-admin/previews/ViewColumnPanes.d.ts +62 -0
- package/dist/views/metadata-admin/previews/ViewColumnPanes.js +140 -0
- package/dist/views/metadata-admin/previews/ViewPreview.d.ts +23 -1
- package/dist/views/metadata-admin/previews/ViewPreview.js +101 -73
- package/dist/views/metadata-admin/previews/block-config.d.ts +82 -0
- package/dist/views/metadata-admin/previews/block-config.js +324 -0
- package/dist/views/metadata-admin/previews/block-types.d.ts +40 -0
- package/dist/views/metadata-admin/previews/block-types.js +110 -0
- package/dist/views/metadata-admin/previews/field-types.d.ts +53 -0
- package/dist/views/metadata-admin/previews/field-types.js +97 -0
- package/dist/views/metadata-admin/previews/flow-canvas-layout.d.ts +102 -0
- package/dist/views/metadata-admin/previews/flow-canvas-layout.js +227 -0
- package/dist/views/metadata-admin/previews/flow-canvas-parts.d.ts +96 -0
- package/dist/views/metadata-admin/previews/flow-canvas-parts.js +373 -0
- package/dist/views/metadata-admin/previews/form-preview.d.ts +24 -0
- package/dist/views/metadata-admin/previews/form-preview.js +29 -0
- package/dist/views/metadata-admin/previews/index.js +43 -0
- package/dist/views/metadata-admin/previews/object-fields-bridge.d.ts +66 -0
- package/dist/views/metadata-admin/previews/object-fields-bridge.js +171 -0
- package/dist/views/metadata-admin/previews/object-fields-io.d.ts +130 -0
- package/dist/views/metadata-admin/previews/object-fields-io.js +243 -0
- package/dist/views/metadata-admin/previews/screen-spec.d.ts +43 -0
- package/dist/views/metadata-admin/previews/screen-spec.js +108 -0
- package/dist/views/metadata-admin/previews/simulator/flow-sim-types.d.ts +102 -0
- package/dist/views/metadata-admin/previews/simulator/flow-sim-types.js +2 -0
- package/dist/views/metadata-admin/previews/simulator/flow-sim-validate.d.ts +15 -0
- package/dist/views/metadata-admin/previews/simulator/flow-sim-validate.js +185 -0
- package/dist/views/metadata-admin/previews/simulator/flow-simulator.d.ts +73 -0
- package/dist/views/metadata-admin/previews/simulator/flow-simulator.js +426 -0
- package/dist/views/metadata-admin/previews/useDatasetCatalog.d.ts +47 -0
- package/dist/views/metadata-admin/previews/useDatasetCatalog.js +133 -0
- package/dist/views/metadata-admin/previews/useFlowNodePalette.d.ts +44 -0
- package/dist/views/metadata-admin/previews/useFlowNodePalette.js +124 -0
- package/dist/views/metadata-admin/previews/useMetaOptions.d.ts +8 -0
- package/dist/views/metadata-admin/previews/useMetaOptions.js +50 -0
- package/dist/views/metadata-admin/previews/useObjectFields.d.ts +23 -0
- package/dist/views/metadata-admin/previews/useObjectFields.js +79 -0
- package/dist/views/metadata-admin/previews/useObjectOptions.d.ts +8 -0
- package/dist/views/metadata-admin/previews/useObjectOptions.js +43 -0
- package/dist/views/metadata-admin/previews/view-column-io.d.ts +42 -0
- package/dist/views/metadata-admin/previews/view-column-io.js +73 -0
- package/dist/views/metadata-admin/previews/widget-types.d.ts +24 -0
- package/dist/views/metadata-admin/previews/widget-types.js +40 -0
- package/dist/views/metadata-admin/registry.d.ts +140 -19
- package/dist/views/metadata-admin/report-schema.d.ts +26 -0
- package/dist/views/metadata-admin/report-schema.js +121 -0
- package/dist/views/metadata-admin/useMetadata.d.ts +100 -2
- package/dist/views/metadata-admin/useMetadata.js +155 -4
- package/dist/views/metadata-admin/view-item-normalize.d.ts +20 -0
- package/dist/views/metadata-admin/view-item-normalize.js +68 -0
- package/dist/views/metadata-admin/view-schema.d.ts +16 -0
- package/dist/views/metadata-admin/view-schema.js +107 -0
- package/dist/views/metadata-admin/view-variant-model.d.ts +23 -0
- package/dist/views/metadata-admin/view-variant-model.js +64 -0
- package/dist/views/metadata-admin/widgets.d.ts +89 -1
- package/dist/views/metadata-admin/widgets.js +491 -17
- package/dist/views/runtime-metadata-persistence.d.ts +78 -0
- package/dist/views/runtime-metadata-persistence.js +89 -0
- package/dist/views/useOpenRecordList.d.ts +18 -0
- package/dist/views/useOpenRecordList.js +36 -0
- package/dist/views/userFilterUrlState.d.ts +15 -0
- package/dist/views/userFilterUrlState.js +53 -0
- package/dist/views/view-config-adapter.d.ts +38 -0
- package/dist/views/view-config-adapter.js +80 -0
- package/package.json +52 -34
- package/dist/views/DesignDrawer.d.ts +0 -28
- package/dist/views/DesignDrawer.js +0 -51
- package/dist/views/metadata-admin/DesignerEditorWrapper.d.ts +0 -68
- package/dist/views/metadata-admin/DesignerEditorWrapper.js +0 -158
|
@@ -0,0 +1,426 @@
|
|
|
1
|
+
// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.
|
|
2
|
+
import { evalCondition, validateFlowDraft } from './flow-sim-validate';
|
|
3
|
+
const MAX_STEPS = 500;
|
|
4
|
+
const PASS_THROUGH = new Set(['start']);
|
|
5
|
+
const MOCKED_SIDE_EFFECT = new Set([
|
|
6
|
+
'create_record',
|
|
7
|
+
'update_record',
|
|
8
|
+
'delete_record',
|
|
9
|
+
'get_record',
|
|
10
|
+
'http_request',
|
|
11
|
+
'connector_action',
|
|
12
|
+
]);
|
|
13
|
+
// `parallel` / `try_catch` carry nested body regions (ADR-0031) the flat
|
|
14
|
+
// stepper can't walk — pass through honestly instead of faking their semantics.
|
|
15
|
+
const UNSUPPORTED = new Set(['join_gateway', 'subflow', 'boundary_event', 'parallel', 'try_catch']);
|
|
16
|
+
const edgeId = (e, i) => e.id || `${e.source}->${e.target}#${i}`;
|
|
17
|
+
const condStr = (c) => (typeof c === 'string' ? c : undefined);
|
|
18
|
+
const str = (v) => (typeof v === 'string' && v ? v : undefined);
|
|
19
|
+
export class FlowSimulator {
|
|
20
|
+
constructor(nodes, edges) {
|
|
21
|
+
Object.defineProperty(this, "nodes", {
|
|
22
|
+
enumerable: true,
|
|
23
|
+
configurable: true,
|
|
24
|
+
writable: true,
|
|
25
|
+
value: new Map()
|
|
26
|
+
});
|
|
27
|
+
Object.defineProperty(this, "edges", {
|
|
28
|
+
enumerable: true,
|
|
29
|
+
configurable: true,
|
|
30
|
+
writable: true,
|
|
31
|
+
value: []
|
|
32
|
+
});
|
|
33
|
+
Object.defineProperty(this, "mocks", {
|
|
34
|
+
enumerable: true,
|
|
35
|
+
configurable: true,
|
|
36
|
+
writable: true,
|
|
37
|
+
value: {}
|
|
38
|
+
});
|
|
39
|
+
Object.defineProperty(this, "seq", {
|
|
40
|
+
enumerable: true,
|
|
41
|
+
configurable: true,
|
|
42
|
+
writable: true,
|
|
43
|
+
value: 0
|
|
44
|
+
});
|
|
45
|
+
Object.defineProperty(this, "state", {
|
|
46
|
+
enumerable: true,
|
|
47
|
+
configurable: true,
|
|
48
|
+
writable: true,
|
|
49
|
+
value: {
|
|
50
|
+
status: 'idle',
|
|
51
|
+
variables: {},
|
|
52
|
+
steps: [],
|
|
53
|
+
frontier: [],
|
|
54
|
+
activeNodeId: null,
|
|
55
|
+
visitedNodeIds: [],
|
|
56
|
+
traversedEdgeIds: [],
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
for (const n of nodes)
|
|
60
|
+
this.nodes.set(n.id, n);
|
|
61
|
+
this.edges = edges;
|
|
62
|
+
}
|
|
63
|
+
/** Validate + seed variables and queue the entry node. Returns the validation. */
|
|
64
|
+
reset(seedVariables = {}, mocks = {}) {
|
|
65
|
+
const validation = validateFlowDraft([...this.nodes.values()], this.edges);
|
|
66
|
+
this.mocks = mocks;
|
|
67
|
+
this.seq = 0;
|
|
68
|
+
this.state = {
|
|
69
|
+
status: validation.errors.length ? 'error' : 'idle',
|
|
70
|
+
variables: { ...seedVariables },
|
|
71
|
+
steps: [],
|
|
72
|
+
frontier: validation.startNodeId ? [validation.startNodeId] : [],
|
|
73
|
+
activeNodeId: null,
|
|
74
|
+
visitedNodeIds: [],
|
|
75
|
+
traversedEdgeIds: [],
|
|
76
|
+
error: validation.errors.length ? validation.errors[0].message : undefined,
|
|
77
|
+
};
|
|
78
|
+
return validation;
|
|
79
|
+
}
|
|
80
|
+
get done() {
|
|
81
|
+
return this.state.status === 'done' || this.state.status === 'error';
|
|
82
|
+
}
|
|
83
|
+
/** Execute one queued node. Returns the recorded step, or null when idle. */
|
|
84
|
+
step() {
|
|
85
|
+
const s = this.state;
|
|
86
|
+
if (s.status === 'error' || s.status === 'done' || s.status === 'paused')
|
|
87
|
+
return null;
|
|
88
|
+
if (this.seq >= MAX_STEPS) {
|
|
89
|
+
s.status = 'error';
|
|
90
|
+
s.error = `Step limit (${MAX_STEPS}) exceeded — the flow may contain an infinite loop.`;
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
const nodeId = s.frontier.shift();
|
|
94
|
+
if (!nodeId) {
|
|
95
|
+
s.status = 'done';
|
|
96
|
+
s.activeNodeId = null;
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
const node = this.nodes.get(nodeId);
|
|
100
|
+
if (!node) {
|
|
101
|
+
return this.record(nodeId, 'unknown', nodeId, 'error', { error: `Node "${nodeId}" not found.` });
|
|
102
|
+
}
|
|
103
|
+
s.status = 'running';
|
|
104
|
+
s.activeNodeId = nodeId;
|
|
105
|
+
if (!s.visitedNodeIds.includes(nodeId))
|
|
106
|
+
s.visitedNodeIds.push(nodeId);
|
|
107
|
+
const step = this.execute(node);
|
|
108
|
+
// Settle the run status. A pause halts the queue until resume(); a decision
|
|
109
|
+
// dead-end / missing node already set 'error' inside execute(). Only a still
|
|
110
|
+
// -'running' branch that drained the frontier completes as 'done'.
|
|
111
|
+
if (s.status === 'running' && s.frontier.length === 0) {
|
|
112
|
+
s.status = 'done';
|
|
113
|
+
s.activeNodeId = null;
|
|
114
|
+
}
|
|
115
|
+
return step;
|
|
116
|
+
}
|
|
117
|
+
/** Run to completion (or until a pause / error). */
|
|
118
|
+
runToEnd() {
|
|
119
|
+
let guard = 0;
|
|
120
|
+
while (this.state.status !== 'done' && this.state.status !== 'error' && this.state.status !== 'paused') {
|
|
121
|
+
if (++guard > MAX_STEPS + 5)
|
|
122
|
+
break;
|
|
123
|
+
this.step();
|
|
124
|
+
}
|
|
125
|
+
return this.state;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Continue a flow paused on a `wait`, `screen`, or `approval` node.
|
|
129
|
+
* - `screenOutputs` — inputs captured from a paused screen.
|
|
130
|
+
* - `decision` — the branch an approval resumes down (ADR-0019/0044:
|
|
131
|
+
* `approve` / `reject` / `revise`). The run takes ONLY the out-edge whose
|
|
132
|
+
* label matches, mirroring how the engine resumes a suspended approval by
|
|
133
|
+
* branch label — instead of fanning out to every out-edge.
|
|
134
|
+
*/
|
|
135
|
+
resume(opts = {}) {
|
|
136
|
+
const s = this.state;
|
|
137
|
+
if (s.status !== 'paused' || !s.activeNodeId)
|
|
138
|
+
return;
|
|
139
|
+
const node = this.nodes.get(s.activeNodeId);
|
|
140
|
+
if (opts.screenOutputs && node?.type === 'screen') {
|
|
141
|
+
Object.assign(s.variables, opts.screenOutputs);
|
|
142
|
+
}
|
|
143
|
+
s.pausedReason = undefined;
|
|
144
|
+
s.status = 'running';
|
|
145
|
+
if (node?.type === 'approval')
|
|
146
|
+
this.resumeApproval(node, opts.decision);
|
|
147
|
+
else if (node)
|
|
148
|
+
this.enqueueSuccessors(node);
|
|
149
|
+
if (s.frontier.length === 0) {
|
|
150
|
+
s.status = 'done';
|
|
151
|
+
s.activeNodeId = null;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Resume a suspended approval down the chosen decision's out-edge: the one
|
|
156
|
+
* whose `label` equals `decision` (case-insensitive — `approve` / `reject` /
|
|
157
|
+
* `revise`). With no match (or no decision) it falls back to fanning out —
|
|
158
|
+
* mirroring the engine's unmatched-`branchLabel` fallback — and logs that so
|
|
159
|
+
* the author notices the unrouted decision.
|
|
160
|
+
*/
|
|
161
|
+
resumeApproval(node, decision) {
|
|
162
|
+
const out = this.edges.map((e, i) => ({ e, i })).filter((x) => x.e.source === node.id);
|
|
163
|
+
const want = (decision ?? '').trim().toLowerCase();
|
|
164
|
+
const chosen = want ? out.find((x) => (x.e.label ?? '').trim().toLowerCase() === want) : undefined;
|
|
165
|
+
if (chosen) {
|
|
166
|
+
this.traverse(chosen.e, chosen.i);
|
|
167
|
+
this.record(node.id, 'approval', node.label, 'ok', { note: `Decision: ${decision} → ${chosen.e.target}` });
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
for (const x of out)
|
|
171
|
+
this.traverse(x.e, x.i);
|
|
172
|
+
this.record(node.id, 'approval', node.label, 'ok', {
|
|
173
|
+
note: want
|
|
174
|
+
? `No out-edge labelled "${decision}"; took all branches (engine label-fallback).`
|
|
175
|
+
: 'No decision supplied; took all branches.',
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
// ---- node execution -----------------------------------------------------
|
|
180
|
+
execute(node) {
|
|
181
|
+
const type = node.type;
|
|
182
|
+
if (type === 'end') {
|
|
183
|
+
// Terminate this branch only; other queued branches still run.
|
|
184
|
+
return this.record(node.id, type, node.label, 'ok', { note: 'Flow end reached.' });
|
|
185
|
+
}
|
|
186
|
+
if (type === 'decision')
|
|
187
|
+
return this.executeDecision(node);
|
|
188
|
+
if (type === 'assignment')
|
|
189
|
+
return this.executeAssignment(node);
|
|
190
|
+
if (UNSUPPORTED.has(type)) {
|
|
191
|
+
this.enqueueSuccessors(node);
|
|
192
|
+
return this.record(node.id, type, node.label, 'skipped', {
|
|
193
|
+
note: `"${type}" is not modelled by the simulator; passing through without its real semantics.`,
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
if (type === 'parallel_gateway') {
|
|
197
|
+
this.enqueueSuccessors(node);
|
|
198
|
+
return this.record(node.id, type, node.label, 'ok', {
|
|
199
|
+
note: 'Parallel split — branches fan out (no join synchronization is simulated).',
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
if (type === 'approval') {
|
|
203
|
+
// ADR-0019: an approval node opens a request and SUSPENDS the run until a
|
|
204
|
+
// decision is recorded. Model that as a pause; the author resumes down the
|
|
205
|
+
// chosen approve / reject / revise out-edge (see resumeApproval) rather
|
|
206
|
+
// than fanning out to every out-edge at once.
|
|
207
|
+
this.state.status = 'paused';
|
|
208
|
+
this.state.pausedReason = 'approval';
|
|
209
|
+
return this.record(node.id, type, node.label, 'paused', { note: 'Approval reached — choose a decision to continue.' });
|
|
210
|
+
}
|
|
211
|
+
if (type === 'wait') {
|
|
212
|
+
this.state.status = 'paused';
|
|
213
|
+
this.state.pausedReason = 'wait';
|
|
214
|
+
return this.record(node.id, type, node.label, 'paused', { note: 'Wait reached — continue manually.' });
|
|
215
|
+
}
|
|
216
|
+
if (type === 'screen') {
|
|
217
|
+
// Mirror the engine's `shouldPause`: a screen suspends only when it
|
|
218
|
+
// collects input (`fields`) or explicitly opts in (`waitForInput`).
|
|
219
|
+
// A field-less / `waitForInput:false` screen is a server pass-through.
|
|
220
|
+
const fields = Array.isArray(node.config?.fields) ? node.config.fields : [];
|
|
221
|
+
const waitForInput = node.config?.waitForInput;
|
|
222
|
+
const shouldPause = waitForInput === true || (fields.length > 0 && waitForInput !== false);
|
|
223
|
+
if (shouldPause) {
|
|
224
|
+
this.state.status = 'paused';
|
|
225
|
+
this.state.pausedReason = 'screen';
|
|
226
|
+
return this.record(node.id, type, node.label, 'paused', { note: 'Screen reached — provide inputs, then continue.' });
|
|
227
|
+
}
|
|
228
|
+
this.enqueueSuccessors(node);
|
|
229
|
+
return this.record(node.id, type, node.label, 'ok', { note: 'Screen has no input — passed through (matches runtime).' });
|
|
230
|
+
}
|
|
231
|
+
if (type === 'loop') {
|
|
232
|
+
const step = this.executeLoop(node);
|
|
233
|
+
this.enqueueSuccessors(node);
|
|
234
|
+
return step;
|
|
235
|
+
}
|
|
236
|
+
if (MOCKED_SIDE_EFFECT.has(type) || type === 'script') {
|
|
237
|
+
const wrote = this.applyMock(node);
|
|
238
|
+
this.enqueueSuccessors(node);
|
|
239
|
+
return this.record(node.id, type, node.label, 'mocked', {
|
|
240
|
+
wrote,
|
|
241
|
+
note: this.mockNote(node),
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
// start / assignment / anything else: pass straight through.
|
|
245
|
+
this.enqueueSuccessors(node);
|
|
246
|
+
return this.record(node.id, type, node.label, 'ok', {
|
|
247
|
+
note: PASS_THROUGH.has(type) ? undefined : `Type "${type}" treated as pass-through.`,
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
executeDecision(node) {
|
|
251
|
+
const out = this.edges
|
|
252
|
+
.map((e, i) => ({ e, i }))
|
|
253
|
+
.filter((x) => x.e.source === node.id);
|
|
254
|
+
const evals = [];
|
|
255
|
+
let chosen;
|
|
256
|
+
let firstError;
|
|
257
|
+
// Evaluate conditional edges in declared order; first truthy wins.
|
|
258
|
+
for (const { e, i } of out) {
|
|
259
|
+
if (e.isDefault)
|
|
260
|
+
continue;
|
|
261
|
+
const cond = condStr(e.condition);
|
|
262
|
+
if (!cond) {
|
|
263
|
+
evals.push({ edgeId: edgeId(e, i), target: e.target, result: false, selected: false, error: 'Branch has no condition.' });
|
|
264
|
+
continue;
|
|
265
|
+
}
|
|
266
|
+
const r = evalCondition(cond, this.state.variables);
|
|
267
|
+
if (r.error && !firstError)
|
|
268
|
+
firstError = `${cond}: ${r.error}`;
|
|
269
|
+
const selected = r.result && !chosen;
|
|
270
|
+
if (selected)
|
|
271
|
+
chosen = { e, i };
|
|
272
|
+
evals.push({ edgeId: edgeId(e, i), target: e.target, condition: cond, result: r.result, error: r.error, selected });
|
|
273
|
+
}
|
|
274
|
+
// Fall back to the default branch when no condition matched.
|
|
275
|
+
if (!chosen) {
|
|
276
|
+
const def = out.find((x) => x.e.isDefault);
|
|
277
|
+
if (def) {
|
|
278
|
+
chosen = def;
|
|
279
|
+
evals.push({ edgeId: edgeId(def.e, def.i), target: def.e.target, isDefault: true, result: true, selected: true });
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
const multiMatch = evals.filter((x) => x.result && !x.isDefault).length > 1;
|
|
283
|
+
if (chosen)
|
|
284
|
+
this.traverse(chosen.e, chosen.i);
|
|
285
|
+
return this.record(node.id, 'decision', node.label, chosen ? 'ok' : 'error', {
|
|
286
|
+
edges: evals,
|
|
287
|
+
error: chosen ? undefined : firstError ?? 'No branch matched and there is no default branch.',
|
|
288
|
+
note: multiMatch ? 'Multiple conditions matched; the first declared branch was taken.' : undefined,
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* assignment node — set flow variables. Normalizes the three authoring
|
|
293
|
+
* shapes the engine accepts (Studio's `{ assignments: { var: value } }`
|
|
294
|
+
* map, the example `{ assignments: [{ variable, value }] }` array, and the
|
|
295
|
+
* legacy flat `{ var: value }`) and interpolates `{var}` templates — so the
|
|
296
|
+
* Debug run mirrors runtime instead of silently no-oping.
|
|
297
|
+
*/
|
|
298
|
+
executeAssignment(node) {
|
|
299
|
+
const cfg = node.config ?? {};
|
|
300
|
+
const raw = cfg.assignments;
|
|
301
|
+
const pairs = [];
|
|
302
|
+
if (Array.isArray(raw)) {
|
|
303
|
+
for (const item of raw) {
|
|
304
|
+
if (item && typeof item === 'object') {
|
|
305
|
+
const e = item;
|
|
306
|
+
const name = e.variable ?? e.name ?? e.key;
|
|
307
|
+
if (typeof name === 'string' && name)
|
|
308
|
+
pairs.push([name, e.value]);
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
else if (raw && typeof raw === 'object') {
|
|
313
|
+
for (const [k, v] of Object.entries(raw))
|
|
314
|
+
pairs.push([k, v]);
|
|
315
|
+
}
|
|
316
|
+
else {
|
|
317
|
+
for (const [k, v] of Object.entries(cfg))
|
|
318
|
+
pairs.push([k, v]);
|
|
319
|
+
}
|
|
320
|
+
const wrote = {};
|
|
321
|
+
for (const [key, value] of pairs) {
|
|
322
|
+
const resolved = this.interpolateValue(value);
|
|
323
|
+
this.state.variables[key] = resolved;
|
|
324
|
+
wrote[key] = resolved;
|
|
325
|
+
}
|
|
326
|
+
this.enqueueSuccessors(node);
|
|
327
|
+
return this.record(node.id, 'assignment', node.label, 'ok', {
|
|
328
|
+
wrote: Object.keys(wrote).length ? wrote : undefined,
|
|
329
|
+
note: Object.keys(wrote).length ? undefined : 'No assignments defined.',
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
/** Resolve `{var}` templates in an assignment value against live variables. */
|
|
333
|
+
interpolateValue(value) {
|
|
334
|
+
if (typeof value !== 'string')
|
|
335
|
+
return value;
|
|
336
|
+
const whole = value.match(/^\{([^}]+)\}$/);
|
|
337
|
+
if (whole) {
|
|
338
|
+
const v = this.state.variables[whole[1].trim()];
|
|
339
|
+
return v !== undefined ? v : value;
|
|
340
|
+
}
|
|
341
|
+
return value.replace(/\{([^}]+)\}/g, (_m, k) => {
|
|
342
|
+
const v = this.state.variables[String(k).trim()];
|
|
343
|
+
return v === undefined || v === null ? '' : String(v);
|
|
344
|
+
});
|
|
345
|
+
}
|
|
346
|
+
executeLoop(node) {
|
|
347
|
+
const ref = str(node.config?.collection);
|
|
348
|
+
const iterVar = str(node.config?.iteratorVariable);
|
|
349
|
+
let note = 'Loop simulated as a single pass (body re-execution is not modelled).';
|
|
350
|
+
if (ref) {
|
|
351
|
+
const resolved = this.resolveRef(ref);
|
|
352
|
+
if (Array.isArray(resolved)) {
|
|
353
|
+
note = `Collection "${ref}" has ${resolved.length} item(s); simulated as a single pass.`;
|
|
354
|
+
if (iterVar && resolved.length)
|
|
355
|
+
this.state.variables[iterVar] = resolved[0];
|
|
356
|
+
}
|
|
357
|
+
else if (resolved !== undefined) {
|
|
358
|
+
note = `Collection "${ref}" is not an array; loop may not run at runtime.`;
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
return this.record(node.id, 'loop', node.label, 'ok', { note });
|
|
362
|
+
}
|
|
363
|
+
// ---- helpers ------------------------------------------------------------
|
|
364
|
+
/** Resolve a `{var}` template ref or a plain variable name from `variables`. */
|
|
365
|
+
resolveRef(ref) {
|
|
366
|
+
const m = ref.match(/^\{(.+)\}$/);
|
|
367
|
+
const key = (m ? m[1] : ref).trim();
|
|
368
|
+
return this.state.variables[key];
|
|
369
|
+
}
|
|
370
|
+
/** Apply a node's mock output to the simulation variables; returns what it wrote. */
|
|
371
|
+
applyMock(node) {
|
|
372
|
+
const cfg = node.config ?? {};
|
|
373
|
+
const mock = this.mocks[node.id];
|
|
374
|
+
const wrote = {};
|
|
375
|
+
const single = str(cfg.outputVariable);
|
|
376
|
+
if (single) {
|
|
377
|
+
wrote[single] = mock !== undefined ? mock : {};
|
|
378
|
+
this.state.variables[single] = wrote[single];
|
|
379
|
+
}
|
|
380
|
+
const list = Array.isArray(cfg.outputVariables) ? cfg.outputVariables : [];
|
|
381
|
+
if (list.length) {
|
|
382
|
+
const m = mock && typeof mock === 'object' ? mock : {};
|
|
383
|
+
for (const name of list) {
|
|
384
|
+
if (typeof name !== 'string')
|
|
385
|
+
continue;
|
|
386
|
+
wrote[name] = name in m ? m[name] : undefined;
|
|
387
|
+
this.state.variables[name] = wrote[name];
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
return Object.keys(wrote).length ? wrote : undefined;
|
|
391
|
+
}
|
|
392
|
+
mockNote(node) {
|
|
393
|
+
if (node.type === 'script') {
|
|
394
|
+
const action = str(node.config?.actionType);
|
|
395
|
+
if (action && action !== 'code') {
|
|
396
|
+
const recips = Array.isArray(node.config?.recipients) ? node.config.recipients.length : 0;
|
|
397
|
+
return `Mocked ${action} notification${recips ? ` to ${recips} recipient(s)` : ''}.`;
|
|
398
|
+
}
|
|
399
|
+
return 'Mocked code script (no real code executed).';
|
|
400
|
+
}
|
|
401
|
+
return `Mocked ${node.type.replace(/_/g, ' ')} (no backend call).`;
|
|
402
|
+
}
|
|
403
|
+
/** Enqueue every outgoing target (linear nodes have one; parallel fans out). */
|
|
404
|
+
enqueueSuccessors(node) {
|
|
405
|
+
this.edges.forEach((e, i) => {
|
|
406
|
+
if (e.source === node.id)
|
|
407
|
+
this.traverse(e, i);
|
|
408
|
+
});
|
|
409
|
+
}
|
|
410
|
+
traverse(e, i) {
|
|
411
|
+
const id = edgeId(e, i);
|
|
412
|
+
if (!this.state.traversedEdgeIds.includes(id))
|
|
413
|
+
this.state.traversedEdgeIds.push(id);
|
|
414
|
+
if (this.nodes.has(e.target))
|
|
415
|
+
this.state.frontier.push(e.target);
|
|
416
|
+
}
|
|
417
|
+
record(nodeId, type, label, status, extra = {}) {
|
|
418
|
+
const step = { seq: this.seq++, nodeId, type, label: label || nodeId, status, ...extra };
|
|
419
|
+
this.state.steps.push(step);
|
|
420
|
+
if (status === 'error' && this.state.status !== 'paused') {
|
|
421
|
+
this.state.status = 'error';
|
|
422
|
+
this.state.error = extra.error;
|
|
423
|
+
}
|
|
424
|
+
return step;
|
|
425
|
+
}
|
|
426
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export interface DatasetDimensionInfo {
|
|
2
|
+
/** Dimension name (snake_case, referenced by `report.rows`). */
|
|
3
|
+
name: string;
|
|
4
|
+
/** Raw field type id when declared (e.g. 'text', 'date'). */
|
|
5
|
+
type?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface DatasetMeasureInfo {
|
|
8
|
+
/** Measure name (snake_case, referenced by `report.values`). */
|
|
9
|
+
name: string;
|
|
10
|
+
/** Aggregate function (sum / avg / count / …) — display hint only. */
|
|
11
|
+
aggregate?: string;
|
|
12
|
+
/** Whether the dataset author certified this measure. */
|
|
13
|
+
certified?: boolean;
|
|
14
|
+
}
|
|
15
|
+
export interface DatasetCatalogEntry {
|
|
16
|
+
/** Dataset unique name (what `report.dataset` stores). */
|
|
17
|
+
name: string;
|
|
18
|
+
/** Human label (falls back to the name). */
|
|
19
|
+
label: string;
|
|
20
|
+
dimensions: DatasetDimensionInfo[];
|
|
21
|
+
measures: DatasetMeasureInfo[];
|
|
22
|
+
}
|
|
23
|
+
export interface UseDatasetCatalogResult {
|
|
24
|
+
datasets: DatasetCatalogEntry[];
|
|
25
|
+
loading: boolean;
|
|
26
|
+
error: string | null;
|
|
27
|
+
}
|
|
28
|
+
/** Normalize a raw dataset document into a catalog entry. */
|
|
29
|
+
export declare function toCatalogEntry(doc: Record<string, unknown>): DatasetCatalogEntry | null;
|
|
30
|
+
export declare function useDatasetCatalog(
|
|
31
|
+
/**
|
|
32
|
+
* Pre-resolved catalog. When supplied the hook skips the network fetch
|
|
33
|
+
* entirely and returns this list verbatim.
|
|
34
|
+
*/
|
|
35
|
+
override?: DatasetCatalogEntry[]): UseDatasetCatalogResult;
|
|
36
|
+
export interface UseDatasetSemanticsResult {
|
|
37
|
+
dimensions: DatasetDimensionInfo[];
|
|
38
|
+
measures: DatasetMeasureInfo[];
|
|
39
|
+
loading: boolean;
|
|
40
|
+
error: string | null;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Resolve the bound dataset's dimensions/measures from the catalog, lazily
|
|
44
|
+
* hydrating via `client.get('dataset', name)` when the list endpoint returned
|
|
45
|
+
* a summary without them (some servers list names only).
|
|
46
|
+
*/
|
|
47
|
+
export declare function useDatasetSemantics(name: string | undefined, catalog: UseDatasetCatalogResult): UseDatasetSemanticsResult;
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
// Copyright (c) 2026 ObjectStack. Licensed under the Apache-2.0 license.
|
|
2
|
+
/**
|
|
3
|
+
* useDatasetCatalog — loads the analytics dataset catalog for the Report
|
|
4
|
+
* inspector's dataset binding controls (ADR-0021 single-form).
|
|
5
|
+
*
|
|
6
|
+
* A 9.0 report binds a semantic-layer `dataset` and selects its `values`
|
|
7
|
+
* (measure names) grouped by `rows` (dimension names) — so the editor needs
|
|
8
|
+
* (a) the list of datasets to bind, and (b) the bound dataset's
|
|
9
|
+
* dimensions/measures to offer as picker options.
|
|
10
|
+
*
|
|
11
|
+
* Mirrors {@link useObjectFields}: defensive (a 404 or transport error
|
|
12
|
+
* resolves to an empty catalog with `error` set, the inspector falls back to
|
|
13
|
+
* manual entry) and override-friendly (hosts that already hold the catalog
|
|
14
|
+
* pass it to keep the inspector network-free, e.g. tests and the runtime
|
|
15
|
+
* config panel).
|
|
16
|
+
*/
|
|
17
|
+
import * as React from 'react';
|
|
18
|
+
import { useMetadataClient } from '../useMetadata';
|
|
19
|
+
function resolveLabel(label, fallback) {
|
|
20
|
+
if (typeof label === 'string' && label)
|
|
21
|
+
return label;
|
|
22
|
+
if (label && typeof label === 'object') {
|
|
23
|
+
const def = label.default;
|
|
24
|
+
if (typeof def === 'string' && def)
|
|
25
|
+
return def;
|
|
26
|
+
}
|
|
27
|
+
return fallback;
|
|
28
|
+
}
|
|
29
|
+
/** Normalize a raw dataset document into a catalog entry. */
|
|
30
|
+
export function toCatalogEntry(doc) {
|
|
31
|
+
const name = typeof doc.name === 'string' ? doc.name : '';
|
|
32
|
+
if (!name)
|
|
33
|
+
return null;
|
|
34
|
+
const dimensions = Array.isArray(doc.dimensions)
|
|
35
|
+
? doc.dimensions
|
|
36
|
+
.filter((d) => d && typeof d.name === 'string' && d.name)
|
|
37
|
+
.map((d) => ({
|
|
38
|
+
name: d.name,
|
|
39
|
+
type: typeof d.type === 'string' ? d.type : undefined,
|
|
40
|
+
}))
|
|
41
|
+
: [];
|
|
42
|
+
const measures = Array.isArray(doc.measures)
|
|
43
|
+
? doc.measures
|
|
44
|
+
.filter((m) => m && typeof m.name === 'string' && m.name)
|
|
45
|
+
.map((m) => ({
|
|
46
|
+
name: m.name,
|
|
47
|
+
aggregate: typeof m.aggregate === 'string' ? m.aggregate : undefined,
|
|
48
|
+
certified: m.certified === true,
|
|
49
|
+
}))
|
|
50
|
+
: [];
|
|
51
|
+
return { name, label: resolveLabel(doc.label, name), dimensions, measures };
|
|
52
|
+
}
|
|
53
|
+
export function useDatasetCatalog(
|
|
54
|
+
/**
|
|
55
|
+
* Pre-resolved catalog. When supplied the hook skips the network fetch
|
|
56
|
+
* entirely and returns this list verbatim.
|
|
57
|
+
*/
|
|
58
|
+
override) {
|
|
59
|
+
const client = useMetadataClient();
|
|
60
|
+
const [state, setState] = React.useState({
|
|
61
|
+
datasets: override ?? [],
|
|
62
|
+
loading: !override,
|
|
63
|
+
error: null,
|
|
64
|
+
});
|
|
65
|
+
React.useEffect(() => {
|
|
66
|
+
if (override) {
|
|
67
|
+
setState({ datasets: override, loading: false, error: null });
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
let cancelled = false;
|
|
71
|
+
setState((s) => ({ ...s, loading: true, error: null }));
|
|
72
|
+
client
|
|
73
|
+
.list('dataset')
|
|
74
|
+
.then((docs) => {
|
|
75
|
+
if (cancelled)
|
|
76
|
+
return;
|
|
77
|
+
const datasets = (Array.isArray(docs) ? docs : [])
|
|
78
|
+
.map(toCatalogEntry)
|
|
79
|
+
.filter((e) => e !== null);
|
|
80
|
+
setState({ datasets, loading: false, error: null });
|
|
81
|
+
})
|
|
82
|
+
.catch((err) => {
|
|
83
|
+
if (cancelled)
|
|
84
|
+
return;
|
|
85
|
+
setState({ datasets: [], loading: false, error: err?.message ?? String(err) });
|
|
86
|
+
});
|
|
87
|
+
return () => {
|
|
88
|
+
cancelled = true;
|
|
89
|
+
};
|
|
90
|
+
}, [client, override]);
|
|
91
|
+
return state;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Resolve the bound dataset's dimensions/measures from the catalog, lazily
|
|
95
|
+
* hydrating via `client.get('dataset', name)` when the list endpoint returned
|
|
96
|
+
* a summary without them (some servers list names only).
|
|
97
|
+
*/
|
|
98
|
+
export function useDatasetSemantics(name, catalog) {
|
|
99
|
+
const client = useMetadataClient();
|
|
100
|
+
const entry = name ? catalog.datasets.find((d) => d.name === name) : undefined;
|
|
101
|
+
const needsFetch = !!name && !catalog.loading &&
|
|
102
|
+
(!entry || (entry.dimensions.length === 0 && entry.measures.length === 0));
|
|
103
|
+
const [fetched, setFetched] = React.useState(null);
|
|
104
|
+
React.useEffect(() => {
|
|
105
|
+
if (!needsFetch || !name)
|
|
106
|
+
return;
|
|
107
|
+
if (fetched?.name === name)
|
|
108
|
+
return;
|
|
109
|
+
let cancelled = false;
|
|
110
|
+
client
|
|
111
|
+
.get('dataset', name)
|
|
112
|
+
.then((doc) => {
|
|
113
|
+
if (cancelled)
|
|
114
|
+
return;
|
|
115
|
+
setFetched({ name, entry: doc ? toCatalogEntry(doc) : null, error: doc ? null : 'Dataset not found' });
|
|
116
|
+
})
|
|
117
|
+
.catch((err) => {
|
|
118
|
+
if (cancelled)
|
|
119
|
+
return;
|
|
120
|
+
setFetched({ name, entry: null, error: err?.message ?? String(err) });
|
|
121
|
+
});
|
|
122
|
+
return () => {
|
|
123
|
+
cancelled = true;
|
|
124
|
+
};
|
|
125
|
+
}, [client, name, needsFetch, fetched]);
|
|
126
|
+
const resolved = needsFetch && fetched?.name === name ? fetched.entry : entry;
|
|
127
|
+
return {
|
|
128
|
+
dimensions: resolved?.dimensions ?? [],
|
|
129
|
+
measures: resolved?.measures ?? [],
|
|
130
|
+
loading: catalog.loading || (needsFetch && fetched?.name !== name),
|
|
131
|
+
error: (needsFetch && fetched?.name === name ? fetched.error : null) ?? catalog.error,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { type PaletteItem } from './flow-canvas-parts';
|
|
2
|
+
/** Minimal shape of an engine action descriptor we consume. */
|
|
3
|
+
interface ActionDescriptorLite {
|
|
4
|
+
type: string;
|
|
5
|
+
name?: string;
|
|
6
|
+
description?: string;
|
|
7
|
+
paradigms?: string[];
|
|
8
|
+
deprecated?: boolean;
|
|
9
|
+
/**
|
|
10
|
+
* JSON Schema for the node's `config` (ADR-0018 §configSchema). Present only
|
|
11
|
+
* for actions whose executor publishes one (e.g. the ADR-0019 approval node).
|
|
12
|
+
* Drives the inspector's server-rendered property form.
|
|
13
|
+
*/
|
|
14
|
+
configSchema?: unknown;
|
|
15
|
+
}
|
|
16
|
+
/** Server API base — shared by the palette fetch and the runs panel. */
|
|
17
|
+
export declare function apiBase(): string;
|
|
18
|
+
/**
|
|
19
|
+
* Merge engine descriptors onto the hardcoded base. Base order is canonical;
|
|
20
|
+
* a descriptor overlays its base entry's label/hint (so the engine is the
|
|
21
|
+
* source of truth for naming), and engine-only types are appended.
|
|
22
|
+
*/
|
|
23
|
+
export declare function mergePalette(base: PaletteItem[], descriptors: ActionDescriptorLite[]): PaletteItem[];
|
|
24
|
+
/**
|
|
25
|
+
* Fetch the running engine's published action descriptors from
|
|
26
|
+
* `GET /api/v1/automation/actions`. Returns `[]` while loading or on any error
|
|
27
|
+
* (offline / plugin absent / older backend), so consumers fall back to their
|
|
28
|
+
* hardcoded defaults. Shared by both the palette and the inspector's
|
|
29
|
+
* server-driven config form.
|
|
30
|
+
*/
|
|
31
|
+
export declare function useActionDescriptors(): ActionDescriptorLite[];
|
|
32
|
+
/**
|
|
33
|
+
* Returns the node palette merged with the running engine's published
|
|
34
|
+
* descriptors. Falls back to {@link NODE_PALETTE} while loading or on any
|
|
35
|
+
* error, so the designer always has a usable palette.
|
|
36
|
+
*/
|
|
37
|
+
export declare function useFlowNodePalette(): PaletteItem[];
|
|
38
|
+
/**
|
|
39
|
+
* Map of node `type` → published config JSON Schema, for the actions whose
|
|
40
|
+
* executor publishes one. Empty while loading / offline, so the inspector
|
|
41
|
+
* falls back to its hardcoded field group for every type.
|
|
42
|
+
*/
|
|
43
|
+
export declare function useActionConfigSchemas(): Record<string, unknown>;
|
|
44
|
+
export {};
|