spine-framework 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.framework/README.md +129 -0
- package/.framework/cli/bin.cjs +14 -0
- package/.framework/cli/commands/agents.ts +153 -0
- package/.framework/cli/commands/auth.ts +94 -0
- package/.framework/cli/commands/create-app.ts +185 -0
- package/.framework/cli/commands/dev.ts +295 -0
- package/.framework/cli/commands/doctor.ts +442 -0
- package/.framework/cli/commands/generate.ts +332 -0
- package/.framework/cli/commands/init.ts +272 -0
- package/.framework/cli/commands/install-app.ts +391 -0
- package/.framework/cli/commands/items.ts +253 -0
- package/.framework/cli/commands/migrations.ts +141 -0
- package/.framework/cli/commands/pipelines.ts +166 -0
- package/.framework/cli/commands/status.ts +197 -0
- package/.framework/cli/commands/system.ts +184 -0
- package/.framework/cli/commands/test.ts +227 -0
- package/.framework/cli/commands/uninstall-app.ts +166 -0
- package/.framework/cli/context.ts +268 -0
- package/.framework/cli/env-loader.ts +36 -0
- package/.framework/cli/index.ts +106 -0
- package/.framework/cli/welcome.cjs +45 -0
- package/.framework/docs/API.md +384 -0
- package/.framework/docs/STABILITY.md +52 -0
- package/.framework/docs/admin-routes.md +76 -0
- package/.framework/docs/api-docs-progress.md +38 -0
- package/.framework/docs/api-governance.md +146 -0
- package/.framework/docs/api-testing-results.md +212 -0
- package/.framework/docs/apis/admin-configs.md +567 -0
- package/.framework/docs/apis/admin-data.md +272 -0
- package/.framework/docs/apis/index.md +231 -0
- package/.framework/docs/apis/internal.md +295 -0
- package/.framework/docs/apis/runtime.md +537 -0
- package/.framework/docs/assembly-launch-guide.md +138 -0
- package/.framework/docs/audit-results.md +590 -0
- package/.framework/docs/authorization-model.md +170 -0
- package/.framework/docs/db-api-inventory.md +95 -0
- package/.framework/docs/examples/custom-app/README.md +77 -0
- package/.framework/docs/examples/custom-function/README.md +27 -0
- package/.framework/docs/examples/custom-function/handler.ts +48 -0
- package/.framework/docs/examples/custom-webhook/README.md +68 -0
- package/.framework/docs/gap-remediation-backlog.md +103 -0
- package/.framework/docs/guides/cli-guide.md +224 -0
- package/.framework/docs/guides/getting-started.md +103 -0
- package/.framework/docs/guides/import-guide.md +193 -0
- package/.framework/docs/guides/testing-guide.md +229 -0
- package/.framework/docs/permission-examples.md +326 -0
- package/.framework/docs/ui-adoption-verification.md +111 -0
- package/.framework/docs/ui-api-coverage.md +84 -0
- package/.framework/docs/v2-compatibility-audit.md +228 -0
- package/.framework/functions/.gitkeep +1 -0
- package/.framework/functions/_shared/agent-runner.ts +1097 -0
- package/.framework/functions/_shared/app-manifest.ts +184 -0
- package/.framework/functions/_shared/audit.ts +150 -0
- package/.framework/functions/_shared/db.ts +174 -0
- package/.framework/functions/_shared/index.ts +382 -0
- package/.framework/functions/_shared/middleware.ts +490 -0
- package/.framework/functions/_shared/permissions.ts +1325 -0
- package/.framework/functions/_shared/pipeline-runner.ts +731 -0
- package/.framework/functions/_shared/principal.ts +760 -0
- package/.framework/functions/_shared/schema-utils.ts +967 -0
- package/.framework/functions/_shared/testing.ts +258 -0
- package/.framework/functions/_shared/trigger-engine.ts +425 -0
- package/.framework/functions/_shared/webhook-registration.ts +168 -0
- package/.framework/functions/_shared/webhook-registry.ts +129 -0
- package/.framework/functions/account-nodes.ts +111 -0
- package/.framework/functions/admin-data.ts +606 -0
- package/.framework/functions/ai-agents.ts +323 -0
- package/.framework/functions/api-keys.ts +376 -0
- package/.framework/functions/apps.ts +483 -0
- package/.framework/functions/auth.ts +196 -0
- package/.framework/functions/debug-auth.ts +107 -0
- package/.framework/functions/embeddings.ts +556 -0
- package/.framework/functions/integration-routes.ts +523 -0
- package/.framework/functions/integrations.ts +319 -0
- package/.framework/functions/item-progress.ts +272 -0
- package/.framework/functions/logs.ts +438 -0
- package/.framework/functions/observability.ts +275 -0
- package/.framework/functions/pipeline-executions.ts +494 -0
- package/.framework/functions/pipelines.ts +485 -0
- package/.framework/functions/prompt-configs.ts +339 -0
- package/.framework/functions/roles.ts +387 -0
- package/.framework/functions/system-cron.ts +742 -0
- package/.framework/functions/system.ts +323 -0
- package/.framework/functions/tests.ts +119 -0
- package/.framework/functions/timers.ts +357 -0
- package/.framework/functions/triggers.ts +563 -0
- package/.framework/functions/types.ts +604 -0
- package/.framework/migrations/000_foundation.sql +1256 -0
- package/.framework/migrations/001_seed.sql +92 -0
- package/.framework/migrations/002_seed_constraints.sql +13 -0
- package/.framework/migrations/003_auth_user_trigger.sql +59 -0
- package/.framework/src/App.tsx +126 -0
- package/.framework/src/apps/admin/index.tsx +173 -0
- package/.framework/src/components/AppWrapper.tsx +56 -0
- package/.framework/src/components/CustomAppLoader.tsx +116 -0
- package/.framework/src/components/admin/AdminListPage.tsx +151 -0
- package/.framework/src/components/admin/AdminSidebar.tsx +166 -0
- package/.framework/src/components/admin/AdminStatsCard.tsx +62 -0
- package/.framework/src/components/admin/SortableTableHeader.tsx +42 -0
- package/.framework/src/components/app-shell/GenericAppShell.tsx +181 -0
- package/.framework/src/components/app-shell/GenericDetailPage.tsx +200 -0
- package/.framework/src/components/app-shell/GenericListPage.tsx +116 -0
- package/.framework/src/components/app-sidebar.tsx +228 -0
- package/.framework/src/components/auth/ProtectedRoute.tsx +88 -0
- package/.framework/src/components/layout/AppShell.tsx +91 -0
- package/.framework/src/components/layout/Header.tsx +88 -0
- package/.framework/src/components/layout/Layout.tsx +95 -0
- package/.framework/src/components/layout/Sidebar.tsx +329 -0
- package/.framework/src/components/runtime/DataDetailHeader.tsx +77 -0
- package/.framework/src/components/runtime/DataDetailPage.tsx +171 -0
- package/.framework/src/components/runtime/DataFilters.tsx +91 -0
- package/.framework/src/components/runtime/DataHeader.tsx +68 -0
- package/.framework/src/components/runtime/DataListPage.tsx +124 -0
- package/.framework/src/components/runtime/DataStats.tsx +70 -0
- package/.framework/src/components/runtime/DataTable.tsx +174 -0
- package/.framework/src/components/runtime/SchemaDetailForm.tsx +134 -0
- package/.framework/src/components/runtime/index.ts +18 -0
- package/.framework/src/components/search-form.tsx +29 -0
- package/.framework/src/components/shared/AgentView.tsx +213 -0
- package/.framework/src/components/shared/FieldRenderer.tsx +478 -0
- package/.framework/src/components/shared/SchemaFields.tsx +226 -0
- package/.framework/src/components/ui/DataTable.tsx +343 -0
- package/.framework/src/components/ui/Form.tsx +281 -0
- package/.framework/src/components/ui/ItemCard.tsx +296 -0
- package/.framework/src/components/ui/ItemListView.tsx +308 -0
- package/.framework/src/components/ui/LoadingSpinner.tsx +52 -0
- package/.framework/src/components/ui/Modal.tsx +61 -0
- package/.framework/src/components/ui/RichTextEditor.tsx +210 -0
- package/.framework/src/components/ui/accordion.tsx +82 -0
- package/.framework/src/components/ui/alert-dialog.tsx +197 -0
- package/.framework/src/components/ui/alert.tsx +76 -0
- package/.framework/src/components/ui/aspect-ratio.tsx +11 -0
- package/.framework/src/components/ui/avatar.tsx +110 -0
- package/.framework/src/components/ui/badge.tsx +49 -0
- package/.framework/src/components/ui/breadcrumb.tsx +122 -0
- package/.framework/src/components/ui/button-group.tsx +83 -0
- package/.framework/src/components/ui/button.tsx +65 -0
- package/.framework/src/components/ui/calendar.tsx +222 -0
- package/.framework/src/components/ui/card.tsx +100 -0
- package/.framework/src/components/ui/carousel.tsx +240 -0
- package/.framework/src/components/ui/chart.tsx +373 -0
- package/.framework/src/components/ui/checkbox.tsx +31 -0
- package/.framework/src/components/ui/collapsible.tsx +33 -0
- package/.framework/src/components/ui/combobox.tsx +299 -0
- package/.framework/src/components/ui/command.tsx +193 -0
- package/.framework/src/components/ui/context-menu.tsx +261 -0
- package/.framework/src/components/ui/dialog.tsx +165 -0
- package/.framework/src/components/ui/direction.tsx +22 -0
- package/.framework/src/components/ui/drawer.tsx +132 -0
- package/.framework/src/components/ui/dropdown-menu.tsx +269 -0
- package/.framework/src/components/ui/empty.tsx +104 -0
- package/.framework/src/components/ui/field.tsx +238 -0
- package/.framework/src/components/ui/hover-card.tsx +42 -0
- package/.framework/src/components/ui/input-group.tsx +153 -0
- package/.framework/src/components/ui/input-otp.tsx +87 -0
- package/.framework/src/components/ui/input.tsx +19 -0
- package/.framework/src/components/ui/item.tsx +196 -0
- package/.framework/src/components/ui/kbd.tsx +26 -0
- package/.framework/src/components/ui/label.tsx +22 -0
- package/.framework/src/components/ui/menubar.tsx +277 -0
- package/.framework/src/components/ui/native-select.tsx +61 -0
- package/.framework/src/components/ui/navigation-menu.tsx +164 -0
- package/.framework/src/components/ui/pagination.tsx +129 -0
- package/.framework/src/components/ui/popover.tsx +87 -0
- package/.framework/src/components/ui/progress.tsx +31 -0
- package/.framework/src/components/ui/radio-group.tsx +42 -0
- package/.framework/src/components/ui/resizable.tsx +50 -0
- package/.framework/src/components/ui/scroll-area.tsx +53 -0
- package/.framework/src/components/ui/select.tsx +195 -0
- package/.framework/src/components/ui/separator.tsx +26 -0
- package/.framework/src/components/ui/sheet.tsx +145 -0
- package/.framework/src/components/ui/sidebar.tsx +706 -0
- package/.framework/src/components/ui/skeleton.tsx +13 -0
- package/.framework/src/components/ui/slider.tsx +59 -0
- package/.framework/src/components/ui/sonner.tsx +47 -0
- package/.framework/src/components/ui/spinner.tsx +10 -0
- package/.framework/src/components/ui/switch.tsx +33 -0
- package/.framework/src/components/ui/table-primitives.tsx +141 -0
- package/.framework/src/components/ui/table.tsx +114 -0
- package/.framework/src/components/ui/tabs.tsx +90 -0
- package/.framework/src/components/ui/textarea.tsx +18 -0
- package/.framework/src/components/ui/toggle-group.tsx +89 -0
- package/.framework/src/components/ui/toggle.tsx +45 -0
- package/.framework/src/components/ui/tooltip.tsx +57 -0
- package/.framework/src/contexts/AppContext.tsx +133 -0
- package/.framework/src/contexts/AuthContext.tsx +371 -0
- package/.framework/src/hooks/use-mobile.ts +19 -0
- package/.framework/src/hooks/useApi.ts +526 -0
- package/.framework/src/hooks/useApps.ts +114 -0
- package/.framework/src/hooks/useEntityList.ts +190 -0
- package/.framework/src/hooks/useEntityRecord.ts +308 -0
- package/.framework/src/hooks/useForm.ts +307 -0
- package/.framework/src/hooks/useListSchema.ts +264 -0
- package/.framework/src/hooks/useSchemaRecord.ts +223 -0
- package/.framework/src/index.css +128 -0
- package/.framework/src/lib/api.ts +156 -0
- package/.framework/src/lib/supabase.ts +94 -0
- package/.framework/src/lib/utils.ts +317 -0
- package/.framework/src/main.tsx +27 -0
- package/.framework/src/pages/DashboardPage.tsx +181 -0
- package/.framework/src/pages/NotFoundPage.tsx +39 -0
- package/.framework/src/pages/admin/AIAgentDetailPage.tsx +161 -0
- package/.framework/src/pages/admin/AIAgentsPage.tsx +318 -0
- package/.framework/src/pages/admin/APIKeyDetailPage.tsx +199 -0
- package/.framework/src/pages/admin/APIKeysPage.tsx +303 -0
- package/.framework/src/pages/admin/AlertsConfigPage.tsx +523 -0
- package/.framework/src/pages/admin/AppDetailPage.tsx +493 -0
- package/.framework/src/pages/admin/AppsPage.tsx +355 -0
- package/.framework/src/pages/admin/DesignedPage.tsx +491 -0
- package/.framework/src/pages/admin/EmbeddingDetailPage.tsx +534 -0
- package/.framework/src/pages/admin/EmbeddingsPage.tsx +424 -0
- package/.framework/src/pages/admin/ExtendedShadcnTestPage.tsx +176 -0
- package/.framework/src/pages/admin/IncrementalShadcnTestPage.tsx +109 -0
- package/.framework/src/pages/admin/IntegratedDashboard.tsx +402 -0
- package/.framework/src/pages/admin/IntegrationDetailPage.tsx +187 -0
- package/.framework/src/pages/admin/IntegrationsPage.tsx +301 -0
- package/.framework/src/pages/admin/LogsPage.tsx +283 -0
- package/.framework/src/pages/admin/MinimalShadcnTestPage.tsx +85 -0
- package/.framework/src/pages/admin/ObservabilityDashboard.tsx +470 -0
- package/.framework/src/pages/admin/PipelineDetailPage.tsx +183 -0
- package/.framework/src/pages/admin/PipelineExecutionsPage.tsx +279 -0
- package/.framework/src/pages/admin/PipelinesPage.tsx +390 -0
- package/.framework/src/pages/admin/PromptConfigDetailPage.tsx +299 -0
- package/.framework/src/pages/admin/PromptConfigsPage.tsx +292 -0
- package/.framework/src/pages/admin/ProperlyDesignedPage.tsx +434 -0
- package/.framework/src/pages/admin/RoleDetailPage.tsx +273 -0
- package/.framework/src/pages/admin/RolesPage.tsx +292 -0
- package/.framework/src/pages/admin/SelectTestPage.tsx +61 -0
- package/.framework/src/pages/admin/ShadcnTestPage.tsx +588 -0
- package/.framework/src/pages/admin/SimpleDashboard.tsx +387 -0
- package/.framework/src/pages/admin/TestRunDetailPage.tsx +172 -0
- package/.framework/src/pages/admin/TestingDashboard.tsx +257 -0
- package/.framework/src/pages/admin/TimerDetailPage.tsx +151 -0
- package/.framework/src/pages/admin/TimersPage.tsx +376 -0
- package/.framework/src/pages/admin/TriggerDetailPage.tsx +149 -0
- package/.framework/src/pages/admin/TriggersPage.tsx +381 -0
- package/.framework/src/pages/admin/TypeDetailPage.tsx +694 -0
- package/.framework/src/pages/admin/TypesPage.tsx +295 -0
- package/.framework/src/pages/auth/LoginPage.tsx +188 -0
- package/.framework/src/pages/auth/RegisterPage.tsx +163 -0
- package/.framework/src/pages/spine-framework/APIPage.tsx +17 -0
- package/.framework/src/pages/spine-framework/CLIPage.tsx +25 -0
- package/.framework/src/types/auth.ts +125 -0
- package/.framework/src/types/types.ts +407 -0
- package/STRUCTURE.md +150 -0
- package/config/components.json +25 -0
- package/config/deno.lock +108 -0
- package/config/package-lock.json +17183 -0
- package/config/postcss.config.cjs +10 -0
- package/config/tailwind.config.cjs +78 -0
- package/config/tsconfig.build.json +32 -0
- package/config/tsconfig.cli.json +18 -0
- package/config/tsconfig.json +41 -0
- package/config/tsconfig.node.json +17 -0
- package/config/tsconfig.node.tsbuildinfo +1 -0
- package/config/tsconfig.tsbuildinfo +1 -0
- package/config/typedoc.json +16 -0
- package/config/vite.config.d.ts +2 -0
- package/config/vite.config.ts +72 -0
- package/dist/cli/commands/agents.d.ts +39 -0
- package/dist/cli/commands/agents.d.ts.map +1 -0
- package/dist/cli/commands/auth.d.ts +36 -0
- package/dist/cli/commands/auth.d.ts.map +1 -0
- package/dist/cli/commands/create-app.d.ts +23 -0
- package/dist/cli/commands/create-app.d.ts.map +1 -0
- package/dist/cli/commands/dev.d.ts +39 -0
- package/dist/cli/commands/dev.d.ts.map +1 -0
- package/dist/cli/commands/doctor.d.ts +42 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/generate.d.ts +36 -0
- package/dist/cli/commands/generate.d.ts.map +1 -0
- package/dist/cli/commands/init.d.ts +30 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/install-app.d.ts +30 -0
- package/dist/cli/commands/install-app.d.ts.map +1 -0
- package/dist/cli/commands/items.d.ts +45 -0
- package/dist/cli/commands/items.d.ts.map +1 -0
- package/dist/cli/commands/migrations.d.ts +41 -0
- package/dist/cli/commands/migrations.d.ts.map +1 -0
- package/dist/cli/commands/pipelines.d.ts +40 -0
- package/dist/cli/commands/pipelines.d.ts.map +1 -0
- package/dist/cli/commands/status.d.ts +23 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/system.d.ts +29 -0
- package/dist/cli/commands/system.d.ts.map +1 -0
- package/dist/cli/commands/test.d.ts +46 -0
- package/dist/cli/commands/test.d.ts.map +1 -0
- package/dist/cli/commands/uninstall-app.d.ts +23 -0
- package/dist/cli/commands/uninstall-app.d.ts.map +1 -0
- package/dist/cli/context.d.ts +88 -0
- package/dist/cli/context.d.ts.map +1 -0
- package/dist/cli/env-loader.d.ts +14 -0
- package/dist/cli/env-loader.d.ts.map +1 -0
- package/dist/cli/index.d.ts +41 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/functions/_shared/agent-runner.d.ts +156 -0
- package/dist/functions/_shared/agent-runner.d.ts.map +1 -0
- package/dist/functions/_shared/app-manifest.d.ts +68 -0
- package/dist/functions/_shared/app-manifest.d.ts.map +1 -0
- package/dist/functions/_shared/audit.d.ts +91 -0
- package/dist/functions/_shared/audit.d.ts.map +1 -0
- package/dist/functions/_shared/db.d.ts +125 -0
- package/dist/functions/_shared/db.d.ts.map +1 -0
- package/dist/functions/_shared/index.d.ts +298 -0
- package/dist/functions/_shared/index.d.ts.map +1 -0
- package/dist/functions/_shared/middleware.d.ts +315 -0
- package/dist/functions/_shared/middleware.d.ts.map +1 -0
- package/dist/functions/_shared/permissions.d.ts +626 -0
- package/dist/functions/_shared/permissions.d.ts.map +1 -0
- package/dist/functions/_shared/pipeline-runner.d.ts +124 -0
- package/dist/functions/_shared/pipeline-runner.d.ts.map +1 -0
- package/dist/functions/_shared/principal.d.ts +284 -0
- package/dist/functions/_shared/principal.d.ts.map +1 -0
- package/dist/functions/_shared/schema-utils.d.ts +181 -0
- package/dist/functions/_shared/schema-utils.d.ts.map +1 -0
- package/dist/functions/_shared/testing.d.ts +172 -0
- package/dist/functions/_shared/testing.d.ts.map +1 -0
- package/dist/functions/_shared/trigger-engine.d.ts +140 -0
- package/dist/functions/_shared/trigger-engine.d.ts.map +1 -0
- package/dist/functions/_shared/webhook-registration.d.ts +81 -0
- package/dist/functions/_shared/webhook-registration.d.ts.map +1 -0
- package/dist/functions/_shared/webhook-registry.d.ts +57 -0
- package/dist/functions/_shared/webhook-registry.d.ts.map +1 -0
- package/dist/functions/account-nodes.d.ts +48 -0
- package/dist/functions/account-nodes.d.ts.map +1 -0
- package/dist/functions/admin-data.d.ts +178 -0
- package/dist/functions/admin-data.d.ts.map +1 -0
- package/dist/functions/ai-agents.d.ts +125 -0
- package/dist/functions/ai-agents.d.ts.map +1 -0
- package/dist/functions/api-keys.d.ts +140 -0
- package/dist/functions/api-keys.d.ts.map +1 -0
- package/dist/functions/apps.d.ts +163 -0
- package/dist/functions/apps.d.ts.map +1 -0
- package/dist/functions/auth.d.ts +74 -0
- package/dist/functions/auth.d.ts.map +1 -0
- package/dist/functions/debug-auth.d.ts +33 -0
- package/dist/functions/debug-auth.d.ts.map +1 -0
- package/dist/functions/embeddings.d.ts +205 -0
- package/dist/functions/embeddings.d.ts.map +1 -0
- package/dist/functions/integration-routes.d.ts +45 -0
- package/dist/functions/integration-routes.d.ts.map +1 -0
- package/dist/functions/integrations.d.ts +124 -0
- package/dist/functions/integrations.d.ts.map +1 -0
- package/dist/functions/item-progress.d.ts +41 -0
- package/dist/functions/item-progress.d.ts.map +1 -0
- package/dist/functions/logs.d.ts +162 -0
- package/dist/functions/logs.d.ts.map +1 -0
- package/dist/functions/observability.d.ts +123 -0
- package/dist/functions/observability.d.ts.map +1 -0
- package/dist/functions/pipeline-executions.d.ts +190 -0
- package/dist/functions/pipeline-executions.d.ts.map +1 -0
- package/dist/functions/pipelines.d.ts +171 -0
- package/dist/functions/pipelines.d.ts.map +1 -0
- package/dist/functions/prompt-configs.d.ts +125 -0
- package/dist/functions/prompt-configs.d.ts.map +1 -0
- package/dist/functions/roles.d.ts +118 -0
- package/dist/functions/roles.d.ts.map +1 -0
- package/dist/functions/system-cron.d.ts +65 -0
- package/dist/functions/system-cron.d.ts.map +1 -0
- package/dist/functions/system.d.ts +29 -0
- package/dist/functions/system.d.ts.map +1 -0
- package/dist/functions/tests.d.ts +28 -0
- package/dist/functions/tests.d.ts.map +1 -0
- package/dist/functions/timers.d.ts +139 -0
- package/dist/functions/timers.d.ts.map +1 -0
- package/dist/functions/triggers.d.ts +203 -0
- package/dist/functions/triggers.d.ts.map +1 -0
- package/dist/functions/types.d.ts +151 -0
- package/dist/functions/types.d.ts.map +1 -0
- package/dist/src/types/types.d.ts +364 -0
- package/dist/src/types/types.d.ts.map +1 -0
- package/package.json +192 -0
- package/scripts/app-install-cli.ts +286 -0
- package/scripts/assemble-frontend.sh +79 -0
- package/scripts/assemble-functions.sh +62 -0
- package/scripts/assemble.sh +35 -0
- package/scripts/boundary-check.sh +106 -0
- package/scripts/build-manifest.sh +80 -0
- package/scripts/check-core-integrity.sh +82 -0
- package/scripts/ingest-chunks.cjs +202 -0
- package/scripts/kb-chunk-parser.cjs +312 -0
- package/scripts/kb-chunk-parser.ts +330 -0
- package/scripts/load-test-app-install.ts +484 -0
- package/scripts/netlify-dev-wrapper.sh +22 -0
- package/scripts/verify-integrity.sh +69 -0
|
@@ -0,0 +1,494 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module pipeline-executions
|
|
3
|
+
* @audience core-contributor
|
|
4
|
+
* @layer api-handler
|
|
5
|
+
* @stability stable
|
|
6
|
+
*
|
|
7
|
+
* Lifecycle management API for the `pipeline_executions` table. Records
|
|
8
|
+
* track individual pipeline runs: status progression (pending → running →
|
|
9
|
+
* completed/failed/cancelled), timing, trigger data, and result payloads.
|
|
10
|
+
*
|
|
11
|
+
* **Routed by:** `GET/POST/PATCH /.netlify/functions/pipeline-executions`
|
|
12
|
+
*
|
|
13
|
+
* **Actions:**
|
|
14
|
+
* | method | ?action | handler |
|
|
15
|
+
* |--------|----------|------------|
|
|
16
|
+
* | GET | list | list |
|
|
17
|
+
* | GET | running | getRunning |
|
|
18
|
+
* | GET | stats | getStats |
|
|
19
|
+
* | POST | cleanup | cleanup |
|
|
20
|
+
* | GET | ?id | get |
|
|
21
|
+
* | GET | (default)| list |
|
|
22
|
+
* | POST | — | create |
|
|
23
|
+
* | PATCH | start | start |
|
|
24
|
+
* | PATCH | complete | complete |
|
|
25
|
+
* | PATCH | cancel | cancel |
|
|
26
|
+
*
|
|
27
|
+
* **Status FSM:** pending → running → completed | failed | cancelled
|
|
28
|
+
*
|
|
29
|
+
* **Authorization:** All operations use `ctx.db` (RLS-scoped to account).
|
|
30
|
+
* Account context required.
|
|
31
|
+
*
|
|
32
|
+
* **Column reference:**
|
|
33
|
+
* `id`, `pipeline_id`, `status`, `trigger_data`, `result`, `error_message`,
|
|
34
|
+
* `started_at`, `completed_at`, `duration_ms`, `created_by`, `account_id`, `created_at`
|
|
35
|
+
*
|
|
36
|
+
* @seeAlso pipelines.ts (pipeline_id FK source)
|
|
37
|
+
* @seeAlso pipeline-runner.ts (runPipeline — calls create/start/complete)
|
|
38
|
+
* @seeAlso audit.ts (emitLog for pipeline_execution.* events)
|
|
39
|
+
*/
|
|
40
|
+
|
|
41
|
+
import { createHandler, json, error, parseBody } from './_shared/middleware'
|
|
42
|
+
import { emitLog } from './_shared/audit'
|
|
43
|
+
|
|
44
|
+
const SELECT_WITH_JOINS = `
|
|
45
|
+
*,
|
|
46
|
+
pipeline:pipelines(id, name, trigger_type),
|
|
47
|
+
triggered_by_person:people!pipeline_executions_created_by_fkey(id, full_name, email)
|
|
48
|
+
`
|
|
49
|
+
|
|
50
|
+
// ─── HANDLERS ─────────────────────────────────────────────────────────────────
|
|
51
|
+
|
|
52
|
+
// ─── CHUNK_START: PIPELINE_EXECUTIONS_LIST ──────────────────────────────────────────────
|
|
53
|
+
/**
|
|
54
|
+
* @chunk-id PIPELINE_EXECUTIONS_LIST_1_0_0
|
|
55
|
+
* @version 1.0.0
|
|
56
|
+
* @hash 499006790777b78f0eb610474f6869e94869b5b244d1ecedbb0e216cf68bae70
|
|
57
|
+
* @macro Pipeline Executions List Handler
|
|
58
|
+
* @micro Lists pipeline executions with filtering and joins
|
|
59
|
+
* @inputs ctx: CoreContext — Request context with principal and database
|
|
60
|
+
* @inputs body: any — Request body (unused for GET)
|
|
61
|
+
* @outputs Array of execution records with pipeline and person joins
|
|
62
|
+
* @depends-on [createHandler, SELECT_WITH_JOINS]
|
|
63
|
+
* @depended-by [Netlify function routing]
|
|
64
|
+
* @side-effects [DB queries with joins]
|
|
65
|
+
* @tags pipeline-executions, list, crud, pagination
|
|
66
|
+
*/
|
|
67
|
+
export const list = createHandler(async (ctx, body) => {
|
|
68
|
+
const { pipeline_id, status, limit = 100, offset = 0 } = ctx.query || {}
|
|
69
|
+
|
|
70
|
+
if (!ctx.accountId) {
|
|
71
|
+
throw new Error('Account context required')
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
let query = ctx.db
|
|
75
|
+
.from('pipeline_executions')
|
|
76
|
+
.select(SELECT_WITH_JOINS)
|
|
77
|
+
.eq('account_id', ctx.accountId)
|
|
78
|
+
.order('created_at', { ascending: false })
|
|
79
|
+
|
|
80
|
+
if (pipeline_id) query = query.eq('pipeline_id', pipeline_id)
|
|
81
|
+
if (status) query = query.eq('status', status)
|
|
82
|
+
|
|
83
|
+
const { data, error: err } = await query.range(
|
|
84
|
+
parseInt(offset.toString()),
|
|
85
|
+
parseInt(offset.toString()) + parseInt(limit.toString()) - 1
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
if (err) throw err
|
|
89
|
+
|
|
90
|
+
return data
|
|
91
|
+
})
|
|
92
|
+
// ─── CHUNK_END: PIPELINE_EXECUTIONS_LIST ────────────────────────────────────────────────
|
|
93
|
+
|
|
94
|
+
// ─── CHUNK_START: PIPELINE_EXECUTIONS_GET ──────────────────────────────────────────────
|
|
95
|
+
/**
|
|
96
|
+
* @chunk-id PIPELINE_EXECUTIONS_GET_1_0_0
|
|
97
|
+
* @version 1.0.0
|
|
98
|
+
* @hash b148fbec727984f7623d1fa94ae20dd0550056d5c886b0994651f119dbc68521
|
|
99
|
+
* @macro Pipeline Execution Get Handler
|
|
100
|
+
* @micro Returns single pipeline execution record with joins
|
|
101
|
+
* @inputs ctx: CoreContext — Request context with principal and database
|
|
102
|
+
* @inputs body: any — Request body (unused for GET)
|
|
103
|
+
* @outputs Execution record with pipeline and person joins
|
|
104
|
+
* @depends-on [createHandler, SELECT_WITH_JOINS]
|
|
105
|
+
* @depended-by [Netlify function routing]
|
|
106
|
+
* @side-effects [DB single row query with joins]
|
|
107
|
+
* @tags pipeline-executions, get, crud, single-record
|
|
108
|
+
*/
|
|
109
|
+
export const get = createHandler(async (ctx, body) => {
|
|
110
|
+
const { id } = ctx.query || {}
|
|
111
|
+
|
|
112
|
+
if (!id) {
|
|
113
|
+
throw new Error('Execution ID is required')
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
const { data, error: err } = await ctx.db
|
|
117
|
+
.from('pipeline_executions')
|
|
118
|
+
.select(SELECT_WITH_JOINS)
|
|
119
|
+
.eq('id', id)
|
|
120
|
+
.single()
|
|
121
|
+
|
|
122
|
+
if (err) throw err
|
|
123
|
+
|
|
124
|
+
return data
|
|
125
|
+
})
|
|
126
|
+
// ─── CHUNK_END: PIPELINE_EXECUTIONS_GET ────────────────────────────────────────────────
|
|
127
|
+
|
|
128
|
+
// ─── CHUNK_START: PIPELINE_EXECUTIONS_CREATE ──────────────────────────────────────────────
|
|
129
|
+
/**
|
|
130
|
+
* @chunk-id PIPELINE_EXECUTIONS_CREATE_1_0_0
|
|
131
|
+
* @version 1.0.0
|
|
132
|
+
* @hash fb1d51a8ca0e30e0d151147edde5516c01a51f2cfcad64105ff07937aa430924
|
|
133
|
+
* @macro Pipeline Execution Create Handler
|
|
134
|
+
* @micro Creates execution record in pending status with audit logging
|
|
135
|
+
* @inputs ctx: CoreContext — Request context with principal and database
|
|
136
|
+
* @inputs body: object — pipeline_id and optional trigger_data
|
|
137
|
+
* @outputs {execution_id: string} — ID of created execution
|
|
138
|
+
* @depends-on [createHandler, emitLog]
|
|
139
|
+
* @depended-by [Netlify function routing, pipeline-runner.ts]
|
|
140
|
+
* @side-effects [DB insert, audit logging]
|
|
141
|
+
* @tags pipeline-executions, create, crud, audit
|
|
142
|
+
*/
|
|
143
|
+
export const create = createHandler(async (ctx, body) => {
|
|
144
|
+
const { pipeline_id, trigger_data } = body
|
|
145
|
+
|
|
146
|
+
if (!pipeline_id) {
|
|
147
|
+
throw new Error('Pipeline ID is required')
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
if (!ctx.accountId) {
|
|
151
|
+
throw new Error('Account context required')
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
const { data, error: err } = await ctx.db
|
|
155
|
+
.from('pipeline_executions')
|
|
156
|
+
.insert({
|
|
157
|
+
pipeline_id,
|
|
158
|
+
status: 'pending',
|
|
159
|
+
trigger_data: trigger_data || {},
|
|
160
|
+
created_by: ctx.principal?.id || null,
|
|
161
|
+
account_id: ctx.accountId,
|
|
162
|
+
})
|
|
163
|
+
.select('id')
|
|
164
|
+
.single()
|
|
165
|
+
|
|
166
|
+
if (err) throw err
|
|
167
|
+
|
|
168
|
+
await emitLog(ctx, 'pipeline_execution.created',
|
|
169
|
+
{ type: 'pipeline_execution', id: data?.id },
|
|
170
|
+
{ after: { pipeline_id } }
|
|
171
|
+
)
|
|
172
|
+
|
|
173
|
+
return { execution_id: data?.id }
|
|
174
|
+
})
|
|
175
|
+
// ─── CHUNK_END: PIPELINE_EXECUTIONS_CREATE ────────────────────────────────────────────────
|
|
176
|
+
|
|
177
|
+
// ─── CHUNK_START: PIPELINE_EXECUTIONS_START ──────────────────────────────────────────────
|
|
178
|
+
/**
|
|
179
|
+
* @chunk-id PIPELINE_EXECUTIONS_START_1_0_0
|
|
180
|
+
* @version 1.0.0
|
|
181
|
+
* @hash 25eeada82be4fff26606dc6e784b6e0accaaebaee08514577368cdd146f39aaf
|
|
182
|
+
* @macro Pipeline Execution Start Handler
|
|
183
|
+
* @micro Transitions execution from pending to running with timestamp
|
|
184
|
+
* @inputs ctx: CoreContext — Request context with principal and database
|
|
185
|
+
* @inputs body: object — execution id to start
|
|
186
|
+
* @outputs {success: true} — Confirmation of successful start
|
|
187
|
+
* @depends-on [createHandler, emitLog]
|
|
188
|
+
* @depended-by [Netlify function routing, pipeline-runner.ts]
|
|
189
|
+
* @side-effects [DB update, audit logging]
|
|
190
|
+
* @tags pipeline-executions, start, state-transition, audit
|
|
191
|
+
*/
|
|
192
|
+
export const start = createHandler(async (ctx, body) => {
|
|
193
|
+
const { id } = body
|
|
194
|
+
|
|
195
|
+
if (!id) {
|
|
196
|
+
throw new Error('Execution ID is required')
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
const { data, error: err } = await ctx.db
|
|
200
|
+
.from('pipeline_executions')
|
|
201
|
+
.update({ status: 'running', started_at: new Date().toISOString() })
|
|
202
|
+
.eq('id', id)
|
|
203
|
+
.select('id')
|
|
204
|
+
.single()
|
|
205
|
+
|
|
206
|
+
if (err) throw err
|
|
207
|
+
|
|
208
|
+
await emitLog(ctx, 'pipeline_execution.started',
|
|
209
|
+
{ type: 'pipeline_execution', id },
|
|
210
|
+
{ after: { status: 'running' } }
|
|
211
|
+
)
|
|
212
|
+
|
|
213
|
+
return { success: true }
|
|
214
|
+
})
|
|
215
|
+
// ─── CHUNK_END: PIPELINE_EXECUTIONS_START ────────────────────────────────────────────────
|
|
216
|
+
|
|
217
|
+
// ─── CHUNK_START: PIPELINE_EXECUTIONS_COMPLETE ──────────────────────────────────────────────
|
|
218
|
+
/**
|
|
219
|
+
* @chunk-id PIPELINE_EXECUTIONS_COMPLETE_1_0_0
|
|
220
|
+
* @version 1.0.0
|
|
221
|
+
* @hash 088db36524718ec6d8d85e1051aa5d1c4fc31fb796f284bc1526c195d4686dff
|
|
222
|
+
* @macro Pipeline Execution Complete Handler
|
|
223
|
+
* @micro Transitions execution to completed/failed with duration calculation
|
|
224
|
+
* @inputs ctx: CoreContext — Request context with principal and database
|
|
225
|
+
* @inputs body: object — id, output_data, and optional error_message
|
|
226
|
+
* @outputs {success: true} — Confirmation of successful completion
|
|
227
|
+
* @depends-on [createHandler, emitLog]
|
|
228
|
+
* @depended-by [Netlify function routing, pipeline-runner.ts]
|
|
229
|
+
* @side-effects [DB read for started_at, DB update, audit logging]
|
|
230
|
+
* @tags pipeline-executions, complete, state-transition, audit
|
|
231
|
+
*/
|
|
232
|
+
export const complete = createHandler(async (ctx, body) => {
|
|
233
|
+
const { id, output_data, error_message } = body
|
|
234
|
+
|
|
235
|
+
if (!id) {
|
|
236
|
+
throw new Error('Execution ID is required')
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
const now = new Date().toISOString()
|
|
240
|
+
const finalStatus = error_message ? 'failed' : 'completed'
|
|
241
|
+
|
|
242
|
+
// Fetch started_at to compute duration
|
|
243
|
+
const { data: existing } = await ctx.db
|
|
244
|
+
.from('pipeline_executions')
|
|
245
|
+
.select('started_at')
|
|
246
|
+
.eq('id', id)
|
|
247
|
+
.single()
|
|
248
|
+
|
|
249
|
+
const duration_ms = existing?.started_at
|
|
250
|
+
? Math.round(Date.now() - new Date(existing.started_at).getTime())
|
|
251
|
+
: null
|
|
252
|
+
|
|
253
|
+
const { data, error: err } = await ctx.db
|
|
254
|
+
.from('pipeline_executions')
|
|
255
|
+
.update({
|
|
256
|
+
status: finalStatus,
|
|
257
|
+
result: output_data || {},
|
|
258
|
+
error_message: error_message || null,
|
|
259
|
+
completed_at: now,
|
|
260
|
+
duration_ms,
|
|
261
|
+
})
|
|
262
|
+
.eq('id', id)
|
|
263
|
+
.select('id')
|
|
264
|
+
.single()
|
|
265
|
+
|
|
266
|
+
if (err) throw err
|
|
267
|
+
|
|
268
|
+
await emitLog(ctx, 'pipeline_execution.completed',
|
|
269
|
+
{ type: 'pipeline_execution', id },
|
|
270
|
+
{ after: { status: finalStatus, error_message } }
|
|
271
|
+
)
|
|
272
|
+
|
|
273
|
+
return { success: true }
|
|
274
|
+
})
|
|
275
|
+
// ─── CHUNK_END: PIPELINE_EXECUTIONS_COMPLETE ────────────────────────────────────────────────
|
|
276
|
+
|
|
277
|
+
// ─── CHUNK_START: PIPELINE_EXECUTIONS_CANCEL ──────────────────────────────────────────────
|
|
278
|
+
/**
|
|
279
|
+
* @chunk-id PIPELINE_EXECUTIONS_CANCEL_1_0_0
|
|
280
|
+
* @version 1.0.0
|
|
281
|
+
* @hash f45e336099afeb28cb3db099fa428d8637e07876dcabf7ec85de844c25b43d97
|
|
282
|
+
* @macro Pipeline Execution Cancel Handler
|
|
283
|
+
* @micro Cancels execution by setting status to cancelled with timestamp
|
|
284
|
+
* @inputs ctx: CoreContext — Request context with principal and database
|
|
285
|
+
* @inputs body: object — execution id to cancel
|
|
286
|
+
* @outputs {success: true} — Confirmation of successful cancellation
|
|
287
|
+
* @depends-on [createHandler, emitLog]
|
|
288
|
+
* @depended-by [Netlify function routing]
|
|
289
|
+
* @side-effects [DB update, audit logging]
|
|
290
|
+
* @tags pipeline-executions, cancel, state-transition, audit
|
|
291
|
+
*/
|
|
292
|
+
export const cancel = createHandler(async (ctx, body) => {
|
|
293
|
+
const { id } = body
|
|
294
|
+
|
|
295
|
+
if (!id) {
|
|
296
|
+
throw new Error('Execution ID is required')
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
const { data, error: err } = await ctx.db
|
|
300
|
+
.from('pipeline_executions')
|
|
301
|
+
.update({ status: 'cancelled', completed_at: new Date().toISOString() })
|
|
302
|
+
.eq('id', id)
|
|
303
|
+
.select('id')
|
|
304
|
+
.single()
|
|
305
|
+
|
|
306
|
+
if (err) throw err
|
|
307
|
+
|
|
308
|
+
await emitLog(ctx, 'pipeline_execution.cancelled',
|
|
309
|
+
{ type: 'pipeline_execution', id },
|
|
310
|
+
{ after: { status: 'cancelled' } }
|
|
311
|
+
)
|
|
312
|
+
|
|
313
|
+
return { success: true }
|
|
314
|
+
})
|
|
315
|
+
// ─── CHUNK_END: PIPELINE_EXECUTIONS_CANCEL ────────────────────────────────────────────────
|
|
316
|
+
|
|
317
|
+
// ─── CHUNK_START: PIPELINE_EXECUTIONS_GET_RUNNING ──────────────────────────────────────────────
|
|
318
|
+
/**
|
|
319
|
+
* @chunk-id PIPELINE_EXECUTIONS_GET_RUNNING_1_0_0
|
|
320
|
+
* @version 1.0.0
|
|
321
|
+
* @hash d43691d1d9063a7421eae3b32ede4bb603efa7b2faf635861f66178fde5641b6
|
|
322
|
+
* @macro Running Pipeline Executions Handler
|
|
323
|
+
* @micro Returns currently running executions with optional pipeline filter
|
|
324
|
+
* @inputs ctx: CoreContext — Request context with principal and database
|
|
325
|
+
* @inputs body: any — Request body (unused for GET)
|
|
326
|
+
* @outputs Array of running execution records with joins
|
|
327
|
+
* @depends-on [createHandler, SELECT_WITH_JOINS]
|
|
328
|
+
* @depended-by [Netlify function routing]
|
|
329
|
+
* @side-effects [DB query with joins]
|
|
330
|
+
* @tags pipeline-executions, running, status-filter, monitoring
|
|
331
|
+
*/
|
|
332
|
+
export const getRunning = createHandler(async (ctx, body) => {
|
|
333
|
+
const { pipeline_id } = ctx.query || {}
|
|
334
|
+
|
|
335
|
+
if (!ctx.accountId) {
|
|
336
|
+
throw new Error('Account context required')
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
let query = ctx.db
|
|
340
|
+
.from('pipeline_executions')
|
|
341
|
+
.select(SELECT_WITH_JOINS)
|
|
342
|
+
.eq('account_id', ctx.accountId)
|
|
343
|
+
.eq('status', 'running')
|
|
344
|
+
.order('started_at', { ascending: false })
|
|
345
|
+
|
|
346
|
+
if (pipeline_id) query = query.eq('pipeline_id', pipeline_id)
|
|
347
|
+
|
|
348
|
+
const { data, error: err } = await query
|
|
349
|
+
|
|
350
|
+
if (err) throw err
|
|
351
|
+
|
|
352
|
+
return data
|
|
353
|
+
})
|
|
354
|
+
// ─── CHUNK_END: PIPELINE_EXECUTIONS_GET_RUNNING ────────────────────────────────────────────────
|
|
355
|
+
|
|
356
|
+
// ─── CHUNK_START: PIPELINE_EXECUTIONS_GET_STATS ──────────────────────────────────────────────
|
|
357
|
+
/**
|
|
358
|
+
* @chunk-id PIPELINE_EXECUTIONS_GET_STATS_1_0_0
|
|
359
|
+
* @version 1.0.0
|
|
360
|
+
* @hash f80bc6b6b830d1bafcd7d02ecac50c78cab10ceef7441dc477b3193a7b29143e
|
|
361
|
+
* @macro Pipeline Executions Statistics Handler
|
|
362
|
+
* @micro Returns execution counts by status with filtering options
|
|
363
|
+
* @inputs ctx: CoreContext — Request context with principal and database
|
|
364
|
+
* @inputs body: any — Request body (unused for GET)
|
|
365
|
+
* @outputs {total, completed, failed, running} — Status count statistics
|
|
366
|
+
* @depends-on [createHandler]
|
|
367
|
+
* @depended-by [Netlify function routing]
|
|
368
|
+
* @side-effects [DB count query, aggregation]
|
|
369
|
+
* @tags pipeline-executions, stats, analytics, monitoring
|
|
370
|
+
*/
|
|
371
|
+
export const getStats = createHandler(async (ctx, body) => {
|
|
372
|
+
const { pipeline_id, date_from, date_to } = ctx.query || {}
|
|
373
|
+
|
|
374
|
+
if (!ctx.accountId) {
|
|
375
|
+
throw new Error('Account context required')
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
let query = ctx.db
|
|
379
|
+
.from('pipeline_executions')
|
|
380
|
+
.select('id, status')
|
|
381
|
+
.eq('account_id', ctx.accountId)
|
|
382
|
+
|
|
383
|
+
if (pipeline_id) query = query.eq('pipeline_id', pipeline_id)
|
|
384
|
+
if (date_from) query = query.gte('created_at', date_from)
|
|
385
|
+
if (date_to) query = query.lte('created_at', date_to)
|
|
386
|
+
|
|
387
|
+
const { data, error: err } = await query
|
|
388
|
+
|
|
389
|
+
if (err) throw err
|
|
390
|
+
|
|
391
|
+
const rows = data || []
|
|
392
|
+
return {
|
|
393
|
+
total: rows.length,
|
|
394
|
+
completed: rows.filter((r: any) => r.status === 'completed').length,
|
|
395
|
+
failed: rows.filter((r: any) => r.status === 'failed').length,
|
|
396
|
+
running: rows.filter((r: any) => r.status === 'running').length,
|
|
397
|
+
}
|
|
398
|
+
})
|
|
399
|
+
// ─── CHUNK_END: PIPELINE_EXECUTIONS_GET_STATS ────────────────────────────────────────────────
|
|
400
|
+
|
|
401
|
+
// ─── CHUNK_START: PIPELINE_EXECUTIONS_CLEANUP ──────────────────────────────────────────────
|
|
402
|
+
/**
|
|
403
|
+
* @chunk-id PIPELINE_EXECUTIONS_CLEANUP_1_0_0
|
|
404
|
+
* @version 1.0.0
|
|
405
|
+
* @hash 713c36d875b9e210b16504c324491c66485681a47265ab8cd228c66be58386d4
|
|
406
|
+
* @macro Pipeline Executions Cleanup Handler
|
|
407
|
+
* @micro Deletes old execution records beyond retention period
|
|
408
|
+
* @inputs ctx: CoreContext — Request context with principal and database
|
|
409
|
+
* @inputs body: object — days_to_keep (default 30) and optional status_filter
|
|
410
|
+
* @outputs {deleted_count: number} — Number of deleted execution records
|
|
411
|
+
* @depends-on [createHandler, emitLog]
|
|
412
|
+
* @depended-by [Netlify function routing]
|
|
413
|
+
* @side-effects [DB delete by date, audit logging]
|
|
414
|
+
* @tags pipeline-executions, cleanup, retention, maintenance
|
|
415
|
+
*/
|
|
416
|
+
export const cleanup = createHandler(async (ctx, body) => {
|
|
417
|
+
const { days_to_keep = 30, status_filter } = body
|
|
418
|
+
|
|
419
|
+
const cutoff = new Date()
|
|
420
|
+
cutoff.setDate(cutoff.getDate() - parseInt(days_to_keep.toString()))
|
|
421
|
+
|
|
422
|
+
let query = ctx.db
|
|
423
|
+
.from('pipeline_executions')
|
|
424
|
+
.delete()
|
|
425
|
+
.lt('created_at', cutoff.toISOString())
|
|
426
|
+
|
|
427
|
+
if (status_filter) query = query.eq('status', status_filter)
|
|
428
|
+
|
|
429
|
+
const { data, error: err } = await query.select('id')
|
|
430
|
+
|
|
431
|
+
if (err) throw err
|
|
432
|
+
|
|
433
|
+
await emitLog(ctx, 'pipeline_executions.cleaned',
|
|
434
|
+
{ type: 'system', id: 'cleanup' },
|
|
435
|
+
{ after: { deleted_count: (data || []).length } }
|
|
436
|
+
)
|
|
437
|
+
|
|
438
|
+
return { deleted_count: (data || []).length }
|
|
439
|
+
})
|
|
440
|
+
// ─── CHUNK_END: PIPELINE_EXECUTIONS_CLEANUP ────────────────────────────────────────────────
|
|
441
|
+
|
|
442
|
+
// ─── MAIN HANDLER ────────────────────────────────────────────────────────────
|
|
443
|
+
|
|
444
|
+
// ─── CHUNK_START: PIPELINE_EXECUTIONS_HANDLER ──────────────────────────────────────────────
|
|
445
|
+
/**
|
|
446
|
+
* @chunk-id PIPELINE_EXECUTIONS_HANDLER_1_0_0
|
|
447
|
+
* @version 1.0.0
|
|
448
|
+
* @hash d1ff32ebff977774775afb91952838530a5d628211a7ab7ac5c74aca2e7c77d2
|
|
449
|
+
* @macro Pipeline Executions Router
|
|
450
|
+
* @micro Routes HTTP methods and actions to appropriate pipeline execution handlers
|
|
451
|
+
* @inputs ctx: CoreContext — Request context with principal and database
|
|
452
|
+
* @inputs body: any — Request body for POST/PATCH operations
|
|
453
|
+
* @outputs Varies — Depends on routed handler (list/get/create/start/complete/cancel/getRunning/getStats/cleanup)
|
|
454
|
+
* @depends-on [createHandler, list, get, create, start, complete, cancel, getRunning, getStats, cleanup]
|
|
455
|
+
* @depended-by [Netlify function routing, pipeline-runner.ts]
|
|
456
|
+
* @side-effects [Delegates to appropriate handler]
|
|
457
|
+
* @tags pipeline-executions, router, crud, netlify-function
|
|
458
|
+
*/
|
|
459
|
+
export const handler = createHandler(async (ctx, body) => {
|
|
460
|
+
const { action } = ctx.query || {}
|
|
461
|
+
const method = ctx.query?.method || 'GET'
|
|
462
|
+
|
|
463
|
+
switch (action) {
|
|
464
|
+
case 'list':
|
|
465
|
+
if (method === 'GET') return await list(ctx, body)
|
|
466
|
+
break
|
|
467
|
+
case 'running':
|
|
468
|
+
if (method === 'GET') return await getRunning(ctx, body)
|
|
469
|
+
break
|
|
470
|
+
case 'stats':
|
|
471
|
+
if (method === 'GET') return await getStats(ctx, body)
|
|
472
|
+
break
|
|
473
|
+
case 'cleanup':
|
|
474
|
+
if (method === 'POST') return await cleanup(ctx, body)
|
|
475
|
+
break
|
|
476
|
+
default:
|
|
477
|
+
if (method === 'GET') {
|
|
478
|
+
if (ctx.query?.id) {
|
|
479
|
+
return await get(ctx, body)
|
|
480
|
+
} else {
|
|
481
|
+
return await list(ctx, body)
|
|
482
|
+
}
|
|
483
|
+
} else if (method === 'POST') {
|
|
484
|
+
return await create(ctx, body)
|
|
485
|
+
} else if (method === 'PATCH') {
|
|
486
|
+
if (ctx.query?.action === 'start') return await start(ctx, body)
|
|
487
|
+
else if (ctx.query?.action === 'complete') return await complete(ctx, body)
|
|
488
|
+
else if (ctx.query?.action === 'cancel') return await cancel(ctx, body)
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
throw new Error('Invalid action or method')
|
|
493
|
+
})
|
|
494
|
+
// ─── CHUNK_END: PIPELINE_EXECUTIONS_HANDLER ────────────────────────────────────────────────
|