@k2b/cloud 0.6.0-rc.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/README.md +98 -0
- package/package.json +128 -0
- package/public/logo.svg +1 -0
- package/scripts/app-favicon.test.ts +49 -0
- package/scripts/app-favicon.ts +51 -0
- package/scripts/build.ts +205 -0
- package/scripts/preload.ts +164 -0
- package/scripts/sync-recovery-smoke.ts +200 -0
- package/src/_internal/app-favicon.ts +2 -0
- package/src/_internal/app-presentation.ts +61 -0
- package/src/_internal/app-workspace-state.ts +24 -0
- package/src/_internal/bounded-json.ts +47 -0
- package/src/_internal/build-metadata.ts +9 -0
- package/src/_internal/capabilities.ts +1118 -0
- package/src/_internal/define-app.ts +801 -0
- package/src/_internal/heartbeat.ts +167 -0
- package/src/_internal/help-catalog.ts +241 -0
- package/src/_internal/help.ts +95 -0
- package/src/_internal/nats-connection.ts +34 -0
- package/src/_internal/page-responses.ts +40 -0
- package/src/_internal/process-sync.ts +117 -0
- package/src/_internal/readiness.ts +3 -0
- package/src/_internal/registry-validation.ts +136 -0
- package/src/_internal/registry-watch.ts +52 -0
- package/src/_internal/registry.ts +338 -0
- package/src/_internal/runtime-compatibility.ts +64 -0
- package/src/_internal/runtime-context.ts +84 -0
- package/src/_internal/runtime-watcher.ts +78 -0
- package/src/_internal/static-assets.ts +86 -0
- package/src/_internal/status-preserving-ssr.ts +49 -0
- package/src/access/PermissionEditor.tsx +486 -0
- package/src/access/ResourceApiKeys.tsx +271 -0
- package/src/access/messages.ts +121 -0
- package/src/access/ui.ts +16 -0
- package/src/account/Avatar.tsx +28 -0
- package/src/account/EntitySearch.tsx +363 -0
- package/src/account/avatar-upload-dialog.tsx +197 -0
- package/src/account/avatar-upload.ts +149 -0
- package/src/account/ui.ts +3 -0
- package/src/ai/admin.ts +47 -0
- package/src/ai/approval-routes.ts +130 -0
- package/src/ai/approvals.ts +139 -0
- package/src/ai/assistant-models.ts +61 -0
- package/src/ai/attachments.ts +40 -0
- package/src/ai/browser.ts +92 -0
- package/src/ai/capabilities.ts +714 -0
- package/src/ai/capability-execution.ts +151 -0
- package/src/ai/chat/blocks.render.test.tsx +1108 -0
- package/src/ai/chat/blocks.tsx +730 -0
- package/src/ai/chat/builtin-tools.tsx +428 -0
- package/src/ai/chat/capability-table.tsx +87 -0
- package/src/ai/chat/composer-adapter.ts +169 -0
- package/src/ai/chat/file-tools.tsx +81 -0
- package/src/ai/chat/message-actions.tsx +370 -0
- package/src/ai/chat/message-utils.ts +479 -0
- package/src/ai/chat/messages.ts +43 -0
- package/src/ai/chat/presentation.tsx +395 -0
- package/src/ai/chat/primitives.tsx +3 -0
- package/src/ai/chat/tool-disclosure.tsx +41 -0
- package/src/ai/chat/turn-navigator-utils.ts +28 -0
- package/src/ai/chat/turn-navigator.tsx +164 -0
- package/src/ai/chat/user-message.tsx +149 -0
- package/src/ai/chat/visual-tools.tsx +435 -0
- package/src/ai/chat/web-tools.tsx +202 -0
- package/src/ai/chat-task-contracts.ts +113 -0
- package/src/ai/chat-tasks.ts +952 -0
- package/src/ai/client/controller.ts +1211 -0
- package/src/ai/client/file-source.ts +95 -0
- package/src/ai/client/live-connection.ts +140 -0
- package/src/ai/client/projection.ts +178 -0
- package/src/ai/client/transport.ts +111 -0
- package/src/ai/compaction.ts +182 -0
- package/src/ai/credentials.ts +124 -0
- package/src/ai/default-tool-contracts.ts +108 -0
- package/src/ai/default-tools.ts +127 -0
- package/src/ai/enrich.ts +280 -0
- package/src/ai/executor.ts +1624 -0
- package/src/ai/fetch-file-tool.ts +313 -0
- package/src/ai/file-context.ts +92 -0
- package/src/ai/file-media-type.ts +28 -0
- package/src/ai/file-mount.ts +16 -0
- package/src/ai/file-tools.ts +566 -0
- package/src/ai/files-store.ts +390 -0
- package/src/ai/firecrawl-tools.ts +305 -0
- package/src/ai/grids-skill.ts +126 -0
- package/src/ai/http.ts +265 -0
- package/src/ai/index.ts +337 -0
- package/src/ai/kit-skill.ts +22 -0
- package/src/ai/limits.ts +5 -0
- package/src/ai/live-events.ts +289 -0
- package/src/ai/live-messages.ts +45 -0
- package/src/ai/live-outbox.ts +102 -0
- package/src/ai/live-routes.ts +412 -0
- package/src/ai/live.ts +2 -0
- package/src/ai/maintenance.ts +302 -0
- package/src/ai/markdown-pdf-tool.ts +95 -0
- package/src/ai/memories.ts +605 -0
- package/src/ai/memory-learning-runs.ts +222 -0
- package/src/ai/memory-learning.ts +619 -0
- package/src/ai/memory-tool.ts +120 -0
- package/src/ai/memory-workflow-evidence.ts +158 -0
- package/src/ai/migrate.ts +2082 -0
- package/src/ai/model-access-migrate.ts +30 -0
- package/src/ai/model-access.ts +191 -0
- package/src/ai/personal-agent.ts +6 -0
- package/src/ai/prefs.ts +72 -0
- package/src/ai/project-tool.ts +94 -0
- package/src/ai/projects-routes.ts +277 -0
- package/src/ai/projects.ts +902 -0
- package/src/ai/protocol.ts +279 -0
- package/src/ai/provider.ts +73 -0
- package/src/ai/public-projection.ts +25 -0
- package/src/ai/resource-markers.ts +31 -0
- package/src/ai/resource-refs.ts +70 -0
- package/src/ai/routes.ts +1131 -0
- package/src/ai/runtime-tools.ts +39 -0
- package/src/ai/runtime.ts +544 -0
- package/src/ai/settings.ts +529 -0
- package/src/ai/short-id.ts +45 -0
- package/src/ai/skill-catalog.ts +73 -0
- package/src/ai/skill-format.ts +145 -0
- package/src/ai/skill-seeds.ts +430 -0
- package/src/ai/skill-tool.ts +81 -0
- package/src/ai/skills-routes.ts +143 -0
- package/src/ai/skills.ts +934 -0
- package/src/ai/solid.ts +27 -0
- package/src/ai/store.ts +3113 -0
- package/src/ai/stream.ts +308 -0
- package/src/ai/structured-runs.ts +66 -0
- package/src/ai/structured.ts +186 -0
- package/src/ai/system-prompt.ts +170 -0
- package/src/ai/task-prompt.ts +22 -0
- package/src/ai/timeline.ts +148 -0
- package/src/ai/tool-audit.ts +177 -0
- package/src/ai/tool-result-budget.ts +16 -0
- package/src/ai/tools.ts +155 -0
- package/src/ai/types.ts +967 -0
- package/src/ai/ui.tsx +39 -0
- package/src/ai/usage-migrate.ts +81 -0
- package/src/ai/usage.ts +315 -0
- package/src/ai/validate.ts +54 -0
- package/src/ai/vision-tool.ts +79 -0
- package/src/api/accounts-entities.ts +174 -0
- package/src/api/admin-ai-projects.ts +74 -0
- package/src/api/admin-ai-skills.ts +76 -0
- package/src/api/admin-ai-usage.ts +42 -0
- package/src/api/admin-core-settings.ts +508 -0
- package/src/api/admin-identity.ts +148 -0
- package/src/api/admin-lifecycle.ts +206 -0
- package/src/api/admin-linux-identities.ts +66 -0
- package/src/api/announcements.ts +131 -0
- package/src/api/app-approval.ts +129 -0
- package/src/api/apps.ts +51 -0
- package/src/api/auth/schemas.ts +54 -0
- package/src/api/auth.ts +370 -0
- package/src/api/capabilities.ts +658 -0
- package/src/api/help-messages.ts +19 -0
- package/src/api/help.ts +78 -0
- package/src/api/index.ts +108 -0
- package/src/api/mcp.ts +744 -0
- package/src/api/me-rail.ts +45 -0
- package/src/api/me.ts +753 -0
- package/src/api/search/schemas.ts +79 -0
- package/src/api/search.bench.ts +185 -0
- package/src/api/search.ts +407 -0
- package/src/api/sync-ops.ts +79 -0
- package/src/api/widgets.ts +143 -0
- package/src/browser/CloudResourceSearch.behavior.test.tsx +74 -0
- package/src/browser/CloudResourceSearch.tsx +791 -0
- package/src/browser/app-approval-vault.ts +305 -0
- package/src/browser/app-approval.ts +234 -0
- package/src/browser/live-websocket.ts +268 -0
- package/src/browser/locale-preference.ts +25 -0
- package/src/browser/notification-target.ts +27 -0
- package/src/browser/notification-timeout.ts +14 -0
- package/src/browser/notifications.ts +181 -0
- package/src/browser/resource-clipboard.ts +70 -0
- package/src/browser/resource-picker.tsx +39 -0
- package/src/browser/resource-search-messages.ts +55 -0
- package/src/browser/resource-search.ts +27 -0
- package/src/capabilities/client.ts +149 -0
- package/src/capabilities/response.ts +39 -0
- package/src/capabilities/server.ts +215 -0
- package/src/capabilities/signals.ts +4 -0
- package/src/capabilities/testing.ts +12 -0
- package/src/capabilities/types.ts +32 -0
- package/src/cli/access.ts +499 -0
- package/src/cli/account.ts +382 -0
- package/src/cli/admin/account-administration.ts +45 -0
- package/src/cli/admin/account-categories.ts +49 -0
- package/src/cli/admin/ai-usage.ts +118 -0
- package/src/cli/admin/app-sign-in.ts +49 -0
- package/src/cli/admin/data.ts +343 -0
- package/src/cli/admin/documentation.ts +34 -0
- package/src/cli/admin/gateway.ts +155 -0
- package/src/cli/admin/index.ts +61 -0
- package/src/cli/admin/instance.ts +250 -0
- package/src/cli/admin/jobs.ts +223 -0
- package/src/cli/admin/legal.ts +122 -0
- package/src/cli/admin/linux.ts +53 -0
- package/src/cli/admin/logs.ts +324 -0
- package/src/cli/admin/metrics.ts +142 -0
- package/src/cli/admin/nats.ts +167 -0
- package/src/cli/admin/notifications.ts +516 -0
- package/src/cli/admin/shared.ts +113 -0
- package/src/cli/admin/sync.ts +188 -0
- package/src/cli/admin/telemetry.ts +314 -0
- package/src/cli/admin/webhooks.ts +222 -0
- package/src/cli/admin/workflows.ts +367 -0
- package/src/cli/apps.ts +40 -0
- package/src/cli/capabilities.ts +239 -0
- package/src/cli/commands.ts +604 -0
- package/src/cli/index.ts +61 -0
- package/src/cli/locale.ts +31 -0
- package/src/cli/output.ts +58 -0
- package/src/clients/core.ts +20 -0
- package/src/config/env.ts +54 -0
- package/src/config/index.ts +6 -0
- package/src/contracts/account-categories.ts +62 -0
- package/src/contracts/announcements.ts +121 -0
- package/src/contracts/app-approval.ts +197 -0
- package/src/contracts/app.ts +162 -0
- package/src/contracts/capabilities.ts +484 -0
- package/src/contracts/index.ts +14 -0
- package/src/contracts/notification-live.ts +66 -0
- package/src/contracts/notification-types.ts +235 -0
- package/src/contracts/posix.ts +69 -0
- package/src/contracts/profile.ts +85 -0
- package/src/contracts/rail-preferences.ts +53 -0
- package/src/contracts/registry.ts +110 -0
- package/src/contracts/resource-clipboard.ts +33 -0
- package/src/contracts/settings-types.ts +98 -0
- package/src/contracts/shared.ts +408 -0
- package/src/contracts/user-notifications.ts +101 -0
- package/src/contracts/widgets.ts +183 -0
- package/src/desktop/index.ts +704 -0
- package/src/desktop/solid.tsx +938 -0
- package/src/index.ts +58 -0
- package/src/server/actor.ts +41 -0
- package/src/server/api/index.ts +2 -0
- package/src/server/api/respond.ts +96 -0
- package/src/server/api-client.ts +54 -0
- package/src/server/app-context.ts +39 -0
- package/src/server/help.ts +187 -0
- package/src/server/index.ts +89 -0
- package/src/server/locale.ts +55 -0
- package/src/server/middleware/auth.ts +386 -0
- package/src/server/middleware/index.ts +28 -0
- package/src/server/middleware/invocation.ts +55 -0
- package/src/server/middleware/middleware.ts +65 -0
- package/src/server/middleware/openapi.ts +126 -0
- package/src/server/middleware/rate-limit.ts +125 -0
- package/src/server/middleware/request-logger.ts +41 -0
- package/src/server/middleware/route-template.ts +46 -0
- package/src/server/middleware/runtime.ts +22 -0
- package/src/server/middleware/settings.ts +55 -0
- package/src/server/middleware/validator.ts +49 -0
- package/src/server/middleware/workload.ts +22 -0
- package/src/server/ratelimit.ts +151 -0
- package/src/server/request-cookies.ts +18 -0
- package/src/server/services/access.ts +644 -0
- package/src/server/services/freeipa/client.ts +137 -0
- package/src/server/services/freeipa/index.ts +9 -0
- package/src/server/services/freeipa/session.ts +123 -0
- package/src/server/services/freeipa/test-certificates.ts +44 -0
- package/src/server/services/freeipa/tls.ts +44 -0
- package/src/server/services/freeipa/transport.ts +116 -0
- package/src/server/services/freeipa/util.ts +59 -0
- package/src/server/services/geo.ts +198 -0
- package/src/server/services/index.ts +48 -0
- package/src/server/services/pagination.ts +22 -0
- package/src/server/services/services.ts +13 -0
- package/src/server/time.ts +33 -0
- package/src/services/account-category-policy.ts +51 -0
- package/src/services/account-lifecycle/audit.ts +41 -0
- package/src/services/account-lifecycle/index.ts +940 -0
- package/src/services/account-lifecycle/ipa-backfill.ts +152 -0
- package/src/services/account-lifecycle/notification-sender.ts +13 -0
- package/src/services/account-lifecycle/scheduler.ts +506 -0
- package/src/services/account-model.ts +22 -0
- package/src/services/accounts/app.ts +1671 -0
- package/src/services/accounts/authz.ts +44 -0
- package/src/services/accounts/avatar.ts +120 -0
- package/src/services/accounts/base-group.ts +11 -0
- package/src/services/accounts/base-user.ts +46 -0
- package/src/services/accounts/duplicate-emails.ts +82 -0
- package/src/services/accounts/entities.ts +622 -0
- package/src/services/accounts/group-sql.ts +106 -0
- package/src/services/accounts/groups.ts +272 -0
- package/src/services/accounts/index.ts +14 -0
- package/src/services/accounts/ipa-data.ts +66 -0
- package/src/services/accounts/lifecycle.ts +2 -0
- package/src/services/accounts/local-groups.ts +499 -0
- package/src/services/accounts/model.ts +129 -0
- package/src/services/accounts/notification-sender.ts +31 -0
- package/src/services/accounts/posix.ts +386 -0
- package/src/services/accounts/request-policy.ts +11 -0
- package/src/services/accounts/switching.ts +126 -0
- package/src/services/accounts/users.ts +745 -0
- package/src/services/announcements/index.ts +224 -0
- package/src/services/app-approval.ts +498 -0
- package/src/services/audit/index.ts +438 -0
- package/src/services/auth-flows/index.ts +15 -0
- package/src/services/auth-flows/ipa.ts +197 -0
- package/src/services/auth-flows/magic-link.ts +185 -0
- package/src/services/auth-flows/notification-sender.ts +10 -0
- package/src/services/auth-flows/password-reset.ts +268 -0
- package/src/services/auth-flows/proxy-return.ts +49 -0
- package/src/services/document-extraction.ts +148 -0
- package/src/services/freeipa-config.ts +179 -0
- package/src/services/gateway.ts +186 -0
- package/src/services/identity/constants.ts +18 -0
- package/src/services/identity/index.ts +52 -0
- package/src/services/identity/invocation-actor.ts +120 -0
- package/src/services/identity/invocation-authority.ts +53 -0
- package/src/services/identity/invocation-operations.ts +15 -0
- package/src/services/identity/invocation-token.ts +276 -0
- package/src/services/identity/key-config.ts +41 -0
- package/src/services/identity/key-ring.ts +530 -0
- package/src/services/identity/metrics.ts +29 -0
- package/src/services/identity/routes.ts +18 -0
- package/src/services/identity/runtime-config.ts +88 -0
- package/src/services/identity/session-token.ts +152 -0
- package/src/services/identity/signer-refresh.ts +44 -0
- package/src/services/identity/workload-auth.ts +64 -0
- package/src/services/index.ts +187 -0
- package/src/services/ipa/auth.ts +216 -0
- package/src/services/ipa/connection.ts +57 -0
- package/src/services/ipa/effective-groups.ts +70 -0
- package/src/services/ipa/groups.ts +722 -0
- package/src/services/ipa/guard.ts +17 -0
- package/src/services/ipa/index.ts +17 -0
- package/src/services/ipa/posix.ts +19 -0
- package/src/services/ipa/profile.ts +132 -0
- package/src/services/ipa/runtime.ts +28 -0
- package/src/services/ipa/search.ts +154 -0
- package/src/services/ipa/service-account.ts +15 -0
- package/src/services/ipa/sync-planning.ts +100 -0
- package/src/services/ipa/sync.ts +862 -0
- package/src/services/ipa/users.ts +806 -0
- package/src/services/legal-consent.ts +76 -0
- package/src/services/logging/index.ts +477 -0
- package/src/services/logging/redaction.ts +20 -0
- package/src/services/logging/trace.ts +1231 -0
- package/src/services/mandates/index.ts +855 -0
- package/src/services/mandates/policy.ts +85 -0
- package/src/services/network-security.ts +31 -0
- package/src/services/notifications/batches.ts +722 -0
- package/src/services/notifications/browser.ts +252 -0
- package/src/services/notifications/catalog.ts +113 -0
- package/src/services/notifications/channels.ts +104 -0
- package/src/services/notifications/dispatcher.ts +139 -0
- package/src/services/notifications/email.ts +118 -0
- package/src/services/notifications/index.ts +633 -0
- package/src/services/notifications/live.ts +50 -0
- package/src/services/notifications/observability.ts +407 -0
- package/src/services/notifications/platform.ts +421 -0
- package/src/services/notifications/runtime.ts +120 -0
- package/src/services/notifications/user.ts +248 -0
- package/src/services/notifications/web-push-transport.ts +135 -0
- package/src/services/oauth-tokens.ts +209 -0
- package/src/services/outbox.ts +187 -0
- package/src/services/pdf/gotenberg.ts +290 -0
- package/src/services/pdf/index.ts +43 -0
- package/src/services/pdf/markdown.ts +209 -0
- package/src/services/pdf/template-preview.ts +122 -0
- package/src/services/postgres.ts +76 -0
- package/src/services/providers/index.ts +27 -0
- package/src/services/providers/local/auth.ts +51 -0
- package/src/services/providers/local/index.ts +4 -0
- package/src/services/providers/local/users.ts +263 -0
- package/src/services/rail-preferences.ts +27 -0
- package/src/services/runtime-lifecycle.ts +191 -0
- package/src/services/secrets.ts +10 -0
- package/src/services/service-account-credentials.ts +891 -0
- package/src/services/service-accounts.ts +184 -0
- package/src/services/session/index.ts +236 -0
- package/src/services/session/test-fixture.ts +18 -0
- package/src/services/session/user.ts +144 -0
- package/src/services/settings/api.ts +61 -0
- package/src/services/settings/app.ts +86 -0
- package/src/services/settings/core-settings.ts +796 -0
- package/src/services/settings/crypto.ts +69 -0
- package/src/services/settings/defaults.ts +374 -0
- package/src/services/settings/index.ts +215 -0
- package/src/services/settings/namespace.ts +9 -0
- package/src/services/settings/snapshot.ts +49 -0
- package/src/services/settings/store.ts +241 -0
- package/src/services/settings/templates.ts +4 -0
- package/src/services/sync-ops.ts +403 -0
- package/src/services/topic-cursor.ts +22 -0
- package/src/services/weather/forecast.ts +323 -0
- package/src/services/weather/geo.ts +119 -0
- package/src/services/weather/index.ts +67 -0
- package/src/services/weather/location.ts +24 -0
- package/src/services/weather/locations.ts +133 -0
- package/src/services/weather/migrate.ts +45 -0
- package/src/services/weather/settings.ts +66 -0
- package/src/services/weather/short-id.ts +57 -0
- package/src/services/weather/types.ts +61 -0
- package/src/services/weather/ui.ts +50 -0
- package/src/services/webauthn.ts +385 -0
- package/src/shared/account-action-notice.ts +70 -0
- package/src/shared/account-display.ts +15 -0
- package/src/shared/account-session.ts +15 -0
- package/src/shared/ai-platform-prompt.ts +134 -0
- package/src/shared/ai-usage.ts +49 -0
- package/src/shared/app-presentation.ts +48 -0
- package/src/shared/app-url.ts +12 -0
- package/src/shared/branding.ts +14 -0
- package/src/shared/capability-messages.ts +70 -0
- package/src/shared/email-html.ts +54 -0
- package/src/shared/format.ts +91 -0
- package/src/shared/help.ts +68 -0
- package/src/shared/icons.ts +400 -0
- package/src/shared/index.ts +54 -0
- package/src/shared/locale.ts +48 -0
- package/src/shared/login-method.ts +44 -0
- package/src/shared/markdown/client.ts +130 -0
- package/src/shared/markdown/extensions/code.ts +105 -0
- package/src/shared/markdown/extensions/guided-help.ts +100 -0
- package/src/shared/markdown/extensions/images.ts +79 -0
- package/src/shared/markdown/extensions/info-blocks.ts +97 -0
- package/src/shared/markdown/extensions/katex.ts +120 -0
- package/src/shared/markdown/extensions/links.ts +43 -0
- package/src/shared/markdown/extensions/mark.ts +48 -0
- package/src/shared/markdown/extensions/sub-sup.ts +60 -0
- package/src/shared/markdown/extensions/tables.ts +109 -0
- package/src/shared/markdown/extensions/task-list.ts +53 -0
- package/src/shared/markdown/formula.ts +1187 -0
- package/src/shared/markdown/index.ts +193 -0
- package/src/shared/markdown/shared.ts +36 -0
- package/src/shared/mock-cover.ts +130 -0
- package/src/shared/network-address.ts +106 -0
- package/src/shared/redirect.ts +56 -0
- package/src/shared/template-rendering.ts +140 -0
- package/src/shared/theme.ts +68 -0
- package/src/shared/time.ts +13 -0
- package/src/ssr/AdminLayout.tsx +53 -0
- package/src/ssr/AdminSidebar.tsx +50 -0
- package/src/ssr/AppLaunchpad.island.tsx +236 -0
- package/src/ssr/AppWorkspaceController.island.tsx +21 -0
- package/src/ssr/BrowserNotifications.island.tsx +135 -0
- package/src/ssr/GlobalAnnouncements.island.tsx +142 -0
- package/src/ssr/GlobalSearchDialog.behavior.test.tsx +96 -0
- package/src/ssr/GlobalSearchDialog.tsx +35 -0
- package/src/ssr/GlobalSearchHelpDialog.tsx +104 -0
- package/src/ssr/GlobalSearchTrigger.island.tsx +55 -0
- package/src/ssr/HotkeysHelpRail.island.tsx +55 -0
- package/src/ssr/Layout.render.test.tsx +148 -0
- package/src/ssr/Layout.tsx +292 -0
- package/src/ssr/LayoutBreadcrumbs.island.tsx +44 -0
- package/src/ssr/LayoutFooter.tsx +22 -0
- package/src/ssr/LayoutHeader.tsx +81 -0
- package/src/ssr/LayoutHelp.tsx +869 -0
- package/src/ssr/LayoutPreferences.island.tsx +36 -0
- package/src/ssr/LayoutRail.tsx +58 -0
- package/src/ssr/MinimalLayout.tsx +46 -0
- package/src/ssr/PageError.tsx +29 -0
- package/src/ssr/ProfilePreferences.island.tsx +92 -0
- package/src/ssr/RailApps.island.tsx +61 -0
- package/src/ssr/RailEditor.tsx +293 -0
- package/src/ssr/RegisteredHelpDocuments.island.tsx +3 -0
- package/src/ssr/TimezoneCookie.island.tsx +23 -0
- package/src/ssr/admin-active-link.ts +47 -0
- package/src/ssr/admin-navigation.ts +78 -0
- package/src/ssr/app-appearance.ts +23 -0
- package/src/ssr/app-navigation.ts +41 -0
- package/src/ssr/help-messages.ts +104 -0
- package/src/ssr/index.ts +14 -0
- package/src/ssr/islands/SearchBar.island.tsx +80 -0
- package/src/ssr/islands/index.ts +16 -0
- package/src/ssr/layout-context.ts +17 -0
- package/src/ssr/layout-help-markdown.ts +9 -0
- package/src/ssr/layout-help-navigation.ts +24 -0
- package/src/ssr/layout-help-url.ts +5 -0
- package/src/ssr/layout-runtime.ts +22 -0
- package/src/ssr/page-error-messages.ts +25 -0
- package/src/ssr/platform-messages.ts +135 -0
- package/src/ssr/preference-controller.ts +44 -0
- package/src/ssr/profile-preferences-messages.ts +29 -0
- package/src/ssr/rail-context.ts +21 -0
- package/src/ssr/rail-messages.ts +66 -0
- package/src/ssr/rail-navigation.ts +60 -0
- package/src/ssr/runtime.ts +31 -0
- package/src/ssr/url-filter.ts +127 -0
- package/src/styles/base-popover.css +36 -0
- package/src/styles/effects.css +851 -0
- package/src/styles/global.css +268 -0
- package/src/styles/input.css +58 -0
- package/src/styles/tokens.css +230 -0
- package/src/styles/utilities-buttons.css +405 -0
- package/src/styles/utilities-data.css +33 -0
- package/src/styles/utilities-feedback.css +232 -0
- package/src/styles/utilities-layout.css +603 -0
- package/src/styles/utilities-markdown-editor.css +525 -0
- package/src/styles/utilities-markdown-table.css +234 -0
- package/src/styles/utilities-navigation.css +1054 -0
- package/src/types/ambient.d.ts +24 -0
- package/src/workflows/ai/index.ts +17 -0
- package/src/workflows/ai/runtime.ts +286 -0
- package/src/workflows/ai/store.ts +314 -0
- package/src/workflows/ai/types.ts +111 -0
- package/src/workflows/ai-actions.ts +269 -0
- package/src/workflows/authoring.ts +88 -0
- package/src/workflows/builtins.ts +193 -0
- package/src/workflows/contracts.ts +280 -0
- package/src/workflows/definition.ts +334 -0
- package/src/workflows/editor.ts +113 -0
- package/src/workflows/index.ts +71 -0
- package/src/workflows/language/binder.ts +45 -0
- package/src/workflows/language/canonical.ts +29 -0
- package/src/workflows/language/compiler.ts +396 -0
- package/src/workflows/language/expressions.ts +34 -0
- package/src/workflows/language/index.ts +20 -0
- package/src/workflows/language/references.ts +55 -0
- package/src/workflows/language/schema.ts +134 -0
- package/src/workflows/language/strict-yaml.ts +131 -0
- package/src/workflows/manifest.ts +24 -0
- package/src/workflows/module.ts +12 -0
- package/src/workflows/runtime/coordinator.ts +115 -0
- package/src/workflows/runtime/executor.ts +1003 -0
- package/src/workflows/runtime/index.ts +60 -0
- package/src/workflows/runtime/instant.ts +8 -0
- package/src/workflows/runtime/ports.ts +213 -0
- package/src/workflows/runtime/schedule.ts +203 -0
- package/src/workflows/runtime/trigger.ts +37 -0
- package/src/workflows/runtime/wake.ts +13 -0
- package/src/workflows/store/actions.ts +438 -0
- package/src/workflows/store/budget.ts +145 -0
- package/src/workflows/store/definitions.ts +345 -0
- package/src/workflows/store/events.ts +383 -0
- package/src/workflows/store/index.ts +107 -0
- package/src/workflows/store/observability.ts +594 -0
- package/src/workflows/store/runs.ts +975 -0
- package/src/workflows/store/transaction.ts +23 -0
- package/src/workflows/store/worker.ts +439 -0
- package/src/workflows/testing/conformance.ts +72 -0
- package/src/workflows/testing/index.ts +11 -0
- package/src/workflows/testing/process-fixtures.ts +275 -0
|
@@ -0,0 +1,408 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
export const RoleSchema = z.enum([
|
|
4
|
+
"admin",
|
|
5
|
+
"ipa",
|
|
6
|
+
"guest",
|
|
7
|
+
"group-manager",
|
|
8
|
+
"local",
|
|
9
|
+
"user",
|
|
10
|
+
"ipa/user",
|
|
11
|
+
"ipa/guest",
|
|
12
|
+
"local/user",
|
|
13
|
+
"local/guest",
|
|
14
|
+
]);
|
|
15
|
+
export type Role = z.infer<typeof RoleSchema>;
|
|
16
|
+
|
|
17
|
+
export const UserProviderSchema = z.enum(["ipa", "local"]);
|
|
18
|
+
export type UserProvider = z.infer<typeof UserProviderSchema>;
|
|
19
|
+
|
|
20
|
+
export const UserProfileSchema = z.enum(["user", "guest"]);
|
|
21
|
+
export type UserProfile = z.infer<typeof UserProfileSchema>;
|
|
22
|
+
|
|
23
|
+
export const SpecialRoleSchema = z.enum(["*", "authenticated", "anonymous"]);
|
|
24
|
+
export type SpecialRole = z.infer<typeof SpecialRoleSchema>;
|
|
25
|
+
export type RoleOrSpecial = Role | SpecialRole;
|
|
26
|
+
|
|
27
|
+
export const hasRole = (user: { roles: Role[] }, ...roles: Role[]): boolean => roles.some((role) => user.roles.includes(role));
|
|
28
|
+
|
|
29
|
+
export const BaseUserSchema = z.object({
|
|
30
|
+
id: z.string(),
|
|
31
|
+
uid: z.string(),
|
|
32
|
+
roles: z.array(RoleSchema),
|
|
33
|
+
provider: UserProviderSchema,
|
|
34
|
+
profile: UserProfileSchema,
|
|
35
|
+
givenname: z.string(),
|
|
36
|
+
sn: z.string(),
|
|
37
|
+
displayName: z.string(),
|
|
38
|
+
mail: z.string().nullable(),
|
|
39
|
+
avatarHash: z.string().nullable(),
|
|
40
|
+
});
|
|
41
|
+
export type BaseUser = z.infer<typeof BaseUserSchema>;
|
|
42
|
+
|
|
43
|
+
export const IpaUserDataSchema = z.object({
|
|
44
|
+
uidNumber: z.number().nullable(),
|
|
45
|
+
phone: z.string().nullable(),
|
|
46
|
+
employeeType: z.string().nullable(),
|
|
47
|
+
mobile: z.string().nullable(),
|
|
48
|
+
address: z.object({
|
|
49
|
+
street: z.string().nullable(),
|
|
50
|
+
postalCode: z.string().nullable(),
|
|
51
|
+
city: z.string().nullable(),
|
|
52
|
+
state: z.string().nullable(),
|
|
53
|
+
}),
|
|
54
|
+
passwordExpires: z.string().nullable(),
|
|
55
|
+
lastLoginIpa: z.string().nullable(),
|
|
56
|
+
syncedAt: z.string().nullable(),
|
|
57
|
+
sshPublicKeys: z.array(z.string()),
|
|
58
|
+
sshFingerprints: z.array(z.string()),
|
|
59
|
+
});
|
|
60
|
+
export type IpaUserData = z.infer<typeof IpaUserDataSchema>;
|
|
61
|
+
|
|
62
|
+
const RichUserFields = {
|
|
63
|
+
accountExpires: z.string().nullable(),
|
|
64
|
+
lastLoginLocal: z.string().nullable(),
|
|
65
|
+
memberofGroup: z.array(z.string()),
|
|
66
|
+
memberofGroupIds: z.array(z.uuid()),
|
|
67
|
+
manages: z.array(z.string()),
|
|
68
|
+
managesGroupIds: z.array(z.uuid()),
|
|
69
|
+
} satisfies z.ZodRawShape;
|
|
70
|
+
|
|
71
|
+
export const IpaUserSchema = BaseUserSchema.extend({
|
|
72
|
+
provider: z.literal("ipa"),
|
|
73
|
+
ipa: IpaUserDataSchema,
|
|
74
|
+
...RichUserFields,
|
|
75
|
+
});
|
|
76
|
+
export type IpaUser = z.infer<typeof IpaUserSchema>;
|
|
77
|
+
|
|
78
|
+
export const LocalUserSchema = BaseUserSchema.extend({
|
|
79
|
+
provider: z.literal("local"),
|
|
80
|
+
ipa: z.null(),
|
|
81
|
+
...RichUserFields,
|
|
82
|
+
});
|
|
83
|
+
export type LocalUser = z.infer<typeof LocalUserSchema>;
|
|
84
|
+
|
|
85
|
+
export const UserSchema = z.discriminatedUnion("provider", [IpaUserSchema, LocalUserSchema]);
|
|
86
|
+
export type User = z.infer<typeof UserSchema>;
|
|
87
|
+
|
|
88
|
+
export const BaseGroupSchema = z.object({
|
|
89
|
+
id: z.uuid(),
|
|
90
|
+
provider: UserProviderSchema,
|
|
91
|
+
name: z.string(),
|
|
92
|
+
description: z.string().nullable(),
|
|
93
|
+
gidnumber: z.number().nullable(),
|
|
94
|
+
});
|
|
95
|
+
export type BaseGroup = z.infer<typeof BaseGroupSchema>;
|
|
96
|
+
|
|
97
|
+
export const EntityKindSchema = z.enum(["user", "group", "service_account"]);
|
|
98
|
+
export type EntityKind = z.infer<typeof EntityKindSchema>;
|
|
99
|
+
|
|
100
|
+
export const EntityRelationSchema = z.object({
|
|
101
|
+
direct: z.boolean().optional(),
|
|
102
|
+
});
|
|
103
|
+
export type EntityRelation = z.infer<typeof EntityRelationSchema>;
|
|
104
|
+
|
|
105
|
+
export const EntityListItemSchema = z.discriminatedUnion("kind", [
|
|
106
|
+
z.object({
|
|
107
|
+
kind: z.literal("user"),
|
|
108
|
+
user: BaseUserSchema,
|
|
109
|
+
relation: EntityRelationSchema.optional(),
|
|
110
|
+
}),
|
|
111
|
+
z.object({
|
|
112
|
+
kind: z.literal("group"),
|
|
113
|
+
group: BaseGroupSchema,
|
|
114
|
+
relation: EntityRelationSchema.optional(),
|
|
115
|
+
}),
|
|
116
|
+
z.object({
|
|
117
|
+
kind: z.literal("service_account"),
|
|
118
|
+
serviceAccount: z.object({
|
|
119
|
+
id: z.uuid(),
|
|
120
|
+
name: z.string(),
|
|
121
|
+
kind: z.enum(["user_delegated", "resource_bound"]),
|
|
122
|
+
status: z.enum(["active", "disabled"]),
|
|
123
|
+
delegatedUserId: z.uuid().nullable(),
|
|
124
|
+
appId: z.string().nullable(),
|
|
125
|
+
resourceType: z.string().nullable(),
|
|
126
|
+
resourceId: z.string().nullable(),
|
|
127
|
+
createdBy: z.uuid().nullable(),
|
|
128
|
+
createdAt: z.string(),
|
|
129
|
+
}),
|
|
130
|
+
relation: EntityRelationSchema.optional(),
|
|
131
|
+
}),
|
|
132
|
+
]);
|
|
133
|
+
export type EntityListItem = z.infer<typeof EntityListItemSchema>;
|
|
134
|
+
|
|
135
|
+
export const GroupMemberSchema = z.object({
|
|
136
|
+
type: z.enum(["user", "group"]),
|
|
137
|
+
id: z.string(),
|
|
138
|
+
displayName: z.string().nullable(),
|
|
139
|
+
});
|
|
140
|
+
export type GroupMember = z.infer<typeof GroupMemberSchema>;
|
|
141
|
+
|
|
142
|
+
export const SearchQuerySchema = z.object({
|
|
143
|
+
search: z.string().optional(),
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
export const PaginationQuerySchema = z.object({
|
|
147
|
+
page: z.coerce.number().int().positive().optional().default(1),
|
|
148
|
+
per_page: z.coerce.number().int().min(1).max(100).optional().default(20),
|
|
149
|
+
});
|
|
150
|
+
export type PaginationQuery = z.infer<typeof PaginationQuerySchema>;
|
|
151
|
+
|
|
152
|
+
export const PaginationResponseSchema = z.object({
|
|
153
|
+
page: z.number(),
|
|
154
|
+
per_page: z.number(),
|
|
155
|
+
total: z.number(),
|
|
156
|
+
total_pages: z.number(),
|
|
157
|
+
has_next: z.boolean(),
|
|
158
|
+
});
|
|
159
|
+
export type PaginationResponse = z.infer<typeof PaginationResponseSchema>;
|
|
160
|
+
|
|
161
|
+
export type PaginationParams = {
|
|
162
|
+
page: number;
|
|
163
|
+
perPage: number;
|
|
164
|
+
offset: number;
|
|
165
|
+
};
|
|
166
|
+
|
|
167
|
+
export const parsePagination = (query: { page?: number; per_page?: number }): PaginationParams => {
|
|
168
|
+
const page = query.page ?? 1;
|
|
169
|
+
const perPage = query.per_page ?? 20;
|
|
170
|
+
const offset = (page - 1) * perPage;
|
|
171
|
+
return { page, perPage, offset };
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
export const createPagination = (params: PaginationParams, total: number): PaginationResponse => {
|
|
175
|
+
const totalPages = Math.ceil(total / params.perPage);
|
|
176
|
+
return {
|
|
177
|
+
page: params.page,
|
|
178
|
+
per_page: params.perPage,
|
|
179
|
+
total,
|
|
180
|
+
total_pages: totalPages,
|
|
181
|
+
has_next: params.page < totalPages,
|
|
182
|
+
};
|
|
183
|
+
};
|
|
184
|
+
|
|
185
|
+
export const ErrorResponseSchema = z.object({
|
|
186
|
+
message: z.string(),
|
|
187
|
+
code: z.string().optional(),
|
|
188
|
+
});
|
|
189
|
+
export type ErrorResponse = z.infer<typeof ErrorResponseSchema>;
|
|
190
|
+
|
|
191
|
+
export const MessageResponseSchema = z.object({
|
|
192
|
+
message: z.string(),
|
|
193
|
+
});
|
|
194
|
+
export type MessageResponse = z.infer<typeof MessageResponseSchema>;
|
|
195
|
+
|
|
196
|
+
export type MutationResult<T = void> = { ok: true; data: T } | { ok: false; error: string; status: 400 | 401 | 403 | 404 | 409 | 500 };
|
|
197
|
+
|
|
198
|
+
export const PermissionLevelSchema = z.enum(["none", "read", "write", "admin"]);
|
|
199
|
+
export type PermissionLevel = z.infer<typeof PermissionLevelSchema>;
|
|
200
|
+
|
|
201
|
+
export const ServiceAccountKindSchema = z.enum(["user_delegated", "resource_bound"]);
|
|
202
|
+
export type ServiceAccountKind = z.infer<typeof ServiceAccountKindSchema>;
|
|
203
|
+
|
|
204
|
+
export const ServiceAccountStatusSchema = z.enum(["active", "disabled"]);
|
|
205
|
+
export type ServiceAccountStatus = z.infer<typeof ServiceAccountStatusSchema>;
|
|
206
|
+
|
|
207
|
+
export const ServiceAccountSchema = z.object({
|
|
208
|
+
id: z.uuid(),
|
|
209
|
+
name: z.string(),
|
|
210
|
+
kind: ServiceAccountKindSchema,
|
|
211
|
+
status: ServiceAccountStatusSchema,
|
|
212
|
+
delegatedUserId: z.uuid().nullable(),
|
|
213
|
+
appId: z.string().nullable(),
|
|
214
|
+
resourceType: z.string().nullable(),
|
|
215
|
+
resourceId: z.string().nullable(),
|
|
216
|
+
createdBy: z.uuid().nullable(),
|
|
217
|
+
createdAt: z.string(),
|
|
218
|
+
});
|
|
219
|
+
export type ServiceAccount = z.infer<typeof ServiceAccountSchema>;
|
|
220
|
+
|
|
221
|
+
export const ServiceAccountCredentialStatusSchema = z.enum(["active", "revoked"]);
|
|
222
|
+
export type ServiceAccountCredentialStatus = z.infer<typeof ServiceAccountCredentialStatusSchema>;
|
|
223
|
+
|
|
224
|
+
export const ServiceAccountCredentialSchema = z.object({
|
|
225
|
+
id: z.uuid(),
|
|
226
|
+
serviceAccountId: z.uuid(),
|
|
227
|
+
name: z.string(),
|
|
228
|
+
kind: z.literal("api_token"),
|
|
229
|
+
status: ServiceAccountCredentialStatusSchema,
|
|
230
|
+
tokenPrefix: z.string(),
|
|
231
|
+
scopes: z.array(z.string()),
|
|
232
|
+
expiresAt: z.string().nullable(),
|
|
233
|
+
lastUsedAt: z.string().nullable(),
|
|
234
|
+
createdBy: z.uuid().nullable(),
|
|
235
|
+
createdAt: z.string(),
|
|
236
|
+
revokedAt: z.string().nullable(),
|
|
237
|
+
revokedBy: z.uuid().nullable(),
|
|
238
|
+
});
|
|
239
|
+
export type ServiceAccountCredential = z.infer<typeof ServiceAccountCredentialSchema>;
|
|
240
|
+
|
|
241
|
+
export const CreateUserApiKeySchema = z.object({
|
|
242
|
+
name: z.string().trim().min(1).max(120),
|
|
243
|
+
expiresAt: z.string().datetime().nullable().optional(),
|
|
244
|
+
});
|
|
245
|
+
export type CreateUserApiKey = z.infer<typeof CreateUserApiKeySchema>;
|
|
246
|
+
|
|
247
|
+
export const CreateUserApiKeyResponseSchema = z.object({
|
|
248
|
+
credential: ServiceAccountCredentialSchema,
|
|
249
|
+
token: z.string(),
|
|
250
|
+
});
|
|
251
|
+
export type CreateUserApiKeyResponse = z.infer<typeof CreateUserApiKeyResponseSchema>;
|
|
252
|
+
|
|
253
|
+
export const WebAuthnPasskeySchema = z.object({
|
|
254
|
+
id: z.uuid(),
|
|
255
|
+
userId: z.uuid(),
|
|
256
|
+
name: z.string(),
|
|
257
|
+
transports: z.array(z.string()),
|
|
258
|
+
deviceType: z.string().nullable(),
|
|
259
|
+
backedUp: z.boolean(),
|
|
260
|
+
createdAt: z.string(),
|
|
261
|
+
lastUsedAt: z.string().nullable(),
|
|
262
|
+
});
|
|
263
|
+
export type WebAuthnPasskey = z.infer<typeof WebAuthnPasskeySchema>;
|
|
264
|
+
|
|
265
|
+
export const CreateWebAuthnPasskeySchema = z.object({
|
|
266
|
+
name: z.string().trim().min(1).max(120),
|
|
267
|
+
response: z.unknown(),
|
|
268
|
+
});
|
|
269
|
+
export type CreateWebAuthnPasskey = z.infer<typeof CreateWebAuthnPasskeySchema>;
|
|
270
|
+
|
|
271
|
+
export const ListWebAuthnPasskeysResponseSchema = z.object({
|
|
272
|
+
items: z.array(WebAuthnPasskeySchema),
|
|
273
|
+
});
|
|
274
|
+
export type ListWebAuthnPasskeysResponse = z.infer<typeof ListWebAuthnPasskeysResponseSchema>;
|
|
275
|
+
|
|
276
|
+
export const AccountActivitySchema = z.object({
|
|
277
|
+
id: z.number(),
|
|
278
|
+
createdAt: z.string(),
|
|
279
|
+
action: z.string(),
|
|
280
|
+
label: z.string(),
|
|
281
|
+
outcome: z.enum(["allowed", "denied", "failed"]),
|
|
282
|
+
context: z.string().nullable(),
|
|
283
|
+
});
|
|
284
|
+
export type AccountActivity = z.infer<typeof AccountActivitySchema>;
|
|
285
|
+
|
|
286
|
+
export const AccountActivityListResponseSchema = z.object({
|
|
287
|
+
items: z.array(AccountActivitySchema),
|
|
288
|
+
});
|
|
289
|
+
export type AccountActivityListResponse = z.infer<typeof AccountActivityListResponseSchema>;
|
|
290
|
+
|
|
291
|
+
export const PrincipalSchema = z.discriminatedUnion("type", [
|
|
292
|
+
z.object({ type: z.literal("user"), userId: z.uuid() }),
|
|
293
|
+
z.object({ type: z.literal("group"), groupId: z.uuid() }),
|
|
294
|
+
z.object({ type: z.literal("service_account"), serviceAccountId: z.uuid() }),
|
|
295
|
+
z.object({ type: z.literal("authenticated") }),
|
|
296
|
+
z.object({ type: z.literal("public") }),
|
|
297
|
+
]);
|
|
298
|
+
export type Principal = z.infer<typeof PrincipalSchema>;
|
|
299
|
+
|
|
300
|
+
export const AccessEntrySchema = z.object({
|
|
301
|
+
id: z.uuid(),
|
|
302
|
+
principal: PrincipalSchema,
|
|
303
|
+
permission: PermissionLevelSchema,
|
|
304
|
+
createdAt: z.string(),
|
|
305
|
+
displayName: z.string().optional(),
|
|
306
|
+
avatarHash: z.string().nullable().optional(),
|
|
307
|
+
});
|
|
308
|
+
export type AccessEntry = z.infer<typeof AccessEntrySchema>;
|
|
309
|
+
|
|
310
|
+
export const NotebookPresenceParticipantSchema = z.object({
|
|
311
|
+
userId: z.uuid(),
|
|
312
|
+
displayName: z.string(),
|
|
313
|
+
avatarHash: z.string().nullable().optional(),
|
|
314
|
+
color: z.string(),
|
|
315
|
+
peerCount: z.number().int().positive(),
|
|
316
|
+
joinedAt: z.string(),
|
|
317
|
+
});
|
|
318
|
+
export type NotebookPresenceParticipant = z.infer<typeof NotebookPresenceParticipantSchema>;
|
|
319
|
+
|
|
320
|
+
export const GrantAccessSchema = z.object({
|
|
321
|
+
principal: PrincipalSchema,
|
|
322
|
+
permission: PermissionLevelSchema,
|
|
323
|
+
});
|
|
324
|
+
export type GrantAccess = z.infer<typeof GrantAccessSchema>;
|
|
325
|
+
|
|
326
|
+
export const UpdateAccessSchema = z.object({
|
|
327
|
+
permission: PermissionLevelSchema,
|
|
328
|
+
});
|
|
329
|
+
export type UpdateAccess = z.infer<typeof UpdateAccessSchema>;
|
|
330
|
+
|
|
331
|
+
// ── Settings (browser-safe types) ────────────────────────────────────
|
|
332
|
+
|
|
333
|
+
export type SettingKind =
|
|
334
|
+
| "string"
|
|
335
|
+
| "text"
|
|
336
|
+
| "email"
|
|
337
|
+
| "url"
|
|
338
|
+
| "secret"
|
|
339
|
+
| "image"
|
|
340
|
+
| "boolean"
|
|
341
|
+
| "number"
|
|
342
|
+
| "enum"
|
|
343
|
+
| "string_list"
|
|
344
|
+
| "number_list"
|
|
345
|
+
| "cron"
|
|
346
|
+
| "timezone"
|
|
347
|
+
| "template";
|
|
348
|
+
|
|
349
|
+
export type SettingOption = {
|
|
350
|
+
value: string;
|
|
351
|
+
label: string;
|
|
352
|
+
};
|
|
353
|
+
|
|
354
|
+
export type SettingValueSource = "custom" | "env" | "default";
|
|
355
|
+
|
|
356
|
+
export type SettingEntry = {
|
|
357
|
+
key: string;
|
|
358
|
+
label: string;
|
|
359
|
+
kind: SettingKind;
|
|
360
|
+
description: string;
|
|
361
|
+
placeholder?: string;
|
|
362
|
+
group: string;
|
|
363
|
+
value: unknown;
|
|
364
|
+
default: unknown;
|
|
365
|
+
resetValue: unknown;
|
|
366
|
+
valueSource: SettingValueSource;
|
|
367
|
+
resetValueSource: Exclude<SettingValueSource, "custom">;
|
|
368
|
+
isCustom: boolean;
|
|
369
|
+
templateVars?: string[];
|
|
370
|
+
options?: SettingOption[];
|
|
371
|
+
min?: number;
|
|
372
|
+
max?: number;
|
|
373
|
+
};
|
|
374
|
+
|
|
375
|
+
// ── Request model ───────────────────────────────────────────────────────────
|
|
376
|
+
// `RequestActor` answers "which credential acted?", `AccessSubject` answers
|
|
377
|
+
// "whose grants should be checked?". They differ for a user-bound credential:
|
|
378
|
+
// the actor is a service account, the subject is its user.
|
|
379
|
+
|
|
380
|
+
export type InvocationProvenance = {
|
|
381
|
+
kind: "invocation";
|
|
382
|
+
callingAppId: string;
|
|
383
|
+
credentialKind: "session" | "oauth" | "api_key" | "mandate";
|
|
384
|
+
invocationId: string;
|
|
385
|
+
requestId?: string | null;
|
|
386
|
+
mandateId?: string;
|
|
387
|
+
mandateRevision?: number;
|
|
388
|
+
workloadType?: string;
|
|
389
|
+
workloadId?: string;
|
|
390
|
+
};
|
|
391
|
+
|
|
392
|
+
export type UserRequestActor = { kind: "user"; user: User; delegation?: InvocationProvenance };
|
|
393
|
+
|
|
394
|
+
export type ServiceAccountRequestActor = {
|
|
395
|
+
kind: "service_account";
|
|
396
|
+
serviceAccount: ServiceAccount;
|
|
397
|
+
delegatedUser: User | null;
|
|
398
|
+
scopes: string[];
|
|
399
|
+
credentialId?: string | null;
|
|
400
|
+
credentialExpiresAt?: string | null;
|
|
401
|
+
delegation?: InvocationProvenance;
|
|
402
|
+
};
|
|
403
|
+
|
|
404
|
+
export type RequestActor = UserRequestActor | ServiceAccountRequestActor;
|
|
405
|
+
|
|
406
|
+
export type AccessSubject =
|
|
407
|
+
| { type: "user"; userId: string; delegatedByServiceAccountId?: string | null }
|
|
408
|
+
| { type: "service_account"; serviceAccountId: string };
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { isUnsafeNetworkAddress, isUnsafeNetworkHostname, networkAddressFamily, normalizeNetworkHostname } from "../shared/network-address";
|
|
3
|
+
|
|
4
|
+
export const NotificationDeliveryStatusSchema = z.enum(["deferred", "pending", "sending", "delivered", "suppressed", "failed"]);
|
|
5
|
+
export type NotificationDeliveryStatus = z.infer<typeof NotificationDeliveryStatusSchema>;
|
|
6
|
+
|
|
7
|
+
export const UserNotificationPreferenceSchema = z.object({
|
|
8
|
+
id: z.string(),
|
|
9
|
+
appId: z.string(),
|
|
10
|
+
kind: z.string(),
|
|
11
|
+
label: z.string(),
|
|
12
|
+
description: z.string(),
|
|
13
|
+
recommendedChannels: z.array(z.string()),
|
|
14
|
+
requiredChannels: z.array(z.string()),
|
|
15
|
+
selectedChannels: z.array(z.string()),
|
|
16
|
+
effectiveChannels: z.array(z.string()),
|
|
17
|
+
customized: z.boolean(),
|
|
18
|
+
});
|
|
19
|
+
export type UserNotificationPreference = z.infer<typeof UserNotificationPreferenceSchema>;
|
|
20
|
+
|
|
21
|
+
export const UserNotificationPreferencesResponseSchema = z.object({
|
|
22
|
+
availableChannels: z.array(z.string()),
|
|
23
|
+
definitions: z.array(UserNotificationPreferenceSchema),
|
|
24
|
+
});
|
|
25
|
+
export type UserNotificationPreferencesResponse = z.infer<typeof UserNotificationPreferencesResponseSchema>;
|
|
26
|
+
|
|
27
|
+
export const UpdateUserNotificationPreferenceSchema = z.object({
|
|
28
|
+
channels: z.array(z.string().trim().min(1).max(80)).max(20),
|
|
29
|
+
});
|
|
30
|
+
export type UpdateUserNotificationPreference = z.infer<typeof UpdateUserNotificationPreferenceSchema>;
|
|
31
|
+
|
|
32
|
+
export const UserNotificationHistoryItemSchema = z.object({
|
|
33
|
+
id: z.uuid(),
|
|
34
|
+
eventId: z.uuid(),
|
|
35
|
+
definitionId: z.string(),
|
|
36
|
+
appId: z.string(),
|
|
37
|
+
label: z.string(),
|
|
38
|
+
title: z.string(),
|
|
39
|
+
targetHref: z.string().nullable(),
|
|
40
|
+
channel: z.string(),
|
|
41
|
+
destinationLabel: z.string(),
|
|
42
|
+
required: z.boolean(),
|
|
43
|
+
status: NotificationDeliveryStatusSchema,
|
|
44
|
+
attemptCount: z.number().int().nonnegative(),
|
|
45
|
+
errorCode: z.string().nullable(),
|
|
46
|
+
errorMessage: z.string().nullable(),
|
|
47
|
+
createdAt: z.string().datetime(),
|
|
48
|
+
deliveredAt: z.string().datetime().nullable(),
|
|
49
|
+
});
|
|
50
|
+
export type UserNotificationHistoryItem = z.infer<typeof UserNotificationHistoryItemSchema>;
|
|
51
|
+
|
|
52
|
+
export const UserNotificationHistoryResponseSchema = z.object({
|
|
53
|
+
items: z.array(UserNotificationHistoryItemSchema),
|
|
54
|
+
total: z.number().int().nonnegative(),
|
|
55
|
+
page: z.number().int().positive(),
|
|
56
|
+
perPage: z.number().int().positive(),
|
|
57
|
+
totalPages: z.number().int().nonnegative(),
|
|
58
|
+
});
|
|
59
|
+
export type UserNotificationHistoryResponse = z.infer<typeof UserNotificationHistoryResponseSchema>;
|
|
60
|
+
|
|
61
|
+
export const isSafeBrowserPushEndpoint = (value: string): boolean => {
|
|
62
|
+
try {
|
|
63
|
+
if (/[\\\u0000-\u001f\u007f]/.test(value)) return false;
|
|
64
|
+
const endpoint = new URL(value);
|
|
65
|
+
const hostname = normalizeNetworkHostname(endpoint.hostname);
|
|
66
|
+
const family = networkAddressFamily(hostname);
|
|
67
|
+
return (
|
|
68
|
+
endpoint.protocol === "https:" &&
|
|
69
|
+
!endpoint.username &&
|
|
70
|
+
!endpoint.password &&
|
|
71
|
+
(!endpoint.port || endpoint.port === "443") &&
|
|
72
|
+
!endpoint.hash &&
|
|
73
|
+
!isUnsafeNetworkHostname(hostname) &&
|
|
74
|
+
(family === null || !isUnsafeNetworkAddress(hostname))
|
|
75
|
+
);
|
|
76
|
+
} catch {
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
export const BrowserPushSubscriptionSchema = z.object({
|
|
82
|
+
endpoint: z.url().max(4_000).refine(isSafeBrowserPushEndpoint, "Push endpoint must use public HTTPS"),
|
|
83
|
+
expirationTime: z.number().nonnegative().nullable().optional(),
|
|
84
|
+
keys: z.object({
|
|
85
|
+
p256dh: z.string().min(20).max(500),
|
|
86
|
+
auth: z.string().min(8).max(200),
|
|
87
|
+
}),
|
|
88
|
+
});
|
|
89
|
+
export type BrowserPushSubscription = z.infer<typeof BrowserPushSubscriptionSchema>;
|
|
90
|
+
|
|
91
|
+
export const BrowserNotificationConfigurationSchema = z.object({ publicKey: z.string().min(1) });
|
|
92
|
+
export type BrowserNotificationConfiguration = z.infer<typeof BrowserNotificationConfigurationSchema>;
|
|
93
|
+
|
|
94
|
+
export const BrowserNotificationEndpointSchema = z.object({ id: z.uuid(), label: z.string() });
|
|
95
|
+
export type BrowserNotificationEndpoint = z.infer<typeof BrowserNotificationEndpointSchema>;
|
|
96
|
+
|
|
97
|
+
export const RegisterBrowserNotificationEndpointSchema = z.object({
|
|
98
|
+
subscription: BrowserPushSubscriptionSchema,
|
|
99
|
+
label: z.string().trim().min(1).max(120).default("This browser"),
|
|
100
|
+
});
|
|
101
|
+
export type RegisterBrowserNotificationEndpoint = z.infer<typeof RegisterBrowserNotificationEndpointSchema>;
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Widget JSON contract — what an app's widget endpoint must return when the
|
|
5
|
+
* dashboard fetches it. Each block maps 1:1 to a `<Widget*>` SolidJS component
|
|
6
|
+
* (see the portable `@k2b/ui` widget primitives).
|
|
7
|
+
*
|
|
8
|
+
* The dashboard sends the user's credential only to Core. Core calls the
|
|
9
|
+
* framework-owned target handler with an exact invocation; the handler remains
|
|
10
|
+
* responsible for permission gating:
|
|
11
|
+
* - `200` + body → render
|
|
12
|
+
* - `403` → list as unavailable at the user's access level
|
|
13
|
+
* - `204` → skip silently because there is no content
|
|
14
|
+
* - anything else → log and render an error placeholder
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
export const WIDGET_MAX_RESPONSE_BYTES = 128 * 1024;
|
|
18
|
+
|
|
19
|
+
const WidgetTextSchema = z.string().max(10_000);
|
|
20
|
+
const WidgetLabelSchema = z.string().max(500);
|
|
21
|
+
const WidgetIconSchema = z.string().max(120);
|
|
22
|
+
const WidgetClassSchema = z.string().max(500);
|
|
23
|
+
const isSafeWidgetHref = (value: string): boolean => {
|
|
24
|
+
if (/[\\\u0000-\u001f\u007f-\u009f]/u.test(value)) return false;
|
|
25
|
+
try {
|
|
26
|
+
const url = new URL(value, "https://cloud.invalid");
|
|
27
|
+
return url.protocol === "https:" || url.protocol === "http:";
|
|
28
|
+
} catch {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
const WidgetHrefSchema = z
|
|
33
|
+
.string()
|
|
34
|
+
.min(1)
|
|
35
|
+
.max(2048)
|
|
36
|
+
.refine(isSafeWidgetHref, "Widget links must be relative paths or HTTP(S) URLs without control characters or backslashes");
|
|
37
|
+
|
|
38
|
+
export const WidgetToneSchema = z.enum(["emerald", "amber", "red", "blue", "zinc"]);
|
|
39
|
+
export type WidgetTone = z.infer<typeof WidgetToneSchema>;
|
|
40
|
+
|
|
41
|
+
export type DashboardWidgetZone = "focus" | "overview" | "context";
|
|
42
|
+
export type DashboardWidgetSpan = "standard" | "wide";
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Stable, app-owned recommendation for a widget's initial dashboard layout.
|
|
46
|
+
* Explicit user layout settings always take precedence.
|
|
47
|
+
*/
|
|
48
|
+
export type DashboardWidgetPresentation = {
|
|
49
|
+
defaultZone?: DashboardWidgetZone;
|
|
50
|
+
defaultSpan?: DashboardWidgetSpan;
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
export const WidgetAccentSchema = z
|
|
54
|
+
.object({
|
|
55
|
+
tone: WidgetToneSchema,
|
|
56
|
+
icon: WidgetIconSchema,
|
|
57
|
+
text: WidgetLabelSchema.optional(),
|
|
58
|
+
})
|
|
59
|
+
.strip();
|
|
60
|
+
|
|
61
|
+
export type WidgetAccent = z.infer<typeof WidgetAccentSchema>;
|
|
62
|
+
|
|
63
|
+
export const WidgetStatBlockSchema = z
|
|
64
|
+
.object({
|
|
65
|
+
kind: z.literal("stat"),
|
|
66
|
+
value: z.union([WidgetTextSchema, z.number()]),
|
|
67
|
+
label: WidgetLabelSchema,
|
|
68
|
+
sub: WidgetTextSchema.optional(),
|
|
69
|
+
valueClass: WidgetClassSchema.optional(),
|
|
70
|
+
accent: WidgetAccentSchema.optional(),
|
|
71
|
+
grow: z.boolean().optional(),
|
|
72
|
+
})
|
|
73
|
+
.strip();
|
|
74
|
+
export type WidgetStatBlock = z.infer<typeof WidgetStatBlockSchema>;
|
|
75
|
+
|
|
76
|
+
export const WidgetListItemSchema = z
|
|
77
|
+
.object({
|
|
78
|
+
icon: WidgetIconSchema.optional(),
|
|
79
|
+
iconTone: WidgetToneSchema.optional(),
|
|
80
|
+
label: WidgetLabelSchema,
|
|
81
|
+
sub: WidgetTextSchema.optional(),
|
|
82
|
+
meta: WidgetLabelSchema.optional(),
|
|
83
|
+
href: WidgetHrefSchema.optional(),
|
|
84
|
+
})
|
|
85
|
+
.strip();
|
|
86
|
+
export type WidgetListItem = z.infer<typeof WidgetListItemSchema>;
|
|
87
|
+
|
|
88
|
+
export const WidgetListBlockSchema = z
|
|
89
|
+
.object({
|
|
90
|
+
kind: z.literal("list"),
|
|
91
|
+
items: z.array(WidgetListItemSchema).max(100),
|
|
92
|
+
emptyMessage: WidgetTextSchema.optional(),
|
|
93
|
+
grow: z.boolean().optional(),
|
|
94
|
+
})
|
|
95
|
+
.strip();
|
|
96
|
+
export type WidgetListBlock = z.infer<typeof WidgetListBlockSchema>;
|
|
97
|
+
|
|
98
|
+
export const WidgetStatusBlockSchema = z
|
|
99
|
+
.object({
|
|
100
|
+
kind: z.literal("status"),
|
|
101
|
+
tone: z.enum(["ok", "warn", "error", "info"]),
|
|
102
|
+
title: WidgetLabelSchema,
|
|
103
|
+
message: WidgetTextSchema.optional(),
|
|
104
|
+
icon: WidgetIconSchema.optional(),
|
|
105
|
+
grow: z.boolean().optional(),
|
|
106
|
+
})
|
|
107
|
+
.strip();
|
|
108
|
+
export type WidgetStatusBlock = z.infer<typeof WidgetStatusBlockSchema>;
|
|
109
|
+
|
|
110
|
+
export const WidgetPillSchema = z
|
|
111
|
+
.object({
|
|
112
|
+
label: WidgetLabelSchema,
|
|
113
|
+
value: z.union([WidgetTextSchema, z.number()]),
|
|
114
|
+
tone: WidgetToneSchema.optional(),
|
|
115
|
+
href: WidgetHrefSchema.optional(),
|
|
116
|
+
})
|
|
117
|
+
.strip();
|
|
118
|
+
export type WidgetPill = z.infer<typeof WidgetPillSchema>;
|
|
119
|
+
|
|
120
|
+
export const WidgetPillsBlockSchema = z
|
|
121
|
+
.object({
|
|
122
|
+
kind: z.literal("pills"),
|
|
123
|
+
pills: z.array(WidgetPillSchema).max(50),
|
|
124
|
+
grow: z.boolean().optional(),
|
|
125
|
+
})
|
|
126
|
+
.strip();
|
|
127
|
+
export type WidgetPillsBlock = z.infer<typeof WidgetPillsBlockSchema>;
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Compact empty state for unavailable or absent widget content.
|
|
131
|
+
* The dashboard renders this through the shared Core Placeholder component.
|
|
132
|
+
*/
|
|
133
|
+
export const WidgetPlaceholderBlockSchema = z
|
|
134
|
+
.object({
|
|
135
|
+
kind: z.literal("placeholder"),
|
|
136
|
+
title: WidgetLabelSchema,
|
|
137
|
+
description: WidgetTextSchema.optional(),
|
|
138
|
+
icon: WidgetIconSchema.optional(),
|
|
139
|
+
})
|
|
140
|
+
.strip();
|
|
141
|
+
export type WidgetPlaceholderBlock = z.infer<typeof WidgetPlaceholderBlockSchema>;
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Hero block — single big centred message. Use for spotlight content like a
|
|
145
|
+
* quote or a single weather location. Always grows to fill available space.
|
|
146
|
+
*/
|
|
147
|
+
export const WidgetHeroBlockSchema = z
|
|
148
|
+
.object({
|
|
149
|
+
kind: z.literal("hero"),
|
|
150
|
+
title: WidgetTextSchema,
|
|
151
|
+
subtitle: WidgetTextSchema.optional(),
|
|
152
|
+
icon: WidgetIconSchema.optional(),
|
|
153
|
+
tone: WidgetToneSchema.optional(),
|
|
154
|
+
})
|
|
155
|
+
.strip();
|
|
156
|
+
export type WidgetHeroBlock = z.infer<typeof WidgetHeroBlockSchema>;
|
|
157
|
+
|
|
158
|
+
/** Discriminated union of every block type the dashboard can render. */
|
|
159
|
+
export const WidgetBlockSchema = z.discriminatedUnion("kind", [
|
|
160
|
+
WidgetStatBlockSchema,
|
|
161
|
+
WidgetListBlockSchema,
|
|
162
|
+
WidgetStatusBlockSchema,
|
|
163
|
+
WidgetPillsBlockSchema,
|
|
164
|
+
WidgetPlaceholderBlockSchema,
|
|
165
|
+
WidgetHeroBlockSchema,
|
|
166
|
+
]);
|
|
167
|
+
export type WidgetBlock = z.infer<typeof WidgetBlockSchema>;
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Top-level shape returned by a widget endpoint. The dashboard renders the
|
|
171
|
+
* `<Widget>` container with the given title/icon/href/meta, then stacks the
|
|
172
|
+
* blocks vertically — composition is open: any number, any order.
|
|
173
|
+
*/
|
|
174
|
+
export const WidgetResponseSchema = z
|
|
175
|
+
.object({
|
|
176
|
+
title: WidgetLabelSchema,
|
|
177
|
+
icon: WidgetIconSchema.optional(),
|
|
178
|
+
href: WidgetHrefSchema.optional(),
|
|
179
|
+
meta: WidgetLabelSchema.optional(),
|
|
180
|
+
blocks: z.array(WidgetBlockSchema).max(24),
|
|
181
|
+
})
|
|
182
|
+
.strip();
|
|
183
|
+
export type WidgetResponse = z.infer<typeof WidgetResponseSchema>;
|