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,357 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module timers
|
|
3
|
+
* @audience core-contributor
|
|
4
|
+
* @layer api-handler
|
|
5
|
+
* @stability stable
|
|
6
|
+
*
|
|
7
|
+
* CRUD API for the `timers` table. Timers are scheduled pipeline triggers
|
|
8
|
+
* (cron-style). They are evaluated and fired by `system-cron.ts` on each
|
|
9
|
+
* scheduled invocation.
|
|
10
|
+
*
|
|
11
|
+
* **Routed by:** `GET/POST/PATCH/DELETE /.netlify/functions/timers`
|
|
12
|
+
*
|
|
13
|
+
* **Actions:**
|
|
14
|
+
* | method | ?action | handler |
|
|
15
|
+
* |--------|----------|----------|
|
|
16
|
+
* | POST | toggle | toggle |
|
|
17
|
+
* | GET | ?id | get |
|
|
18
|
+
* | GET | (default)| list |
|
|
19
|
+
* | POST | — | create |
|
|
20
|
+
* | PATCH | — | update |
|
|
21
|
+
* | DELETE | — | remove (hard) |
|
|
22
|
+
*
|
|
23
|
+
* **Authorization:** All operations use `ctx.db` (RLS-scoped). Authenticated
|
|
24
|
+
* principal required for writes.
|
|
25
|
+
*
|
|
26
|
+
* INVARIANT: `remove` is a hard delete.
|
|
27
|
+
* INVARIANT: `update` only patches allowed fields: name, description, config,
|
|
28
|
+
* pipeline_id, metadata, is_active.
|
|
29
|
+
*
|
|
30
|
+
* @seeAlso system-cron.ts (fires timers on schedule)
|
|
31
|
+
* @seeAlso pipelines.ts (pipeline_id FK on timers)
|
|
32
|
+
* @seeAlso audit.ts (emitLog for timer.* events)
|
|
33
|
+
*/
|
|
34
|
+
|
|
35
|
+
import { createHandler } from './_shared/middleware'
|
|
36
|
+
import { joins } from './_shared/db'
|
|
37
|
+
import { emitLog } from './_shared/audit'
|
|
38
|
+
import { sanitizeRecordData } from './_shared/permissions'
|
|
39
|
+
|
|
40
|
+
// ─── HANDLERS ─────────────────────────────────────────────────────────────────
|
|
41
|
+
|
|
42
|
+
// ─── CHUNK_START: TIMERS_LIST ──────────────────────────────────────────────
|
|
43
|
+
/**
|
|
44
|
+
* @chunk-id TIMERS_LIST_1_0_0
|
|
45
|
+
* @version 1.0.0
|
|
46
|
+
* @hash 151a2403c9d974004a34303443368921966ea3adeada07e5f63b9a20ad3f08a1
|
|
47
|
+
* @macro Timers List Handler
|
|
48
|
+
* @micro Lists timers with filtering and sanitization
|
|
49
|
+
* @inputs ctx: CoreContext — Request context with principal and database
|
|
50
|
+
* @inputs _body: any — Request body (unused for GET)
|
|
51
|
+
* @outputs Array of sanitized timer records with app/createdBy joins
|
|
52
|
+
* @depends-on [createHandler, joins, sanitizeRecordData]
|
|
53
|
+
* @depended-by [Netlify function routing]
|
|
54
|
+
* @side-effects [DB queries, permission sanitization]
|
|
55
|
+
* @tags timers, list, crud, filtering
|
|
56
|
+
*/
|
|
57
|
+
export const list = createHandler(async (ctx, _body) => {
|
|
58
|
+
const { app_id, timer_type, is_active } = ctx.query || {}
|
|
59
|
+
|
|
60
|
+
if (!ctx.accountId) {
|
|
61
|
+
throw new Error('Account context required')
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
let query = ctx.db
|
|
65
|
+
.from('timers')
|
|
66
|
+
.select(`*, ${joins.app}, ${joins.createdBy}`)
|
|
67
|
+
.order('name')
|
|
68
|
+
|
|
69
|
+
if (app_id) {
|
|
70
|
+
query = query.eq('app_id', app_id)
|
|
71
|
+
}
|
|
72
|
+
if (timer_type) {
|
|
73
|
+
query = query.eq('timer_type', timer_type)
|
|
74
|
+
}
|
|
75
|
+
if (is_active !== undefined) {
|
|
76
|
+
query = query.eq('is_active', is_active === 'true')
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const { data, error: err } = await query
|
|
80
|
+
|
|
81
|
+
if (err) throw err
|
|
82
|
+
|
|
83
|
+
const sanitized = []
|
|
84
|
+
for (const timer of data || []) {
|
|
85
|
+
sanitized.push(await sanitizeRecordData(ctx, timer, 'timer'))
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
return sanitized
|
|
89
|
+
})
|
|
90
|
+
// ─── CHUNK_END: TIMERS_LIST ────────────────────────────────────────────────
|
|
91
|
+
|
|
92
|
+
// ─── CHUNK_START: TIMERS_GET ──────────────────────────────────────────────
|
|
93
|
+
/**
|
|
94
|
+
* @chunk-id TIMERS_GET_1_0_0
|
|
95
|
+
* @version 1.0.0
|
|
96
|
+
* @hash 8bbf46bb1410299eb881680ba4b508093157000a7fe525f7380e96ff0a241f32
|
|
97
|
+
* @macro Timer Get Handler
|
|
98
|
+
* @micro Returns single timer record with joins and sanitization
|
|
99
|
+
* @inputs ctx: CoreContext — Request context with principal and database
|
|
100
|
+
* @inputs _body: any — Request body (unused for GET)
|
|
101
|
+
* @outputs Sanitized timer record with app/createdBy joins
|
|
102
|
+
* @depends-on [createHandler, joins, sanitizeRecordData]
|
|
103
|
+
* @depended-by [Netlify function routing]
|
|
104
|
+
* @side-effects [DB single row query, permission sanitization]
|
|
105
|
+
* @tags timers, get, crud, single-record
|
|
106
|
+
*/
|
|
107
|
+
export const get = createHandler(async (ctx, _body) => {
|
|
108
|
+
const { id } = ctx.query || {}
|
|
109
|
+
|
|
110
|
+
if (!id) {
|
|
111
|
+
throw new Error('Timer ID is required')
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
const { data, error: err } = await ctx.db
|
|
115
|
+
.from('timers')
|
|
116
|
+
.select(`*, ${joins.app}, ${joins.createdBy}`)
|
|
117
|
+
.eq('id', id)
|
|
118
|
+
.single()
|
|
119
|
+
|
|
120
|
+
if (err) throw err
|
|
121
|
+
|
|
122
|
+
return await sanitizeRecordData(ctx, data, 'timer')
|
|
123
|
+
})
|
|
124
|
+
// ─── CHUNK_END: TIMERS_GET ────────────────────────────────────────────────
|
|
125
|
+
|
|
126
|
+
// ─── CHUNK_START: TIMERS_CREATE ──────────────────────────────────────────────
|
|
127
|
+
/**
|
|
128
|
+
* @chunk-id TIMERS_CREATE_1_0_0
|
|
129
|
+
* @version 1.0.0
|
|
130
|
+
* @hash b655ea396b23dac3548323612decef91b712c0a2b42bc5c7bc0f79aee4d11af4
|
|
131
|
+
* @macro Timer Create Handler
|
|
132
|
+
* @micro Creates timer with validation and audit logging
|
|
133
|
+
* @inputs ctx: CoreContext — Request context with principal and database
|
|
134
|
+
* @inputs body: object — Timer data including name, timer_type, and optional fields
|
|
135
|
+
* @outputs Inserted timer record
|
|
136
|
+
* @depends-on [createHandler, emitLog]
|
|
137
|
+
* @depended-by [Netlify function routing]
|
|
138
|
+
* @side-effects [DB insert, audit logging]
|
|
139
|
+
* @tags timers, create, crud, audit
|
|
140
|
+
*/
|
|
141
|
+
export const create = createHandler(async (ctx, body) => {
|
|
142
|
+
const { app_id, name, description, timer_type, config, pipeline_id, metadata } = body
|
|
143
|
+
|
|
144
|
+
if (!name || !timer_type) {
|
|
145
|
+
throw new Error('name and timer_type are required')
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
if (!ctx.principal || ctx.principal.id === 'anonymous' || !ctx.accountId) {
|
|
149
|
+
throw new Error('User context (person and account) required')
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
const { data, error: err } = await ctx.db
|
|
153
|
+
.from('timers')
|
|
154
|
+
.insert({
|
|
155
|
+
app_id: app_id || null,
|
|
156
|
+
account_id: ctx.accountId,
|
|
157
|
+
name,
|
|
158
|
+
description: description || null,
|
|
159
|
+
timer_type,
|
|
160
|
+
config: config || {},
|
|
161
|
+
pipeline_id: pipeline_id || null,
|
|
162
|
+
metadata: metadata || {},
|
|
163
|
+
created_by: ctx.principal.id
|
|
164
|
+
})
|
|
165
|
+
.select()
|
|
166
|
+
.single()
|
|
167
|
+
|
|
168
|
+
if (err) throw err
|
|
169
|
+
|
|
170
|
+
await emitLog(ctx, 'timer.created',
|
|
171
|
+
{ type: 'timer', id: data.id },
|
|
172
|
+
{ after: { name, timer_type } }
|
|
173
|
+
)
|
|
174
|
+
|
|
175
|
+
return data
|
|
176
|
+
})
|
|
177
|
+
// ─── CHUNK_END: TIMERS_CREATE ────────────────────────────────────────────────
|
|
178
|
+
|
|
179
|
+
// ─── CHUNK_START: TIMERS_UPDATE ──────────────────────────────────────────────
|
|
180
|
+
/**
|
|
181
|
+
* @chunk-id TIMERS_UPDATE_1_0_0
|
|
182
|
+
* @version 1.0.0
|
|
183
|
+
* @hash 3c53499205d63b8643e28671b397b97b344976e88ea561860e2e394ca246942d
|
|
184
|
+
* @macro Timer Update Handler
|
|
185
|
+
* @micro Updates timer with field allowlist and audit logging
|
|
186
|
+
* @inputs ctx: CoreContext — Request context with principal and database
|
|
187
|
+
* @inputs body: object — Timer updates including id and updatable fields
|
|
188
|
+
* @outputs Updated timer record
|
|
189
|
+
* @depends-on [createHandler, emitLog]
|
|
190
|
+
* @depended-by [Netlify function routing]
|
|
191
|
+
* @side-effects [DB update, audit logging]
|
|
192
|
+
* @tags timers, update, crud, audit
|
|
193
|
+
*/
|
|
194
|
+
export const update = createHandler(async (ctx, body) => {
|
|
195
|
+
const id = body?.id || ctx.query?.id
|
|
196
|
+
const { id: _bodyId, ...updates } = body || {}
|
|
197
|
+
|
|
198
|
+
if (!id) {
|
|
199
|
+
throw new Error('Timer ID is required')
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
const allowed = ['name', 'description', 'config', 'pipeline_id', 'metadata', 'is_active']
|
|
203
|
+
const updateData: Record<string, any> = { updated_at: new Date().toISOString() }
|
|
204
|
+
for (const key of allowed) {
|
|
205
|
+
if (updates[key] !== undefined) updateData[key] = updates[key]
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
const { data, error: err } = await ctx.db
|
|
209
|
+
.from('timers')
|
|
210
|
+
.update(updateData)
|
|
211
|
+
.eq('id', id)
|
|
212
|
+
.select()
|
|
213
|
+
.single()
|
|
214
|
+
|
|
215
|
+
if (err) throw err
|
|
216
|
+
|
|
217
|
+
await emitLog(ctx, 'timer.updated',
|
|
218
|
+
{ type: 'timer', id },
|
|
219
|
+
{ after: updateData }
|
|
220
|
+
)
|
|
221
|
+
|
|
222
|
+
return data
|
|
223
|
+
})
|
|
224
|
+
// ─── CHUNK_END: TIMERS_UPDATE ────────────────────────────────────────────────
|
|
225
|
+
|
|
226
|
+
// ─── CHUNK_START: TIMERS_TOGGLE ──────────────────────────────────────────────
|
|
227
|
+
/**
|
|
228
|
+
* @chunk-id TIMERS_TOGGLE_1_0_0
|
|
229
|
+
* @version 1.0.0
|
|
230
|
+
* @hash 5db82e7a94fbdb9a0e3452c63a044789a993ed8881033d9372b86778c50a2d8c
|
|
231
|
+
* @macro Timer Toggle Handler
|
|
232
|
+
* @micro Activates or deactivates timer with audit logging
|
|
233
|
+
* @inputs ctx: CoreContext — Request context with principal and database
|
|
234
|
+
* @inputs body: object — Timer id and is_active boolean
|
|
235
|
+
* @outputs Updated timer record
|
|
236
|
+
* @depends-on [createHandler, emitLog]
|
|
237
|
+
* @depended-by [Netlify function routing]
|
|
238
|
+
* @side-effects [DB update, audit logging]
|
|
239
|
+
* @tags timers, toggle, state-transition, audit
|
|
240
|
+
*/
|
|
241
|
+
export const toggle = createHandler(async (ctx, body) => {
|
|
242
|
+
const { id, is_active } = body
|
|
243
|
+
|
|
244
|
+
if (!id || is_active === undefined) {
|
|
245
|
+
throw new Error('Timer ID and is_active are required')
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
const { data, error: err } = await ctx.db
|
|
249
|
+
.from('timers')
|
|
250
|
+
.update({ is_active, updated_at: new Date().toISOString() })
|
|
251
|
+
.eq('id', id)
|
|
252
|
+
.select()
|
|
253
|
+
.single()
|
|
254
|
+
|
|
255
|
+
if (err) throw err
|
|
256
|
+
|
|
257
|
+
await emitLog(ctx, 'timer.toggled',
|
|
258
|
+
{ type: 'timer', id },
|
|
259
|
+
{ after: { is_active } }
|
|
260
|
+
)
|
|
261
|
+
|
|
262
|
+
return data
|
|
263
|
+
})
|
|
264
|
+
// ─── CHUNK_END: TIMERS_TOGGLE ────────────────────────────────────────────────
|
|
265
|
+
|
|
266
|
+
// ─── CHUNK_START: TIMERS_REMOVE ──────────────────────────────────────────────
|
|
267
|
+
/**
|
|
268
|
+
* @chunk-id TIMERS_REMOVE_1_0_0
|
|
269
|
+
* @version 1.0.0
|
|
270
|
+
* @hash 2d999f6948d616925eaa36be8b39b2fd23de364bf242d4fb0ff3304e1ff9f275
|
|
271
|
+
* @macro Timer Remove Handler
|
|
272
|
+
* @micro Hard-deletes timer with audit logging
|
|
273
|
+
* @inputs ctx: CoreContext — Request context with principal and database
|
|
274
|
+
* @inputs _body: any — Request body (unused for DELETE)
|
|
275
|
+
* @outputs {success: true} — Confirmation of successful deletion
|
|
276
|
+
* @depends-on [createHandler, emitLog]
|
|
277
|
+
* @depended-by [Netlify function routing]
|
|
278
|
+
* @side-effects [DB delete, audit logging]
|
|
279
|
+
* @tags timers, remove, delete, audit
|
|
280
|
+
*/
|
|
281
|
+
export const remove = createHandler(async (ctx, _body) => {
|
|
282
|
+
const id = ctx.query?.id
|
|
283
|
+
|
|
284
|
+
if (!id) {
|
|
285
|
+
throw new Error('Timer ID is required')
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
const { data: current } = await ctx.db
|
|
289
|
+
.from('timers')
|
|
290
|
+
.select('id, name')
|
|
291
|
+
.eq('id', id)
|
|
292
|
+
.single()
|
|
293
|
+
|
|
294
|
+
if (!current) throw new Error('Timer not found')
|
|
295
|
+
|
|
296
|
+
const { error: err } = await ctx.db
|
|
297
|
+
.from('timers')
|
|
298
|
+
.delete()
|
|
299
|
+
.eq('id', id)
|
|
300
|
+
|
|
301
|
+
if (err) throw err
|
|
302
|
+
|
|
303
|
+
await emitLog(ctx, 'timer.deleted',
|
|
304
|
+
{ type: 'timer', id },
|
|
305
|
+
{ before: current }
|
|
306
|
+
)
|
|
307
|
+
|
|
308
|
+
return { success: true }
|
|
309
|
+
})
|
|
310
|
+
// ─── CHUNK_END: TIMERS_REMOVE ────────────────────────────────────────────────
|
|
311
|
+
|
|
312
|
+
// ─── MAIN HANDLER ────────────────────────────────────────────────────────────
|
|
313
|
+
|
|
314
|
+
// ─── CHUNK_START: TIMERS_HANDLER ──────────────────────────────────────────────
|
|
315
|
+
/**
|
|
316
|
+
* @chunk-id TIMERS_HANDLER_1_0_0
|
|
317
|
+
* @version 1.0.0
|
|
318
|
+
* @hash e890b54a4f767885a6e9d54b4ab19b968e09f6fc2f8db840d5b60df1e3cd2ba3
|
|
319
|
+
* @macro Timers Router
|
|
320
|
+
* @micro Routes HTTP methods and actions to appropriate timer handlers
|
|
321
|
+
* @inputs ctx: CoreContext — Request context with principal and database
|
|
322
|
+
* @inputs body: any — Request body for POST/PATCH/DELETE operations
|
|
323
|
+
* @outputs Varies — Depends on routed handler (list/get/create/update/remove/toggle)
|
|
324
|
+
* @depends-on [createHandler, list, get, create, update, remove, toggle]
|
|
325
|
+
* @depended-by [Netlify function routing]
|
|
326
|
+
* @side-effects [Delegates to appropriate handler]
|
|
327
|
+
* @tags timers, router, crud, netlify-function
|
|
328
|
+
*/
|
|
329
|
+
export const handler = createHandler(async (ctx, body) => {
|
|
330
|
+
const { action } = ctx.query || {}
|
|
331
|
+
const method = ctx.query?.method || 'GET'
|
|
332
|
+
|
|
333
|
+
switch (action) {
|
|
334
|
+
case 'toggle':
|
|
335
|
+
if (method === 'POST') {
|
|
336
|
+
return await toggle(ctx, body)
|
|
337
|
+
}
|
|
338
|
+
break
|
|
339
|
+
default:
|
|
340
|
+
if (method === 'GET') {
|
|
341
|
+
if (ctx.query?.id) {
|
|
342
|
+
return await get(ctx, body)
|
|
343
|
+
} else {
|
|
344
|
+
return await list(ctx, body)
|
|
345
|
+
}
|
|
346
|
+
} else if (method === 'POST') {
|
|
347
|
+
return await create(ctx, body)
|
|
348
|
+
} else if (method === 'PATCH') {
|
|
349
|
+
return await update(ctx, body)
|
|
350
|
+
} else if (method === 'DELETE') {
|
|
351
|
+
return await remove(ctx, body)
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
throw new Error('Invalid action or method')
|
|
356
|
+
})
|
|
357
|
+
// ─── CHUNK_END: TIMERS_HANDLER ────────────────────────────────────────────────
|