@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,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-request settings snapshot.
|
|
3
|
+
*
|
|
4
|
+
* Loads every known setting via `bulkRead` (one Redis MGET + DB fallback for
|
|
5
|
+
* misses) and builds a frozen nested object keyed by dotted-path segments.
|
|
6
|
+
*
|
|
7
|
+
* Used by the middleware that runs at request start (see `define-app.ts`).
|
|
8
|
+
* Exposed on the Hono context as `c.get("settings")` — typed per-app via
|
|
9
|
+
* `AppContext<typeof app>`.
|
|
10
|
+
*
|
|
11
|
+
* The snapshot is read-only and stable for the duration of one request:
|
|
12
|
+
* later writes (in this or other containers) do not mutate this snapshot.
|
|
13
|
+
* If a long-running handler needs fresh values, it should use the typed
|
|
14
|
+
* async API (`app.settings.get(key)`) instead.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { allKnownKeys, bulkRead } from "./store";
|
|
18
|
+
|
|
19
|
+
/** Build a frozen nested object from the registered settings. */
|
|
20
|
+
export const loadSnapshot = async (): Promise<Readonly<Record<string, unknown>>> => {
|
|
21
|
+
const flat = await bulkRead(allKnownKeys());
|
|
22
|
+
|
|
23
|
+
const tree: Record<string, unknown> = {};
|
|
24
|
+
for (const [key, value] of flat) {
|
|
25
|
+
const parts = key.split(".");
|
|
26
|
+
let cursor = tree;
|
|
27
|
+
for (let i = 0; i < parts.length - 1; i += 1) {
|
|
28
|
+
const part = parts[i]!;
|
|
29
|
+
const existing = cursor[part];
|
|
30
|
+
if (typeof existing !== "object" || existing === null || Array.isArray(existing)) {
|
|
31
|
+
cursor[part] = {};
|
|
32
|
+
}
|
|
33
|
+
cursor = cursor[part] as Record<string, unknown>;
|
|
34
|
+
}
|
|
35
|
+
cursor[parts[parts.length - 1]!] = value;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
return deepFreeze(tree);
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
const deepFreeze = <T>(obj: T): Readonly<T> => {
|
|
42
|
+
if (obj === null || typeof obj !== "object") return obj;
|
|
43
|
+
for (const value of Object.values(obj as Record<string, unknown>)) {
|
|
44
|
+
if (value !== null && typeof value === "object" && !Object.isFrozen(value)) {
|
|
45
|
+
deepFreeze(value);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return Object.freeze(obj);
|
|
49
|
+
};
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Settings store — Redis cache-aside read/write primitives.
|
|
3
|
+
*
|
|
4
|
+
* Pattern: each key is cached in Redis with a 5-minute TTL. Reads try Redis
|
|
5
|
+
* first, fall back to DB on miss, and populate Redis. Writes update DB and
|
|
6
|
+
* delete the Redis key (next reader repopulates with fresh DB state).
|
|
7
|
+
*
|
|
8
|
+
* This achieves cross-container coherence without polling or pubsub: a write
|
|
9
|
+
* in container A invalidates the shared Redis cache; container B's next read
|
|
10
|
+
* hits Redis (miss after del), goes to DB, sees the new value, repopulates.
|
|
11
|
+
*
|
|
12
|
+
* Reads/writes here are async — sync callers should use the per-request
|
|
13
|
+
* snapshot exposed via `c.get("settings")` (built by snapshot.ts middleware).
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import { redis, sql } from "bun";
|
|
17
|
+
import { toPgTextArray } from "../postgres";
|
|
18
|
+
import { decryptValue, encryptValue } from "./crypto";
|
|
19
|
+
import { SETTINGS, SETTINGS_MAP, type SettingDef, validateSettingValue } from "./defaults";
|
|
20
|
+
|
|
21
|
+
const REDIS_KEY = (k: string) => `settings:${k}`;
|
|
22
|
+
|
|
23
|
+
type SqlClient = typeof sql;
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Forget cached values so every container re-reads on next access.
|
|
27
|
+
*
|
|
28
|
+
* Separate from the write because ordering matters: dropping the cache while a
|
|
29
|
+
* transaction is still open lets another container miss, read the pre-commit
|
|
30
|
+
* row and cache *that* for the full TTL. Callers writing inside a transaction
|
|
31
|
+
* therefore invalidate after it commits.
|
|
32
|
+
*/
|
|
33
|
+
export const invalidateSettingsCache = async (keys: readonly string[]): Promise<void> => {
|
|
34
|
+
await Promise.all(keys.map((key) => redis.del(REDIS_KEY(key))));
|
|
35
|
+
};
|
|
36
|
+
const REDIS_TTL_SEC = 300;
|
|
37
|
+
|
|
38
|
+
type StoredRow = { key: string; value: string };
|
|
39
|
+
type LegacyStoredRow = { key: string; value: string; updated_at: Date | string | null };
|
|
40
|
+
|
|
41
|
+
export type LegacySettingRow = {
|
|
42
|
+
key: string;
|
|
43
|
+
updatedAt: string | null;
|
|
44
|
+
decryptable: boolean;
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Resolve the env-fallback or default value for a key whose DB row is missing
|
|
49
|
+
* or invalid. Mirrors the existing `resolve()` logic in services/settings/index.ts
|
|
50
|
+
* but takes a SettingDef directly (no global state).
|
|
51
|
+
*/
|
|
52
|
+
const resolveFallback = (def: SettingDef | undefined): unknown => {
|
|
53
|
+
if (!def) return undefined;
|
|
54
|
+
const raw = def.envFallback?.();
|
|
55
|
+
if (raw !== undefined) {
|
|
56
|
+
const validated = validateSettingValue(def, raw);
|
|
57
|
+
if (validated.ok) return validated.value;
|
|
58
|
+
}
|
|
59
|
+
return def.default;
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Read a single setting key. Tries Redis first, falls back to DB.
|
|
64
|
+
* On DB hit, populates Redis with TTL. On miss, returns env-fallback or default.
|
|
65
|
+
*/
|
|
66
|
+
export const readKey = async (key: string): Promise<unknown> => {
|
|
67
|
+
const def = SETTINGS_MAP.get(key);
|
|
68
|
+
|
|
69
|
+
const cached = await redis.get(REDIS_KEY(key));
|
|
70
|
+
if (cached !== null) {
|
|
71
|
+
try {
|
|
72
|
+
return JSON.parse(cached);
|
|
73
|
+
} catch {
|
|
74
|
+
// Corrupt cache entry — drop and re-read from DB.
|
|
75
|
+
await redis.del(REDIS_KEY(key));
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const rows = await sql<StoredRow[]>`SELECT value FROM settings.entries WHERE key = ${key}`;
|
|
80
|
+
if (rows.length > 0 && rows[0]) {
|
|
81
|
+
try {
|
|
82
|
+
const decrypted = await decryptValue(rows[0].value);
|
|
83
|
+
if (def) {
|
|
84
|
+
const validated = validateSettingValue(def, decrypted);
|
|
85
|
+
if (validated.ok) {
|
|
86
|
+
await redis.set(REDIS_KEY(key), JSON.stringify(validated.value), "EX", REDIS_TTL_SEC);
|
|
87
|
+
return validated.value;
|
|
88
|
+
}
|
|
89
|
+
} else {
|
|
90
|
+
// No def known — still cache the decrypted value (caller's responsibility to interpret).
|
|
91
|
+
await redis.set(REDIS_KEY(key), JSON.stringify(decrypted), "EX", REDIS_TTL_SEC);
|
|
92
|
+
return decrypted;
|
|
93
|
+
}
|
|
94
|
+
} catch {
|
|
95
|
+
// Decryption failure — legacy row encrypted with a different APP_SECRET.
|
|
96
|
+
// Skip silently and fall through to env/default fallback.
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
return resolveFallback(def);
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Bulk read for snapshot construction. One Redis MGET round-trip, DB fallback
|
|
105
|
+
* for misses (single SELECT with key = ANY), populates Redis for missed keys.
|
|
106
|
+
*
|
|
107
|
+
* Returns a Map keyed by the input keys; every input key is present in the
|
|
108
|
+
* result (with env-fallback or default as last resort).
|
|
109
|
+
*/
|
|
110
|
+
export const bulkRead = async (keys: readonly string[]): Promise<Map<string, unknown>> => {
|
|
111
|
+
const result = new Map<string, unknown>();
|
|
112
|
+
if (keys.length === 0) return result;
|
|
113
|
+
|
|
114
|
+
// 1. Redis MGET — one round-trip
|
|
115
|
+
const cached = await redis.mget(...keys.map(REDIS_KEY));
|
|
116
|
+
const missing: string[] = [];
|
|
117
|
+
for (let i = 0; i < keys.length; i += 1) {
|
|
118
|
+
const k = keys[i]!;
|
|
119
|
+
const c = cached[i];
|
|
120
|
+
if (c !== null && c !== undefined) {
|
|
121
|
+
try {
|
|
122
|
+
result.set(k, JSON.parse(c));
|
|
123
|
+
continue;
|
|
124
|
+
} catch {
|
|
125
|
+
// Drop corrupt cache entry, treat as missing.
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
missing.push(k);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// 2. Fetch missing from DB in one query (Bun sql can't serialize JS arrays
|
|
132
|
+
// for ANY(), so we hand-build the Postgres TEXT[] literal).
|
|
133
|
+
if (missing.length > 0) {
|
|
134
|
+
const rows = await sql<StoredRow[]>`SELECT key, value FROM settings.entries WHERE key = ANY(${toPgTextArray(missing)}::text[])`;
|
|
135
|
+
for (const row of rows) {
|
|
136
|
+
try {
|
|
137
|
+
const decrypted = await decryptValue(row.value);
|
|
138
|
+
const def = SETTINGS_MAP.get(row.key);
|
|
139
|
+
if (def) {
|
|
140
|
+
const validated = validateSettingValue(def, decrypted);
|
|
141
|
+
if (validated.ok) {
|
|
142
|
+
result.set(row.key, validated.value);
|
|
143
|
+
await redis.set(REDIS_KEY(row.key), JSON.stringify(validated.value), "EX", REDIS_TTL_SEC);
|
|
144
|
+
}
|
|
145
|
+
} else {
|
|
146
|
+
result.set(row.key, decrypted);
|
|
147
|
+
await redis.set(REDIS_KEY(row.key), JSON.stringify(decrypted), "EX", REDIS_TTL_SEC);
|
|
148
|
+
}
|
|
149
|
+
} catch {
|
|
150
|
+
// Legacy row with mismatched key — silent skip.
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// 3. Apply env-fallback / default for keys that are still missing
|
|
156
|
+
for (const k of keys) {
|
|
157
|
+
if (!result.has(k)) {
|
|
158
|
+
result.set(k, resolveFallback(SETTINGS_MAP.get(k)));
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
return result;
|
|
163
|
+
};
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Get every known setting key (across all registered defs).
|
|
167
|
+
* Used by snapshot loader to determine what to bulk-read.
|
|
168
|
+
*/
|
|
169
|
+
export const allKnownKeys = (): string[] => SETTINGS.map((d) => d.key);
|
|
170
|
+
|
|
171
|
+
const knownKeysWith = (extraKnownKeys: readonly string[]) => Array.from(new Set([...allKnownKeys(), ...extraKnownKeys]));
|
|
172
|
+
|
|
173
|
+
export const listLegacyKeys = async (extraKnownKeys: readonly string[] = []): Promise<LegacySettingRow[]> => {
|
|
174
|
+
const knownKeys = knownKeysWith(extraKnownKeys);
|
|
175
|
+
const rows = await sql<LegacyStoredRow[]>`
|
|
176
|
+
SELECT key, value, updated_at
|
|
177
|
+
FROM settings.entries
|
|
178
|
+
WHERE NOT (key = ANY(${toPgTextArray(knownKeys)}::text[]))
|
|
179
|
+
ORDER BY updated_at DESC NULLS LAST, key ASC
|
|
180
|
+
`;
|
|
181
|
+
|
|
182
|
+
const legacy: LegacySettingRow[] = [];
|
|
183
|
+
for (const row of rows) {
|
|
184
|
+
let decryptable = true;
|
|
185
|
+
try {
|
|
186
|
+
await decryptValue(row.value);
|
|
187
|
+
} catch {
|
|
188
|
+
decryptable = false;
|
|
189
|
+
}
|
|
190
|
+
legacy.push({
|
|
191
|
+
key: row.key,
|
|
192
|
+
updatedAt: row.updated_at ? new Date(row.updated_at).toISOString() : null,
|
|
193
|
+
decryptable,
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
return legacy;
|
|
197
|
+
};
|
|
198
|
+
|
|
199
|
+
export const deleteLegacyKeys = async (extraKnownKeys: readonly string[] = []): Promise<{ deleted: string[] }> => {
|
|
200
|
+
const knownKeys = knownKeysWith(extraKnownKeys);
|
|
201
|
+
const rows = await sql<{ key: string }[]>`
|
|
202
|
+
DELETE FROM settings.entries
|
|
203
|
+
WHERE NOT (key = ANY(${toPgTextArray(knownKeys)}::text[]))
|
|
204
|
+
RETURNING key
|
|
205
|
+
`;
|
|
206
|
+
const deleted = rows.map((row) => row.key);
|
|
207
|
+
if (deleted.length > 0) await redis.del(...deleted.map(REDIS_KEY));
|
|
208
|
+
return { deleted };
|
|
209
|
+
};
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Encrypt the value, upsert the DB row, invalidate the Redis key.
|
|
213
|
+
*
|
|
214
|
+
* Validation is the caller's responsibility — the typed wrapper API
|
|
215
|
+
* (createSettingsAPI) validates against the declared SettingDef before reaching
|
|
216
|
+
* here. Direct callers must ensure the value matches the setting's kind.
|
|
217
|
+
*/
|
|
218
|
+
export const writeKey = async (key: string, value: unknown, db?: SqlClient): Promise<void> => {
|
|
219
|
+
const def = SETTINGS_MAP.get(key);
|
|
220
|
+
if (!def) throw new Error(`Unknown setting: ${key}`);
|
|
221
|
+
const validated = validateSettingValue(def, value);
|
|
222
|
+
if (!validated.ok) throw new Error(validated.error);
|
|
223
|
+
|
|
224
|
+
const encrypted = await encryptValue(validated.value);
|
|
225
|
+
await (db ?? sql)`
|
|
226
|
+
INSERT INTO settings.entries (key, value, updated_at)
|
|
227
|
+
VALUES (${key}, ${encrypted}, now())
|
|
228
|
+
ON CONFLICT (key)
|
|
229
|
+
DO UPDATE SET value = ${encrypted}, updated_at = now()
|
|
230
|
+
`;
|
|
231
|
+
|
|
232
|
+
// Passing a transaction means the caller owns invalidation, because the row
|
|
233
|
+
// is not visible to anyone else until they commit.
|
|
234
|
+
if (!db) await invalidateSettingsCache([key]);
|
|
235
|
+
};
|
|
236
|
+
|
|
237
|
+
/** Delete the DB row and invalidate Redis. See writeKey for the `db` contract. */
|
|
238
|
+
export const deleteKey = async (key: string, db?: SqlClient): Promise<void> => {
|
|
239
|
+
await (db ?? sql)`DELETE FROM settings.entries WHERE key = ${key}`;
|
|
240
|
+
if (!db) await invalidateSettingsCache([key]);
|
|
241
|
+
};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { renderLiquidTemplate } from "../../shared/template-rendering";
|
|
2
|
+
|
|
3
|
+
/** Render a Liquid template with Cloud's legacy-compatible HTML escaping. */
|
|
4
|
+
export const renderTemplate = (template: string, vars: Record<string, unknown>): string => renderLiquidTemplate(template, vars);
|