@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,383 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Every run starts from an event.
|
|
3
|
+
*
|
|
4
|
+
* There used to be three ways in, with three durability stories: a direct
|
|
5
|
+
* invocation, a schedule tick, and a trigger delivery. Grids recorded only a
|
|
6
|
+
* `channel` enum, so once a run existed nobody could say what caused it. Here
|
|
7
|
+
* the cause is a row, so "why did this run" is a join rather than a guess, and
|
|
8
|
+
* idempotency, retry and recovery are written once instead of three times.
|
|
9
|
+
*
|
|
10
|
+
* A schedule tick is an event. A button press is an event. An inbound message
|
|
11
|
+
* is an event. Nothing needs its own registration path.
|
|
12
|
+
*/
|
|
13
|
+
import { type SQL, sql } from "bun";
|
|
14
|
+
import type { WorkflowJsonValue } from "../contracts";
|
|
15
|
+
import { createWorkflowRun } from "./runs";
|
|
16
|
+
import { withTransaction } from "./transaction";
|
|
17
|
+
|
|
18
|
+
export type WorkflowEventInput = {
|
|
19
|
+
appId: string;
|
|
20
|
+
scopeId: string;
|
|
21
|
+
/** Namespaced `${appId}.${key}`, matching a declaration in the app's `workflows.ts`. */
|
|
22
|
+
type: string;
|
|
23
|
+
data?: Record<string, WorkflowJsonValue>;
|
|
24
|
+
/**
|
|
25
|
+
* Makes a repeatable source at-most-once: a schedule slot, a provider
|
|
26
|
+
* redelivery, a double-clicked button. Emitting the same key twice records
|
|
27
|
+
* one event and therefore starts one run.
|
|
28
|
+
*/
|
|
29
|
+
dedupeKey?: string;
|
|
30
|
+
/** The occurrence's own time, not the emitter's. Runs replay against this. */
|
|
31
|
+
occurredAt?: Date;
|
|
32
|
+
/**
|
|
33
|
+
* Everything the plan reads under context.*, distinct from the payload.
|
|
34
|
+
*
|
|
35
|
+
* An app that already holds the facts a run needs — a captured row, the
|
|
36
|
+
* launcher that was pressed — hands them over rather than making every step
|
|
37
|
+
* read them again.
|
|
38
|
+
*/
|
|
39
|
+
context?: Record<string, WorkflowJsonValue>;
|
|
40
|
+
/**
|
|
41
|
+
* Who the resulting runs act as.
|
|
42
|
+
*
|
|
43
|
+
* Without this every run would execute as the system: the activation's own
|
|
44
|
+
* snapshot is the fallback, and it is only meaningful for occurrences that
|
|
45
|
+
* have no human behind them, like a schedule tick.
|
|
46
|
+
*/
|
|
47
|
+
authorization?: WorkflowJsonValue;
|
|
48
|
+
/**
|
|
49
|
+
* Restricts matching to one workflow's activations.
|
|
50
|
+
*
|
|
51
|
+
* For occurrences that concern exactly one workflow because the app already
|
|
52
|
+
* decided — it evaluated its own trigger filter — and a broadcast would start
|
|
53
|
+
* every workflow in the scope.
|
|
54
|
+
*/
|
|
55
|
+
targetWorkflowId?: string;
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
export type WorkflowEmission = {
|
|
59
|
+
eventId: string;
|
|
60
|
+
/** Empty when nothing was listening, or when dispatch was deferred. */
|
|
61
|
+
runIds: string[];
|
|
62
|
+
/** True when this exact event had already been recorded. */
|
|
63
|
+
duplicate: boolean;
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
type ActivationMatch = {
|
|
67
|
+
activation_id: string;
|
|
68
|
+
workflow_id: string;
|
|
69
|
+
workflow_version_id: string;
|
|
70
|
+
authorization_snapshot: WorkflowJsonValue;
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
type StoredEvent = {
|
|
74
|
+
id: string;
|
|
75
|
+
appId: string;
|
|
76
|
+
scopeId: string;
|
|
77
|
+
type: string;
|
|
78
|
+
occurredAt: Date;
|
|
79
|
+
data: Record<string, WorkflowJsonValue>;
|
|
80
|
+
context: Record<string, WorkflowJsonValue>;
|
|
81
|
+
authorization: WorkflowJsonValue;
|
|
82
|
+
targetWorkflowId: string | null;
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
const EVENT_DISPATCH_MAX_ATTEMPTS = 8;
|
|
86
|
+
const EVENT_DISPATCH_BACKOFF_MS = 1_000;
|
|
87
|
+
const EVENT_DISPATCH_MAX_BACKOFF_MS = 5 * 60_000;
|
|
88
|
+
|
|
89
|
+
/** An empty object means the emitter named nobody; fall back to the activation. */
|
|
90
|
+
const isEmpty = (value: WorkflowJsonValue): boolean =>
|
|
91
|
+
!value || (typeof value === "object" && !Array.isArray(value) && Object.keys(value).length === 0);
|
|
92
|
+
|
|
93
|
+
/** Freezes the exact live activations that matched when the event arrived. */
|
|
94
|
+
const pinDeliveries = async (tx: SQL, event: StoredEvent): Promise<number> => {
|
|
95
|
+
const rows = await tx<{ activation_id: string }[]>`
|
|
96
|
+
INSERT INTO workflows.event_delivery (
|
|
97
|
+
event_id, activation_id, workflow_id, workflow_version_id, authorization_snapshot
|
|
98
|
+
)
|
|
99
|
+
SELECT ${event.id}::uuid, a.id, a.workflow_id, a.workflow_version_id, a.authorization_snapshot
|
|
100
|
+
FROM workflows.activation AS a
|
|
101
|
+
JOIN workflows.workflow AS w
|
|
102
|
+
ON w.id = a.workflow_id
|
|
103
|
+
AND w.active_version_id = a.workflow_version_id
|
|
104
|
+
WHERE a.enabled
|
|
105
|
+
AND a.event_type = ${event.type}
|
|
106
|
+
AND w.app_id = ${event.appId}
|
|
107
|
+
AND w.scope_id = ${event.scopeId}
|
|
108
|
+
AND (${event.targetWorkflowId}::uuid IS NULL OR a.workflow_id = ${event.targetWorkflowId}::uuid)
|
|
109
|
+
ORDER BY a.id
|
|
110
|
+
ON CONFLICT DO NOTHING
|
|
111
|
+
RETURNING activation_id
|
|
112
|
+
`;
|
|
113
|
+
return rows.length;
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Turns one event into runs.
|
|
118
|
+
*
|
|
119
|
+
* Runs are keyed by the event and the activation that matched it, so a
|
|
120
|
+
* redelivered event or a retried dispatch converges on the same runs rather
|
|
121
|
+
* than adding more.
|
|
122
|
+
*/
|
|
123
|
+
const materializeRuns = async (tx: SQL, event: StoredEvent): Promise<string[]> => {
|
|
124
|
+
const matches = await tx<ActivationMatch[]>`
|
|
125
|
+
SELECT activation_id, workflow_id, workflow_version_id, authorization_snapshot
|
|
126
|
+
FROM workflows.event_delivery
|
|
127
|
+
WHERE event_id = ${event.id}::uuid
|
|
128
|
+
ORDER BY activation_id
|
|
129
|
+
`;
|
|
130
|
+
|
|
131
|
+
const runIds: string[] = [];
|
|
132
|
+
for (const match of matches) {
|
|
133
|
+
runIds.push(
|
|
134
|
+
await createWorkflowRun(
|
|
135
|
+
{
|
|
136
|
+
appId: event.appId,
|
|
137
|
+
scopeId: event.scopeId,
|
|
138
|
+
workflowId: match.workflow_id,
|
|
139
|
+
workflowVersionId: match.workflow_version_id,
|
|
140
|
+
mode: "execute",
|
|
141
|
+
inputs: event.data,
|
|
142
|
+
context: event.context,
|
|
143
|
+
// The emitter's actor wins; the activation's snapshot is what a
|
|
144
|
+
// schedule tick or a captured row falls back to.
|
|
145
|
+
authorization: isEmpty(event.authorization) ? match.authorization_snapshot : event.authorization,
|
|
146
|
+
idempotencyKey: `event:${event.id}:${match.activation_id}`,
|
|
147
|
+
occurredAt: event.occurredAt,
|
|
148
|
+
eventId: event.id,
|
|
149
|
+
},
|
|
150
|
+
{ db: tx },
|
|
151
|
+
),
|
|
152
|
+
);
|
|
153
|
+
}
|
|
154
|
+
return runIds;
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Records an event and, unless deferred, starts the runs listening for it.
|
|
159
|
+
*
|
|
160
|
+
* `dispatch: "now"` is what a direct invocation uses: the caller gets run ids
|
|
161
|
+
* back without a round trip through a queue, which is what the launcher and
|
|
162
|
+
* "run this workflow" buttons depend on. Everything an app merely *observes* —
|
|
163
|
+
* a row changing, a message arriving — defers, because losing the caller's
|
|
164
|
+
* request is better than losing the occurrence: a failing dispatch would
|
|
165
|
+
* otherwise roll back the event itself and the occurrence would vanish.
|
|
166
|
+
*/
|
|
167
|
+
export const emitWorkflowEvent = async (
|
|
168
|
+
event: WorkflowEventInput,
|
|
169
|
+
options: { dispatch?: "now" | "deferred"; db?: SQL } = {},
|
|
170
|
+
): Promise<WorkflowEmission> => {
|
|
171
|
+
const occurredAt = event.occurredAt ?? new Date();
|
|
172
|
+
const data = event.data ?? {};
|
|
173
|
+
const context = event.context ?? {};
|
|
174
|
+
const authorization = event.authorization ?? {};
|
|
175
|
+
|
|
176
|
+
return withTransaction(options.db, async (tx) => {
|
|
177
|
+
const inserted = await tx<{ id: string }[]>`
|
|
178
|
+
INSERT INTO workflows.event (
|
|
179
|
+
app_id, scope_id, type, data, context, authorization_snapshot, target_workflow_id, dedupe_key, occurred_at
|
|
180
|
+
)
|
|
181
|
+
VALUES (
|
|
182
|
+
${event.appId}, ${event.scopeId}, ${event.type}, ${data}, ${context}, ${authorization},
|
|
183
|
+
${event.targetWorkflowId ?? null}::uuid, ${event.dedupeKey ?? null}, ${occurredAt}
|
|
184
|
+
)
|
|
185
|
+
ON CONFLICT (app_id, scope_id, type, dedupe_key) WHERE dedupe_key IS NOT NULL DO NOTHING
|
|
186
|
+
RETURNING id
|
|
187
|
+
`;
|
|
188
|
+
|
|
189
|
+
if (!inserted[0]) {
|
|
190
|
+
// Already recorded. Answer with the runs it produced the first time
|
|
191
|
+
// rather than starting more — that is the whole point of the key.
|
|
192
|
+
const [existing] = await tx<{ id: string }[]>`
|
|
193
|
+
SELECT id FROM workflows.event
|
|
194
|
+
WHERE app_id = ${event.appId}
|
|
195
|
+
AND scope_id = ${event.scopeId}
|
|
196
|
+
AND type = ${event.type}
|
|
197
|
+
AND dedupe_key = ${event.dedupeKey ?? null}
|
|
198
|
+
`;
|
|
199
|
+
if (!existing) throw new Error("workflow event conflicted but could not be found");
|
|
200
|
+
const runs = await tx<{ id: string }[]>`SELECT id FROM workflows.run WHERE event_id = ${existing.id}::uuid ORDER BY created_at, id`;
|
|
201
|
+
return { eventId: existing.id, runIds: runs.map((row) => row.id), duplicate: true };
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
const eventId = inserted[0].id;
|
|
205
|
+
const stored = {
|
|
206
|
+
id: eventId,
|
|
207
|
+
appId: event.appId,
|
|
208
|
+
scopeId: event.scopeId,
|
|
209
|
+
type: event.type,
|
|
210
|
+
occurredAt,
|
|
211
|
+
data,
|
|
212
|
+
context,
|
|
213
|
+
authorization,
|
|
214
|
+
targetWorkflowId: event.targetWorkflowId ?? null,
|
|
215
|
+
};
|
|
216
|
+
const matchedCount = await pinDeliveries(tx, stored);
|
|
217
|
+
await tx`
|
|
218
|
+
UPDATE workflows.event
|
|
219
|
+
SET matched_count = ${matchedCount},
|
|
220
|
+
dispatched_at = CASE WHEN ${matchedCount} = 0 THEN now() ELSE dispatched_at END
|
|
221
|
+
WHERE id = ${eventId}::uuid
|
|
222
|
+
`;
|
|
223
|
+
if (options.dispatch !== "now" || matchedCount === 0) return { eventId, runIds: [], duplicate: false };
|
|
224
|
+
|
|
225
|
+
const runIds = await materializeRuns(tx, stored);
|
|
226
|
+
await tx`
|
|
227
|
+
UPDATE workflows.event
|
|
228
|
+
SET dispatched_at = now(), attempts = attempts + 1, last_error = NULL
|
|
229
|
+
WHERE id = ${eventId}::uuid
|
|
230
|
+
`;
|
|
231
|
+
return { eventId, runIds, duplicate: false };
|
|
232
|
+
});
|
|
233
|
+
};
|
|
234
|
+
|
|
235
|
+
/**
|
|
236
|
+
* Starts the runs for events that were recorded but not yet dispatched.
|
|
237
|
+
*
|
|
238
|
+
* One event at a time, each in its own transaction: an event whose activations
|
|
239
|
+
* cannot be materialised must not take the rest of the batch down with it. Its
|
|
240
|
+
* failure is recorded on the row instead, because an event that matched nothing
|
|
241
|
+
* and said nothing is exactly how Grids' schedules stopped firing.
|
|
242
|
+
*/
|
|
243
|
+
export const dispatchPendingWorkflowEvents = async (
|
|
244
|
+
limit = 100,
|
|
245
|
+
options: { appId?: string; scopeId?: string; db?: SQL } = {},
|
|
246
|
+
): Promise<{ dispatched: number; failed: number; deadLettered: number }> => {
|
|
247
|
+
const db = options.db ?? sql;
|
|
248
|
+
const pending = await db<{ id: string }[]>`
|
|
249
|
+
SELECT id FROM workflows.event
|
|
250
|
+
WHERE dispatched_at IS NULL
|
|
251
|
+
AND dispatch_failed_at IS NULL
|
|
252
|
+
AND matched_count > 0
|
|
253
|
+
AND dispatch_after <= now()
|
|
254
|
+
AND (${options.appId ?? null}::text IS NULL OR app_id = ${options.appId ?? null})
|
|
255
|
+
AND (${options.scopeId ?? null}::text IS NULL OR scope_id = ${options.scopeId ?? null})
|
|
256
|
+
ORDER BY dispatch_after, occurred_at, id
|
|
257
|
+
LIMIT ${limit}
|
|
258
|
+
`;
|
|
259
|
+
|
|
260
|
+
let dispatched = 0;
|
|
261
|
+
let failed = 0;
|
|
262
|
+
let deadLettered = 0;
|
|
263
|
+
for (const { id } of pending) {
|
|
264
|
+
try {
|
|
265
|
+
await withTransaction(options.db, async (tx) => {
|
|
266
|
+
const [row] = await tx<
|
|
267
|
+
{
|
|
268
|
+
id: string;
|
|
269
|
+
app_id: string;
|
|
270
|
+
scope_id: string;
|
|
271
|
+
type: string;
|
|
272
|
+
data: Record<string, WorkflowJsonValue>;
|
|
273
|
+
context: Record<string, WorkflowJsonValue>;
|
|
274
|
+
authorization_snapshot: WorkflowJsonValue;
|
|
275
|
+
target_workflow_id: string | null;
|
|
276
|
+
occurred_at: Date;
|
|
277
|
+
}[]
|
|
278
|
+
>`
|
|
279
|
+
SELECT id, app_id, scope_id, type, data, context, authorization_snapshot, target_workflow_id, occurred_at
|
|
280
|
+
FROM workflows.event
|
|
281
|
+
WHERE id = ${id}::uuid
|
|
282
|
+
AND dispatched_at IS NULL
|
|
283
|
+
AND dispatch_failed_at IS NULL
|
|
284
|
+
AND matched_count > 0
|
|
285
|
+
AND dispatch_after <= now()
|
|
286
|
+
FOR UPDATE SKIP LOCKED
|
|
287
|
+
`;
|
|
288
|
+
// Another worker took it, or it was dispatched between the scan and here.
|
|
289
|
+
if (!row) return;
|
|
290
|
+
|
|
291
|
+
await materializeRuns(tx, {
|
|
292
|
+
id: row.id,
|
|
293
|
+
appId: row.app_id,
|
|
294
|
+
scopeId: row.scope_id,
|
|
295
|
+
type: row.type,
|
|
296
|
+
occurredAt: row.occurred_at,
|
|
297
|
+
data: row.data,
|
|
298
|
+
context: row.context,
|
|
299
|
+
authorization: row.authorization_snapshot,
|
|
300
|
+
targetWorkflowId: row.target_workflow_id,
|
|
301
|
+
});
|
|
302
|
+
await tx`
|
|
303
|
+
UPDATE workflows.event
|
|
304
|
+
SET dispatched_at = now(), attempts = attempts + 1, last_error = NULL
|
|
305
|
+
WHERE id = ${row.id}::uuid
|
|
306
|
+
`;
|
|
307
|
+
dispatched += 1;
|
|
308
|
+
});
|
|
309
|
+
} catch (error) {
|
|
310
|
+
failed += 1;
|
|
311
|
+
const [recorded] = await db<{ dispatch_failed_at: Date | null }[]>`
|
|
312
|
+
UPDATE workflows.event
|
|
313
|
+
SET attempts = attempts + 1,
|
|
314
|
+
last_error = ${error instanceof Error ? error.message : String(error)},
|
|
315
|
+
dispatch_after = now() + (
|
|
316
|
+
LEAST(
|
|
317
|
+
${EVENT_DISPATCH_MAX_BACKOFF_MS}::double precision,
|
|
318
|
+
${EVENT_DISPATCH_BACKOFF_MS}::double precision * power(2::double precision, attempts::double precision)
|
|
319
|
+
) * interval '1 millisecond'
|
|
320
|
+
),
|
|
321
|
+
dispatch_failed_at = CASE
|
|
322
|
+
WHEN attempts + 1 >= ${EVENT_DISPATCH_MAX_ATTEMPTS} THEN now()
|
|
323
|
+
ELSE dispatch_failed_at
|
|
324
|
+
END
|
|
325
|
+
WHERE id = ${id}::uuid AND dispatched_at IS NULL
|
|
326
|
+
RETURNING dispatch_failed_at
|
|
327
|
+
`;
|
|
328
|
+
if (recorded?.dispatch_failed_at) deadLettered += 1;
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
return { dispatched, failed, deadLettered };
|
|
332
|
+
};
|
|
333
|
+
|
|
334
|
+
export type UndispatchedWorkflowEvent = {
|
|
335
|
+
id: string;
|
|
336
|
+
appId: string;
|
|
337
|
+
scopeId: string;
|
|
338
|
+
type: string;
|
|
339
|
+
occurredAt: Date;
|
|
340
|
+
attempts: number;
|
|
341
|
+
matchedCount: number;
|
|
342
|
+
lastError: string | null;
|
|
343
|
+
dispatchFailedAt: Date | null;
|
|
344
|
+
};
|
|
345
|
+
|
|
346
|
+
/** Events that matched nothing, are retrying, or exhausted dispatch retries. */
|
|
347
|
+
export const listUndispatchedWorkflowEvents = async (
|
|
348
|
+
options: { limit?: number; offset?: number; appId?: string; scopeId?: string; db?: SQL } = {},
|
|
349
|
+
): Promise<UndispatchedWorkflowEvent[]> => {
|
|
350
|
+
const db = options.db ?? sql;
|
|
351
|
+
const rows = await db<
|
|
352
|
+
{
|
|
353
|
+
id: string;
|
|
354
|
+
app_id: string;
|
|
355
|
+
scope_id: string;
|
|
356
|
+
type: string;
|
|
357
|
+
occurred_at: Date;
|
|
358
|
+
attempts: number;
|
|
359
|
+
matched_count: number;
|
|
360
|
+
last_error: string | null;
|
|
361
|
+
dispatch_failed_at: Date | null;
|
|
362
|
+
}[]
|
|
363
|
+
>`
|
|
364
|
+
SELECT id, app_id, scope_id, type, occurred_at, attempts, matched_count, last_error, dispatch_failed_at
|
|
365
|
+
FROM workflows.event
|
|
366
|
+
WHERE (matched_count = 0 OR dispatched_at IS NULL)
|
|
367
|
+
AND (${options.appId ?? null}::text IS NULL OR app_id = ${options.appId ?? null})
|
|
368
|
+
AND (${options.scopeId ?? null}::text IS NULL OR scope_id = ${options.scopeId ?? null})
|
|
369
|
+
ORDER BY occurred_at, id
|
|
370
|
+
LIMIT ${options.limit ?? 100} OFFSET ${options.offset ?? 0}
|
|
371
|
+
`;
|
|
372
|
+
return rows.map((row) => ({
|
|
373
|
+
id: row.id,
|
|
374
|
+
appId: row.app_id,
|
|
375
|
+
scopeId: row.scope_id,
|
|
376
|
+
type: row.type,
|
|
377
|
+
occurredAt: row.occurred_at,
|
|
378
|
+
attempts: row.attempts,
|
|
379
|
+
matchedCount: row.matched_count,
|
|
380
|
+
lastError: row.last_error,
|
|
381
|
+
dispatchFailedAt: row.dispatch_failed_at,
|
|
382
|
+
}));
|
|
383
|
+
};
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Server-only. Kept out of `@k2b/cloud/workflows`, which islands
|
|
3
|
+
* import for its contracts — pulling this in would drag Bun's `sql` into a
|
|
4
|
+
* browser bundle.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
export {
|
|
8
|
+
createWorkflowActionPort,
|
|
9
|
+
createWorkflowDryRunPort,
|
|
10
|
+
type WorkflowActionPortOptions,
|
|
11
|
+
type WorkflowEffectJournalPort,
|
|
12
|
+
type WorkflowEffectJournalStep,
|
|
13
|
+
workflowEffectKey,
|
|
14
|
+
} from "./actions";
|
|
15
|
+
export {
|
|
16
|
+
budgetError,
|
|
17
|
+
budgetRootRunId,
|
|
18
|
+
chargeWorkflowEffectBudget,
|
|
19
|
+
checkEffectBudget,
|
|
20
|
+
totalPlannedEffects,
|
|
21
|
+
type WorkflowBudgetError,
|
|
22
|
+
type WorkflowBudgetOutcome,
|
|
23
|
+
type WorkflowEffectBudget,
|
|
24
|
+
type WorkflowEffectCharge,
|
|
25
|
+
} from "./budget";
|
|
26
|
+
export {
|
|
27
|
+
createWorkflow,
|
|
28
|
+
deleteWorkflowScope,
|
|
29
|
+
getWorkflow,
|
|
30
|
+
listWorkflowActivations,
|
|
31
|
+
listWorkflows,
|
|
32
|
+
listWorkflowVersions,
|
|
33
|
+
type PublishWorkflowVersion,
|
|
34
|
+
publishWorkflowVersion,
|
|
35
|
+
renameWorkflow,
|
|
36
|
+
setWorkflowEnabled,
|
|
37
|
+
type WorkflowActivationInput,
|
|
38
|
+
type WorkflowActivationRecord,
|
|
39
|
+
type WorkflowAuthor,
|
|
40
|
+
type WorkflowRecord,
|
|
41
|
+
type WorkflowVersionRecord,
|
|
42
|
+
} from "./definitions";
|
|
43
|
+
export {
|
|
44
|
+
dispatchPendingWorkflowEvents,
|
|
45
|
+
emitWorkflowEvent,
|
|
46
|
+
listUndispatchedWorkflowEvents,
|
|
47
|
+
type UndispatchedWorkflowEvent,
|
|
48
|
+
type WorkflowEmission,
|
|
49
|
+
type WorkflowEventInput,
|
|
50
|
+
} from "./events";
|
|
51
|
+
export {
|
|
52
|
+
getWorkflowRun,
|
|
53
|
+
listWorkflowFamilies,
|
|
54
|
+
listWorkflowRunTimeline,
|
|
55
|
+
listStrandedWorkflowEffects,
|
|
56
|
+
listWorkflowRunSteps,
|
|
57
|
+
listWorkflowRuns,
|
|
58
|
+
type StrandedWorkflowEffect,
|
|
59
|
+
type WorkflowAppHealth,
|
|
60
|
+
type WorkflowFamilyFilter,
|
|
61
|
+
type WorkflowFamilySummary,
|
|
62
|
+
type WorkflowRunDetail,
|
|
63
|
+
type WorkflowRunFilter,
|
|
64
|
+
type WorkflowRunSummary,
|
|
65
|
+
type WorkflowRunTimeline,
|
|
66
|
+
type WorkflowStepSummary,
|
|
67
|
+
workflowHealth,
|
|
68
|
+
} from "./observability";
|
|
69
|
+
export {
|
|
70
|
+
beginWorkflowEffect,
|
|
71
|
+
claimWorkflowRun,
|
|
72
|
+
countChildWorkflowRuns,
|
|
73
|
+
createChildWorkflowRuns,
|
|
74
|
+
createWorkflowCoordinatorPort,
|
|
75
|
+
createWorkflowRun,
|
|
76
|
+
createWorkflowRuntimeRepository,
|
|
77
|
+
finishWorkflowRun,
|
|
78
|
+
isWorkflowEffectReplayable,
|
|
79
|
+
listClaimableWorkflowRunIds,
|
|
80
|
+
type NewWorkflowRun,
|
|
81
|
+
readWorkflowEffect,
|
|
82
|
+
recordWorkflowEffect,
|
|
83
|
+
releaseWorkflowRun,
|
|
84
|
+
renewWorkflowRunLease,
|
|
85
|
+
requestWorkflowRunCancel,
|
|
86
|
+
resolveWorkflowRunAttention,
|
|
87
|
+
settleWorkflowEffect,
|
|
88
|
+
WORKFLOW_RUN_LEASE_MS,
|
|
89
|
+
WORKFLOW_RUN_MAX_CONSECUTIVE_FAILURES,
|
|
90
|
+
type WorkflowAttentionResolution,
|
|
91
|
+
WorkflowLeaseLostError,
|
|
92
|
+
type WorkflowRunClaim,
|
|
93
|
+
type WorkflowRunResult,
|
|
94
|
+
wakeExpiredWorkflowRuns,
|
|
95
|
+
wakeWorkflowRunsWaitingOn,
|
|
96
|
+
} from "./runs";
|
|
97
|
+
export {
|
|
98
|
+
dryRunOneWorkflow,
|
|
99
|
+
hasClaimableWorkflowRun,
|
|
100
|
+
runOneWorkflow,
|
|
101
|
+
tickWorkflows,
|
|
102
|
+
type WorkflowDryRunOutcome,
|
|
103
|
+
type WorkflowDryRunWorkerOptions,
|
|
104
|
+
type WorkflowTickResult,
|
|
105
|
+
type WorkflowWorkerOptions,
|
|
106
|
+
type WorkflowWorkerOutcome,
|
|
107
|
+
} from "./worker";
|