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,170 @@
|
|
|
1
|
+
# Authorization Model Overview
|
|
2
|
+
|
|
3
|
+
## First Surface vs Second Surface
|
|
4
|
+
|
|
5
|
+
### First Surface (User Interactions)
|
|
6
|
+
- User is the actor
|
|
7
|
+
- Permissions come from type.schema + DB role assignments
|
|
8
|
+
- System admin bypasses all checks
|
|
9
|
+
- Examples: User creates account, user creates ticket, user sends message
|
|
10
|
+
|
|
11
|
+
### Second Surface (System Interactions)
|
|
12
|
+
- System is the actor
|
|
13
|
+
- Runs with system role
|
|
14
|
+
- Captures triggering user/system UUID for audit
|
|
15
|
+
- Examples: AI agent processes ticket, timer fires, integration syncs data
|
|
16
|
+
|
|
17
|
+
### System Admin
|
|
18
|
+
- Complete bypass of all restrictions
|
|
19
|
+
- Can read/write/lock/unlock any surface
|
|
20
|
+
- Audit logs still record actions
|
|
21
|
+
|
|
22
|
+
## Permission Resolution
|
|
23
|
+
|
|
24
|
+
1. **Authentication** - Validate JWT, resolve personId
|
|
25
|
+
2. **Account Context** - Determine acting account from headers/membership
|
|
26
|
+
3. **Role Resolution** - Get active roles from v2.people_accounts + v2.people_roles
|
|
27
|
+
4. **Schema Loading** - Load type.schema for target record type
|
|
28
|
+
5. **Permission Evaluation** - Apply record_permissions + field overrides
|
|
29
|
+
6. **Multi-role Merge** - Use highest effective permission per action
|
|
30
|
+
7. **System Admin Bypass** - Skip all checks if system_admin
|
|
31
|
+
|
|
32
|
+
## Master/Client Access
|
|
33
|
+
|
|
34
|
+
Master account users access client records by:
|
|
35
|
+
1. Being assigned roles in client accounts via v2.people_roles
|
|
36
|
+
2. Having those roles recognized in client record's type.schema
|
|
37
|
+
3. No special-case permission logic required
|
|
38
|
+
|
|
39
|
+
## Type Schema Structure
|
|
40
|
+
|
|
41
|
+
```json
|
|
42
|
+
{
|
|
43
|
+
"record_permissions": {
|
|
44
|
+
"role_slug": {
|
|
45
|
+
"create": boolean,
|
|
46
|
+
"read": "all" | "account" | "own" | "none",
|
|
47
|
+
"update": "all" | "account" | "own" | "none",
|
|
48
|
+
"delete": boolean
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
"fields": {
|
|
52
|
+
"field_name": {
|
|
53
|
+
"type": "field_type",
|
|
54
|
+
"permissions": {
|
|
55
|
+
"role_slug": {
|
|
56
|
+
"read": boolean,
|
|
57
|
+
"write": boolean
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## Access Levels
|
|
66
|
+
|
|
67
|
+
### Record Access Levels
|
|
68
|
+
- **all** - Can access all records regardless of ownership
|
|
69
|
+
- **account** - Can access records within the same account
|
|
70
|
+
- **own** - Can only access records they created
|
|
71
|
+
- **none** - No access
|
|
72
|
+
|
|
73
|
+
### Field Access Levels
|
|
74
|
+
- **true** - Can access the field
|
|
75
|
+
- **false** - Cannot access the field
|
|
76
|
+
|
|
77
|
+
## Multi-Role Permission Merging
|
|
78
|
+
|
|
79
|
+
When a user has multiple roles, permissions are merged using the "highest effective permission wins" rule:
|
|
80
|
+
|
|
81
|
+
- For CRUD operations: if any role allows the action, the action is allowed
|
|
82
|
+
- For field access: if any role allows field access, field access is allowed
|
|
83
|
+
- System admin bypasses all permission checks
|
|
84
|
+
|
|
85
|
+
## Implementation Details
|
|
86
|
+
|
|
87
|
+
### Shared Permission Resolver
|
|
88
|
+
|
|
89
|
+
The `resolveFirstSurfacePermissions()` function in `v2-core/functions/_shared/permissions.ts` handles:
|
|
90
|
+
|
|
91
|
+
1. Loading type schema from database
|
|
92
|
+
2. Resolving user roles for the account context
|
|
93
|
+
3. Evaluating record permissions for each role
|
|
94
|
+
4. Merging permissions across multiple roles
|
|
95
|
+
5. Applying field-level overrides
|
|
96
|
+
|
|
97
|
+
### API Integration
|
|
98
|
+
|
|
99
|
+
APIs use the permission resolver through these helper functions:
|
|
100
|
+
|
|
101
|
+
- `canAccessRecord()` - Check if user can perform action on a record
|
|
102
|
+
- `sanitizeRecordData()` - Filter record data based on read permissions
|
|
103
|
+
- `validateUpdatePermissions()` - Validate field-level write permissions
|
|
104
|
+
|
|
105
|
+
### System Admin Override
|
|
106
|
+
|
|
107
|
+
System admin users (`systemRole === 'system_admin'`) bypass all permission checks while maintaining audit trails.
|
|
108
|
+
|
|
109
|
+
## Examples
|
|
110
|
+
|
|
111
|
+
### Support Ticket Type Schema
|
|
112
|
+
|
|
113
|
+
```json
|
|
114
|
+
{
|
|
115
|
+
"record_permissions": {
|
|
116
|
+
"user": {
|
|
117
|
+
"create": true,
|
|
118
|
+
"read": "own",
|
|
119
|
+
"update": "own",
|
|
120
|
+
"delete": false
|
|
121
|
+
},
|
|
122
|
+
"master-support": {
|
|
123
|
+
"create": false,
|
|
124
|
+
"read": "all",
|
|
125
|
+
"update": "all",
|
|
126
|
+
"delete": false
|
|
127
|
+
},
|
|
128
|
+
"master-csm": {
|
|
129
|
+
"create": false,
|
|
130
|
+
"read": "all",
|
|
131
|
+
"update": false,
|
|
132
|
+
"delete": false
|
|
133
|
+
}
|
|
134
|
+
},
|
|
135
|
+
"fields": {
|
|
136
|
+
"arr": {
|
|
137
|
+
"type": "number",
|
|
138
|
+
"permissions": {
|
|
139
|
+
"master-support": {
|
|
140
|
+
"read": false,
|
|
141
|
+
"write": false
|
|
142
|
+
},
|
|
143
|
+
"master-csm": {
|
|
144
|
+
"read": true,
|
|
145
|
+
"write": true
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
### Permission Evaluation
|
|
154
|
+
|
|
155
|
+
**Customer (user role):**
|
|
156
|
+
- Can create tickets
|
|
157
|
+
- Can only read/update their own tickets
|
|
158
|
+
- Cannot see ARR field
|
|
159
|
+
|
|
160
|
+
**Master Support (master-support role):**
|
|
161
|
+
- Cannot create tickets
|
|
162
|
+
- Can read all client tickets
|
|
163
|
+
- Can update most ticket fields
|
|
164
|
+
- Cannot see ARR field (field override)
|
|
165
|
+
|
|
166
|
+
**Master CSM (master-csm role):**
|
|
167
|
+
- Cannot create tickets
|
|
168
|
+
- Can read all client tickets
|
|
169
|
+
- Can only update ARR field (field override)
|
|
170
|
+
- Cannot delete tickets
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# DB-First API Inventory (v2 Schema)
|
|
2
|
+
|
|
3
|
+
## Core Entity Tables
|
|
4
|
+
|
|
5
|
+
| Table | Endpoint | Domain | Status | Notes |
|
|
6
|
+
|-------|----------|--------|--------|-------|
|
|
7
|
+
| `accounts` | accounts.ts | admin-data | complete | Full CRUD with account scoping |
|
|
8
|
+
| `people` | people.ts | admin-data | complete | Full CRUD with account scoping |
|
|
9
|
+
| `items` | items.ts | admin-data | complete | Full CRUD with type validation |
|
|
10
|
+
| `types` | types.ts | admin-configs | complete | Unified for item/account/person types |
|
|
11
|
+
| `apps` | apps.ts | admin-configs | complete | App definitions with nav items |
|
|
12
|
+
| `roles` | roles.ts | admin-configs | complete | Role definitions and permissions |
|
|
13
|
+
| `links` | links.ts | runtime | complete | Polymorphic entity relationships |
|
|
14
|
+
| `link_types` | link_types.ts | admin-configs | complete | Link type definitions |
|
|
15
|
+
|
|
16
|
+
## Workflow & Automation Tables
|
|
17
|
+
|
|
18
|
+
| Table | Endpoint | Domain | Status | Notes |
|
|
19
|
+
|-------|----------|--------|--------|-------|
|
|
20
|
+
| `pipelines` | pipelines.ts | admin-configs | complete | Workflow automation pipelines |
|
|
21
|
+
| `pipeline_executions` | pipeline-executions.ts | runtime | complete | Pipeline execution history |
|
|
22
|
+
| `triggers` | triggers.ts | admin-configs | complete | Trigger definitions |
|
|
23
|
+
| `trigger_executions` | trigger_executions | runtime | RPC-only | Accessed via triggers.ts |
|
|
24
|
+
| `timers` | timers.ts | admin-configs | complete | Scheduled/delayed timers |
|
|
25
|
+
|
|
26
|
+
## Collaboration & Communication Tables
|
|
27
|
+
|
|
28
|
+
| Table | Endpoint | Domain | Status | Notes |
|
|
29
|
+
|-------|----------|--------|--------|-------|
|
|
30
|
+
| `threads` | threads.ts | runtime | complete | Conversation threads |
|
|
31
|
+
| `messages` | messages.ts | runtime | complete | Thread messages |
|
|
32
|
+
| `attachments` | attachments.ts | runtime | complete | File attachments |
|
|
33
|
+
| `watchers` | watchers.ts | runtime | complete | Entity watching/subscriptions |
|
|
34
|
+
|
|
35
|
+
## Integration & AI Tables
|
|
36
|
+
|
|
37
|
+
| Table | Endpoint | Domain | Status | Notes |
|
|
38
|
+
|-------|----------|--------|--------|-------|
|
|
39
|
+
| `integrations` | integrations.ts | admin-configs | complete | Integration instances |
|
|
40
|
+
| `embeddings` | embeddings.ts | admin-configs | complete | Embedding vectors |
|
|
41
|
+
| `ai_agents` | ai-agents.ts | admin-configs | complete | AI agent definitions |
|
|
42
|
+
| `prompt_configs` | prompt-configs.ts | admin-configs | complete | AI prompt configurations |
|
|
43
|
+
|
|
44
|
+
## Access Control Tables
|
|
45
|
+
|
|
46
|
+
| Table | Endpoint | Domain | Status | Notes |
|
|
47
|
+
|-------|----------|--------|--------|-------|
|
|
48
|
+
| `people_accounts` | people-accounts.ts | runtime | complete | People-Accounts junction |
|
|
49
|
+
| `people_roles` | people-roles.ts | runtime | complete | People-Roles junction |
|
|
50
|
+
| `account_paths` | account-nodes.ts | internal | RPC-only | Account hierarchy traversal |
|
|
51
|
+
|
|
52
|
+
## System & Logging Tables
|
|
53
|
+
|
|
54
|
+
| Table | Endpoint | Domain | Status | Notes |
|
|
55
|
+
|-------|----------|--------|--------|-------|
|
|
56
|
+
| `logs` | logs.ts | internal | complete | System and application logs |
|
|
57
|
+
|
|
58
|
+
## v2-Incompatible Endpoints (Require Remediation)
|
|
59
|
+
|
|
60
|
+
| Endpoint | Referenced Tables | Domain | Status | Action Required |
|
|
61
|
+
|----------|------------------|--------|--------|-----------------|
|
|
62
|
+
| ai-orchestrator.ts | `ai_orchestrator` | internal | v2-incompatible | Table does not exist in v2 schema |
|
|
63
|
+
| pending-actions.ts | `pending_actions` | internal | v2-incompatible | Table does not exist in v2 schema |
|
|
64
|
+
| apps-accounts.ts | `apps_accounts` | internal | v2-incompatible | Table does not exist in v2 schema |
|
|
65
|
+
| apps-integrations.ts | `apps_integrations` | internal | v2-incompatible | Table does not exist in v2 schema |
|
|
66
|
+
| impersonation.ts | `impersonation_sessions`, `impersonation_policies`, `impersonation_logs` | internal | v2-incompatible | Tables do not exist in v2 schema |
|
|
67
|
+
| integration-health.ts | `integration_sync_logs`, `oauth_connections`, `api_keys`, `api_key_usage_logs` | internal | v2-incompatible | Tables do not exist in v2 schema |
|
|
68
|
+
| thread-participants.ts | `thread_participants` | runtime | v2-incompatible | Table does not exist in v2 schema |
|
|
69
|
+
| outbox.ts | `outbox` | internal | v2-incompatible | Table does not exist in v2 schema |
|
|
70
|
+
| webhooks.ts | `webhooks` | internal | v2-incompatible | Table does not exist in v2 schema |
|
|
71
|
+
|
|
72
|
+
## Summary
|
|
73
|
+
|
|
74
|
+
### Complete Coverage: 18 tables
|
|
75
|
+
- All core entity tables have proper endpoints
|
|
76
|
+
- All workflow/automation tables are covered
|
|
77
|
+
- All collaboration tables are covered
|
|
78
|
+
- All integration/AI tables are covered
|
|
79
|
+
- Access control tables are covered
|
|
80
|
+
- System logging is covered
|
|
81
|
+
|
|
82
|
+
### v2-Incompatible: 9 endpoints
|
|
83
|
+
- These endpoints reference tables that don't exist in v2 schema
|
|
84
|
+
- Must be either rewritten to use existing v2 tables or quarantined
|
|
85
|
+
- Priority: High - these will cause runtime errors if called
|
|
86
|
+
|
|
87
|
+
### Missing Endpoints: 0 tables
|
|
88
|
+
- All v2 schema tables have corresponding endpoints
|
|
89
|
+
- Some tables are accessed via RPC rather than direct queries (trigger_executions, account_paths)
|
|
90
|
+
|
|
91
|
+
### Recommendations
|
|
92
|
+
1. Quarantine v2-incompatible endpoints immediately
|
|
93
|
+
2. Rewrite or remove incompatible endpoints
|
|
94
|
+
3. Consider if missing functionality should be implemented with existing v2 tables
|
|
95
|
+
4. Update any UI that might be calling incompatible endpoints
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# Example: Custom App
|
|
2
|
+
|
|
3
|
+
A minimal React app with manifest and routing, installable via `spine-framework install-app`.
|
|
4
|
+
|
|
5
|
+
## Directory Structure
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
custom/apps/my-app/
|
|
9
|
+
├── manifest.json # App metadata, routes, nav items
|
|
10
|
+
├── index.tsx # React entry point (default export)
|
|
11
|
+
├── seed/
|
|
12
|
+
│ ├── types.json # Item types this app provides
|
|
13
|
+
│ └── triggers.json # Automation triggers
|
|
14
|
+
├── components/
|
|
15
|
+
│ └── Dashboard.tsx # App-specific components
|
|
16
|
+
└── package.json # npm package metadata (optional)
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## manifest.json
|
|
20
|
+
|
|
21
|
+
```json
|
|
22
|
+
{
|
|
23
|
+
"name": "My App",
|
|
24
|
+
"slug": "my-app",
|
|
25
|
+
"version": "0.1.0",
|
|
26
|
+
"description": "A custom app for demonstration",
|
|
27
|
+
"routes": [
|
|
28
|
+
{ "path": "/", "redirect": "/dashboard" },
|
|
29
|
+
{ "path": "/dashboard", "component": "Dashboard" }
|
|
30
|
+
],
|
|
31
|
+
"nav_items": [
|
|
32
|
+
{ "label": "Dashboard", "path": "/dashboard", "icon": "LayoutDashboard" }
|
|
33
|
+
],
|
|
34
|
+
"required_roles": ["member"]
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## index.tsx
|
|
39
|
+
|
|
40
|
+
```tsx
|
|
41
|
+
import * as React from 'react'
|
|
42
|
+
import { Routes, Route, Navigate } from 'react-router-dom'
|
|
43
|
+
|
|
44
|
+
function Dashboard() {
|
|
45
|
+
return (
|
|
46
|
+
<div className="p-6">
|
|
47
|
+
<h1 className="text-2xl font-bold">My App</h1>
|
|
48
|
+
</div>
|
|
49
|
+
)
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export default function MyApp() {
|
|
53
|
+
return (
|
|
54
|
+
<Routes>
|
|
55
|
+
<Route path="/" element={<Navigate to="dashboard" replace />} />
|
|
56
|
+
<Route path="dashboard" element={<Dashboard />} />
|
|
57
|
+
</Routes>
|
|
58
|
+
)
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Installation
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
# Create the app scaffold
|
|
66
|
+
spine-framework create-app my-app
|
|
67
|
+
|
|
68
|
+
# Or install an existing app package
|
|
69
|
+
spine-framework install-app my-app
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## How It Works
|
|
73
|
+
|
|
74
|
+
1. `CustomAppLoader` discovers apps via `import.meta.glob('custom/apps/*/index.tsx')`
|
|
75
|
+
2. The app's `manifest.json` provides routing and navigation metadata
|
|
76
|
+
3. Seed data is applied via `spine-framework install-app` (idempotent upserts)
|
|
77
|
+
4. The app is isolated — it cannot import from other apps or core internals
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Example: Custom Function
|
|
2
|
+
|
|
3
|
+
A minimal Netlify Function using Spine's core context system.
|
|
4
|
+
|
|
5
|
+
## Setup
|
|
6
|
+
|
|
7
|
+
1. Create `custom/functions/custom_my-handler.ts`
|
|
8
|
+
2. Import `createHandler` and `CoreContext` from `spine-framework/_shared`
|
|
9
|
+
3. Your handler receives a fully-resolved `CoreContext` with:
|
|
10
|
+
- `ctx.principal` — authenticated user/machine identity
|
|
11
|
+
- `ctx.db` — Supabase client (scoped to principal's permissions)
|
|
12
|
+
- `ctx.accountId` — resolved account UUID
|
|
13
|
+
- `ctx.requestId` — unique request trace ID
|
|
14
|
+
|
|
15
|
+
## Key Points
|
|
16
|
+
|
|
17
|
+
- **Naming convention:** Custom functions MUST be prefixed with `custom_`
|
|
18
|
+
- **No static imports from core:** Use the `spine-framework` package exports
|
|
19
|
+
- **Authentication is automatic:** `createHandler` validates the JWT/API key before your code runs
|
|
20
|
+
- **Database access:** Use `ctx.db` for RLS-scoped queries, or import `adminDb` for service-role operations
|
|
21
|
+
|
|
22
|
+
## API
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
GET/POST /.netlify/functions/custom_my-handler?action=list
|
|
26
|
+
Authorization: Bearer <jwt>
|
|
27
|
+
```
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Example: Custom Netlify Function using Spine core context
|
|
3
|
+
*
|
|
4
|
+
* This demonstrates the minimal pattern for creating a custom function
|
|
5
|
+
* that leverages Spine's authentication, database, and principal system.
|
|
6
|
+
*
|
|
7
|
+
* File: custom/functions/custom_my-handler.ts
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { createHandler, adminDb } from 'spine-framework/_shared'
|
|
11
|
+
import type { CoreContext } from 'spine-framework/_shared'
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* A simple handler that lists items for the current account.
|
|
15
|
+
*/
|
|
16
|
+
async function listAccountItems(ctx: CoreContext) {
|
|
17
|
+
const { data, error } = await ctx.db
|
|
18
|
+
.from('items')
|
|
19
|
+
.select('id, title, type_id, created_at')
|
|
20
|
+
.eq('account_id', ctx.accountId)
|
|
21
|
+
.eq('is_active', true)
|
|
22
|
+
.order('created_at', { ascending: false })
|
|
23
|
+
.limit(50)
|
|
24
|
+
|
|
25
|
+
if (error) {
|
|
26
|
+
return { statusCode: 500, body: JSON.stringify({ error: error.message }) }
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
return {
|
|
30
|
+
statusCode: 200,
|
|
31
|
+
body: JSON.stringify({ items: data }),
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Netlify Function entry point.
|
|
37
|
+
* `createHandler` resolves the principal, validates auth, and provides CoreContext.
|
|
38
|
+
*/
|
|
39
|
+
export const handler = createHandler(async (ctx) => {
|
|
40
|
+
const { action } = ctx.params
|
|
41
|
+
|
|
42
|
+
switch (action) {
|
|
43
|
+
case 'list':
|
|
44
|
+
return listAccountItems(ctx)
|
|
45
|
+
default:
|
|
46
|
+
return { statusCode: 400, body: JSON.stringify({ error: 'Unknown action' }) }
|
|
47
|
+
}
|
|
48
|
+
})
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# Example: Custom Webhook Handler
|
|
2
|
+
|
|
3
|
+
Demonstrates the self-registration pattern for webhook handlers.
|
|
4
|
+
|
|
5
|
+
## How It Works
|
|
6
|
+
|
|
7
|
+
1. Create a handler function in `custom/functions/custom_my-webhook.ts`
|
|
8
|
+
2. Register it by calling `registerWebhookHandler()` in `custom/functions/custom_webhook-handlers.ts`
|
|
9
|
+
3. Core resolves handlers at runtime via the `webhook_handlers` DB table — no static imports needed
|
|
10
|
+
|
|
11
|
+
## Handler Function
|
|
12
|
+
|
|
13
|
+
```ts
|
|
14
|
+
// custom/functions/custom_my-webhook.ts
|
|
15
|
+
|
|
16
|
+
import { createHandler } from 'spine-framework/_shared'
|
|
17
|
+
import type { CoreContext } from 'spine-framework/_shared'
|
|
18
|
+
|
|
19
|
+
export const handler = createHandler(async (ctx: CoreContext) => {
|
|
20
|
+
const payload = ctx.body
|
|
21
|
+
|
|
22
|
+
// Process the webhook payload
|
|
23
|
+
console.log('Received webhook:', payload.event_type)
|
|
24
|
+
|
|
25
|
+
// Do something with the data
|
|
26
|
+
const { error } = await ctx.db
|
|
27
|
+
.from('items')
|
|
28
|
+
.insert({
|
|
29
|
+
title: `Webhook: ${payload.event_type}`,
|
|
30
|
+
type_id: await resolveTypeId('webhook_event'),
|
|
31
|
+
account_id: ctx.accountId,
|
|
32
|
+
data: payload,
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
if (error) {
|
|
36
|
+
return { statusCode: 500, body: JSON.stringify({ error: error.message }) }
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
return { statusCode: 200, body: JSON.stringify({ ok: true }) }
|
|
40
|
+
})
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Registration
|
|
44
|
+
|
|
45
|
+
```ts
|
|
46
|
+
// In custom/functions/custom_webhook-handlers.ts
|
|
47
|
+
|
|
48
|
+
import { registerWebhookHandler } from 'spine-framework/_shared/webhook-registration'
|
|
49
|
+
|
|
50
|
+
registerWebhookHandler({
|
|
51
|
+
name: 'my-webhook',
|
|
52
|
+
functionName: 'custom_my-webhook',
|
|
53
|
+
description: 'Handles incoming webhooks from MyService',
|
|
54
|
+
events: ['integration.webhook'],
|
|
55
|
+
}).catch(console.error)
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## Integration Config
|
|
59
|
+
|
|
60
|
+
When configuring an integration in the admin panel, set:
|
|
61
|
+
- `handler.path` = `my-webhook` (matches the `name` in registration)
|
|
62
|
+
|
|
63
|
+
## Key Points
|
|
64
|
+
|
|
65
|
+
- **Self-registration is idempotent** — safe to call on every module load
|
|
66
|
+
- **No core changes needed** — just add your handler and register it
|
|
67
|
+
- **Runtime resolution** — core looks up handlers from `webhook_handlers` table via `resolveHandler()`
|
|
68
|
+
- **Events array** — currently `['integration.webhook']` is the standard event type
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
# Gap Remediation Backlog
|
|
2
|
+
|
|
3
|
+
## Priority 1: Critical v2-Incompatible Endpoints
|
|
4
|
+
|
|
5
|
+
### 1. Quarantine v2-Incompatible Endpoints
|
|
6
|
+
**Files to quarantine:**
|
|
7
|
+
- `ai-orchestrator.ts` - References non-existent `ai_orchestrator` table
|
|
8
|
+
- `pending-actions.ts` - References non-existent `pending_actions` table
|
|
9
|
+
- `apps-accounts.ts` - References non-existent `apps_accounts` table
|
|
10
|
+
- `apps-integrations.ts` - References non-existent `apps_integrations` table
|
|
11
|
+
- `impersonation.ts` - References non-existent impersonation tables
|
|
12
|
+
- `integration-health.ts` - References non-existent integration log tables
|
|
13
|
+
- `thread-participants.ts` - References non-existent `thread_participants` table
|
|
14
|
+
- `outbox.ts` - References non-existent `outbox` table
|
|
15
|
+
- `webhooks.ts` - References non-existent `webhooks` table
|
|
16
|
+
|
|
17
|
+
**Action:**
|
|
18
|
+
1. Move these files to `v2-core/functions/_quarantine/` directory
|
|
19
|
+
2. Update any routing that might call these endpoints
|
|
20
|
+
3. Document what functionality needs replacement
|
|
21
|
+
|
|
22
|
+
## Priority 2: UI Adoption Issues
|
|
23
|
+
|
|
24
|
+
### 2. Fix TimersPage Mock Data
|
|
25
|
+
**Issue:** TimersPage uses mock data instead of calling timers.ts API
|
|
26
|
+
**File:** `v2-core/src/pages/admin/TimersPage.tsx`
|
|
27
|
+
**Action:** Replace mock data with `apiFetch('/.netlify/functions/timers')`
|
|
28
|
+
|
|
29
|
+
## Priority 3: API Standardization
|
|
30
|
+
|
|
31
|
+
### 3. Add Role Guards to Config Endpoints
|
|
32
|
+
**Files to update:**
|
|
33
|
+
- `types.ts` - Admin-only for create/update/delete
|
|
34
|
+
- `apps.ts` - Admin-only for create/update/delete
|
|
35
|
+
- `pipelines.ts` - Admin-only for create/update/delete
|
|
36
|
+
- `triggers.ts` - Admin-only for create/update/delete
|
|
37
|
+
- `ai-agents.ts` - Admin-only for create/update/delete
|
|
38
|
+
- `embeddings.ts` - Admin-only for create/update/delete
|
|
39
|
+
- `timers.ts` - Admin-only for create/update/delete
|
|
40
|
+
- `integrations.ts` - Admin-only for create/update/delete
|
|
41
|
+
- `prompt-configs.ts` - Admin-only for create/update/delete
|
|
42
|
+
- `roles.ts` - Admin-only for create/update/delete
|
|
43
|
+
|
|
44
|
+
**Action:** Add `requireAuth` middleware to all config mutation endpoints
|
|
45
|
+
|
|
46
|
+
### 4. Verify Soft Delete Implementation
|
|
47
|
+
**Files to check:**
|
|
48
|
+
- All endpoints should use `is_active=false` for delete
|
|
49
|
+
- Ensure `updated_at` is set on soft delete
|
|
50
|
+
- Verify audit logging before soft delete
|
|
51
|
+
|
|
52
|
+
## Priority 4: Documentation
|
|
53
|
+
|
|
54
|
+
### 5. Add Inline API Documentation
|
|
55
|
+
**All endpoint files need:**
|
|
56
|
+
- Purpose and domain documentation
|
|
57
|
+
- Auth requirements
|
|
58
|
+
- Account scoping rules
|
|
59
|
+
- Request/response contracts
|
|
60
|
+
- Soft delete behavior
|
|
61
|
+
- v2 table dependencies
|
|
62
|
+
|
|
63
|
+
### 6. Generate API Reference Docs
|
|
64
|
+
**Create files in `v2-core/docs/apis/`:**
|
|
65
|
+
- `admin-data.md`
|
|
66
|
+
- `admin-configs.md`
|
|
67
|
+
- `runtime.md`
|
|
68
|
+
- `internal.md`
|
|
69
|
+
- `index.md` (top-level)
|
|
70
|
+
|
|
71
|
+
## Implementation Order
|
|
72
|
+
|
|
73
|
+
### Phase 1: Critical Fixes (Immediate)
|
|
74
|
+
1. Quarantine v2-incompatible endpoints
|
|
75
|
+
2. Fix TimersPage mock data issue
|
|
76
|
+
|
|
77
|
+
### Phase 2: Security & Standards (High)
|
|
78
|
+
1. Add role guards to config endpoints
|
|
79
|
+
2. Verify soft delete implementation
|
|
80
|
+
3. Add basic inline documentation
|
|
81
|
+
|
|
82
|
+
### Phase 3: Documentation (Medium)
|
|
83
|
+
1. Complete inline documentation for all endpoints
|
|
84
|
+
2. Generate split API reference docs
|
|
85
|
+
3. Create top-level index
|
|
86
|
+
|
|
87
|
+
### Phase 4: Verification (Low)
|
|
88
|
+
1. Verify UI adoption for all completed APIs
|
|
89
|
+
2. Final compliance check against API rulebook
|
|
90
|
+
|
|
91
|
+
## Success Criteria
|
|
92
|
+
|
|
93
|
+
- [ ] No v2-incompatible endpoints in active routing
|
|
94
|
+
- [ ] All admin UIs use proper APIs (no mock data)
|
|
95
|
+
- [ ] All config endpoints have admin-only role guards
|
|
96
|
+
- [ ] All endpoints use soft delete correctly
|
|
97
|
+
- [ ] All endpoints have inline documentation
|
|
98
|
+
- [ ] API reference docs generated and indexed
|
|
99
|
+
- [ ] UI adoption verified for all APIs
|
|
100
|
+
|
|
101
|
+
## Blocked Items
|
|
102
|
+
|
|
103
|
+
None currently identified.
|