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,275 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module observability
|
|
3
|
+
* @audience core-contributor
|
|
4
|
+
* @layer api-handler
|
|
5
|
+
* @stability stable
|
|
6
|
+
*
|
|
7
|
+
* Aggregated observability metrics API. All handlers delegate to Postgres
|
|
8
|
+
* analytics RPCs that operate over the `v2.logs` table. Results are
|
|
9
|
+
* read-only; no writes occur in this module.
|
|
10
|
+
*
|
|
11
|
+
* **Routed by:** `GET/POST /.netlify/functions/observability`
|
|
12
|
+
*
|
|
13
|
+
* **Actions (all GET unless noted):**
|
|
14
|
+
* | ?action | handler |
|
|
15
|
+
* |-----------------------|------------------------|
|
|
16
|
+
* | event_volume | getEventVolume |
|
|
17
|
+
* | error_rate | getErrorRate |
|
|
18
|
+
* | latency_percentiles | getLatencyPercentiles |
|
|
19
|
+
* | pipeline_stats | getPipelineStats |
|
|
20
|
+
* | top_actors | getTopActors |
|
|
21
|
+
* | cleanup | cleanupOldLogs (POST) |
|
|
22
|
+
*
|
|
23
|
+
* **Authorization:** All read endpoints require account context (RLS-scoped
|
|
24
|
+
* via `ctx.db`). `cleanup` additionally requires the `system_admin` role.
|
|
25
|
+
*
|
|
26
|
+
* INVARIANT: Every handler requires both `from` and `to` date params
|
|
27
|
+
* (except `cleanup`). Requests without them throw immediately.
|
|
28
|
+
*
|
|
29
|
+
* @seeAlso logs.ts (raw log access with filter/search)
|
|
30
|
+
* @seeAlso system-cron.ts (evaluateThresholds calls observability RPCs)
|
|
31
|
+
* @seeAlso pipeline-executions.ts (pipeline_stats RPC aggregates these)
|
|
32
|
+
*/
|
|
33
|
+
|
|
34
|
+
import { createHandler } from './_shared/middleware'
|
|
35
|
+
|
|
36
|
+
// ─── HANDLERS ─────────────────────────────────────────────────────────────────
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Returns time-bucketed event volume counts via the `get_event_volume` RPC.
|
|
40
|
+
*
|
|
41
|
+
* Query params: `from` (required, ISO), `to` (required, ISO),
|
|
42
|
+
* `bucket` ('minute'|'hour'|'day', default 'hour')
|
|
43
|
+
*
|
|
44
|
+
* @returns Array of `{ bucket_time, event_type, count }` rows
|
|
45
|
+
* @throws Error('Account context required')
|
|
46
|
+
* @throws Error('from and to dates are required')
|
|
47
|
+
* @sideEffects DB read: get_event_volume RPC
|
|
48
|
+
* @calledBy handler (?action=event_volume)
|
|
49
|
+
*/
|
|
50
|
+
export const getEventVolume = createHandler(async (ctx, body) => {
|
|
51
|
+
const { from, to, bucket = 'hour' } = ctx.query || {}
|
|
52
|
+
|
|
53
|
+
if (!ctx.accountId) {
|
|
54
|
+
throw new Error('Account context required')
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
if (!from || !to) {
|
|
58
|
+
throw new Error('from and to dates are required')
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const { data, error: err } = await ctx.db
|
|
62
|
+
.rpc('get_event_volume', {
|
|
63
|
+
p_account_id: ctx.accountId,
|
|
64
|
+
p_event_type: null,
|
|
65
|
+
p_bucket: bucket,
|
|
66
|
+
p_from: from,
|
|
67
|
+
p_to: to,
|
|
68
|
+
})
|
|
69
|
+
|
|
70
|
+
if (err) throw err
|
|
71
|
+
return data || []
|
|
72
|
+
})
|
|
73
|
+
|
|
74
|
+
// ── Error Rate ───────────────────────────────────────────
|
|
75
|
+
/**
|
|
76
|
+
* Returns aggregate error rate for the account time window via the
|
|
77
|
+
* `get_error_rate` RPC.
|
|
78
|
+
*
|
|
79
|
+
* Query params: `from` (required, ISO), `to` (required, ISO)
|
|
80
|
+
*
|
|
81
|
+
* @returns `{ total: number, errors: number, rate: number }` (0.0–1.0)
|
|
82
|
+
* @throws Error('Account context required')
|
|
83
|
+
* @throws Error('from and to dates are required')
|
|
84
|
+
* @sideEffects DB read: get_error_rate RPC
|
|
85
|
+
* @calledBy handler (?action=error_rate)
|
|
86
|
+
* @calledBy system-cron.ts evaluateThresholds (metric='error_rate')
|
|
87
|
+
*/
|
|
88
|
+
export const getErrorRate = createHandler(async (ctx, body) => {
|
|
89
|
+
const { from, to } = ctx.query || {}
|
|
90
|
+
|
|
91
|
+
if (!ctx.accountId) {
|
|
92
|
+
throw new Error('Account context required')
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
if (!from || !to) {
|
|
96
|
+
throw new Error('from and to dates are required')
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
const { data, error: err } = await ctx.db
|
|
100
|
+
.rpc('get_error_rate', {
|
|
101
|
+
p_account_id: ctx.accountId,
|
|
102
|
+
p_from: from,
|
|
103
|
+
p_to: to,
|
|
104
|
+
})
|
|
105
|
+
|
|
106
|
+
if (err) throw err
|
|
107
|
+
return data?.[0] || { total: 0, errors: 0, rate: 0 }
|
|
108
|
+
})
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Returns request latency percentiles (p50/p90/p99) via the
|
|
112
|
+
* `get_latency_percentiles` RPC.
|
|
113
|
+
*
|
|
114
|
+
* Query params: `from` (required, ISO), `to` (required, ISO),
|
|
115
|
+
* `source` (log source filter, default 'request')
|
|
116
|
+
*
|
|
117
|
+
* @returns `{ p50: number, p90: number, p99: number }` (milliseconds)
|
|
118
|
+
* @throws Error('Account context required')
|
|
119
|
+
* @throws Error('from and to dates are required')
|
|
120
|
+
* @sideEffects DB read: get_latency_percentiles RPC
|
|
121
|
+
* @calledBy handler (?action=latency_percentiles)
|
|
122
|
+
* @calledBy system-cron.ts evaluateThresholds (metric='latency_p95')
|
|
123
|
+
*/
|
|
124
|
+
export const getLatencyPercentiles = createHandler(async (ctx, body) => {
|
|
125
|
+
const { from, to, source = 'request' } = ctx.query || {}
|
|
126
|
+
|
|
127
|
+
if (!ctx.accountId) {
|
|
128
|
+
throw new Error('Account context required')
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
if (!from || !to) {
|
|
132
|
+
throw new Error('from and to dates are required')
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
const { data, error: err } = await ctx.db
|
|
136
|
+
.rpc('get_latency_percentiles', {
|
|
137
|
+
p_account_id: ctx.accountId,
|
|
138
|
+
p_source: source,
|
|
139
|
+
p_from: from,
|
|
140
|
+
p_to: to,
|
|
141
|
+
})
|
|
142
|
+
|
|
143
|
+
if (err) throw err
|
|
144
|
+
return data?.[0] || { p50: 0, p90: 0, p99: 0 }
|
|
145
|
+
})
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Returns per-pipeline execution statistics (success/failure counts,
|
|
149
|
+
* average duration) via the `get_pipeline_stats` RPC.
|
|
150
|
+
*
|
|
151
|
+
* Query params: `from` (required, ISO), `to` (required, ISO)
|
|
152
|
+
*
|
|
153
|
+
* @returns Array of `{ pipeline_id, name, success_count, failure_count, avg_duration_ms }`
|
|
154
|
+
* @throws Error('Account context required')
|
|
155
|
+
* @throws Error('from and to dates are required')
|
|
156
|
+
* @sideEffects DB read: get_pipeline_stats RPC
|
|
157
|
+
* @calledBy handler (?action=pipeline_stats)
|
|
158
|
+
* @calledBy system-cron.ts evaluateThresholds (metric='pipeline_failure_rate')
|
|
159
|
+
*/
|
|
160
|
+
export const getPipelineStats = createHandler(async (ctx, body) => {
|
|
161
|
+
const { from, to } = ctx.query || {}
|
|
162
|
+
|
|
163
|
+
if (!ctx.accountId) {
|
|
164
|
+
throw new Error('Account context required')
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
if (!from || !to) {
|
|
168
|
+
throw new Error('from and to dates are required')
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
const { data, error: err } = await ctx.db
|
|
172
|
+
.rpc('get_pipeline_stats', {
|
|
173
|
+
p_account_id: ctx.accountId,
|
|
174
|
+
p_from: from,
|
|
175
|
+
p_to: to,
|
|
176
|
+
})
|
|
177
|
+
|
|
178
|
+
if (err) throw err
|
|
179
|
+
return data || []
|
|
180
|
+
})
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Returns the most active principals (persons) by event count via the
|
|
184
|
+
* `get_top_actors` RPC.
|
|
185
|
+
*
|
|
186
|
+
* Query params: `from` (required, ISO), `to` (required, ISO),
|
|
187
|
+
* `limit` (default 5)
|
|
188
|
+
*
|
|
189
|
+
* @returns Array of `{ person_id, full_name, event_count }` ordered by count desc
|
|
190
|
+
* @throws Error('Account context required')
|
|
191
|
+
* @throws Error('from and to dates are required')
|
|
192
|
+
* @sideEffects DB read: get_top_actors RPC
|
|
193
|
+
* @calledBy handler (?action=top_actors)
|
|
194
|
+
*/
|
|
195
|
+
export const getTopActors = createHandler(async (ctx, body) => {
|
|
196
|
+
const { from, to, limit = 5 } = ctx.query || {}
|
|
197
|
+
|
|
198
|
+
if (!ctx.accountId) {
|
|
199
|
+
throw new Error('Account context required')
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
if (!from || !to) {
|
|
203
|
+
throw new Error('from and to dates are required')
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
const { data, error: err } = await ctx.db
|
|
207
|
+
.rpc('get_top_actors', {
|
|
208
|
+
p_account_id: ctx.accountId,
|
|
209
|
+
p_from: from,
|
|
210
|
+
p_to: to,
|
|
211
|
+
p_limit: parseInt(limit.toString()) || 5,
|
|
212
|
+
})
|
|
213
|
+
|
|
214
|
+
if (err) throw err
|
|
215
|
+
return data || []
|
|
216
|
+
})
|
|
217
|
+
|
|
218
|
+
// ── Cleanup Old Logs (manual trigger) ────────────────────
|
|
219
|
+
/**
|
|
220
|
+
* Manually triggers cross-account log cleanup via the `cleanup_old_logs`
|
|
221
|
+
* RPC. Requires `system_admin` role — not available to regular users.
|
|
222
|
+
*
|
|
223
|
+
* Query params: `days` (optional, default 90)
|
|
224
|
+
*
|
|
225
|
+
* @returns `{ deleted_count: number }`
|
|
226
|
+
* @throws Error('System admin required') if principal lacks system_admin role
|
|
227
|
+
* @sideEffects DB write: cleanup_old_logs RPC (cross-account DELETE)
|
|
228
|
+
* @calledBy handler (?action=cleanup)
|
|
229
|
+
* @calledBy system-cron.ts cleanupOldLogs (automated daily rotation)
|
|
230
|
+
*/
|
|
231
|
+
export const cleanupOldLogs = createHandler(async (ctx, body) => {
|
|
232
|
+
const { days = 90 } = ctx.query || {}
|
|
233
|
+
|
|
234
|
+
// Only system admins can trigger manual cleanup
|
|
235
|
+
if (!ctx.principal?.roles?.includes('system_admin')) {
|
|
236
|
+
throw new Error('System admin required')
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
const { data, error: err } = await ctx.db
|
|
240
|
+
.rpc('cleanup_old_logs', {
|
|
241
|
+
p_retention_days: parseInt(days.toString()) || 90,
|
|
242
|
+
})
|
|
243
|
+
|
|
244
|
+
if (err) throw err
|
|
245
|
+
return { deleted_count: data?.[0]?.deleted_count || 0 }
|
|
246
|
+
})
|
|
247
|
+
|
|
248
|
+
// ─── MAIN HANDLER ────────────────────────────────────────────────────────────
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* Netlify function entry point. Dispatches to analytics handler by ?action.
|
|
252
|
+
* All valid ?action values are listed in the module dispatch table.
|
|
253
|
+
* @throws Error('Unknown action: <action>. Valid actions: ...') on mismatch
|
|
254
|
+
* @calledBy Netlify function routing
|
|
255
|
+
*/
|
|
256
|
+
export const handler = createHandler(async (ctx, body) => {
|
|
257
|
+
const { action } = ctx.query || {}
|
|
258
|
+
|
|
259
|
+
switch (action) {
|
|
260
|
+
case 'event_volume':
|
|
261
|
+
return await getEventVolume(ctx, body)
|
|
262
|
+
case 'error_rate':
|
|
263
|
+
return await getErrorRate(ctx, body)
|
|
264
|
+
case 'latency_percentiles':
|
|
265
|
+
return await getLatencyPercentiles(ctx, body)
|
|
266
|
+
case 'pipeline_stats':
|
|
267
|
+
return await getPipelineStats(ctx, body)
|
|
268
|
+
case 'top_actors':
|
|
269
|
+
return await getTopActors(ctx, body)
|
|
270
|
+
case 'cleanup':
|
|
271
|
+
return await cleanupOldLogs(ctx, body)
|
|
272
|
+
default:
|
|
273
|
+
throw new Error(`Unknown action: ${action}. Valid actions: event_volume, error_rate, latency_percentiles, pipeline_stats, top_actors, cleanup`)
|
|
274
|
+
}
|
|
275
|
+
})
|