spine-framework 0.3.124 → 0.3.126
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/cli/commands/agents.ts +35 -37
- package/.framework/cli/commands/auth.ts +35 -34
- package/.framework/cli/commands/create-app.ts +104 -40
- package/.framework/cli/commands/dev.ts +104 -69
- package/.framework/cli/commands/doctor.ts +179 -69
- package/.framework/cli/commands/generate.ts +83 -143
- package/.framework/cli/commands/init.ts +72 -34
- package/.framework/cli/commands/install-app.ts +260 -125
- package/.framework/cli/commands/items.ts +33 -44
- package/.framework/cli/commands/migrate.ts +122 -40
- package/.framework/cli/commands/migrations.ts +33 -40
- package/.framework/cli/commands/pipelines.ts +31 -39
- package/.framework/cli/commands/status.ts +47 -23
- package/.framework/cli/commands/system.ts +47 -37
- package/.framework/cli/commands/test.ts +112 -68
- package/.framework/cli/commands/validate-app.ts +215 -121
- package/.framework/cli/context.ts +112 -130
- package/.framework/cli/env-loader.ts +47 -18
- package/.framework/cli/index.ts +81 -42
- package/.framework/docs/runtime-types.md +1024 -0
- package/.framework/functions/_shared/agent-runner.ts +1296 -961
- package/.framework/functions/_shared/app-manifest.ts +82 -68
- package/.framework/functions/_shared/audit.ts +135 -83
- package/.framework/functions/_shared/{cil-state.ts → cil.ts} +158 -56
- package/.framework/functions/_shared/db.ts +80 -126
- package/.framework/functions/_shared/hash-api-key.ts +63 -0
- package/.framework/functions/_shared/index.ts +224 -335
- package/.framework/functions/_shared/kb.ts +319 -0
- package/.framework/functions/_shared/llm.ts +92 -0
- package/.framework/functions/_shared/logging.ts +288 -0
- package/.framework/functions/_shared/middleware.ts +329 -365
- package/.framework/functions/_shared/outcomes.ts +36 -0
- package/.framework/functions/_shared/permissions.ts +359 -643
- package/.framework/functions/_shared/pipeline-runner.ts +243 -316
- package/.framework/functions/_shared/principal.ts +376 -468
- package/.framework/functions/_shared/resolve-credentials.ts +102 -0
- package/.framework/functions/_shared/resolve-ids.ts +188 -16
- package/.framework/functions/_shared/retry-deliveries.ts +104 -0
- package/.framework/functions/_shared/schema-utils.ts +611 -373
- package/.framework/functions/_shared/testing.ts +207 -137
- package/.framework/functions/_shared/tracing.ts +276 -0
- package/.framework/functions/_shared/trigger-engine.ts +159 -211
- package/.framework/functions/_shared/webhook-registration.ts +95 -81
- package/.framework/functions/_shared/webhook-registry.ts +153 -75
- package/.framework/functions/account-nodes.ts +31 -53
- package/.framework/functions/adapters/generic-webhook-inbound.ts +56 -0
- package/.framework/functions/adapters/generic-webhook-outbound.ts +43 -0
- package/.framework/functions/adapters/openai-outbound.ts +40 -0
- package/.framework/functions/admin-data.ts +685 -537
- package/.framework/functions/admin-funnel.ts +31 -20
- package/.framework/functions/admin-install-funnel.ts +47 -28
- package/.framework/functions/admin-signals.ts +47 -29
- package/.framework/functions/ai-agents.ts +122 -147
- package/.framework/functions/ai-interactions.ts +180 -90
- package/.framework/functions/api-keys.ts +250 -192
- package/.framework/functions/apps.ts +203 -197
- package/.framework/functions/auth.ts +98 -91
- package/.framework/functions/cil-agent-ingest.ts +773 -0
- package/.framework/functions/cil-agent.ts +592 -0
- package/.framework/functions/cil-callmap.ts +1227 -0
- package/.framework/functions/cil-config.ts +583 -0
- package/.framework/functions/cil-context.ts +445 -0
- package/.framework/functions/cil-doc.ts +1752 -0
- package/.framework/functions/cil-embeddings.ts +1202 -0
- package/.framework/functions/cil-graph.ts +585 -0
- package/.framework/functions/cil-ingest.ts +2416 -0
- package/.framework/functions/cil-pipeline.ts +318 -0
- package/.framework/functions/cil-project.ts +499 -0
- package/.framework/functions/cil-validate.ts +469 -0
- package/.framework/functions/debug-auth.ts +73 -53
- package/.framework/functions/deliveries.ts +117 -0
- package/.framework/functions/embeddings.ts +528 -516
- package/.framework/functions/eval-harness.ts +158 -106
- package/.framework/functions/integration-outbound.ts +311 -0
- package/.framework/functions/integration-routes.ts +240 -466
- package/.framework/functions/integrations.ts +132 -140
- package/.framework/functions/invites.ts +401 -201
- package/.framework/functions/item-progress.ts +113 -53
- package/.framework/functions/kb.ts +28 -0
- package/.framework/functions/logs.ts +239 -222
- package/.framework/functions/observability.ts +308 -259
- package/.framework/functions/pipeline-executions.ts +179 -235
- package/.framework/functions/pipelines.ts +163 -205
- package/.framework/functions/prompt-configs.ts +109 -156
- package/.framework/functions/roles.ts +97 -147
- package/.framework/functions/system-cron.ts +132 -218
- package/.framework/functions/system.ts +112 -52
- package/.framework/functions/tests.ts +32 -28
- package/.framework/functions/timers.ts +162 -210
- package/.framework/functions/triggers.ts +282 -346
- package/.framework/functions/types.ts +283 -400
- package/.framework/migrations/001_core_schema.sql +630 -0
- package/.framework/migrations/002_core_rls_and_functions.sql +532 -0
- package/.framework/migrations/{003_system_data.sql → 003_core_system_data.sql} +26 -153
- package/.framework/migrations/004_core_rpc_and_broker.sql +421 -0
- package/.framework/migrations/005_core_observability.sql +598 -0
- package/.framework/migrations/006_security_hardening_rls.sql +97 -0
- package/.framework/migrations/007_kb_article_list.sql +237 -0
- package/.framework/migrations/008_items_target.sql +8 -0
- package/.framework/migrations/009_roles_slug_unique.sql +11 -0
- package/.framework/public/spine.config.json +91 -0
- package/.framework/scripts/app-install-cli.ts +112 -98
- package/.framework/src/App.tsx +67 -20
- package/.framework/src/apps/admin/index.tsx +97 -27
- package/.framework/src/components/AppWrapper.tsx +50 -11
- package/.framework/src/components/CustomAppLoader.tsx +131 -22
- package/.framework/src/components/admin/AdminListPage.tsx +75 -8
- package/.framework/src/components/admin/AdminSidebar.tsx +148 -36
- package/.framework/src/components/admin/AdminStatsCard.tsx +48 -29
- package/.framework/src/components/admin/PageInstructions.tsx +49 -0
- package/.framework/src/components/admin/SortableTableHeader.tsx +49 -2
- package/.framework/src/components/app-shell/GenericAppShell.tsx +69 -11
- package/.framework/src/components/app-shell/GenericDetailPage.tsx +55 -10
- package/.framework/src/components/app-shell/GenericListPage.tsx +76 -9
- package/.framework/src/components/app-sidebar.tsx +50 -3
- package/.framework/src/components/auth/ProtectedRoute.tsx +53 -45
- package/.framework/src/components/kb/KBArticleEditor.tsx +409 -0
- package/.framework/src/components/kb/KBArticleList.tsx +557 -0
- package/.framework/src/components/layout/AppShell.tsx +54 -16
- package/.framework/src/components/layout/Header.tsx +50 -38
- package/.framework/src/components/layout/Layout.tsx +48 -32
- package/.framework/src/components/layout/Sidebar.tsx +167 -16
- package/.framework/src/components/runtime/DataDetailHeader.tsx +33 -1
- package/.framework/src/components/runtime/DataDetailPage.tsx +289 -4
- package/.framework/src/components/runtime/DataFilters.tsx +78 -1
- package/.framework/src/components/runtime/DataHeader.tsx +32 -29
- package/.framework/src/components/runtime/DataListPage.tsx +161 -2
- package/.framework/src/components/runtime/DataStats.tsx +48 -1
- package/.framework/src/components/runtime/DataTable.tsx +153 -1
- package/.framework/src/components/runtime/SchemaDetailForm.tsx +77 -46
- package/.framework/src/components/runtime/index.ts +16 -9
- package/.framework/src/components/search-form.tsx +33 -1
- package/.framework/src/components/shared/AgentView.tsx +48 -51
- package/.framework/src/components/shared/FieldRenderer.tsx +84 -67
- package/.framework/src/components/shared/InviteManager.tsx +113 -52
- package/.framework/src/components/shared/MemberList.tsx +182 -0
- package/.framework/src/components/shared/SchemaFields.tsx +96 -78
- package/.framework/src/components/ui/DataTable.tsx +86 -56
- package/.framework/src/components/ui/Form.tsx +188 -109
- package/.framework/src/components/ui/ItemCard.tsx +86 -58
- package/.framework/src/components/ui/ItemListView.tsx +88 -61
- package/.framework/src/components/ui/LoadingSpinner.tsx +52 -27
- package/.framework/src/components/ui/Modal.tsx +81 -4
- package/.framework/src/components/ui/RichTextEditor.tsx +101 -9
- package/.framework/src/components/ui/accordion.tsx +97 -5
- package/.framework/src/components/ui/alert-dialog.tsx +225 -13
- package/.framework/src/components/ui/alert.tsx +113 -6
- package/.framework/src/components/ui/aspect-ratio.tsx +49 -2
- package/.framework/src/components/ui/avatar.tsx +129 -7
- package/.framework/src/components/ui/badge.tsx +65 -3
- package/.framework/src/components/ui/breadcrumb.tsx +145 -8
- package/.framework/src/components/ui/button-group.tsx +81 -4
- package/.framework/src/components/ui/button.tsx +49 -2
- package/.framework/src/components/ui/calendar.tsx +65 -3
- package/.framework/src/components/ui/card.tsx +145 -8
- package/.framework/src/components/ui/carousel.tsx +129 -7
- package/.framework/src/components/ui/chart.tsx +161 -10
- package/.framework/src/components/ui/checkbox.tsx +49 -2
- package/.framework/src/components/ui/collapsible.tsx +81 -5
- package/.framework/src/components/ui/combobox.tsx +305 -20
- package/.framework/src/components/ui/command.tsx +177 -11
- package/.framework/src/components/ui/context-menu.tsx +273 -17
- package/.framework/src/components/ui/dialog.tsx +209 -27
- package/.framework/src/components/ui/direction.tsx +64 -4
- package/.framework/src/components/ui/drawer.tsx +193 -12
- package/.framework/src/components/ui/dropdown-menu.tsx +273 -18
- package/.framework/src/components/ui/empty.tsx +145 -9
- package/.framework/src/components/ui/field.tsx +209 -14
- package/.framework/src/components/ui/hover-card.tsx +81 -4
- package/.framework/src/components/ui/input-group.tsx +162 -10
- package/.framework/src/components/ui/input-otp.tsx +98 -5
- package/.framework/src/components/ui/input.tsx +49 -2
- package/.framework/src/components/ui/item.tsx +225 -13
- package/.framework/src/components/ui/kbd.tsx +65 -3
- package/.framework/src/components/ui/label.tsx +49 -2
- package/.framework/src/components/ui/menubar.tsx +289 -17
- package/.framework/src/components/ui/native-select.tsx +97 -5
- package/.framework/src/components/ui/navigation-menu.tsx +177 -10
- package/.framework/src/components/ui/pagination.tsx +161 -9
- package/.framework/src/components/ui/popover.tsx +145 -8
- package/.framework/src/components/ui/progress.tsx +49 -2
- package/.framework/src/components/ui/radio-group.tsx +65 -3
- package/.framework/src/components/ui/resizable.tsx +82 -4
- package/.framework/src/components/ui/scroll-area.tsx +65 -3
- package/.framework/src/components/ui/select.tsx +193 -11
- package/.framework/src/components/ui/separator.tsx +49 -2
- package/.framework/src/components/ui/sheet.tsx +193 -11
- package/.framework/src/components/ui/sidebar.tsx +481 -38
- package/.framework/src/components/ui/skeleton.tsx +49 -2
- package/.framework/src/components/ui/slider.tsx +49 -2
- package/.framework/src/components/ui/sonner.tsx +49 -2
- package/.framework/src/components/ui/spinner.tsx +49 -2
- package/.framework/src/components/ui/switch.tsx +49 -2
- package/.framework/src/components/ui/table-primitives.tsx +160 -33
- package/.framework/src/components/ui/table.tsx +161 -9
- package/.framework/src/components/ui/tabs.tsx +113 -6
- package/.framework/src/components/ui/textarea.tsx +49 -2
- package/.framework/src/components/ui/toggle-group.tsx +81 -4
- package/.framework/src/components/ui/toggle.tsx +65 -3
- package/.framework/src/components/ui/tooltip.tsx +97 -5
- package/.framework/src/contexts/AppContext.tsx +129 -45
- package/.framework/src/contexts/AuthContext.tsx +187 -144
- package/.framework/src/hooks/use-mobile.ts +48 -2
- package/.framework/src/hooks/useApi.ts +208 -159
- package/.framework/src/hooks/useAppPath.ts +32 -23
- package/.framework/src/hooks/useApps.ts +51 -20
- package/.framework/src/hooks/useEntityList.ts +32 -78
- package/.framework/src/hooks/useEntityRecord.ts +35 -96
- package/.framework/src/hooks/useForm.ts +32 -92
- package/.framework/src/hooks/useListSchema.ts +49 -78
- package/.framework/src/hooks/useSchemaRecord.ts +114 -105
- package/.framework/src/lib/api.ts +195 -116
- package/.framework/src/lib/supabase.ts +98 -64
- package/.framework/src/lib/utils.ts +287 -151
- package/.framework/src/main.tsx +49 -3
- package/.framework/src/pages/DashboardPage.tsx +52 -29
- package/.framework/src/pages/NotFoundPage.tsx +32 -10
- package/.framework/src/pages/SetupPage.tsx +32 -12
- package/.framework/src/pages/admin/AIAgentDetailPage.tsx +119 -10
- package/.framework/src/pages/admin/AIAgentsPage.tsx +48 -19
- package/.framework/src/pages/admin/APIKeyDetailPage.tsx +187 -17
- package/.framework/src/pages/admin/APIKeysPage.tsx +98 -22
- package/.framework/src/pages/admin/AlertsConfigPage.tsx +113 -26
- package/.framework/src/pages/admin/AppDetailPage.tsx +125 -8
- package/.framework/src/pages/admin/AppsPage.tsx +49 -2
- package/.framework/src/pages/admin/DeliveriesPage.tsx +196 -0
- package/.framework/src/pages/admin/DesignedPage.tsx +32 -18
- package/.framework/src/pages/admin/EmbeddingDetailPage.tsx +215 -484
- package/.framework/src/pages/admin/EmbeddingsPage.tsx +116 -319
- package/.framework/src/pages/admin/ExtendedShadcnTestPage.tsx +34 -9
- package/.framework/src/pages/admin/IncrementalShadcnTestPage.tsx +34 -9
- package/.framework/src/pages/admin/IntegratedDashboard.tsx +32 -16
- package/.framework/src/pages/admin/IntegrationDetailPage.tsx +183 -26
- package/.framework/src/pages/admin/IntegrationsPage.tsx +48 -19
- package/.framework/src/pages/admin/InvitesPage.tsx +48 -14
- package/.framework/src/pages/admin/LogsPage.tsx +422 -75
- package/.framework/src/pages/admin/MinimalShadcnTestPage.tsx +34 -9
- package/.framework/src/pages/admin/ObservabilityDashboard.tsx +113 -24
- package/.framework/src/pages/admin/PipelineDetailPage.tsx +206 -34
- package/.framework/src/pages/admin/PipelineExecutionsPage.tsx +50 -17
- package/.framework/src/pages/admin/PipelinesPage.tsx +160 -21
- package/.framework/src/pages/admin/PromptConfigDetailPage.tsx +378 -88
- package/.framework/src/pages/admin/PromptConfigsPage.tsx +125 -16
- package/.framework/src/pages/admin/ProperlyDesignedPage.tsx +49 -10
- package/.framework/src/pages/admin/RoleDetailPage.tsx +130 -10
- package/.framework/src/pages/admin/RolesPage.tsx +171 -18
- package/.framework/src/pages/admin/SelectTestPage.tsx +34 -9
- package/.framework/src/pages/admin/ShadcnTestPage.tsx +49 -11
- package/.framework/src/pages/admin/SimpleDashboard.tsx +49 -10
- package/.framework/src/pages/admin/TestRunDetailPage.tsx +49 -4
- package/.framework/src/pages/admin/TestingDashboard.tsx +98 -28
- package/.framework/src/pages/admin/TimerDetailPage.tsx +143 -33
- package/.framework/src/pages/admin/TimersPage.tsx +48 -20
- package/.framework/src/pages/admin/TriggerDetailPage.tsx +118 -30
- package/.framework/src/pages/admin/TriggersPage.tsx +64 -19
- package/.framework/src/pages/admin/TypeDetailPage.tsx +138 -15
- package/.framework/src/pages/admin/TypesPage.tsx +48 -20
- package/.framework/src/pages/admin/cil/CILAgentPage.tsx +465 -0
- package/.framework/src/pages/admin/cil/CILChunkDetailPage.tsx +787 -0
- package/.framework/src/pages/admin/cil/CILDashboardPage.tsx +699 -0
- package/.framework/src/pages/admin/cil/CILFileListPage.tsx +647 -0
- package/.framework/src/pages/admin/cil/CILGraphPage.tsx +616 -0
- package/.framework/src/pages/admin/cil/CILIngestionPage.tsx +1402 -0
- package/.framework/src/pages/admin/cil/CILProjectsPage.tsx +614 -0
- package/.framework/src/pages/admin/cil/CILSearchPage.tsx +571 -0
- package/.framework/src/pages/admin/cil/FlexiblePipelinePage.tsx +731 -0
- package/.framework/src/pages/admin/kb/KBAdminPage.tsx +64 -0
- package/.framework/src/pages/auth/AuthConfirmPage.tsx +52 -51
- package/.framework/src/pages/auth/ForgotPasswordPage.tsx +31 -22
- package/.framework/src/pages/auth/LoginPage.tsx +50 -23
- package/.framework/src/pages/auth/PendingApprovalPage.tsx +31 -15
- package/.framework/src/pages/auth/RegisterPage.tsx +281 -317
- package/.framework/src/pages/spine-framework/APIPage.tsx +33 -0
- package/.framework/src/pages/spine-framework/CLIPage.tsx +33 -0
- package/.framework/src/types/auth.ts +128 -71
- package/.framework/src/types/types.ts +373 -157
- package/custom/.devin/skills/spine-workbench-discovery/SKILL.md +39 -0
- package/custom/.devin/skills/spine-workbench-idea/SKILL.md +36 -0
- package/custom/.devin/skills/spine-workbench-implement/SKILL.md +46 -0
- package/custom/.devin/skills/spine-workbench-initiative/SKILL.md +28 -0
- package/custom/.devin/skills/spine-workbench-plan/SKILL.md +38 -0
- package/docs/README.md +9 -130
- package/netlify.toml +5 -2
- package/package.json +13 -25
- package/scripts/kb-ingest-docs.ts +203 -0
- package/spine.config.json +65 -4
- package/.framework/migrations/001_schema.sql +0 -425
- package/.framework/migrations/002_rls_and_functions.sql +0 -763
- package/.framework/migrations/004_enhancements.sql +0 -43
- package/.framework/migrations/005_auth_user_trigger.sql +0 -105
- package/.framework/migrations/006_fix_current_actor_id.sql +0 -21
- package/.framework/migrations/016_invites.sql +0 -27
- package/.framework/migrations/017_fix_get_account_apps.sql +0 -78
- package/.framework/migrations/018_apps_required_roles.sql +0 -17
- package/.framework/migrations/019_triggers_unique_constraint.sql +0 -13
- package/.framework/migrations/020_get_account_apps_role_filter.sql +0 -117
- package/.framework/migrations/021_app_domains.sql +0 -112
- package/.framework/migrations/022_route_prefix_domain_unique.sql +0 -21
- package/.framework/migrations/023_match_embeddings_rpc.sql +0 -78
- package/.framework/migrations/024_messages_account_id.sql +0 -9
- package/.framework/migrations/025_retype_threads_messages.sql +0 -240
- package/.framework/migrations/026_fix_rls_policies.sql +0 -47
- package/.framework/migrations/027_embedding_lifecycle.sql +0 -176
- package/.framework/migrations/028_fix_message_data_permissions.sql +0 -49
- package/.framework/migrations/029_tighten_support_triage_prompt.sql +0 -41
- package/.framework/migrations/030_messages_updated_by.sql +0 -6
- package/.framework/migrations/031_seed_upsert_constraints.sql +0 -35
- package/docs/APPS.md +0 -232
- package/docs/ARCHITECTURE.md +0 -246
- package/docs/INSTALL.md +0 -155
- package/docs/design-schema-spec.md +0 -1837
- package/docs/dev-guides/01-create-an-app.md +0 -183
- package/docs/dev-guides/02-create-a-function.md +0 -178
- package/docs/dev-guides/03-create-a-component.md +0 -178
- package/docs/dev-guides/04-webhook-handlers.md +0 -129
- package/docs/dev-guides/05-testing.md +0 -168
- package/docs/dev-guides/README.md +0 -40
- package/docs/npm-packages-plan.md +0 -288
- package/docs/spine-core--api-reference.md +0 -822
|
@@ -1,59 +1,55 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @module integrations
|
|
3
|
-
* @audience core-contributor
|
|
4
|
-
* @layer api-handler
|
|
5
|
-
* @stability stable
|
|
6
|
-
*
|
|
7
|
-
* CRUD API for the `integrations` table. Integration records describe
|
|
8
|
-
* third-party service connections (API credentials, provider, version,
|
|
9
|
-
* configuration). Each integration is scoped to an account and optionally
|
|
10
|
-
* to an app. `is_configured` tracks whether credentials have been set.
|
|
11
|
-
*
|
|
12
|
-
* **Routed by:** `GET/POST/PATCH/DELETE /.netlify/functions/integrations`
|
|
13
|
-
*
|
|
14
|
-
* **Standard CRUD — routes directly by HTTP method (no ?action switch):**
|
|
15
|
-
* | method | condition | handler |
|
|
16
|
-
* |--------|-----------|---------|
|
|
17
|
-
* | GET | ?id | get |
|
|
18
|
-
* | GET | (default) | list |
|
|
19
|
-
* | POST | — | create |
|
|
20
|
-
* | PATCH | — | update |
|
|
21
|
-
* | DELETE | — | remove (soft) |
|
|
22
|
-
*
|
|
23
|
-
* **Authorization:** All operations use `ctx.db` (RLS-scoped). Authenticated
|
|
24
|
-
* principal required for writes.
|
|
25
|
-
*
|
|
26
|
-
* INVARIANT: `remove` is a soft delete (sets `is_active = false`). Hard deletes
|
|
27
|
-
* are not supported to preserve audit trails on integration-linked data.
|
|
28
|
-
* INVARIANT: `update` only patches the explicit allowlist of fields.
|
|
29
|
-
*
|
|
30
|
-
* @seeAlso api-keys.ts (api_keys belong to integrations)
|
|
31
|
-
* @seeAlso trigger-engine.ts (integration webhooks trigger pipelines)
|
|
32
|
-
* @seeAlso audit.ts (emitLog for integration.* events)
|
|
33
|
-
*/
|
|
34
1
|
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
// CIL[BEGIN chunk_id="integrations_moduleheader_1783968140" type="module_header" identity="imports" parent="none"]
|
|
8
|
+
// CIL[DOC-MACRO purpose="Import dependencies for integration CRUD API"]
|
|
9
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Import handler utilities and database access"]
|
|
10
|
+
// CIL[DOC-CONTEXT module="integrations" layer="api-handler" related_files="[\".framework/src/pages/admin/IntegrationsPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/functions/_shared/schema-utils.ts\",\"\\\"]"]
|
|
11
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Imported modules" errors="Import failures" side_effects="none"]
|
|
12
|
+
// CIL[DOC-MICRO logic_summary="Imports createHandler, joins, emitLog, sanitizeRecordData" notable_decisions="[]"]
|
|
13
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
14
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
15
|
+
// CIL[DOC-AUDIENCE audience="developer"]
|
|
16
|
+
// CIL[DOC-VECTOR type="context" content="Layer: api-handler. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/IntegrationsPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/functions/_shared/principal.ts, .framework/functions/_shared/schema-utils.ts, \."]
|
|
17
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
18
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
19
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
20
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
21
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
35
22
|
import { createHandler } from './_shared/middleware'
|
|
36
23
|
import { joins } from './_shared/db'
|
|
37
24
|
import { emitLog } from './_shared/audit'
|
|
38
25
|
import { sanitizeRecordData } from './_shared/permissions'
|
|
39
26
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
27
|
+
function deriveSlug(name: string, slug?: string): string {
|
|
28
|
+
return slug || name.toLowerCase().replace(/\s+/g, '-').replace(/[^a-z0-9-]/g, '')
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function computeIsConfigured(credentials: Record<string, any> | undefined): boolean {
|
|
32
|
+
if (!credentials || Object.keys(credentials).length === 0) return false
|
|
33
|
+
return Object.values(credentials).every((entry: any) => {
|
|
34
|
+
if (!entry || !entry.source) return false
|
|
35
|
+
return typeof entry.value === 'string' && entry.value.length > 0
|
|
36
|
+
})
|
|
37
|
+
}
|
|
38
|
+
// CIL[END chunk_id="integrations_moduleheader_1783968140"]
|
|
39
|
+
// CIL[BEGIN chunk_id="integrations_list_1783968140" type="function" identity="list" parent="none"]
|
|
40
|
+
// CIL[DOC-MACRO purpose="List integrations with filtering and permission sanitization"]
|
|
41
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Query and return sanitized integration records"]
|
|
42
|
+
// CIL[DOC-CONTEXT module="integrations" layer="api-handler" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\".framework/functions/_shared/principal.ts\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/components/ui/dialog.tsx\",\"\\\"]"]
|
|
43
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Array of sanitized integration records" errors="Account context required, DB errors" side_effects="DB read operations"]
|
|
44
|
+
// CIL[DOC-MICRO logic_summary="Builds filtered query with joins, sanitizes each result before returning" notable_decisions="[]"]
|
|
45
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
46
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
47
|
+
// CIL[DOC-VECTOR type="context" content="Layer: api-handler. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, .framework/src/pages/admin/IntegrationsPage.tsx, .framework/functions/_shared/principal.ts, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/components/ui/dialog.tsx, \."]
|
|
48
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
49
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
50
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
51
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
52
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
57
53
|
export const list = createHandler(async (ctx, _body) => {
|
|
58
54
|
const { integration_type, provider, is_active, is_configured, limit = 100, offset = 0 } = ctx.query || {}
|
|
59
55
|
|
|
@@ -93,23 +89,21 @@ export const list = createHandler(async (ctx, _body) => {
|
|
|
93
89
|
|
|
94
90
|
return sanitized
|
|
95
91
|
})
|
|
96
|
-
//
|
|
97
|
-
|
|
98
|
-
//
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
* @tags integrations, get, crud, single-record
|
|
112
|
-
*/
|
|
92
|
+
// CIL[END chunk_id="integrations_list_1783968140"]
|
|
93
|
+
// CIL[BEGIN chunk_id="integrations_get_1783968140" type="function" identity="get" parent="none"]
|
|
94
|
+
// CIL[DOC-MACRO purpose="Get single integration record with joins and sanitization"]
|
|
95
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Retrieve and sanitize individual integration"]
|
|
96
|
+
// CIL[DOC-CONTEXT module="integrations" layer="api-handler" related_files="[\".framework/src/pages/admin/IntegrationsPage.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"\\\"]"]
|
|
97
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Sanitized integration record" errors="Integration ID required, not found, DB errors" side_effects="DB read operation"]
|
|
98
|
+
// CIL[DOC-MICRO logic_summary="Queries by ID with joins, sanitizes result before returning" notable_decisions="[]"]
|
|
99
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
100
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
101
|
+
// CIL[DOC-VECTOR type="context" content="Layer: api-handler. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/IntegrationsPage.tsx, custom/apps/portal/pages/ContentPage.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/src/pages/admin/RolesPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, \."]
|
|
102
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
103
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
104
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
105
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
106
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
113
107
|
export const get = createHandler(async (ctx, _body) => {
|
|
114
108
|
const { id } = ctx.query || {}
|
|
115
109
|
|
|
@@ -127,23 +121,21 @@ export const get = createHandler(async (ctx, _body) => {
|
|
|
127
121
|
|
|
128
122
|
return await sanitizeRecordData(ctx, data, 'integration')
|
|
129
123
|
})
|
|
130
|
-
//
|
|
131
|
-
|
|
132
|
-
//
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
* @tags integrations, create, crud, audit
|
|
146
|
-
*/
|
|
124
|
+
// CIL[END chunk_id="integrations_get_1783968140"]
|
|
125
|
+
// CIL[BEGIN chunk_id="integrations_create_1783968140" type="function" identity="create" parent="none"]
|
|
126
|
+
// CIL[DOC-MACRO purpose="Create new integration record with validation and audit logging"]
|
|
127
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Insert new integration with proper metadata"]
|
|
128
|
+
// CIL[DOC-CONTEXT module="integrations" layer="api-handler" related_files="[\".framework/src/pages/admin/IntegrationsPage.tsx\",\".framework/functions/_shared/schema-utils.ts\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/components/ui/dialog.tsx\",\"\\\"]"]
|
|
129
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Created integration record" errors="Required fields missing, auth required, DB errors" side_effects="DB insert, audit logging"]
|
|
130
|
+
// CIL[DOC-MICRO logic_summary="Validates required fields, creates integration record, logs creation" notable_decisions="[]"]
|
|
131
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
132
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
133
|
+
// CIL[DOC-VECTOR type="context" content="Layer: api-handler. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/IntegrationsPage.tsx, .framework/functions/_shared/schema-utils.ts, .framework/src/pages/admin/TypeDetailPage.tsx, custom/apps/portal/pages/ContentPage.tsx, .framework/src/components/ui/dialog.tsx, \."]
|
|
134
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
135
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
136
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
137
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
138
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
147
139
|
export const create = createHandler(async (ctx, body) => {
|
|
148
140
|
const { app_id, name, description, integration_type, provider, version, config, credentials, metadata } = body
|
|
149
141
|
|
|
@@ -155,19 +147,23 @@ export const create = createHandler(async (ctx, body) => {
|
|
|
155
147
|
throw new Error('User context (person and account) required')
|
|
156
148
|
}
|
|
157
149
|
|
|
150
|
+
const safeCredentials = credentials || {}
|
|
151
|
+
|
|
158
152
|
const { data, error: err } = await ctx.db
|
|
159
153
|
.from('integrations')
|
|
160
154
|
.insert({
|
|
161
155
|
app_id: app_id || null,
|
|
162
156
|
account_id: ctx.accountId,
|
|
157
|
+
slug: deriveSlug(name, body.slug),
|
|
163
158
|
name,
|
|
164
159
|
description: description || null,
|
|
165
160
|
integration_type,
|
|
166
161
|
provider,
|
|
167
162
|
version: version || '1.0.0',
|
|
168
163
|
config: config || {},
|
|
169
|
-
credentials:
|
|
164
|
+
credentials: safeCredentials,
|
|
170
165
|
metadata: metadata || {},
|
|
166
|
+
is_configured: computeIsConfigured(safeCredentials),
|
|
171
167
|
created_by: ctx.principal.id
|
|
172
168
|
})
|
|
173
169
|
.select()
|
|
@@ -182,23 +178,21 @@ export const create = createHandler(async (ctx, body) => {
|
|
|
182
178
|
|
|
183
179
|
return data
|
|
184
180
|
})
|
|
185
|
-
//
|
|
186
|
-
|
|
187
|
-
//
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
* @tags integrations, update, crud, audit
|
|
201
|
-
*/
|
|
181
|
+
// CIL[END chunk_id="integrations_create_1783968140"]
|
|
182
|
+
// CIL[BEGIN chunk_id="integrations_update_1783968140" type="function" identity="update" parent="none"]
|
|
183
|
+
// CIL[DOC-MACRO purpose="Update integration with field allowlist and audit logging"]
|
|
184
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Modify integration records safely"]
|
|
185
|
+
// CIL[DOC-CONTEXT module="integrations" layer="api-handler" related_files="[\".framework/src/pages/admin/IntegrationsPage.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/functions/_shared/schema-utils.ts\",\".framework/functions/_shared/db.ts\"]"]
|
|
186
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Updated integration record" errors="Integration ID required, DB errors" side_effects="DB update, audit logging"]
|
|
187
|
+
// CIL[DOC-MICRO logic_summary="Updates only allowed fields, logs changes, returns updated record" notable_decisions="[]"]
|
|
188
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
189
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
190
|
+
// CIL[DOC-VECTOR type="context" content="Layer: api-handler. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/IntegrationsPage.tsx, custom/apps/portal/pages/ContentPage.tsx, .framework/functions/_shared/schema-utils.ts, .framework/functions/_shared/db.ts."]
|
|
191
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
192
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
193
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
194
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
195
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
202
196
|
export const update = createHandler(async (ctx, body) => {
|
|
203
197
|
const id = body?.id || ctx.query?.id
|
|
204
198
|
const { id: _bodyId, ...updates } = body || {}
|
|
@@ -207,12 +201,16 @@ export const update = createHandler(async (ctx, body) => {
|
|
|
207
201
|
throw new Error('Integration ID is required')
|
|
208
202
|
}
|
|
209
203
|
|
|
210
|
-
const allowed = ['name', 'description', 'integration_type', 'provider', 'version', 'config', 'credentials', 'metadata', 'is_active'
|
|
204
|
+
const allowed = ['name', 'slug', 'description', 'integration_type', 'provider', 'version', 'config', 'credentials', 'metadata', 'is_active']
|
|
211
205
|
const updateData: Record<string, any> = { updated_at: new Date().toISOString() }
|
|
212
206
|
for (const key of allowed) {
|
|
213
207
|
if (updates[key] !== undefined) updateData[key] = updates[key]
|
|
214
208
|
}
|
|
215
209
|
|
|
210
|
+
if (updateData.credentials !== undefined) {
|
|
211
|
+
updateData.is_configured = computeIsConfigured(updateData.credentials)
|
|
212
|
+
}
|
|
213
|
+
|
|
216
214
|
const { data, error: err } = await ctx.db
|
|
217
215
|
.from('integrations')
|
|
218
216
|
.update(updateData)
|
|
@@ -229,23 +227,21 @@ export const update = createHandler(async (ctx, body) => {
|
|
|
229
227
|
|
|
230
228
|
return data
|
|
231
229
|
})
|
|
232
|
-
//
|
|
233
|
-
|
|
234
|
-
//
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
* @tags integrations, remove, crud, audit
|
|
248
|
-
*/
|
|
230
|
+
// CIL[END chunk_id="integrations_update_1783968140"]
|
|
231
|
+
// CIL[BEGIN chunk_id="integrations_remove_1783968140" type="function" identity="remove" parent="none"]
|
|
232
|
+
// CIL[DOC-MACRO purpose="Soft-delete integration by setting is_active to false"]
|
|
233
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Deactivate integration records while preserving audit trail"]
|
|
234
|
+
// CIL[DOC-CONTEXT module="integrations" layer="api-handler" related_files="[]"]
|
|
235
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Updated integration record" errors="Integration ID required, not found, DB errors" side_effects="DB soft delete, audit logging"]
|
|
236
|
+
// CIL[DOC-MICRO logic_summary="Sets is_active false, logs deletion, preserves record for audit" notable_decisions="[]"]
|
|
237
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
238
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
239
|
+
// CIL[DOC-VECTOR type="context" content="Layer: api-handler. Direct callers: 0. Direct calls: 0. Related files: none."]
|
|
240
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
241
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
242
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
243
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
244
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
249
245
|
export const remove = createHandler(async (ctx, _body) => {
|
|
250
246
|
const id = ctx.query?.id
|
|
251
247
|
|
|
@@ -277,25 +273,21 @@ export const remove = createHandler(async (ctx, _body) => {
|
|
|
277
273
|
|
|
278
274
|
return data
|
|
279
275
|
})
|
|
280
|
-
//
|
|
281
|
-
|
|
282
|
-
//
|
|
283
|
-
|
|
284
|
-
//
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
* @depended-by [Netlify function routing]
|
|
296
|
-
* @side-effects [Delegates to appropriate handler]
|
|
297
|
-
* @tags integrations, router, crud, netlify-function
|
|
298
|
-
*/
|
|
276
|
+
// CIL[END chunk_id="integrations_remove_1783968140"]
|
|
277
|
+
// CIL[BEGIN chunk_id="integrations_handler_1783968140" type="function" identity="handler" parent="none"]
|
|
278
|
+
// CIL[DOC-MACRO purpose="Route HTTP methods to appropriate integration handlers"]
|
|
279
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Dispatch CRUD requests to correct handler functions"]
|
|
280
|
+
// CIL[DOC-CONTEXT module="integrations" layer="api-handler" related_files="[]"]
|
|
281
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Varies by method" errors="Unsupported method" side_effects="Delegates to handlers"]
|
|
282
|
+
// CIL[DOC-MICRO logic_summary="Switch statement routes GET/POST/PATCH/DELETE to appropriate handlers" notable_decisions="[]"]
|
|
283
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
284
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
285
|
+
// CIL[DOC-VECTOR type="context" content="Layer: api-handler. Direct callers: 0. Direct calls: 0. Related files: none."]
|
|
286
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
287
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
288
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
289
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
290
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
299
291
|
export const handler = createHandler(async (ctx, body) => {
|
|
300
292
|
const method = ctx.query?.method || 'GET'
|
|
301
293
|
|
|
@@ -316,4 +308,4 @@ export const handler = createHandler(async (ctx, body) => {
|
|
|
316
308
|
throw new Error(`Unsupported method: ${method}`)
|
|
317
309
|
}
|
|
318
310
|
})
|
|
319
|
-
//
|
|
311
|
+
// CIL[END chunk_id="integrations_handler_1783968140"]
|