@jini-ai/admin 0.3.10 → 0.4.1
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 +64 -0
- package/README.md +71 -37
- package/dist/agent-plugins/adapters/http.d.ts +7 -0
- package/dist/agent-plugins/adapters/http.js +15 -0
- package/dist/agent-plugins/adapters/memory.d.ts +8 -0
- package/dist/agent-plugins/adapters/memory.js +25 -0
- package/dist/agent-plugins/agent-plugins.module.d.ts +51 -0
- package/dist/agent-plugins/agent-plugins.module.js +6 -0
- package/dist/agent-plugins/conformance/agent-plugins-api.conformance.d.ts +12 -0
- package/dist/agent-plugins/conformance/agent-plugins-api.conformance.js +47 -0
- package/dist/agent-plugins/controllers/agent-plugin-files.controller.d.ts +20 -0
- package/dist/agent-plugins/controllers/agent-plugin-files.controller.js +43 -0
- package/dist/agent-plugins/controllers/agent-plugins.controller.d.ts +25 -0
- package/dist/agent-plugins/controllers/agent-plugins.controller.js +91 -0
- package/dist/agent-plugins/index.d.ts +9 -0
- package/dist/agent-plugins/index.js +9 -0
- package/dist/agent-plugins/messages.en.d.ts +23 -0
- package/dist/agent-plugins/messages.en.js +14 -0
- package/dist/agent-plugins/models.d.ts +57 -0
- package/dist/agent-plugins/models.js +2 -0
- package/dist/agent-plugins/package-file-tree.d.ts +111 -0
- package/dist/agent-plugins/package-file-tree.js +188 -0
- package/dist/agent-plugins/ports.d.ts +18 -0
- package/dist/agent-plugins/ports.js +3 -0
- package/dist/agent-plugins/react/components/AgentPluginFileContent.d.ts +5 -0
- package/dist/agent-plugins/react/components/AgentPluginFileContent.js +9 -0
- package/dist/agent-plugins/react/components/AgentPluginFileTree.d.ts +9 -0
- package/dist/agent-plugins/react/components/AgentPluginFileTree.js +7 -0
- package/dist/agent-plugins/react/components/AgentPluginInspector.d.ts +3 -0
- package/dist/agent-plugins/react/components/AgentPluginInspector.js +11 -0
- package/dist/agent-plugins/react/components/AgentPluginListPanel.d.ts +6 -0
- package/dist/agent-plugins/react/components/AgentPluginListPanel.js +10 -0
- package/dist/agent-plugins/react/components/AgentPluginRow.d.ts +5 -0
- package/dist/agent-plugins/react/components/AgentPluginRow.js +8 -0
- package/dist/agent-plugins/react/hooks/AgentPluginInspector.hooks.d.ts +90 -0
- package/dist/agent-plugins/react/hooks/AgentPluginInspector.hooks.js +74 -0
- package/dist/agent-plugins/react/hooks/AgentPluginPanel.hooks.d.ts +67 -0
- package/dist/agent-plugins/react/hooks/AgentPluginPanel.hooks.js +50 -0
- package/dist/agent-plugins/react/hooks/AgentPluginRow.hooks.d.ts +55 -0
- package/dist/agent-plugins/react/hooks/AgentPluginRow.hooks.js +6 -0
- package/dist/agent-plugins/react/hooks/AgentPluginsPage.hooks.d.ts +64 -0
- package/dist/agent-plugins/react/hooks/AgentPluginsPage.hooks.js +39 -0
- package/dist/agent-plugins/react/hooks/AgentPluginsPorts.hooks.d.ts +7 -0
- package/dist/agent-plugins/react/hooks/AgentPluginsPorts.hooks.js +10 -0
- package/dist/agent-plugins/react/hooks/MarketplaceTab.hooks.d.ts +6 -0
- package/dist/agent-plugins/react/hooks/MarketplaceTab.hooks.js +3 -0
- package/dist/agent-plugins/react/index.d.ts +245 -0
- package/dist/agent-plugins/react/index.js +13 -0
- package/dist/agent-plugins/react/pages/AgentPluginsPage.d.ts +4 -0
- package/dist/agent-plugins/react/pages/AgentPluginsPage.js +12 -0
- package/dist/agent-plugins/react/tabs/DownloadedTab.d.ts +4 -0
- package/dist/agent-plugins/react/tabs/DownloadedTab.js +5 -0
- package/dist/agent-plugins/react/tabs/InstalledTab.d.ts +4 -0
- package/dist/agent-plugins/react/tabs/InstalledTab.js +5 -0
- package/dist/agent-plugins/react/tabs/MarketplaceTab.d.ts +4 -0
- package/dist/agent-plugins/react/tabs/MarketplaceTab.js +10 -0
- package/dist/agent-plugins/rules.d.ts +33 -0
- package/dist/agent-plugins/rules.js +51 -0
- package/dist/browser/index.d.ts +1 -0
- package/dist/browser/index.js +1 -0
- package/dist/browser/navigation.d.ts +19 -4
- package/dist/browser/navigation.js +8 -8
- package/dist/browser/shell-navigation.d.ts +12 -0
- package/dist/browser/shell-navigation.js +16 -0
- package/dist/contracts/credential-management.d.ts +8 -0
- package/dist/contracts/credential-management.js +3 -0
- package/dist/contracts/media-picker.d.ts +17 -0
- package/dist/contracts/media-picker.js +5 -0
- package/dist/contracts/playground-render-target.d.ts +18 -0
- package/dist/contracts/playground-render-target.js +3 -0
- package/dist/core/entities/rules.d.ts +138 -0
- package/dist/core/entities/rules.js +344 -0
- package/dist/core/gated/types.d.ts +8 -4
- package/dist/core/index.d.ts +4 -0
- package/dist/core/index.js +1 -0
- package/dist/core/manifest/rules.d.ts +24 -6
- package/dist/core/manifest/rules.js +12 -11
- package/dist/core/module/controller-store.d.ts +22 -0
- package/dist/core/module/controller-store.js +32 -0
- package/dist/core/module/create-admin.d.ts +41 -0
- package/dist/core/module/create-admin.js +187 -0
- package/dist/core/module/define-admin-module.d.ts +4 -0
- package/dist/core/module/define-admin-module.js +5 -0
- package/dist/core/module/index.d.ts +7 -0
- package/dist/core/module/index.js +4 -0
- package/dist/core/module/token.d.ts +19 -0
- package/dist/core/module/token.js +4 -0
- package/dist/core/module/types.d.ts +79 -0
- package/dist/core/module/types.js +2 -0
- package/dist/core/permissions/rules.d.ts +4 -1
- package/dist/core/permissions/rules.js +1 -1
- package/dist/core/ports/analytics.d.ts +1 -1
- package/dist/core/ports/auth.d.ts +2 -2
- package/dist/core/ports/comments.d.ts +9 -6
- package/dist/core/ports/database.d.ts +13 -10
- package/dist/core/ports/entities.d.ts +302 -0
- package/dist/core/ports/entities.js +47 -0
- package/dist/core/ports/forms.d.ts +19 -7
- package/dist/core/ports/identity.d.ts +42 -17
- package/dist/core/ports/index.d.ts +2 -0
- package/dist/core/ports/integrations.d.ts +9 -4
- package/dist/core/ports/media.d.ts +16 -7
- package/dist/core/ports/members.d.ts +7 -3
- package/dist/core/ports/menus.d.ts +46 -0
- package/dist/core/ports/menus.js +43 -0
- package/dist/core/ports/plugins.d.ts +3 -2
- package/dist/core/ports/recovery.d.ts +10 -6
- package/dist/core/ports/redirects.d.ts +17 -7
- package/dist/core/ports/seo.d.ts +12 -6
- package/dist/core/ports/shell.d.ts +41 -0
- package/dist/core/ports/shell.js +2 -0
- package/dist/core/ports/workspace.d.ts +3 -3
- package/dist/core/routing/rules.d.ts +17 -4
- package/dist/core/routing/rules.js +4 -4
- package/dist/core/transport/errors.d.ts +13 -4
- package/dist/core/transport/errors.js +4 -4
- package/dist/core/transport/http.d.ts +26 -16
- package/dist/core/transport/http.js +59 -21
- package/dist/core/transport/types.d.ts +26 -14
- package/dist/core/transport/types.js +9 -7
- package/dist/media/adapters/http.d.ts +27 -0
- package/dist/media/adapters/http.js +44 -0
- package/dist/media/adapters/memory.d.ts +11 -0
- package/dist/media/adapters/memory.js +139 -0
- package/dist/media/conformance/media-api.conformance.d.ts +7 -0
- package/dist/media/conformance/media-api.conformance.js +69 -0
- package/dist/media/controllers/edit-media.controller.d.ts +24 -0
- package/dist/media/controllers/edit-media.controller.js +69 -0
- package/dist/media/controllers/library.controller.d.ts +47 -0
- package/dist/media/controllers/library.controller.js +173 -0
- package/dist/media/controllers/providers.controller.d.ts +30 -0
- package/dist/media/controllers/providers.controller.js +76 -0
- package/dist/media/html-attributes.d.ts +82 -0
- package/dist/media/html-attributes.js +204 -0
- package/dist/media/index.d.ts +12 -0
- package/dist/media/index.js +9 -0
- package/dist/media/media.module.d.ts +83 -0
- package/dist/media/media.module.js +43 -0
- package/dist/media/messages.en.d.ts +24 -0
- package/dist/media/messages.en.js +24 -0
- package/dist/media/models.d.ts +72 -0
- package/dist/media/models.js +2 -0
- package/dist/media/ports.d.ts +75 -0
- package/dist/media/ports.js +7 -0
- package/dist/media/react/components/EditMediaPanel.d.ts +3 -0
- package/dist/media/react/components/EditMediaPanel.js +10 -0
- package/dist/media/react/components/MediaCard.d.ts +5 -0
- package/dist/media/react/components/MediaCard.js +17 -0
- package/dist/media/react/components/MediaDialog.d.ts +3 -0
- package/dist/media/react/components/MediaDialog.js +8 -0
- package/dist/media/react/components/MediaGrid.d.ts +4 -0
- package/dist/media/react/components/MediaGrid.js +8 -0
- package/dist/media/react/components/MediaIcons.d.ts +14 -0
- package/dist/media/react/components/MediaIcons.js +39 -0
- package/dist/media/react/components/MediaLightbox.d.ts +5 -0
- package/dist/media/react/components/MediaLightbox.js +12 -0
- package/dist/media/react/components/MediaPicker.d.ts +3 -0
- package/dist/media/react/components/MediaPicker.js +10 -0
- package/dist/media/react/components/MediaPurgeDialog.d.ts +4 -0
- package/dist/media/react/components/MediaPurgeDialog.js +9 -0
- package/dist/media/react/components/UploadButton.d.ts +3 -0
- package/dist/media/react/components/UploadButton.js +8 -0
- package/dist/media/react/hooks/EditMediaPanel.hooks.d.ts +84 -0
- package/dist/media/react/hooks/EditMediaPanel.hooks.js +105 -0
- package/dist/media/react/hooks/LibraryTab.hooks.d.ts +103 -0
- package/dist/media/react/hooks/LibraryTab.hooks.js +164 -0
- package/dist/media/react/hooks/MediaCard.hooks.d.ts +83 -0
- package/dist/media/react/hooks/MediaCard.hooks.js +66 -0
- package/dist/media/react/hooks/MediaDialog.hooks.d.ts +10 -0
- package/dist/media/react/hooks/MediaDialog.hooks.js +20 -0
- package/dist/media/react/hooks/MediaGrid.hooks.d.ts +29 -0
- package/dist/media/react/hooks/MediaGrid.hooks.js +6 -0
- package/dist/media/react/hooks/MediaLightbox.hooks.d.ts +27 -0
- package/dist/media/react/hooks/MediaLightbox.hooks.js +64 -0
- package/dist/media/react/hooks/MediaPage.hooks.d.ts +68 -0
- package/dist/media/react/hooks/MediaPage.hooks.js +68 -0
- package/dist/media/react/hooks/MediaPicker.hooks.d.ts +26 -0
- package/dist/media/react/hooks/MediaPicker.hooks.js +25 -0
- package/dist/media/react/hooks/MediaPorts.hooks.d.ts +9 -0
- package/dist/media/react/hooks/MediaPorts.hooks.js +10 -0
- package/dist/media/react/hooks/MediaPurgeDialog.hooks.d.ts +22 -0
- package/dist/media/react/hooks/MediaPurgeDialog.hooks.js +6 -0
- package/dist/media/react/hooks/ProvidersTab.hooks.d.ts +55 -0
- package/dist/media/react/hooks/ProvidersTab.hooks.js +124 -0
- package/dist/media/react/hooks/UploadButton.hooks.d.ts +48 -0
- package/dist/media/react/hooks/UploadButton.hooks.js +118 -0
- package/dist/media/react/index.d.ts +373 -0
- package/dist/media/react/index.js +73 -0
- package/dist/media/react/pages/MediaPage.d.ts +4 -0
- package/dist/media/react/pages/MediaPage.js +9 -0
- package/dist/media/react/tabs/LibraryTab.d.ts +4 -0
- package/dist/media/react/tabs/LibraryTab.js +14 -0
- package/dist/media/react/tabs/ProvidersTab.d.ts +4 -0
- package/dist/media/react/tabs/ProvidersTab.js +10 -0
- package/dist/media/rules.d.ts +86 -0
- package/dist/media/rules.js +134 -0
- package/dist/media/styles.d.ts +4 -0
- package/dist/media/styles.js +5 -0
- package/dist/playground/adapters/http.d.ts +8 -0
- package/dist/playground/adapters/http.js +4 -0
- package/dist/playground/adapters/memory.d.ts +10 -0
- package/dist/playground/adapters/memory.js +30 -0
- package/dist/playground/conformance/playground-api.conformance.d.ts +6 -0
- package/dist/playground/conformance/playground-api.conformance.js +37 -0
- package/dist/playground/controllers/playground.controller.d.ts +16 -0
- package/dist/playground/controllers/playground.controller.js +21 -0
- package/dist/playground/index.d.ts +7 -0
- package/dist/playground/index.js +5 -0
- package/dist/playground/messages.en.d.ts +9 -0
- package/dist/playground/messages.en.js +2 -0
- package/dist/playground/models.d.ts +4 -0
- package/dist/playground/models.js +2 -0
- package/dist/playground/playground.module.d.ts +31 -0
- package/dist/playground/playground.module.js +5 -0
- package/dist/playground/ports.d.ts +5 -0
- package/dist/playground/ports.js +2 -0
- package/dist/playground/react/components/Canvas.d.ts +3 -0
- package/dist/playground/react/components/Canvas.js +9 -0
- package/dist/playground/react/hooks/Canvas.hooks.d.ts +7 -0
- package/dist/playground/react/hooks/Canvas.hooks.js +18 -0
- package/dist/playground/react/hooks/PlaygroundPage.hooks.d.ts +8 -0
- package/dist/playground/react/hooks/PlaygroundPage.hooks.js +2 -0
- package/dist/playground/react/hooks/PlaygroundPorts.hooks.d.ts +4 -0
- package/dist/playground/react/hooks/PlaygroundPorts.hooks.js +6 -0
- package/dist/playground/react/index.d.ts +136 -0
- package/dist/playground/react/index.js +10 -0
- package/dist/playground/react/pages/PlaygroundPage.d.ts +4 -0
- package/dist/playground/react/pages/PlaygroundPage.js +11 -0
- package/dist/playground/react/tabs/CanvasTab.d.ts +4 -0
- package/dist/playground/react/tabs/CanvasTab.js +5 -0
- package/dist/playground/rules.d.ts +4 -0
- package/dist/playground/rules.js +2 -0
- package/dist/react/OverlayHost.d.ts +3 -0
- package/dist/react/OverlayHost.hooks.d.ts +9 -0
- package/dist/react/OverlayHost.hooks.js +9 -0
- package/dist/react/OverlayHost.js +7 -0
- package/dist/react/bind-react.d.ts +46 -0
- package/dist/react/bind-react.js +28 -0
- package/dist/react/components/ConfirmButton/ConfirmButton.hooks.d.ts +7 -1
- package/dist/react/components/ConfirmButton/ConfirmButton.hooks.js +2 -2
- package/dist/react/components/ConfirmButton/ConfirmButton.js +1 -1
- package/dist/react/components/ConfirmDialog/ConfirmDialog.hooks.d.ts +17 -3
- package/dist/react/components/ConfirmDialog/ConfirmDialog.hooks.js +3 -3
- package/dist/react/components/ConfirmDialog/ConfirmDialog.js +5 -5
- package/dist/react/components/InteractiveHtmlEditor/InteractiveHtmlEditor.d.ts +6 -2
- package/dist/react/components/InteractiveHtmlEditor/InteractiveHtmlEditor.js +7 -8
- package/dist/react/components/RowMenu/RowMenu.d.ts +5 -1
- package/dist/react/components/RowMenu/RowMenu.hooks.d.ts +8 -2
- package/dist/react/components/RowMenu/RowMenu.hooks.js +4 -4
- package/dist/react/components/RowMenu/RowMenu.js +6 -6
- package/dist/react/components/Sidebar.d.ts +1 -1
- package/dist/react/components/Sidebar.js +103 -7
- package/dist/react/entities/EntityCell.d.ts +10 -0
- package/dist/react/entities/EntityCell.js +18 -0
- package/dist/react/entities/EntityDetail.d.ts +3 -0
- package/dist/react/entities/EntityDetail.js +21 -0
- package/dist/react/entities/EntityEdit.d.ts +13 -0
- package/dist/react/entities/EntityEdit.js +45 -0
- package/dist/react/entities/EntityField.d.ts +20 -0
- package/dist/react/entities/EntityField.js +31 -0
- package/dist/react/entities/EntityIndex.d.ts +3 -0
- package/dist/react/entities/EntityIndex.js +10 -0
- package/dist/react/entities/EntityList.d.ts +7 -0
- package/dist/react/entities/EntityList.js +52 -0
- package/dist/react/entities/contribution.d.ts +26 -0
- package/dist/react/entities/contribution.js +78 -0
- package/dist/react/entities/index.d.ts +10 -0
- package/dist/react/entities/index.js +7 -0
- package/dist/react/entities/rules.d.ts +179 -0
- package/dist/react/entities/rules.js +224 -0
- package/dist/react/entities/types.d.ts +45 -0
- package/dist/react/entities/types.js +5 -0
- package/dist/react/entities/use-entity-edit.d.ts +35 -0
- package/dist/react/entities/use-entity-edit.js +98 -0
- package/dist/react/entities/use-entity-read.d.ts +22 -0
- package/dist/react/entities/use-entity-read.js +27 -0
- package/dist/react/hooks/use-nav-sections.d.ts +12 -3
- package/dist/react/hooks/use-nav-sections.js +14 -14
- package/dist/react/hooks/use-sidebar-rail.d.ts +7 -1
- package/dist/react/hooks/use-sidebar-rail.js +11 -11
- package/dist/react/index.d.ts +3 -1
- package/dist/react/index.js +5 -2
- package/dist/react/overlays.d.ts +38 -0
- package/dist/react/overlays.js +46 -0
- package/dist/react/shell/AdminShell.d.ts +9 -0
- package/dist/react/shell/AdminShell.hooks.d.ts +15 -0
- package/dist/react/shell/AdminShell.hooks.js +27 -0
- package/dist/react/shell/AdminShell.js +46 -0
- package/dist/react/shell/index.d.ts +7 -0
- package/dist/react/shell/index.js +5 -0
- package/dist/react/shell/model.d.ts +25 -0
- package/dist/react/shell/model.js +29 -0
- package/dist/react/shell/theme-ports.d.ts +28 -0
- package/dist/react/shell/theme-ports.js +2 -0
- package/dist/react/shell/types.d.ts +99 -0
- package/dist/react/shell/types.js +2 -0
- package/dist/react/shell/use-admin-shell-session.d.ts +13 -0
- package/dist/react/shell/use-admin-shell-session.js +81 -0
- package/dist/react/shell/use-admin-theme.d.ts +16 -0
- package/dist/react/shell/use-admin-theme.js +57 -0
- package/dist/react/types.d.ts +6 -4
- package/dist/react/types.js +2 -2
- package/dist/react/use-controller.d.ts +16 -0
- package/dist/react/use-controller.js +18 -0
- package/dist/security/adapters/http.d.ts +16 -0
- package/dist/security/adapters/http.js +94 -0
- package/dist/security/adapters/memory.d.ts +15 -0
- package/dist/security/adapters/memory.js +60 -0
- package/dist/security/conformance/security-api.conformance.d.ts +10 -0
- package/dist/security/conformance/security-api.conformance.js +48 -0
- package/dist/security/controllers/access-tokens.controller.d.ts +44 -0
- package/dist/security/controllers/access-tokens.controller.js +112 -0
- package/dist/security/controllers/other-credentials.controller.d.ts +30 -0
- package/dist/security/controllers/other-credentials.controller.js +74 -0
- package/dist/security/controllers/root-key.controller.d.ts +35 -0
- package/dist/security/controllers/root-key.controller.js +90 -0
- package/dist/security/index.d.ts +9 -0
- package/dist/security/index.js +9 -0
- package/dist/security/messages.en.d.ts +12 -0
- package/dist/security/messages.en.js +2 -0
- package/dist/security/models.d.ts +112 -0
- package/dist/security/models.js +2 -0
- package/dist/security/ports.d.ts +58 -0
- package/dist/security/ports.js +5 -0
- package/dist/security/react/components/CredentialEditor.d.ts +3 -0
- package/dist/security/react/components/CredentialEditor.js +8 -0
- package/dist/security/react/hooks/AccessTokensTab.hooks.d.ts +94 -0
- package/dist/security/react/hooks/AccessTokensTab.hooks.js +36 -0
- package/dist/security/react/hooks/CredentialEditor.hooks.d.ts +49 -0
- package/dist/security/react/hooks/CredentialEditor.hooks.js +14 -0
- package/dist/security/react/hooks/RootKeyTab.hooks.d.ts +29 -0
- package/dist/security/react/hooks/RootKeyTab.hooks.js +19 -0
- package/dist/security/react/hooks/SecurityPage.hooks.d.ts +17 -0
- package/dist/security/react/hooks/SecurityPage.hooks.js +12 -0
- package/dist/security/react/hooks/SecurityPorts.hooks.d.ts +9 -0
- package/dist/security/react/hooks/SecurityPorts.hooks.js +6 -0
- package/dist/security/react/index.d.ts +215 -0
- package/dist/security/react/index.js +10 -0
- package/dist/security/react/pages/SecurityPage.d.ts +4 -0
- package/dist/security/react/pages/SecurityPage.js +10 -0
- package/dist/security/react/tabs/AccessTokensTab.d.ts +4 -0
- package/dist/security/react/tabs/AccessTokensTab.js +10 -0
- package/dist/security/react/tabs/RootKeyTab.d.ts +4 -0
- package/dist/security/react/tabs/RootKeyTab.js +9 -0
- package/dist/security/rules.d.ts +57 -0
- package/dist/security/rules.js +63 -0
- package/dist/security/security.module.d.ts +45 -0
- package/dist/security/security.module.js +5 -0
- package/dist/source-control/adapters/http.d.ts +6 -0
- package/dist/source-control/adapters/http.js +13 -0
- package/dist/source-control/adapters/memory.d.ts +9 -0
- package/dist/source-control/adapters/memory.js +35 -0
- package/dist/source-control/conformance/source-control-api.conformance.d.ts +10 -0
- package/dist/source-control/conformance/source-control-api.conformance.js +48 -0
- package/dist/source-control/controllers/source-control.controller.d.ts +26 -0
- package/dist/source-control/controllers/source-control.controller.js +70 -0
- package/dist/source-control/index.d.ts +8 -0
- package/dist/source-control/index.js +6 -0
- package/dist/source-control/messages.en.d.ts +11 -0
- package/dist/source-control/messages.en.js +2 -0
- package/dist/source-control/models.d.ts +70 -0
- package/dist/source-control/models.js +2 -0
- package/dist/source-control/ports.d.ts +23 -0
- package/dist/source-control/ports.js +3 -0
- package/dist/source-control/react/components/SourceControlCredentialFields.d.ts +5 -0
- package/dist/source-control/react/components/SourceControlCredentialFields.js +8 -0
- package/dist/source-control/react/components/SourceControlProviderRow.d.ts +5 -0
- package/dist/source-control/react/components/SourceControlProviderRow.js +7 -0
- package/dist/source-control/react/hooks/ProvidersTab.hooks.d.ts +45 -0
- package/dist/source-control/react/hooks/ProvidersTab.hooks.js +20 -0
- package/dist/source-control/react/hooks/SourceControlCredentialFields.hooks.d.ts +43 -0
- package/dist/source-control/react/hooks/SourceControlCredentialFields.hooks.js +9 -0
- package/dist/source-control/react/hooks/SourceControlPage.hooks.d.ts +17 -0
- package/dist/source-control/react/hooks/SourceControlPage.hooks.js +5 -0
- package/dist/source-control/react/hooks/SourceControlPorts.hooks.d.ts +9 -0
- package/dist/source-control/react/hooks/SourceControlPorts.hooks.js +6 -0
- package/dist/source-control/react/index.d.ts +156 -0
- package/dist/source-control/react/index.js +10 -0
- package/dist/source-control/react/pages/SourceControlPage.d.ts +4 -0
- package/dist/source-control/react/pages/SourceControlPage.js +11 -0
- package/dist/source-control/react/tabs/ProvidersTab.d.ts +4 -0
- package/dist/source-control/react/tabs/ProvidersTab.js +10 -0
- package/dist/source-control/rules.d.ts +32 -0
- package/dist/source-control/rules.js +35 -0
- package/dist/source-control/source-control.module.d.ts +36 -0
- package/dist/source-control/source-control.module.js +6 -0
- package/package.json +207 -4
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { CATEGORIES } from '../../rules.js';
|
|
2
|
+
export function useCredentialEditor({ controller, draft, saving }, _optional = {}) {
|
|
3
|
+
const provider = controller?.getSnapshot().providers.find(p => p.kind === draft.kind && p.id === draft.providerId);
|
|
4
|
+
const fields = (provider?.fields ?? []).filter(f => f.name !== provider?.tokenField).map(field => ({ ...field, value: draft.values[field.name] ?? '', onValueChange({ value }) { controller?.setDraft({ patch: { values: { ...draft.values, [field.name]: value } } }); } }));
|
|
5
|
+
return { categories: CATEGORIES.slice(1), fields, tokenLabel: provider?.fields.find(f => f.name === provider.tokenField)?.label ?? 'Access token', title: draft.id ? 'Edit credential' : 'Add credential', saving,
|
|
6
|
+
onLabel({ value }) { controller?.setDraft({ patch: { label: value } }); },
|
|
7
|
+
onToken({ value }) { controller?.setDraft({ patch: { token: value } }); },
|
|
8
|
+
onUrl({ value }) { controller?.setDraft({ patch: { baseUrl: value } }); },
|
|
9
|
+
onUsername({ value }) { controller?.setDraft({ patch: { username: value } }); },
|
|
10
|
+
onHosts({ value }) { controller?.setDraft({ patch: { additionalHosts: value } }); },
|
|
11
|
+
onCategory({ value }) { controller?.setDraft({ patch: { category: value } }); },
|
|
12
|
+
save() { void controller?.save({}); }, cancel() { controller?.cancel({}); }, };
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=CredentialEditor.hooks.js.map
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { TabViewProps } from '../../../react/bind-react.js';
|
|
2
|
+
export declare function useRootKeyTab({ permissions, params }: TabViewProps, _optional?: {}): {
|
|
3
|
+
denied: boolean;
|
|
4
|
+
loading: boolean;
|
|
5
|
+
saving: boolean;
|
|
6
|
+
status: import("../../models.js").RootKeyStatus | null | undefined;
|
|
7
|
+
error: string | null | undefined;
|
|
8
|
+
result: string | null | undefined;
|
|
9
|
+
scopeNotice: string;
|
|
10
|
+
token: string;
|
|
11
|
+
confirm: string;
|
|
12
|
+
confirming: boolean;
|
|
13
|
+
preview: import("../../models.js").RootKeyPreview | null | undefined;
|
|
14
|
+
locked: boolean;
|
|
15
|
+
canGenerate: boolean;
|
|
16
|
+
canConfirm: boolean;
|
|
17
|
+
onToken({ value }: {
|
|
18
|
+
value: string;
|
|
19
|
+
}): void;
|
|
20
|
+
onConfirmText({ value }: {
|
|
21
|
+
value: string;
|
|
22
|
+
}): void;
|
|
23
|
+
generate(): void;
|
|
24
|
+
unlock(): void;
|
|
25
|
+
previewFresh(): void;
|
|
26
|
+
cancelFresh(): void;
|
|
27
|
+
confirmFresh(): Promise<void>;
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=RootKeyTab.hooks.d.ts.map
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { useController } from '../../../react/use-controller.js';
|
|
2
|
+
import { createRootKeyController } from '../../controllers/root-key.controller.js';
|
|
3
|
+
import { ROOT_KEY_PERMISSION, START_FRESH_CONFIRMATION, isRootKeyLocked } from '../../rules.js';
|
|
4
|
+
import { useSecurityPorts } from './SecurityPorts.hooks.js';
|
|
5
|
+
const unavailable = { async status() { throw new Error('Unavailable'); }, async generate() { throw new Error('Unavailable'); }, async importToken() { throw new Error('Unavailable'); }, async previewStartFresh() { throw new Error('Unavailable'); }, async startFresh() { throw new Error('Unavailable'); } };
|
|
6
|
+
export function useRootKeyTab({ permissions = [], params }, _optional = {}) {
|
|
7
|
+
const { rootKey } = useSecurityPorts({});
|
|
8
|
+
const key = permissions.join('\0');
|
|
9
|
+
const { controller, snapshot: s } = useController({ create: () => createRootKeyController({ api: rootKey ?? unavailable, permissions }), dependencies: [rootKey, key] }, { start: ({ controller }) => { void controller.load({}); } });
|
|
10
|
+
return { denied: !rootKey || !permissions.includes(ROOT_KEY_PERMISSION), loading: s?.loading ?? true, saving: s?.saving ?? false, status: s?.status, error: s?.error, result: s?.result,
|
|
11
|
+
scopeNotice: typeof params.scopeNotice === 'string' ? params.scopeNotice : 'This key protects saved credentials. Keep its backup separate from the database.',
|
|
12
|
+
token: s?.token ?? '', confirm: s?.confirm ?? '', confirming: s?.confirming ?? false, preview: s?.preview,
|
|
13
|
+
locked: isRootKeyLocked({ status: s?.status ?? null }), canGenerate: s?.status?.state === 'missing' && !s.status.active, canConfirm: !!s?.preview && s.confirm === START_FRESH_CONFIRMATION,
|
|
14
|
+
onToken({ value }) { controller?.setToken({ value }); }, onConfirmText({ value }) { controller?.setConfirm({ value }); },
|
|
15
|
+
generate() { void controller?.generate({}); }, unlock() { void controller?.importToken({}); }, previewFresh() { void controller?.preview({}); },
|
|
16
|
+
cancelFresh() { controller?.cancel({}); }, async confirmFresh() { if (!await controller?.startFresh({}))
|
|
17
|
+
throw new Error('Recovery was not completed'); }, };
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=RootKeyTab.hooks.js.map
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ModulePageProps } from '../../../react/bind-react.js';
|
|
2
|
+
export declare function useSecurityPage(props: ModulePageProps, _optional?: {}): {
|
|
3
|
+
denied: boolean;
|
|
4
|
+
active: string;
|
|
5
|
+
ActiveTab: import("react").LazyExoticComponent<import("react").ComponentType<import("../../../react/bind-react.js").TabViewProps>> | undefined;
|
|
6
|
+
params: Readonly<Record<string, unknown>>;
|
|
7
|
+
permissions: readonly string[];
|
|
8
|
+
items: {
|
|
9
|
+
id: string;
|
|
10
|
+
label: string;
|
|
11
|
+
content: null;
|
|
12
|
+
}[];
|
|
13
|
+
onValueChange({ value }: {
|
|
14
|
+
value: string;
|
|
15
|
+
}): void;
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=SecurityPage.hooks.d.ts.map
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { useState } from 'react';
|
|
2
|
+
export function useSecurityPage(props, _optional = {}) {
|
|
3
|
+
const [local, setLocal] = useState('access-tokens');
|
|
4
|
+
const visible = props.description.visible ? props.description.tabs.filter(t => t.visible) : [];
|
|
5
|
+
const active = visible.find(t => t.id.endsWith(`.${props.requestedTab ?? local}`)) ?? visible[0];
|
|
6
|
+
const id = active?.id.split('.').at(-1);
|
|
7
|
+
return { denied: !props.description.visible, active: id ?? '', ActiveTab: id ? props.tabs[id] : undefined, params: active?.params ?? {}, permissions: props.description.grants,
|
|
8
|
+
items: visible.map(t => ({ id: t.id.split('.').at(-1), label: t.label, content: null })),
|
|
9
|
+
onValueChange({ value }) { setLocal(value); props.onTabChange?.({ tab: value }); },
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=SecurityPage.hooks.js.map
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { SecurityApiPort, OtherCredentialsPort, RootKeyPort } from '../../ports.js';
|
|
2
|
+
export interface SecurityPorts {
|
|
3
|
+
readonly securityApi: SecurityApiPort;
|
|
4
|
+
readonly otherCredentials?: OtherCredentialsPort;
|
|
5
|
+
readonly rootKey?: RootKeyPort;
|
|
6
|
+
}
|
|
7
|
+
export declare const SecurityPortsContext: import("react").Context<SecurityPorts | null>;
|
|
8
|
+
export declare function useSecurityPorts(_required?: Record<string, never>, _optional?: {}): SecurityPorts;
|
|
9
|
+
//# sourceMappingURL=SecurityPorts.hooks.d.ts.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { createContext, useContext } from 'react';
|
|
2
|
+
import { AdminConfigError } from '../../../core/module/index.js';
|
|
3
|
+
export const SecurityPortsContext = createContext(null);
|
|
4
|
+
export function useSecurityPorts(_required = {}, _optional = {}) { const ports = useContext(SecurityPortsContext); if (!ports)
|
|
5
|
+
throw new AdminConfigError({ issues: ['React scope unavailable: security'] }); return ports; }
|
|
6
|
+
//# sourceMappingURL=SecurityPorts.hooks.js.map
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
export { useSecurityPorts } from './hooks/SecurityPorts.hooks.js';
|
|
2
|
+
export declare function security(_required: Record<string, never>, { rootKeyScopeNotice }?: {
|
|
3
|
+
rootKeyScopeNotice?: string;
|
|
4
|
+
}): {
|
|
5
|
+
pages: {
|
|
6
|
+
secrets: {
|
|
7
|
+
tabs: {
|
|
8
|
+
'root-key': {
|
|
9
|
+
params: {
|
|
10
|
+
scopeNotice: string;
|
|
11
|
+
} | {
|
|
12
|
+
scopeNotice?: never;
|
|
13
|
+
};
|
|
14
|
+
label: "Root key";
|
|
15
|
+
permissions: readonly ["admin.security.tokens.manage"];
|
|
16
|
+
optional: {
|
|
17
|
+
readonly rootKey: import("../../core/module/token.js").AdminPortToken<import("../ports.js").RootKeyPort, "admin.security.root-key">;
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
'access-tokens': {
|
|
21
|
+
readonly label: "Access tokens";
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
path: "/secrets";
|
|
25
|
+
label: "Secrets";
|
|
26
|
+
permissions: readonly ["security.read"];
|
|
27
|
+
nav: {
|
|
28
|
+
readonly group: "system";
|
|
29
|
+
readonly icon: "key";
|
|
30
|
+
};
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
id: "security";
|
|
34
|
+
requires: {
|
|
35
|
+
readonly securityApi: import("../../core/module/token.js").AdminPortToken<import("../ports.js").SecurityApiPort, "admin.security.api">;
|
|
36
|
+
};
|
|
37
|
+
optional: {
|
|
38
|
+
readonly otherCredentials: import("../../core/module/token.js").AdminPortToken<import("../ports.js").OtherCredentialsPort, "admin.security.other">;
|
|
39
|
+
readonly rootKey: import("../../core/module/token.js").AdminPortToken<import("../ports.js").RootKeyPort, "admin.security.root-key">;
|
|
40
|
+
};
|
|
41
|
+
messages: {
|
|
42
|
+
readonly security: "Secrets";
|
|
43
|
+
readonly accessTokens: "Access tokens";
|
|
44
|
+
readonly rootKey: "Root key";
|
|
45
|
+
readonly denied: "Permission denied";
|
|
46
|
+
readonly loading: "Loading credentials…";
|
|
47
|
+
readonly remove: "Remove credential";
|
|
48
|
+
readonly replace: "Replace";
|
|
49
|
+
readonly save: "Save";
|
|
50
|
+
readonly cancel: "Cancel";
|
|
51
|
+
};
|
|
52
|
+
} & {
|
|
53
|
+
react: {
|
|
54
|
+
module: {
|
|
55
|
+
pages: {
|
|
56
|
+
secrets: {
|
|
57
|
+
tabs: {
|
|
58
|
+
'root-key': {
|
|
59
|
+
params: {
|
|
60
|
+
scopeNotice: string;
|
|
61
|
+
} | {
|
|
62
|
+
scopeNotice?: never;
|
|
63
|
+
};
|
|
64
|
+
label: "Root key";
|
|
65
|
+
permissions: readonly ["admin.security.tokens.manage"];
|
|
66
|
+
optional: {
|
|
67
|
+
readonly rootKey: import("../../core/module/token.js").AdminPortToken<import("../ports.js").RootKeyPort, "admin.security.root-key">;
|
|
68
|
+
};
|
|
69
|
+
};
|
|
70
|
+
'access-tokens': {
|
|
71
|
+
readonly label: "Access tokens";
|
|
72
|
+
};
|
|
73
|
+
};
|
|
74
|
+
path: "/secrets";
|
|
75
|
+
label: "Secrets";
|
|
76
|
+
permissions: readonly ["security.read"];
|
|
77
|
+
nav: {
|
|
78
|
+
readonly group: "system";
|
|
79
|
+
readonly icon: "key";
|
|
80
|
+
};
|
|
81
|
+
};
|
|
82
|
+
};
|
|
83
|
+
id: "security";
|
|
84
|
+
requires: {
|
|
85
|
+
readonly securityApi: import("../../core/module/token.js").AdminPortToken<import("../ports.js").SecurityApiPort, "admin.security.api">;
|
|
86
|
+
};
|
|
87
|
+
optional: {
|
|
88
|
+
readonly otherCredentials: import("../../core/module/token.js").AdminPortToken<import("../ports.js").OtherCredentialsPort, "admin.security.other">;
|
|
89
|
+
readonly rootKey: import("../../core/module/token.js").AdminPortToken<import("../ports.js").RootKeyPort, "admin.security.root-key">;
|
|
90
|
+
};
|
|
91
|
+
messages: {
|
|
92
|
+
readonly security: "Secrets";
|
|
93
|
+
readonly accessTokens: "Access tokens";
|
|
94
|
+
readonly rootKey: "Root key";
|
|
95
|
+
readonly denied: "Permission denied";
|
|
96
|
+
readonly loading: "Loading credentials…";
|
|
97
|
+
readonly remove: "Remove credential";
|
|
98
|
+
readonly replace: "Replace";
|
|
99
|
+
readonly save: "Save";
|
|
100
|
+
readonly cancel: "Cancel";
|
|
101
|
+
};
|
|
102
|
+
};
|
|
103
|
+
pages: {
|
|
104
|
+
secrets: {
|
|
105
|
+
Page: import("react").LazyExoticComponent<import("react").ComponentType<import("../../react/bind-react.js").ModulePageProps>>;
|
|
106
|
+
tabs: {
|
|
107
|
+
'root-key': import("react").LazyExoticComponent<import("react").ComponentType<import("../../react/bind-react.js").TabViewProps>>;
|
|
108
|
+
'access-tokens': import("react").LazyExoticComponent<import("react").ComponentType<import("../../react/bind-react.js").TabViewProps>>;
|
|
109
|
+
};
|
|
110
|
+
};
|
|
111
|
+
};
|
|
112
|
+
Provider: ({ admin, children }: {
|
|
113
|
+
admin: import("../../core/module/types.js").AdminInstance;
|
|
114
|
+
children: import("react").ReactNode;
|
|
115
|
+
}, _optional?: Record<string, never>) => import("react").FunctionComponentElement<import("react").ProviderProps<import("../../core/module/types.js").ScopedPorts<{
|
|
116
|
+
pages: {
|
|
117
|
+
secrets: {
|
|
118
|
+
tabs: {
|
|
119
|
+
'root-key': {
|
|
120
|
+
params: {
|
|
121
|
+
scopeNotice: string;
|
|
122
|
+
} | {
|
|
123
|
+
scopeNotice?: never;
|
|
124
|
+
};
|
|
125
|
+
label: "Root key";
|
|
126
|
+
permissions: readonly ["admin.security.tokens.manage"];
|
|
127
|
+
optional: {
|
|
128
|
+
readonly rootKey: import("../../core/module/token.js").AdminPortToken<import("../ports.js").RootKeyPort, "admin.security.root-key">;
|
|
129
|
+
};
|
|
130
|
+
};
|
|
131
|
+
'access-tokens': {
|
|
132
|
+
readonly label: "Access tokens";
|
|
133
|
+
};
|
|
134
|
+
};
|
|
135
|
+
path: "/secrets";
|
|
136
|
+
label: "Secrets";
|
|
137
|
+
permissions: readonly ["security.read"];
|
|
138
|
+
nav: {
|
|
139
|
+
readonly group: "system";
|
|
140
|
+
readonly icon: "key";
|
|
141
|
+
};
|
|
142
|
+
};
|
|
143
|
+
};
|
|
144
|
+
id: "security";
|
|
145
|
+
requires: {
|
|
146
|
+
readonly securityApi: import("../../core/module/token.js").AdminPortToken<import("../ports.js").SecurityApiPort, "admin.security.api">;
|
|
147
|
+
};
|
|
148
|
+
optional: {
|
|
149
|
+
readonly otherCredentials: import("../../core/module/token.js").AdminPortToken<import("../ports.js").OtherCredentialsPort, "admin.security.other">;
|
|
150
|
+
readonly rootKey: import("../../core/module/token.js").AdminPortToken<import("../ports.js").RootKeyPort, "admin.security.root-key">;
|
|
151
|
+
};
|
|
152
|
+
messages: {
|
|
153
|
+
readonly security: "Secrets";
|
|
154
|
+
readonly accessTokens: "Access tokens";
|
|
155
|
+
readonly rootKey: "Root key";
|
|
156
|
+
readonly denied: "Permission denied";
|
|
157
|
+
readonly loading: "Loading credentials…";
|
|
158
|
+
readonly remove: "Remove credential";
|
|
159
|
+
readonly replace: "Replace";
|
|
160
|
+
readonly save: "Save";
|
|
161
|
+
readonly cancel: "Cancel";
|
|
162
|
+
};
|
|
163
|
+
}> | null>>;
|
|
164
|
+
usePorts: (_required?: Record<string, never>, _optional?: Record<string, never>) => import("../../core/module/types.js").ScopedPorts<{
|
|
165
|
+
pages: {
|
|
166
|
+
secrets: {
|
|
167
|
+
tabs: {
|
|
168
|
+
'root-key': {
|
|
169
|
+
params: {
|
|
170
|
+
scopeNotice: string;
|
|
171
|
+
} | {
|
|
172
|
+
scopeNotice?: never;
|
|
173
|
+
};
|
|
174
|
+
label: "Root key";
|
|
175
|
+
permissions: readonly ["admin.security.tokens.manage"];
|
|
176
|
+
optional: {
|
|
177
|
+
readonly rootKey: import("../../core/module/token.js").AdminPortToken<import("../ports.js").RootKeyPort, "admin.security.root-key">;
|
|
178
|
+
};
|
|
179
|
+
};
|
|
180
|
+
'access-tokens': {
|
|
181
|
+
readonly label: "Access tokens";
|
|
182
|
+
};
|
|
183
|
+
};
|
|
184
|
+
path: "/secrets";
|
|
185
|
+
label: "Secrets";
|
|
186
|
+
permissions: readonly ["security.read"];
|
|
187
|
+
nav: {
|
|
188
|
+
readonly group: "system";
|
|
189
|
+
readonly icon: "key";
|
|
190
|
+
};
|
|
191
|
+
};
|
|
192
|
+
};
|
|
193
|
+
id: "security";
|
|
194
|
+
requires: {
|
|
195
|
+
readonly securityApi: import("../../core/module/token.js").AdminPortToken<import("../ports.js").SecurityApiPort, "admin.security.api">;
|
|
196
|
+
};
|
|
197
|
+
optional: {
|
|
198
|
+
readonly otherCredentials: import("../../core/module/token.js").AdminPortToken<import("../ports.js").OtherCredentialsPort, "admin.security.other">;
|
|
199
|
+
readonly rootKey: import("../../core/module/token.js").AdminPortToken<import("../ports.js").RootKeyPort, "admin.security.root-key">;
|
|
200
|
+
};
|
|
201
|
+
messages: {
|
|
202
|
+
readonly security: "Secrets";
|
|
203
|
+
readonly accessTokens: "Access tokens";
|
|
204
|
+
readonly rootKey: "Root key";
|
|
205
|
+
readonly denied: "Permission denied";
|
|
206
|
+
readonly loading: "Loading credentials…";
|
|
207
|
+
readonly remove: "Remove credential";
|
|
208
|
+
readonly replace: "Replace";
|
|
209
|
+
readonly save: "Save";
|
|
210
|
+
readonly cancel: "Cancel";
|
|
211
|
+
};
|
|
212
|
+
}>;
|
|
213
|
+
};
|
|
214
|
+
};
|
|
215
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { bindReact } from '../../react/bind-react.js';
|
|
2
|
+
import { securityModule } from '../security.module.js';
|
|
3
|
+
import { SecurityPortsContext } from './hooks/SecurityPorts.hooks.js';
|
|
4
|
+
export { useSecurityPorts } from './hooks/SecurityPorts.hooks.js';
|
|
5
|
+
export function security(_required, { rootKeyScopeNotice } = {}) {
|
|
6
|
+
const module = { ...securityModule, pages: { secrets: { ...securityModule.pages.secrets, tabs: { ...securityModule.pages.secrets.tabs, 'root-key': { ...securityModule.pages.secrets.tabs['root-key'], params: rootKeyScopeNotice ? { scopeNotice: rootKeyScopeNotice } : {} } } } } };
|
|
7
|
+
const react = bindReact({ module, views: { secrets: { page: () => import('./pages/SecurityPage.js'), tabs: { 'access-tokens': () => import('./tabs/AccessTokensTab.js'), 'root-key': () => import('./tabs/RootKeyTab.js') } } } }, { context: SecurityPortsContext });
|
|
8
|
+
return Object.assign(module, { react });
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Suspense } from 'react';
|
|
3
|
+
import { Tabs, Notice, Spinner } from '@jini-ai/ui-kit/react';
|
|
4
|
+
import { useSecurityPage } from '../hooks/SecurityPage.hooks.js';
|
|
5
|
+
export function SecurityPage(props, _optional = {}) {
|
|
6
|
+
const vm = useSecurityPage(props);
|
|
7
|
+
return _jsxs("section", { "data-jini-part": "security.page", children: [_jsx("h1", { children: props.description.label }), vm.denied ? _jsx(Notice, { tone: "danger", children: "Permission denied" }) : _jsxs(_Fragment, { children: [_jsx(Tabs, { label: "Security views", value: vm.active, items: vm.items, onValueChange: vm.onValueChange }), _jsx(Suspense, { fallback: _jsx(Spinner, { label: "Loading credentials\u2026" }), children: vm.ActiveTab && _jsx(vm.ActiveTab, { params: vm.params, permissions: vm.permissions }, vm.active) })] })] });
|
|
8
|
+
}
|
|
9
|
+
export default SecurityPage;
|
|
10
|
+
//# sourceMappingURL=SecurityPage.js.map
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { Button, TextField, Select, Notice, ConfirmDialog, Spinner } from '@jini-ai/ui-kit/react';
|
|
3
|
+
import { useAccessTokensTab } from '../hooks/AccessTokensTab.hooks.js';
|
|
4
|
+
import { CredentialEditor } from '../components/CredentialEditor.js';
|
|
5
|
+
export function AccessTokensTab(props, _optional = {}) {
|
|
6
|
+
const vm = useAccessTokensTab(props);
|
|
7
|
+
return vm.denied ? _jsx(Notice, { tone: "danger", children: "Permission denied" }) : _jsxs("section", { "aria-label": "Access tokens", children: [_jsx(TextField, { label: "Search tokens", type: "search", value: vm.query, onValueChange: vm.onQuery }), _jsx(Select, { label: "Category", value: vm.category, options: vm.categories, onValueChange: vm.onCategory }), _jsxs("p", { role: "status", children: [vm.matched, " of ", vm.total, " tokens saved"] }), _jsx(Button, { onPress: vm.reload, disabled: vm.saving, children: "Reload" }), vm.loading && _jsx(Spinner, { label: "Loading credentials\u2026" }), vm.errors.map((error, i) => _jsx(Notice, { tone: "danger", children: error }, i)), vm.providers.map(p => _jsxs("section", { children: [_jsxs("h2", { children: [p.provider.label, " \u00B7 ", p.provider.category] }), _jsx("p", { children: p.provider.help }), p.provider.tokenPageUrl && _jsxs("a", { href: p.provider.tokenPageUrl, target: "_blank", rel: "noreferrer", children: ["Manage tokens at ", p.provider.vendorLabel] }), p.canWrite && _jsxs(Button, { onPress: p.add, disabled: vm.saving, children: ["Add ", p.provider.label, " token"] })] }, `${p.provider.kind}:${p.provider.id}`)), vm.rows.map(item => _jsxs("article", { children: [_jsx("h3", { children: item.label }), _jsxs("p", { children: [item.row.kind, " \u00B7 ", item.row.isDefault ? 'Default' : 'Saved', " \u00B7 ", item.row.updatedAt] }), item.canWrite && _jsxs(_Fragment, { children: [_jsxs(Button, { onPress: item.edit, disabled: vm.saving, children: ["Edit ", item.label] }), item.row.kind !== 'custom' && !item.row.isDefault && _jsx(Button, { onPress: item.makeDefault, disabled: vm.saving, children: "Make default" }), _jsxs(Button, { onPress: item.remove, disabled: vm.saving, children: ["Remove ", item.label] })] })] }, `${item.row.kind}:${item.row.id}`)), vm.otherRows.map(item => _jsxs("article", { children: [_jsx("h3", { children: item.row.label }), _jsxs("p", { children: ["Configured", item.row.envNames && _jsxs(_Fragment, { children: [" \u00B7 ", item.row.envNames.length, " environment variables set"] })] }), item.canWrite && _jsxs(_Fragment, { children: [item.row.supportsReplace && _jsxs(_Fragment, { children: [_jsx(TextField, { label: `New key for ${item.row.label}`, type: "password", value: item.token, onValueChange: item.onToken, disabled: vm.saving, attrs: { 'data-agent-private': 'true' } }), _jsxs(Button, { onPress: item.replace, disabled: vm.saving, children: ["Replace ", item.row.label] })] }), _jsxs(Button, { onPress: item.remove, disabled: vm.saving, children: ["Remove ", item.row.label] })] })] }, `${item.row.store}:${item.row.id}`)), vm.canAddCustom && _jsx(Button, { onPress: vm.addCustom, disabled: vm.saving, children: "Add custom provider" }), vm.draft && _jsx(CredentialEditor, { controller: vm.controller, draft: vm.draft, saving: vm.saving }), vm.removal && _jsx(ConfirmDialog, { open: true, title: "Remove credential", body: "Removing this saved connection cannot revoke the token at its provider.", consequence: "Operations using this connection may stop working. Revoke the token at its provider separately.", confirmLabel: "Remove credential", onConfirm: vm.confirmRemove, onCancel: vm.cancelRemove, pending: vm.saving, agentMayConfirm: false, tone: "danger" })] });
|
|
8
|
+
}
|
|
9
|
+
export default AccessTokensTab;
|
|
10
|
+
//# sourceMappingURL=AccessTokensTab.js.map
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { Button, TextField, Notice, ConfirmDialog, Spinner } from '@jini-ai/ui-kit/react';
|
|
3
|
+
import { useRootKeyTab } from '../hooks/RootKeyTab.hooks.js';
|
|
4
|
+
export function RootKeyTab(props, _optional = {}) {
|
|
5
|
+
const vm = useRootKeyTab(props);
|
|
6
|
+
return vm.denied ? _jsx(Notice, { tone: "danger", children: "Permission denied" }) : _jsxs("section", { "aria-label": "Root key", children: [_jsx(Notice, { children: vm.scopeNotice }), vm.loading && _jsx(Spinner, { label: "Loading root key status\u2026" }), vm.error && _jsx(Notice, { tone: "danger", children: vm.error }), vm.result && _jsx(Notice, { tone: "success", children: vm.result }), vm.status && _jsxs("p", { children: [vm.status.state, " \u00B7 ", vm.status.fingerprint, " \u00B7 ", vm.status.source] }), vm.canGenerate && _jsx(Button, { onPress: vm.generate, pending: vm.saving, children: "Create root key" }), vm.locked && _jsxs(_Fragment, { children: [_jsx(TextField, { label: "Old root key", type: "password", value: vm.token, onValueChange: vm.onToken, disabled: vm.saving, attrs: { 'data-agent-private': 'true' } }), _jsx(Button, { onPress: vm.unlock, pending: vm.saving, children: "Unlock saved credentials" }), _jsx(Button, { onPress: vm.previewFresh, disabled: vm.saving || vm.loading, children: "Start fresh" })] }), vm.confirming && _jsx(ConfirmDialog, { open: true, title: "Start fresh", body: _jsxs(_Fragment, { children: [_jsx("p", { children: vm.preview?.detail }), _jsxs("p", { children: [vm.preview?.removes, " credentials will be removed."] }), vm.preview?.affectedWebhooks.map(w => _jsxs("p", { children: [w.label, " \u00B7 ", w.targetUrl] }, `${w.label}:${w.targetUrl}`)), _jsx(TextField, { label: "Type START FRESH", value: vm.confirm, onValueChange: vm.onConfirmText, disabled: vm.saving })] }), consequence: "Saved credentials will be removed. Update affected webhook receivers with new signing secrets.", confirmLabel: "Start fresh", onConfirm: vm.confirmFresh, onCancel: vm.cancelFresh, pending: vm.saving, agentMayConfirm: false, tone: "danger" })] });
|
|
7
|
+
}
|
|
8
|
+
export default RootKeyTab;
|
|
9
|
+
//# sourceMappingURL=RootKeyTab.js.map
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { CredentialCategory, CredentialDraft, CredentialKind, CredentialPatch, CredentialProvider, CredentialSummary, OtherCredentialSummary, OtherStoreId, RootKeyStatus } from './models.js';
|
|
2
|
+
import type { SecurityApiPort } from './ports.js';
|
|
3
|
+
export declare const START_FRESH_CONFIRMATION = "START FRESH";
|
|
4
|
+
export declare const ROOT_KEY_PERMISSION = "admin.security.tokens.manage";
|
|
5
|
+
export declare const CATEGORIES: readonly {
|
|
6
|
+
value: CredentialCategory | 'all';
|
|
7
|
+
label: string;
|
|
8
|
+
}[];
|
|
9
|
+
export declare const OTHER_STORES: readonly OtherStoreId[];
|
|
10
|
+
export declare function writePermission({ kind }: {
|
|
11
|
+
kind: CredentialKind;
|
|
12
|
+
}, _optional?: {}): "custom-credentials.write" | "system.publish" | "source-control.credentials.write";
|
|
13
|
+
export declare function otherWritePermission({ store }: {
|
|
14
|
+
store: OtherStoreId;
|
|
15
|
+
}, _optional?: {}): "admin.assistant.manage" | "admin.integrations.manage";
|
|
16
|
+
export declare function credentialStore({ api, kind }: {
|
|
17
|
+
api: SecurityApiPort;
|
|
18
|
+
kind: CredentialKind;
|
|
19
|
+
}, _optional?: {}): import("./ports.js").CredentialStorePort;
|
|
20
|
+
export declare function blankCredentialDraft({ kind, providerId }: {
|
|
21
|
+
kind: CredentialKind;
|
|
22
|
+
providerId?: string;
|
|
23
|
+
}, _optional?: {}): CredentialDraft;
|
|
24
|
+
/** Legacy sentinel labels are display-only: opening this page must never mutate saved data. */
|
|
25
|
+
export declare function credentialLabel({ row, providers }: {
|
|
26
|
+
row: CredentialSummary;
|
|
27
|
+
providers: readonly CredentialProvider[];
|
|
28
|
+
}, _optional?: {}): string;
|
|
29
|
+
export declare function credentialCategory({ row }: {
|
|
30
|
+
row: CredentialSummary;
|
|
31
|
+
}, _optional?: {}): CredentialCategory;
|
|
32
|
+
export declare function filterCredentials({ rows, query, category, providers }: {
|
|
33
|
+
rows: readonly CredentialSummary[];
|
|
34
|
+
query: string;
|
|
35
|
+
category: CredentialCategory | 'all';
|
|
36
|
+
providers: readonly CredentialProvider[];
|
|
37
|
+
}, _optional?: {}): CredentialSummary[];
|
|
38
|
+
export declare function filterOtherCredentials({ rows, query, category }: {
|
|
39
|
+
rows: readonly OtherCredentialSummary[];
|
|
40
|
+
query: string;
|
|
41
|
+
category: CredentialCategory | 'all';
|
|
42
|
+
}, _optional?: {}): OtherCredentialSummary[];
|
|
43
|
+
/** A custom row is its own provider identity; its username can change without retyping its token. */
|
|
44
|
+
export declare function validateCredentialDraft({ draft, rows, providers }: {
|
|
45
|
+
draft: CredentialDraft;
|
|
46
|
+
rows: readonly CredentialSummary[];
|
|
47
|
+
providers: readonly CredentialProvider[];
|
|
48
|
+
}, _optional?: {}): string | null;
|
|
49
|
+
/** Omitting connection preserves the saved secret. Never send an empty or half-blank replacement. */
|
|
50
|
+
export declare function buildCredentialPatch({ draft, providers }: {
|
|
51
|
+
draft: CredentialDraft;
|
|
52
|
+
providers: readonly CredentialProvider[];
|
|
53
|
+
}, _optional?: {}): CredentialPatch;
|
|
54
|
+
export declare function isRootKeyLocked({ status }: {
|
|
55
|
+
status: RootKeyStatus | null;
|
|
56
|
+
}, _optional?: {}): boolean;
|
|
57
|
+
//# sourceMappingURL=rules.d.ts.map
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
export const START_FRESH_CONFIRMATION = 'START FRESH';
|
|
2
|
+
export const ROOT_KEY_PERMISSION = 'admin.security.tokens.manage';
|
|
3
|
+
export const CATEGORIES = [
|
|
4
|
+
{ value: 'all', label: 'All' }, { value: 'source-control', label: 'Source control' },
|
|
5
|
+
{ value: 'hosting', label: 'Hosting' }, { value: 'media', label: 'Media' },
|
|
6
|
+
{ value: 'ai', label: 'AI' }, { value: 'ops', label: 'Ops' }, { value: 'general', label: 'General' },
|
|
7
|
+
];
|
|
8
|
+
export const OTHER_STORES = ['site-assistant', 'admin-byok', 'media-provider', 'external-mcp'];
|
|
9
|
+
export function writePermission({ kind }, _optional = {}) { return kind === 'custom' ? 'custom-credentials.write' : kind === 'publish' ? 'system.publish' : 'source-control.credentials.write'; }
|
|
10
|
+
export function otherWritePermission({ store }, _optional = {}) { return store === 'site-assistant' || store === 'admin-byok' ? 'admin.assistant.manage' : 'admin.integrations.manage'; }
|
|
11
|
+
export function credentialStore({ api, kind }, _optional = {}) { return kind === 'source-control' ? api.sourceControl : kind === 'publish' ? api.publish : api.custom; }
|
|
12
|
+
export function blankCredentialDraft({ kind, providerId = '' }, _optional = {}) {
|
|
13
|
+
return { kind, providerId, label: '', token: '', values: {}, category: kind === 'publish' ? 'hosting' : kind === 'source-control' ? 'source-control' : 'general', baseUrl: '', additionalHosts: '', username: '' };
|
|
14
|
+
}
|
|
15
|
+
/** Legacy sentinel labels are display-only: opening this page must never mutate saved data. */
|
|
16
|
+
export function credentialLabel({ row, providers }, _optional = {}) {
|
|
17
|
+
if (row.label !== 'default' || row.kind === 'custom')
|
|
18
|
+
return row.label;
|
|
19
|
+
return `${providers.find(p => p.kind === row.kind && p.id === row.providerId)?.label ?? row.providerId} token`;
|
|
20
|
+
}
|
|
21
|
+
export function credentialCategory({ row }, _optional = {}) { return row.category ?? (row.kind === 'publish' ? 'hosting' : row.kind === 'source-control' ? 'source-control' : 'general'); }
|
|
22
|
+
export function filterCredentials({ rows, query, category, providers }, _optional = {}) {
|
|
23
|
+
const q = query.trim().toLowerCase();
|
|
24
|
+
return rows.filter(row => (category === 'all' || credentialCategory({ row }) === category) && [credentialLabel({ row, providers }), row.providerId, row.baseUrl ?? '', row.accountLabel ?? ''].join(' ').toLowerCase().includes(q));
|
|
25
|
+
}
|
|
26
|
+
export function filterOtherCredentials({ rows, query, category }, _optional = {}) { return rows.filter(row => (category === 'all' || row.category === category) && `${row.label} ${row.store}`.toLowerCase().includes(query.trim().toLowerCase())); }
|
|
27
|
+
/** A custom row is its own provider identity; its username can change without retyping its token. */
|
|
28
|
+
export function validateCredentialDraft({ draft, rows, providers }, _optional = {}) {
|
|
29
|
+
if (!draft.label.trim())
|
|
30
|
+
return 'Enter a name';
|
|
31
|
+
if (rows.some(r => r.kind === draft.kind && r.id !== draft.id && (draft.kind === 'custom' || r.providerId === draft.providerId) && r.label.trim().toLowerCase() === draft.label.trim().toLowerCase()))
|
|
32
|
+
return 'That name is already in use';
|
|
33
|
+
if (!draft.id && !draft.token.trim())
|
|
34
|
+
return 'Enter an access token';
|
|
35
|
+
if (draft.kind === 'custom') {
|
|
36
|
+
try {
|
|
37
|
+
if (!['http:', 'https:'].includes(new URL(draft.baseUrl).protocol))
|
|
38
|
+
return 'Enter an HTTP or HTTPS URL';
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return 'Enter an HTTP or HTTPS URL';
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
else if (!draft.id || draft.token.trim()) {
|
|
45
|
+
const provider = providers.find(p => p.kind === draft.kind && p.id === draft.providerId);
|
|
46
|
+
if (!provider)
|
|
47
|
+
return 'Provider is unavailable';
|
|
48
|
+
if (provider.fields.some(f => f.name !== provider.tokenField && f.required && !draft.values[f.name]?.trim()))
|
|
49
|
+
return 'Complete all required fields';
|
|
50
|
+
}
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
/** Omitting connection preserves the saved secret. Never send an empty or half-blank replacement. */
|
|
54
|
+
export function buildCredentialPatch({ draft, providers }, _optional = {}) {
|
|
55
|
+
const provider = providers.find(p => p.kind === draft.kind && p.id === draft.providerId);
|
|
56
|
+
const token = draft.token.trim();
|
|
57
|
+
const connection = token ? draft.kind === 'custom'
|
|
58
|
+
? { token, ...(draft.username.trim() ? { username: draft.username.trim() } : {}) }
|
|
59
|
+
: { providerId: draft.providerId, [provider?.tokenField ?? 'token']: token, ...Object.fromEntries((provider?.fields ?? []).filter(f => f.name !== provider?.tokenField && draft.values[f.name]?.trim()).map(f => [f.name, draft.values[f.name].trim()])) } : undefined;
|
|
60
|
+
return { label: draft.label.trim(), ...(connection ? { connection } : {}), ...(draft.kind === 'custom' ? { category: draft.category, baseUrl: draft.baseUrl.trim(), additionalHosts: draft.additionalHosts.split(/[\n,]/).map(s => s.trim()).filter(Boolean), username: draft.username.trim() || null } : {}) };
|
|
61
|
+
}
|
|
62
|
+
export function isRootKeyLocked({ status }, _optional = {}) { return status?.state === 'missing-with-data' || status?.state === 'mismatch'; }
|
|
63
|
+
//# sourceMappingURL=rules.js.map
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export declare const securityModule: {
|
|
2
|
+
readonly id: "security";
|
|
3
|
+
readonly requires: {
|
|
4
|
+
readonly securityApi: import("../core/module/token.js").AdminPortToken<import("./ports.js").SecurityApiPort, "admin.security.api">;
|
|
5
|
+
};
|
|
6
|
+
readonly optional: {
|
|
7
|
+
readonly otherCredentials: import("../core/module/token.js").AdminPortToken<import("./ports.js").OtherCredentialsPort, "admin.security.other">;
|
|
8
|
+
readonly rootKey: import("../core/module/token.js").AdminPortToken<import("./ports.js").RootKeyPort, "admin.security.root-key">;
|
|
9
|
+
};
|
|
10
|
+
readonly messages: {
|
|
11
|
+
readonly security: "Secrets";
|
|
12
|
+
readonly accessTokens: "Access tokens";
|
|
13
|
+
readonly rootKey: "Root key";
|
|
14
|
+
readonly denied: "Permission denied";
|
|
15
|
+
readonly loading: "Loading credentials…";
|
|
16
|
+
readonly remove: "Remove credential";
|
|
17
|
+
readonly replace: "Replace";
|
|
18
|
+
readonly save: "Save";
|
|
19
|
+
readonly cancel: "Cancel";
|
|
20
|
+
};
|
|
21
|
+
readonly pages: {
|
|
22
|
+
readonly secrets: {
|
|
23
|
+
readonly path: "/secrets";
|
|
24
|
+
readonly label: "Secrets";
|
|
25
|
+
readonly permissions: readonly ["security.read"];
|
|
26
|
+
readonly nav: {
|
|
27
|
+
readonly group: "system";
|
|
28
|
+
readonly icon: "key";
|
|
29
|
+
};
|
|
30
|
+
readonly tabs: {
|
|
31
|
+
readonly 'access-tokens': {
|
|
32
|
+
readonly label: "Access tokens";
|
|
33
|
+
};
|
|
34
|
+
readonly 'root-key': {
|
|
35
|
+
readonly label: "Root key";
|
|
36
|
+
readonly permissions: readonly ["admin.security.tokens.manage"];
|
|
37
|
+
readonly optional: {
|
|
38
|
+
readonly rootKey: import("../core/module/token.js").AdminPortToken<import("./ports.js").RootKeyPort, "admin.security.root-key">;
|
|
39
|
+
};
|
|
40
|
+
};
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
//# sourceMappingURL=security.module.d.ts.map
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { defineAdminModule } from '../core/module/index.js';
|
|
2
|
+
import { securityApiToken, otherCredentialsToken, rootKeyToken } from './ports.js';
|
|
3
|
+
import { securityMessagesEn } from './messages.en.js';
|
|
4
|
+
export const securityModule = defineAdminModule({ id: 'security', requires: { securityApi: securityApiToken }, optional: { otherCredentials: otherCredentialsToken, rootKey: rootKeyToken }, messages: securityMessagesEn, pages: { secrets: { path: '/secrets', label: securityMessagesEn.security, permissions: ['security.read'], nav: { group: 'system', icon: 'key' }, tabs: { 'access-tokens': { label: securityMessagesEn.accessTokens }, 'root-key': { label: securityMessagesEn.rootKey, permissions: ['admin.security.tokens.manage'], optional: { rootKey: rootKeyToken } } } } } });
|
|
5
|
+
//# sourceMappingURL=security.module.js.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { SourceControlApiPort, SourceControlTransportPort } from '../ports.js';
|
|
2
|
+
export declare function createHttpSourceControlApi({ transport, workspacePath }: {
|
|
3
|
+
transport: SourceControlTransportPort;
|
|
4
|
+
workspacePath: string;
|
|
5
|
+
}, _optional?: {}): SourceControlApiPort;
|
|
6
|
+
//# sourceMappingURL=http.d.ts.map
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { sourceControlSummary } from '../rules.js';
|
|
2
|
+
export function createHttpSourceControlApi({ transport, workspacePath }, _optional = {}) {
|
|
3
|
+
const base = `${workspacePath.replace(/\/$/, '')}/system/source-control`, path = `${base}/credentials`;
|
|
4
|
+
async function request(suffix, method, options, body) { options.signal?.throwIfAborted(); return transport.request({ path: `${base}${suffix}`, method, ...(body !== undefined ? { body } : {}) }, options); }
|
|
5
|
+
return {
|
|
6
|
+
async providers(_required, options = {}) { const r = await request('/providers', 'GET', options); return Object.freeze(r.providers.map(p => Object.freeze({ id: p.id, label: p.label, ...(p.credential ? { credential: Object.freeze({ tokenField: p.credential.tokenField, fields: Object.freeze(p.credential.fields.map(f => Object.freeze({ ...f }))), ...(p.credential.help ? { help: p.credential.help } : {}), ...(p.credential.tokenPageUrl ? { tokenPageUrl: p.credential.tokenPageUrl } : {}) }) } : {}) }))); },
|
|
7
|
+
async list(_required, options = {}) { const r = await request('/credentials', 'GET', options); return Object.freeze(r.credentials.map(row => sourceControlSummary({ row }))); },
|
|
8
|
+
async create(input, options = {}) { const r = await request('/credentials', 'POST', options, input); return sourceControlSummary({ row: r.credential }); },
|
|
9
|
+
async update({ id, patch }, options = {}) { const r = await request(`/credentials/${encodeURIComponent(id)}`, 'PUT', options, patch); return sourceControlSummary({ row: r.credential }); },
|
|
10
|
+
async remove({ id }, options = {}) { options.signal?.throwIfAborted(); await transport.request({ path: `${path}/${encodeURIComponent(id)}`, method: 'DELETE' }, options); },
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=http.js.map
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { SourceControlApiPort } from '../ports.js';
|
|
2
|
+
import type { SourceControlCredential, SourceControlProvider } from '../models.js';
|
|
3
|
+
export declare function createMemorySourceControlApi({ providers, credentials }: {
|
|
4
|
+
providers?: readonly SourceControlProvider[];
|
|
5
|
+
credentials?: readonly SourceControlCredential[];
|
|
6
|
+
}, { now }?: {
|
|
7
|
+
now?: () => string;
|
|
8
|
+
}): SourceControlApiPort;
|
|
9
|
+
//# sourceMappingURL=memory.d.ts.map
|