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,563 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module triggers
|
|
3
|
+
* @audience core-contributor
|
|
4
|
+
* @layer api-handler
|
|
5
|
+
* @stability stable
|
|
6
|
+
*
|
|
7
|
+
* CRUD API for the `triggers` table, plus execution history access.
|
|
8
|
+
* Triggers bind event types to pipelines. When an event fires, the trigger
|
|
9
|
+
* engine evaluates active triggers via `_shared/trigger-engine.ts`.
|
|
10
|
+
*
|
|
11
|
+
* **Routed by:** `GET/POST/PATCH/DELETE /.netlify/functions/triggers`
|
|
12
|
+
*
|
|
13
|
+
* **Actions:**
|
|
14
|
+
* | method | ?action | handler |
|
|
15
|
+
* |--------|------------|---------------|
|
|
16
|
+
* | GET | by-event | listByEvent |
|
|
17
|
+
* | GET | executions | getExecutions |
|
|
18
|
+
* | POST | toggle | toggle |
|
|
19
|
+
* | GET | ?id | get |
|
|
20
|
+
* | GET | (default) | list |
|
|
21
|
+
* | POST | — | create |
|
|
22
|
+
* | PATCH | — | update |
|
|
23
|
+
* | DELETE | — | remove (soft) |
|
|
24
|
+
*
|
|
25
|
+
* **Authorization:** `create` requires system admin OR first-surface `canCreate`
|
|
26
|
+
* permission. All other operations use `ctx.db` RLS.
|
|
27
|
+
*
|
|
28
|
+
* Also exports `AGENT_EVENT_TYPES` constant and `getAgentEventTypes()` helper
|
|
29
|
+
* for referencing well-known agent event slugs in trigger configuration.
|
|
30
|
+
*
|
|
31
|
+
* @seeAlso trigger-engine.ts (checkAndFireTriggers — runtime evaluation)
|
|
32
|
+
* @seeAlso pipelines.ts (pipeline_id FK on triggers)
|
|
33
|
+
* @seeAlso audit.ts (emitLog for trigger.* events)
|
|
34
|
+
*/
|
|
35
|
+
|
|
36
|
+
import { createHandler } from './_shared/middleware'
|
|
37
|
+
import { joins } from './_shared/db'
|
|
38
|
+
import { emitLog } from './_shared/audit'
|
|
39
|
+
import { PermissionEngine, sanitizeRecordData } from './_shared/permissions'
|
|
40
|
+
|
|
41
|
+
const permissions = PermissionEngine as any
|
|
42
|
+
|
|
43
|
+
// ─── CONSTANTS ─────────────────────────────────────────────────────────────────
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Well-known agent event type slugs for use in trigger `event_type` config.
|
|
47
|
+
* These are emitted by `agent-runner.ts` during inference, tool dispatch,
|
|
48
|
+
* and escalation workflows.
|
|
49
|
+
*/
|
|
50
|
+
export const AGENT_EVENT_TYPES = {
|
|
51
|
+
// Inference events
|
|
52
|
+
INFERENCE_COMPLETED: 'agent.inference.completed',
|
|
53
|
+
INFERENCE_FAILED: 'agent.inference.failed',
|
|
54
|
+
LOW_CONFIDENCE: 'agent.inference.low_confidence',
|
|
55
|
+
|
|
56
|
+
// Tool events
|
|
57
|
+
TOOL_CALLED: 'agent.tool.called',
|
|
58
|
+
TOOL_COMPLETED: 'agent.tool.completed',
|
|
59
|
+
TOOL_FAILED: 'agent.tool.failed',
|
|
60
|
+
|
|
61
|
+
// Conversation events
|
|
62
|
+
MESSAGE_RECEIVED: 'agent.message.received',
|
|
63
|
+
MESSAGE_SENT: 'agent.message.sent',
|
|
64
|
+
THREAD_CREATED: 'agent.thread.created',
|
|
65
|
+
|
|
66
|
+
// Escalation events
|
|
67
|
+
ESCALATION_TRIGGERED: 'agent.escalation.triggered',
|
|
68
|
+
ESCALATION_RESOLVED: 'agent.escalation.resolved',
|
|
69
|
+
HUMAN_HANDOFF: 'agent.human.handoff'
|
|
70
|
+
} as const
|
|
71
|
+
|
|
72
|
+
// ─── CHUNK_START: TRIGGERS_GET_AGENT_EVENT_TYPES ──────────────────────────────────────────────
|
|
73
|
+
/**
|
|
74
|
+
* @chunk-id TRIGGERS_GET_AGENT_EVENT_TYPES_1_0_0
|
|
75
|
+
* @version 1.0.0
|
|
76
|
+
* @hash ef90bc655886f31a4417d82b5bac35cfece4ba4e03770d71a449fc36e4cecb24
|
|
77
|
+
* @macro Agent Event Types Helper
|
|
78
|
+
* @micro Returns array of all agent event type slugs for UI dropdowns
|
|
79
|
+
* @inputs None
|
|
80
|
+
* @outputs string[] — All AGENT_EVENT_TYPES values
|
|
81
|
+
* @depends-on [AGENT_EVENT_TYPES constant]
|
|
82
|
+
* @depended-by [UI components, trigger configuration forms]
|
|
83
|
+
* @side-effects [None]
|
|
84
|
+
* @tags triggers, helper, event-types, ui
|
|
85
|
+
*/
|
|
86
|
+
export function getAgentEventTypes(): string[] {
|
|
87
|
+
return Object.values(AGENT_EVENT_TYPES)
|
|
88
|
+
}
|
|
89
|
+
// ─── CHUNK_END: TRIGGERS_GET_AGENT_EVENT_TYPES ────────────────────────────────────────────────
|
|
90
|
+
|
|
91
|
+
// ─── HANDLERS ─────────────────────────────────────────────────────────────────
|
|
92
|
+
|
|
93
|
+
// ─── CHUNK_START: TRIGGERS_LIST_BY_EVENT ──────────────────────────────────────────────
|
|
94
|
+
/**
|
|
95
|
+
* @chunk-id TRIGGERS_LIST_BY_EVENT_1_0_0
|
|
96
|
+
* @version 1.0.0
|
|
97
|
+
* @hash c6d2127dc2ced6d0618b338d227d8823b699b86977fc14ce455a27a29a2b1fa5
|
|
98
|
+
* @macro Triggers by Event List Handler
|
|
99
|
+
* @micro Lists triggers filtered by event type with sanitization
|
|
100
|
+
* @inputs ctx: CoreContext — Request context with principal and database
|
|
101
|
+
* @inputs body: any — Request body (unused for GET)
|
|
102
|
+
* @outputs Array of sanitized trigger records with app/createdBy joins
|
|
103
|
+
* @depends-on [createHandler, joins, sanitizeRecordData]
|
|
104
|
+
* @depended-by [Netlify function routing]
|
|
105
|
+
* @side-effects [DB queries, permission sanitization]
|
|
106
|
+
* @tags triggers, list, event-type, crud
|
|
107
|
+
*/
|
|
108
|
+
export const listByEvent = createHandler(async (ctx, body) => {
|
|
109
|
+
const { event_type, app_id, include_inactive } = ctx.query || {}
|
|
110
|
+
|
|
111
|
+
if (!event_type) {
|
|
112
|
+
throw new Error('event_type is required')
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
if (!ctx.accountId) {
|
|
116
|
+
throw new Error('Account context required')
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
let query = ctx.db
|
|
120
|
+
.from('triggers')
|
|
121
|
+
.select(`*, ${joins.app}, ${joins.createdBy}`)
|
|
122
|
+
.eq('event_type', event_type)
|
|
123
|
+
.order('name')
|
|
124
|
+
|
|
125
|
+
if (app_id) {
|
|
126
|
+
query = query.eq('app_id', app_id)
|
|
127
|
+
}
|
|
128
|
+
if (include_inactive !== 'true') {
|
|
129
|
+
query = query.eq('is_active', true)
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
const { data, error: err } = await query
|
|
133
|
+
|
|
134
|
+
if (err) throw err
|
|
135
|
+
|
|
136
|
+
// Sanitize each record based on role permissions
|
|
137
|
+
const sanitized = []
|
|
138
|
+
for (const trigger of data || []) {
|
|
139
|
+
sanitized.push(await sanitizeRecordData(ctx, trigger, 'trigger'))
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
return sanitized
|
|
143
|
+
})
|
|
144
|
+
// ─── CHUNK_END: TRIGGERS_LIST_BY_EVENT ────────────────────────────────────────────────
|
|
145
|
+
|
|
146
|
+
// ─── CHUNK_START: TRIGGERS_LIST ──────────────────────────────────────────────
|
|
147
|
+
/**
|
|
148
|
+
* @chunk-id TRIGGERS_LIST_1_0_0
|
|
149
|
+
* @version 1.0.0
|
|
150
|
+
* @hash b65a861b2a1b7c63a6a2bbe395dfb6138fe00e0517a0eb40f012c2317fbcf45f
|
|
151
|
+
* @macro Triggers List Handler
|
|
152
|
+
* @micro Lists triggers with filtering and sanitization
|
|
153
|
+
* @inputs ctx: CoreContext — Request context with principal and database
|
|
154
|
+
* @inputs body: any — Request body (unused for GET)
|
|
155
|
+
* @outputs Array of sanitized trigger records with app/createdBy joins
|
|
156
|
+
* @depends-on [createHandler, joins, sanitizeRecordData]
|
|
157
|
+
* @depended-by [Netlify function routing]
|
|
158
|
+
* @side-effects [DB queries, permission sanitization]
|
|
159
|
+
* @tags triggers, list, crud, filtering
|
|
160
|
+
*/
|
|
161
|
+
export const list = createHandler(async (ctx, body) => {
|
|
162
|
+
const { app_id, event_type, include_inactive } = ctx.query || {}
|
|
163
|
+
|
|
164
|
+
if (!ctx.accountId) {
|
|
165
|
+
throw new Error('Account context required')
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// RLS automatically filters to accessible accounts
|
|
169
|
+
let query = ctx.db
|
|
170
|
+
.from('triggers')
|
|
171
|
+
.select(`*, ${joins.app}, ${joins.createdBy}`)
|
|
172
|
+
.order('name')
|
|
173
|
+
|
|
174
|
+
if (app_id) {
|
|
175
|
+
query = query.eq('app_id', app_id)
|
|
176
|
+
}
|
|
177
|
+
if (event_type) {
|
|
178
|
+
query = query.eq('event_type', event_type)
|
|
179
|
+
}
|
|
180
|
+
if (include_inactive !== 'true') {
|
|
181
|
+
query = query.eq('is_active', true)
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
const { data, error: err } = await query
|
|
185
|
+
|
|
186
|
+
if (err) throw err
|
|
187
|
+
|
|
188
|
+
// Sanitize each record based on role permissions
|
|
189
|
+
const sanitized = []
|
|
190
|
+
for (const trigger of data || []) {
|
|
191
|
+
sanitized.push(await sanitizeRecordData(ctx, trigger, 'trigger'))
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
return sanitized
|
|
195
|
+
})
|
|
196
|
+
// ─── CHUNK_END: TRIGGERS_LIST ────────────────────────────────────────────────
|
|
197
|
+
|
|
198
|
+
// ─── CHUNK_START: TRIGGERS_GET ──────────────────────────────────────────────
|
|
199
|
+
/**
|
|
200
|
+
* @chunk-id TRIGGERS_GET_1_0_0
|
|
201
|
+
* @version 1.0.0
|
|
202
|
+
* @hash 106ae81cd0528145f976f7c8e0cc16cacaf32468d0e2950a16b8f167bb88143d
|
|
203
|
+
* @macro Trigger Get Handler
|
|
204
|
+
* @micro Returns single trigger record with joins and sanitization
|
|
205
|
+
* @inputs ctx: CoreContext — Request context with principal and database
|
|
206
|
+
* @inputs body: any — Request body (unused for GET)
|
|
207
|
+
* @outputs Sanitized trigger record with app/createdBy joins
|
|
208
|
+
* @depends-on [createHandler, joins, sanitizeRecordData]
|
|
209
|
+
* @depended-by [Netlify function routing]
|
|
210
|
+
* @side-effects [DB single row query, permission sanitization]
|
|
211
|
+
* @tags triggers, get, crud, single-record
|
|
212
|
+
*/
|
|
213
|
+
export const get = createHandler(async (ctx, body) => {
|
|
214
|
+
const { id } = ctx.query || {}
|
|
215
|
+
|
|
216
|
+
if (!id) {
|
|
217
|
+
throw new Error('Trigger ID is required')
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
const { data, error: err } = await ctx.db
|
|
221
|
+
.from('triggers')
|
|
222
|
+
.select(`*, ${joins.app}, ${joins.createdBy}`)
|
|
223
|
+
.eq('id', id)
|
|
224
|
+
.single()
|
|
225
|
+
|
|
226
|
+
if (err) throw err
|
|
227
|
+
|
|
228
|
+
// Sanitize based on role permissions
|
|
229
|
+
return await sanitizeRecordData(ctx, data, 'trigger')
|
|
230
|
+
})
|
|
231
|
+
// ─── CHUNK_END: TRIGGERS_GET ────────────────────────────────────────────────
|
|
232
|
+
|
|
233
|
+
// ─── CHUNK_START: TRIGGERS_CREATE ──────────────────────────────────────────────
|
|
234
|
+
/**
|
|
235
|
+
* @chunk-id TRIGGERS_CREATE_1_0_0
|
|
236
|
+
* @version 1.0.0
|
|
237
|
+
* @hash 4411a0111e10158d29446e4b989fbccaf1e55057b4f809129eed33f93ee21901
|
|
238
|
+
* @macro Trigger Create Handler
|
|
239
|
+
* @micro Creates trigger with permission validation and audit logging
|
|
240
|
+
* @inputs ctx: CoreContext — Request context with principal and database
|
|
241
|
+
* @inputs body: object — Trigger data including name, trigger_type, and optional fields
|
|
242
|
+
* @outputs Inserted trigger record
|
|
243
|
+
* @depends-on [createHandler, PermissionEngine, emitLog]
|
|
244
|
+
* @depended-by [Netlify function routing]
|
|
245
|
+
* @side-effects [DB insert, permission validation, audit logging]
|
|
246
|
+
* @tags triggers, create, crud, permissions, audit
|
|
247
|
+
*/
|
|
248
|
+
export const create = createHandler(async (ctx, body) => {
|
|
249
|
+
const { app_id, name, description, trigger_type, event_type, config, pipeline_id, metadata, is_active } = body
|
|
250
|
+
|
|
251
|
+
if (!name || !trigger_type) {
|
|
252
|
+
throw new Error('name and trigger_type are required')
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
if (!ctx.principal || ctx.principal.id === 'anonymous' || !ctx.accountId) {
|
|
256
|
+
throw new Error('User context (person and account) required')
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
// Check create permissions
|
|
260
|
+
if (!permissions.isSystemAdmin(ctx)) {
|
|
261
|
+
const perms = await permissions.resolveFirstSurfacePermissions(
|
|
262
|
+
ctx.principal.id,
|
|
263
|
+
ctx.accountId!,
|
|
264
|
+
'trigger',
|
|
265
|
+
'create'
|
|
266
|
+
)
|
|
267
|
+
|
|
268
|
+
if (!perms.canCreate) {
|
|
269
|
+
throw new Error('Insufficient permissions to create triggers')
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
const { data, error: err } = await ctx.db
|
|
274
|
+
.from('triggers')
|
|
275
|
+
.insert({
|
|
276
|
+
app_id,
|
|
277
|
+
name,
|
|
278
|
+
description,
|
|
279
|
+
trigger_type,
|
|
280
|
+
event_type,
|
|
281
|
+
config: config || {},
|
|
282
|
+
pipeline_id: pipeline_id || null,
|
|
283
|
+
metadata: metadata || {},
|
|
284
|
+
is_active: is_active ?? true,
|
|
285
|
+
created_by: ctx.principal.id,
|
|
286
|
+
account_id: ctx.accountId
|
|
287
|
+
})
|
|
288
|
+
.select()
|
|
289
|
+
.single()
|
|
290
|
+
|
|
291
|
+
if (err) throw err
|
|
292
|
+
|
|
293
|
+
await emitLog(ctx, 'trigger.created',
|
|
294
|
+
{ type: 'trigger', id: data.id },
|
|
295
|
+
{ after: data }
|
|
296
|
+
)
|
|
297
|
+
|
|
298
|
+
return data
|
|
299
|
+
})
|
|
300
|
+
// ─── CHUNK_END: TRIGGERS_CREATE ────────────────────────────────────────────────
|
|
301
|
+
|
|
302
|
+
// ─── CHUNK_START: TRIGGERS_UPDATE ──────────────────────────────────────────────
|
|
303
|
+
/**
|
|
304
|
+
* @chunk-id TRIGGERS_UPDATE_1_0_0
|
|
305
|
+
* @version 1.0.0
|
|
306
|
+
* @hash 8c7ee9556f7e18c9b63746baaf49ae73a4526735227a828bc77aaf518d4796fb
|
|
307
|
+
* @macro Trigger Update Handler
|
|
308
|
+
* @micro Updates trigger with audit logging and before/after state
|
|
309
|
+
* @inputs ctx: CoreContext — Request context with principal and database
|
|
310
|
+
* @inputs body: object — Trigger updates including id and updatable fields
|
|
311
|
+
* @outputs Updated trigger record
|
|
312
|
+
* @depends-on [createHandler, emitLog]
|
|
313
|
+
* @depended-by [Netlify function routing]
|
|
314
|
+
* @side-effects [DB update, audit logging]
|
|
315
|
+
* @tags triggers, update, crud, audit
|
|
316
|
+
*/
|
|
317
|
+
export const update = createHandler(async (ctx, body) => {
|
|
318
|
+
const id = body?.id || ctx.query?.id
|
|
319
|
+
const { id: _bodyId, app_id, name, description, trigger_type, event_type, config, pipeline_id, metadata, is_active } = body || {}
|
|
320
|
+
|
|
321
|
+
if (!id) {
|
|
322
|
+
throw new Error('Trigger ID is required')
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
if (!ctx.principal || ctx.principal.id === 'anonymous' || !ctx.accountId) {
|
|
326
|
+
throw new Error('User context (person and account) required')
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
// Get current state for audit - RLS will filter to accessible triggers
|
|
330
|
+
const { data: current } = await ctx.db
|
|
331
|
+
.from('triggers')
|
|
332
|
+
.select('*')
|
|
333
|
+
.eq('id', id)
|
|
334
|
+
.single()
|
|
335
|
+
|
|
336
|
+
if (!current) {
|
|
337
|
+
throw new Error('Trigger not found')
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
const { data, error: err } = await ctx.db
|
|
341
|
+
.from('triggers')
|
|
342
|
+
.update({
|
|
343
|
+
app_id,
|
|
344
|
+
name,
|
|
345
|
+
description,
|
|
346
|
+
trigger_type,
|
|
347
|
+
event_type,
|
|
348
|
+
config,
|
|
349
|
+
pipeline_id,
|
|
350
|
+
metadata,
|
|
351
|
+
is_active,
|
|
352
|
+
updated_at: new Date().toISOString()
|
|
353
|
+
})
|
|
354
|
+
.eq('id', id)
|
|
355
|
+
.select()
|
|
356
|
+
.single()
|
|
357
|
+
|
|
358
|
+
if (err) throw err
|
|
359
|
+
|
|
360
|
+
await emitLog(ctx, 'trigger.updated',
|
|
361
|
+
{ type: 'trigger', id },
|
|
362
|
+
{ before: current, after: data }
|
|
363
|
+
)
|
|
364
|
+
|
|
365
|
+
return data
|
|
366
|
+
})
|
|
367
|
+
// ─── CHUNK_END: TRIGGERS_UPDATE ────────────────────────────────────────────────
|
|
368
|
+
|
|
369
|
+
// ─── CHUNK_START: TRIGGERS_REMOVE ──────────────────────────────────────────────
|
|
370
|
+
/**
|
|
371
|
+
* @chunk-id TRIGGERS_REMOVE_1_0_0
|
|
372
|
+
* @version 1.0.0
|
|
373
|
+
* @hash d25952bb0f5bcd15fb5272f6d54a975b8a0f1cc6b85bc514b0e91df2fcb35ad5
|
|
374
|
+
* @macro Trigger Remove Handler
|
|
375
|
+
* @micro Soft-deletes trigger with audit logging and before/after state
|
|
376
|
+
* @inputs ctx: CoreContext — Request context with principal and database
|
|
377
|
+
* @inputs body: object — Trigger id for deletion
|
|
378
|
+
* @outputs Updated trigger record with is_active: false
|
|
379
|
+
* @depends-on [createHandler, emitLog]
|
|
380
|
+
* @depended-by [Netlify function routing]
|
|
381
|
+
* @side-effects [DB soft delete, audit logging]
|
|
382
|
+
* @tags triggers, remove, soft-delete, audit
|
|
383
|
+
*/
|
|
384
|
+
export const remove = createHandler(async (ctx, body) => {
|
|
385
|
+
const id = body?.id || ctx.query?.id
|
|
386
|
+
|
|
387
|
+
if (!id) {
|
|
388
|
+
throw new Error('Trigger ID is required')
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
if (!ctx.principal || ctx.principal.id === 'anonymous' || !ctx.accountId) {
|
|
392
|
+
throw new Error('User context (person and account) required')
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
// Get current state for audit - RLS will filter to accessible triggers
|
|
396
|
+
const { data: current } = await ctx.db
|
|
397
|
+
.from('triggers')
|
|
398
|
+
.select('*')
|
|
399
|
+
.eq('id', id)
|
|
400
|
+
.single()
|
|
401
|
+
|
|
402
|
+
if (!current) {
|
|
403
|
+
throw new Error('Trigger not found')
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
const { data, error: err } = await ctx.db
|
|
407
|
+
.from('triggers')
|
|
408
|
+
.update({
|
|
409
|
+
is_active: false,
|
|
410
|
+
updated_at: new Date().toISOString()
|
|
411
|
+
})
|
|
412
|
+
.eq('id', id)
|
|
413
|
+
.select()
|
|
414
|
+
.single()
|
|
415
|
+
|
|
416
|
+
if (err) throw err
|
|
417
|
+
|
|
418
|
+
await emitLog(ctx, 'trigger.deleted',
|
|
419
|
+
{ type: 'trigger', id },
|
|
420
|
+
{ before: current, after: data }
|
|
421
|
+
)
|
|
422
|
+
|
|
423
|
+
return data
|
|
424
|
+
})
|
|
425
|
+
// ─── CHUNK_END: TRIGGERS_REMOVE ────────────────────────────────────────────────
|
|
426
|
+
|
|
427
|
+
// ─── CHUNK_START: TRIGGERS_TOGGLE ──────────────────────────────────────────────
|
|
428
|
+
/**
|
|
429
|
+
* @chunk-id TRIGGERS_TOGGLE_1_0_0
|
|
430
|
+
* @version 1.0.0
|
|
431
|
+
* @hash 56add34659ac69c93b3570eb63f3bc3072d6a15083f79eaa7a9926f40f275373
|
|
432
|
+
* @macro Trigger Toggle Handler
|
|
433
|
+
* @micro Activates or deactivates trigger with audit logging
|
|
434
|
+
* @inputs ctx: CoreContext — Request context with principal and database
|
|
435
|
+
* @inputs body: object — Trigger id and is_active boolean
|
|
436
|
+
* @outputs Updated trigger record
|
|
437
|
+
* @depends-on [createHandler, emitLog]
|
|
438
|
+
* @depended-by [Netlify function routing]
|
|
439
|
+
* @side-effects [DB update, audit logging]
|
|
440
|
+
* @tags triggers, toggle, state-transition, audit
|
|
441
|
+
*/
|
|
442
|
+
export const toggle = createHandler(async (ctx, body) => {
|
|
443
|
+
const { id, is_active } = body
|
|
444
|
+
|
|
445
|
+
if (!id || is_active === undefined) {
|
|
446
|
+
throw new Error('Trigger ID and is_active are required')
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
const { data, error: err } = await ctx.db
|
|
450
|
+
.from('triggers')
|
|
451
|
+
.update({
|
|
452
|
+
is_active,
|
|
453
|
+
updated_at: new Date().toISOString()
|
|
454
|
+
})
|
|
455
|
+
.eq('id', id)
|
|
456
|
+
.select()
|
|
457
|
+
.single()
|
|
458
|
+
|
|
459
|
+
if (err) throw err
|
|
460
|
+
|
|
461
|
+
await emitLog(ctx, 'trigger.toggled',
|
|
462
|
+
{ type: 'trigger', id },
|
|
463
|
+
{ after: { is_active } }
|
|
464
|
+
)
|
|
465
|
+
|
|
466
|
+
return data
|
|
467
|
+
})
|
|
468
|
+
// ─── CHUNK_END: TRIGGERS_TOGGLE ────────────────────────────────────────────────
|
|
469
|
+
|
|
470
|
+
// ─── CHUNK_START: TRIGGERS_GET_EXECUTIONS ──────────────────────────────────────────────
|
|
471
|
+
/**
|
|
472
|
+
* @chunk-id TRIGGERS_GET_EXECUTIONS_1_0_0
|
|
473
|
+
* @version 1.0.0
|
|
474
|
+
* @hash cf649749d76cd4d5909f96eb9193fd791f30f1e6268e1a0e6cb35ee4676d3071
|
|
475
|
+
* @macro Trigger Executions Handler
|
|
476
|
+
* @micro Returns paginated execution history for a trigger
|
|
477
|
+
* @inputs ctx: CoreContext — Request context with principal and database
|
|
478
|
+
* @inputs body: any — Request body (unused for GET)
|
|
479
|
+
* @outputs Array of trigger_executions rows ordered by triggered_at desc
|
|
480
|
+
* @depends-on [createHandler]
|
|
481
|
+
* @depended-by [Netlify function routing]
|
|
482
|
+
* @side-effects [DB queries, pagination]
|
|
483
|
+
* @tags triggers, executions, history, pagination
|
|
484
|
+
*/
|
|
485
|
+
export const getExecutions = createHandler(async (ctx, body) => {
|
|
486
|
+
const { trigger_id, limit = 50, offset = 0 } = ctx.query || {}
|
|
487
|
+
|
|
488
|
+
if (!trigger_id) {
|
|
489
|
+
throw new Error('Trigger ID is required')
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
const parsedLimit = parseInt(limit.toString())
|
|
493
|
+
const parsedOffset = parseInt(offset.toString())
|
|
494
|
+
|
|
495
|
+
const { data, error: err } = await ctx.db
|
|
496
|
+
.from('trigger_executions')
|
|
497
|
+
.select('*')
|
|
498
|
+
.eq('trigger_id', trigger_id)
|
|
499
|
+
.order('triggered_at', { ascending: false })
|
|
500
|
+
.range(parsedOffset, parsedOffset + parsedLimit - 1)
|
|
501
|
+
|
|
502
|
+
if (err) throw err
|
|
503
|
+
|
|
504
|
+
return data
|
|
505
|
+
})
|
|
506
|
+
// ─── CHUNK_END: TRIGGERS_GET_EXECUTIONS ────────────────────────────────────────────────
|
|
507
|
+
|
|
508
|
+
// ─── MAIN HANDLER ────────────────────────────────────────────────────────────
|
|
509
|
+
|
|
510
|
+
// ─── CHUNK_START: TRIGGERS_HANDLER ──────────────────────────────────────────────
|
|
511
|
+
/**
|
|
512
|
+
* @chunk-id TRIGGERS_HANDLER_1_0_0
|
|
513
|
+
* @version 1.0.0
|
|
514
|
+
* @hash 4efc53a8d92acf3346a939c519e3fbd0d64be57f4ee65a81ee213c5aba24e2ce
|
|
515
|
+
* @macro Triggers Router
|
|
516
|
+
* @micro Routes HTTP methods and actions to appropriate trigger handlers
|
|
517
|
+
* @inputs ctx: CoreContext — Request context with principal and database
|
|
518
|
+
* @inputs body: any — Request body for POST/PATCH/DELETE operations
|
|
519
|
+
* @outputs Varies — Depends on routed handler (listByEvent/getExecutions/toggle/list/get/create/update/remove)
|
|
520
|
+
* @depends-on [createHandler, listByEvent, getExecutions, toggle, list, get, create, update, remove]
|
|
521
|
+
* @depended-by [Netlify function routing]
|
|
522
|
+
* @side-effects [Delegates to appropriate handler]
|
|
523
|
+
* @tags triggers, router, crud, netlify-function
|
|
524
|
+
*/
|
|
525
|
+
export const handler = createHandler(async (ctx, body) => {
|
|
526
|
+
const { action } = ctx.query || {}
|
|
527
|
+
const method = ctx.query?.method || 'GET'
|
|
528
|
+
|
|
529
|
+
switch (action) {
|
|
530
|
+
case 'by-event':
|
|
531
|
+
if (method === 'GET') {
|
|
532
|
+
return await listByEvent(ctx, body)
|
|
533
|
+
}
|
|
534
|
+
break
|
|
535
|
+
case 'executions':
|
|
536
|
+
if (method === 'GET') {
|
|
537
|
+
return await getExecutions(ctx, body)
|
|
538
|
+
}
|
|
539
|
+
break
|
|
540
|
+
case 'toggle':
|
|
541
|
+
if (method === 'POST') {
|
|
542
|
+
return await toggle(ctx, body)
|
|
543
|
+
}
|
|
544
|
+
break
|
|
545
|
+
default:
|
|
546
|
+
if (method === 'GET') {
|
|
547
|
+
if (ctx.query?.id) {
|
|
548
|
+
return await get(ctx, body)
|
|
549
|
+
} else {
|
|
550
|
+
return await list(ctx, body)
|
|
551
|
+
}
|
|
552
|
+
} else if (method === 'POST') {
|
|
553
|
+
return await create(ctx, body)
|
|
554
|
+
} else if (method === 'PATCH') {
|
|
555
|
+
return await update(ctx, body)
|
|
556
|
+
} else if (method === 'DELETE') {
|
|
557
|
+
return await remove(ctx, body)
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
throw new Error('Invalid action or method')
|
|
562
|
+
})
|
|
563
|
+
// ─── CHUNK_END: TRIGGERS_HANDLER ────────────────────────────────────────────────
|