spine-framework 0.4.3 → 0.5.0-rc.4
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/.env.example +13 -3
- package/.framework/cli/commands/bootstrap.ts +392 -0
- package/.framework/cli/commands/dev.ts +91 -218
- package/.framework/cli/commands/doctor.ts +132 -26
- package/.framework/cli/commands/generate.ts +38 -298
- package/.framework/cli/commands/init.ts +20 -1
- package/.framework/cli/commands/migrate.ts +36 -30
- package/.framework/cli/commands/migrations.ts +16 -56
- package/.framework/cli/commands/upgrade.ts +35 -0
- package/.framework/cli/commands/validate-schema.ts +147 -0
- package/.framework/cli/context.ts +223 -110
- package/.framework/cli/index.ts +6 -0
- package/.framework/cli/lib/project-files.ts +241 -1
- package/.framework/functions/_shared/agent-runner.ts +1000 -81
- package/.framework/functions/_shared/cil.ts +2 -1
- package/.framework/functions/_shared/db.ts +3 -6
- package/.framework/functions/_shared/hash-api-key.ts +183 -79
- package/.framework/functions/_shared/kb.ts +61 -7
- package/.framework/functions/_shared/logging.ts +562 -224
- package/.framework/functions/_shared/message-sequence.ts +53 -0
- package/.framework/functions/_shared/middleware.ts +47 -44
- package/.framework/functions/_shared/pipeline-runner.ts +150 -37
- package/.framework/functions/_shared/principal.ts +9 -6
- package/.framework/functions/_shared/trigger-engine.ts +149 -40
- package/.framework/functions/admin-data.ts +48 -31
- package/.framework/functions/ai-agents.ts +103 -33
- package/.framework/functions/api-keys.ts +301 -122
- package/.framework/functions/apps.ts +43 -26
- package/.framework/functions/cil-ingest.ts +48 -15
- package/.framework/functions/debug-auth.ts +14 -8
- package/.framework/functions/deliveries.ts +39 -12
- package/.framework/functions/embeddings.ts +145 -76
- package/.framework/functions/integration-outbound.ts +67 -27
- package/.framework/functions/integrations.ts +254 -127
- package/.framework/functions/logs.ts +273 -133
- package/.framework/functions/observability.ts +277 -147
- package/.framework/functions/pipeline-executions.ts +1 -1
- package/.framework/functions/pipeline-runner-background.ts +120 -0
- package/.framework/functions/pipelines.ts +14 -9
- package/.framework/functions/prompt-configs.ts +7 -4
- package/.framework/functions/roles.ts +8 -5
- package/.framework/functions/security.ts +30 -17
- package/.framework/functions/system-cron.ts +250 -128
- package/.framework/functions/tests.ts +7 -6
- package/.framework/functions/timers.ts +310 -107
- package/.framework/functions/trigger-scheduler.ts +65 -5
- package/.framework/functions/triggers.ts +28 -13
- package/.framework/functions/types.ts +13 -10
- package/.framework/migrations/064_episode_leases.sql +196 -0
- package/.framework/migrations/065_execution_tables_updated_at.sql +20 -0
- package/.framework/migrations/066_episode_steal_thread_merge.sql +148 -0
- package/.framework/migrations/067_episode_lease_stale_steal.sql +93 -0
- package/.framework/migrations/068_cron_schedule_timer_rpcs.sql +251 -0
- package/.framework/migrations/069_log_stats_window.sql +54 -0
- package/.framework/migrations/070_app_type_schema_rpcs.sql +166 -0
- package/.framework/migrations/071_timer_interval_keys.sql +96 -0
- package/.framework/migrations/072_slug_autofill.sql +77 -0
- package/.framework/migrations/073_seed_member_roles.sql +26 -0
- package/.framework/schemas/spine.config.schema.json +62 -0
- package/.framework/src/App.tsx +3 -1
- package/.framework/src/apps/admin/index.tsx +1141 -775
- package/.framework/src/components/ErrorBoundary.tsx +136 -0
- package/.framework/src/components/admin/AdminListPage.tsx +81 -73
- package/.framework/src/components/admin/AdminSidebar.tsx +92 -81
- package/.framework/src/components/admin/EntitySelect.tsx +181 -0
- package/.framework/src/components/admin/PageInstructions.tsx +86 -127
- package/.framework/src/components/app-shell/GenericAppShell.tsx +3 -1
- package/.framework/src/components/app-shell/GenericDetailPage.tsx +37 -13
- package/.framework/src/components/app-shell/GenericListPage.tsx +28 -32
- package/.framework/src/components/auth/TurnstileWidget.tsx +9 -6
- package/.framework/src/components/kb/KBArticleEditor.tsx +49 -6
- package/.framework/src/components/layout/Layout.tsx +4 -2
- package/.framework/src/components/layout/Sidebar.tsx +304 -179
- package/.framework/src/components/runtime/DataDetailPage.tsx +67 -35
- package/.framework/src/components/runtime/DataHeader.tsx +96 -48
- package/.framework/src/components/runtime/DataListPage.tsx +3 -26
- package/.framework/src/components/runtime/DataStats.tsx +10 -10
- package/.framework/src/components/runtime/DataTable.tsx +12 -10
- package/.framework/src/components/ui/sheet.tsx +24 -26
- package/.framework/src/components/ui/textarea.tsx +74 -48
- package/.framework/src/hooks/useBranding.ts +47 -0
- package/.framework/src/hooks/useEntityList.ts +12 -9
- package/.framework/src/hooks/useListSchema.ts +108 -58
- package/.framework/src/instructions/README.md +57 -0
- package/.framework/src/instructions/ai-agents.md +69 -0
- package/.framework/src/instructions/alerts.md +80 -0
- package/.framework/src/instructions/api-keys.md +87 -0
- package/.framework/src/instructions/apps.md +77 -0
- package/.framework/src/instructions/concepts/ai-and-prompts.md +150 -0
- package/.framework/src/instructions/concepts/apps-and-renderers.md +162 -0
- package/.framework/src/instructions/concepts/auth-and-api-keys.md +133 -0
- package/.framework/src/instructions/concepts/automation.md +186 -0
- package/.framework/src/instructions/concepts/concurrency-and-idempotency.md +125 -0
- package/.framework/src/instructions/concepts/core-vs-custom.md +124 -0
- package/.framework/src/instructions/concepts/design-schema.md +152 -0
- package/.framework/src/instructions/concepts/integrations-and-webhooks.md +127 -0
- package/.framework/src/instructions/concepts/observability.md +116 -0
- package/.framework/src/instructions/concepts/permissions.md +150 -0
- package/.framework/src/instructions/concepts/runtime-records.md +111 -0
- package/.framework/src/instructions/concepts/scope-and-accounts.md +112 -0
- package/.framework/src/instructions/concepts/spine-way.md +172 -0
- package/.framework/src/instructions/deliveries.md +59 -0
- package/.framework/src/instructions/guide/00-orientation.md +106 -0
- package/.framework/src/instructions/guide/01-install-and-first-run.md +253 -0
- package/.framework/src/instructions/guide/02-project-map.md +147 -0
- package/.framework/src/instructions/guide/03-domain-model.md +223 -0
- package/.framework/src/instructions/guide/04-first-app.md +227 -0
- package/.framework/src/instructions/guide/05-glossary.md +183 -0
- package/.framework/src/instructions/integrations.md +96 -0
- package/.framework/src/instructions/internal/cil-markers.md +83 -0
- package/.framework/src/instructions/invites.md +60 -0
- package/.framework/src/instructions/kb.md +80 -0
- package/.framework/src/instructions/logs.md +77 -0
- package/.framework/src/instructions/observability.md +61 -0
- package/.framework/src/instructions/operations/deployment.md +115 -0
- package/.framework/src/instructions/operations/migrations.md +125 -0
- package/.framework/src/instructions/operations/security-checklist.md +148 -0
- package/.framework/src/instructions/operations/troubleshooting.md +170 -0
- package/.framework/src/instructions/operations/upgrade.md +116 -0
- package/.framework/src/instructions/pipeline-executions.md +62 -0
- package/.framework/src/instructions/pipelines.md +78 -0
- package/.framework/src/instructions/prompts.md +95 -0
- package/.framework/src/instructions/reference/api/admin-data.md +162 -0
- package/.framework/src/instructions/reference/api/auth.md +113 -0
- package/.framework/src/instructions/reference/api/errors-and-envelopes.md +113 -0
- package/.framework/src/instructions/reference/app-manifest.md +150 -0
- package/.framework/src/instructions/reference/cli.md +124 -0
- package/.framework/src/instructions/reference/database.md +132 -0
- package/.framework/src/instructions/reference/design-schema.md +280 -0
- package/.framework/src/instructions/reference/env-vars.md +133 -0
- package/.framework/src/instructions/reference/functions/account-nodes.md +75 -0
- package/.framework/src/instructions/reference/functions/admin-data.md +195 -0
- package/.framework/src/instructions/reference/functions/admin-funnel.md +90 -0
- package/.framework/src/instructions/reference/functions/admin-install-funnel.md +107 -0
- package/.framework/src/instructions/reference/functions/admin-signals.md +102 -0
- package/.framework/src/instructions/reference/functions/ai-agents.md +148 -0
- package/.framework/src/instructions/reference/functions/ai-interactions.md +156 -0
- package/.framework/src/instructions/reference/functions/api-keys.md +130 -0
- package/.framework/src/instructions/reference/functions/apps.md +140 -0
- package/.framework/src/instructions/reference/functions/auth.md +99 -0
- package/.framework/src/instructions/reference/functions/debug-auth.md +91 -0
- package/.framework/src/instructions/reference/functions/deliveries.md +110 -0
- package/.framework/src/instructions/reference/functions/embeddings.md +166 -0
- package/.framework/src/instructions/reference/functions/eval-harness.md +149 -0
- package/.framework/src/instructions/reference/functions/index.md +103 -0
- package/.framework/src/instructions/reference/functions/integration-outbound.md +200 -0
- package/.framework/src/instructions/reference/functions/integration-routes.md +151 -0
- package/.framework/src/instructions/reference/functions/integrations.md +130 -0
- package/.framework/src/instructions/reference/functions/invites.md +182 -0
- package/.framework/src/instructions/reference/functions/item-progress.md +107 -0
- package/.framework/src/instructions/reference/functions/kb.md +166 -0
- package/.framework/src/instructions/reference/functions/logs.md +141 -0
- package/.framework/src/instructions/reference/functions/observability.md +105 -0
- package/.framework/src/instructions/reference/functions/pipeline-executions.md +132 -0
- package/.framework/src/instructions/reference/functions/pipeline-runner-background.md +121 -0
- package/.framework/src/instructions/reference/functions/pipelines.md +136 -0
- package/.framework/src/instructions/reference/functions/prompt-configs.md +121 -0
- package/.framework/src/instructions/reference/functions/roles.md +121 -0
- package/.framework/src/instructions/reference/functions/security.md +140 -0
- package/.framework/src/instructions/reference/functions/system-cron.md +136 -0
- package/.framework/src/instructions/reference/functions/system.md +106 -0
- package/.framework/src/instructions/reference/functions/tests.md +97 -0
- package/.framework/src/instructions/reference/functions/timers.md +117 -0
- package/.framework/src/instructions/reference/functions/trigger-scheduler.md +102 -0
- package/.framework/src/instructions/reference/functions/triggers.md +140 -0
- package/.framework/src/instructions/reference/functions/types.md +146 -0
- package/.framework/src/instructions/reference/seeds.md +126 -0
- package/.framework/src/instructions/reference/shared-modules.md +127 -0
- package/.framework/src/instructions/reference/spine-config.md +114 -0
- package/.framework/src/instructions/roles.md +80 -0
- package/.framework/src/instructions/runtime-detail.md +70 -0
- package/.framework/src/instructions/runtime-list.md +77 -0
- package/.framework/src/instructions/security.md +67 -0
- package/.framework/src/instructions/tasks/add-a-pipeline.md +110 -0
- package/.framework/src/instructions/tasks/add-a-role.md +96 -0
- package/.framework/src/instructions/tasks/add-a-timer.md +114 -0
- package/.framework/src/instructions/tasks/add-a-trigger.md +106 -0
- package/.framework/src/instructions/tasks/add-a-type.md +151 -0
- package/.framework/src/instructions/tasks/add-a-webhook.md +108 -0
- package/.framework/src/instructions/tasks/add-an-ai-agent.md +108 -0
- package/.framework/src/instructions/tasks/add-an-integration.md +124 -0
- package/.framework/src/instructions/tasks/build-a-custom-page.md +118 -0
- package/.framework/src/instructions/tasks/package-and-install-an-app.md +127 -0
- package/.framework/src/instructions/tasks/test-your-code.md +108 -0
- package/.framework/src/instructions/tasks/write-a-function.md +132 -0
- package/.framework/src/instructions/tasks/write-a-migration.md +110 -0
- package/.framework/src/instructions/testing.md +59 -0
- package/.framework/src/instructions/timers.md +82 -0
- package/.framework/src/instructions/triggers.md +69 -0
- package/.framework/src/instructions/types.md +93 -0
- package/.framework/src/lib/branding.ts +128 -0
- package/.framework/src/pages/NoAppPage.tsx +3 -1
- package/.framework/src/pages/NotFoundPage.tsx +62 -31
- package/.framework/src/pages/SetupPage.tsx +5 -2
- package/.framework/src/pages/admin/AIAgentDetailPage.tsx +117 -106
- package/.framework/src/pages/admin/AIAgentsPage.tsx +86 -48
- package/.framework/src/pages/admin/APIKeyDetailPage.tsx +153 -152
- package/.framework/src/pages/admin/APIKeysPage.tsx +91 -90
- package/.framework/src/pages/admin/AlertsConfigPage.tsx +29 -18
- package/.framework/src/pages/admin/AppDetailPage.tsx +6 -60
- package/.framework/src/pages/admin/AppsPage.tsx +104 -66
- package/.framework/src/pages/admin/DeliveriesPage.tsx +5 -5
- package/.framework/src/pages/admin/EmbeddingDetailPage.tsx +5 -23
- package/.framework/src/pages/admin/EmbeddingsPage.tsx +5 -26
- package/.framework/src/pages/admin/IntegrationDetailPage.tsx +7 -7
- package/.framework/src/pages/admin/IntegrationsPage.tsx +85 -43
- package/.framework/src/pages/admin/LogsPage.tsx +144 -76
- package/.framework/src/pages/admin/ObservabilityDashboard.tsx +223 -140
- package/.framework/src/pages/admin/PipelineDetailPage.tsx +134 -113
- package/.framework/src/pages/admin/PipelineExecutionsPage.tsx +108 -45
- package/.framework/src/pages/admin/PipelinesPage.tsx +160 -115
- package/.framework/src/pages/admin/PromptConfigDetailPage.tsx +96 -98
- package/.framework/src/pages/admin/PromptConfigsPage.tsx +101 -59
- package/.framework/src/pages/admin/RoleDetailPage.tsx +90 -79
- package/.framework/src/pages/admin/RolesPage.tsx +86 -43
- package/.framework/src/pages/admin/SecurityPage.tsx +1 -1
- package/.framework/src/pages/admin/TestingDashboard.tsx +16 -28
- package/.framework/src/pages/admin/TimerDetailPage.tsx +117 -100
- package/.framework/src/pages/admin/TimersPage.tsx +90 -62
- package/.framework/src/pages/admin/TriggerDetailPage.tsx +90 -83
- package/.framework/src/pages/admin/TriggersPage.tsx +124 -99
- package/.framework/src/pages/admin/TypeDetailPage.tsx +152 -138
- package/.framework/src/pages/admin/TypesPage.tsx +90 -48
- package/.framework/src/pages/admin/cil/CILAgentPage.tsx +17 -25
- package/.framework/src/pages/admin/cil/CILChunkDetailPage.tsx +17 -27
- package/.framework/src/pages/admin/cil/CILDashboardPage.tsx +72 -40
- package/.framework/src/pages/admin/cil/CILFileListPage.tsx +321 -129
- package/.framework/src/pages/admin/cil/CILFileSelectPage.tsx +18 -29
- package/.framework/src/pages/admin/cil/CILGraphPage.tsx +26 -38
- package/.framework/src/pages/admin/cil/CILIngestionPage.tsx +34 -46
- package/.framework/src/pages/admin/cil/CILProjectsPage.tsx +189 -103
- package/.framework/src/pages/admin/cil/CILSearchPage.tsx +246 -136
- package/.framework/src/pages/admin/cil/CILSuggestionsPage.tsx +11 -22
- package/.framework/src/pages/admin/cil/CILVersionsPage.tsx +9 -20
- package/.framework/src/pages/admin/cil/FlexiblePipelinePage.tsx +26 -38
- package/.framework/src/pages/admin/kb/KBAdminPage.tsx +7 -26
- package/.framework/src/pages/auth/AuthConfirmPage.tsx +3 -1
- package/.framework/src/pages/auth/ForgotPasswordPage.tsx +3 -1
- package/.framework/src/pages/auth/LoginPage.tsx +4 -2
- package/.framework/src/pages/auth/RegisterPage.tsx +3 -1
- package/.framework/templates/agent/AGENTS.md +150 -0
- package/.framework/templates/agent/skills/spine-add-ai-agent/SKILL.md +58 -0
- package/.framework/templates/agent/skills/spine-add-automation/SKILL.md +62 -0
- package/.framework/templates/agent/skills/spine-add-integration/SKILL.md +63 -0
- package/.framework/templates/agent/skills/spine-architect/SKILL.md +86 -0
- package/.framework/templates/agent/skills/spine-install-app/SKILL.md +72 -0
- package/.framework/templates/agent/skills/spine-migration/SKILL.md +75 -0
- package/.framework/templates/agent/skills/spine-new-app/SKILL.md +67 -0
- package/.framework/templates/agent/skills/spine-new-function/SKILL.md +65 -0
- package/.framework/templates/agent/skills/spine-new-type/SKILL.md +65 -0
- package/.framework/templates/agent/skills/spine-schema/SKILL.md +77 -0
- package/.framework/templates/agent/skills/spine-test/SKILL.md +67 -0
- package/.framework/templates/agent/skills/spine-troubleshoot/SKILL.md +74 -0
- package/.framework/templates/agent/skills/spine-upgrade/SKILL.md +69 -0
- package/.framework/templates/project.json +5 -1
- package/.framework/tests/unit/account-scoping-gates.test.ts +392 -0
- package/.framework/tests/unit/agent-files.test.ts +355 -0
- package/.framework/tests/unit/agent-runner.test.ts +496 -47
- package/.framework/tests/unit/api-keys-create-scope-gate.test.ts +160 -0
- package/.framework/tests/unit/api-keys-omit-secret-fields.test.ts +38 -0
- package/.framework/tests/unit/bootstrap.test.ts +242 -0
- package/.framework/tests/unit/cli-context-api-key.test.ts +114 -0
- package/.framework/tests/unit/debug-auth.test.ts +38 -0
- package/.framework/tests/unit/deliveries-account-scoping.test.ts +185 -0
- package/.framework/tests/unit/episode-lease.test.ts +695 -0
- package/.framework/tests/unit/integration-outbound-credentials.test.ts +167 -0
- package/.framework/tests/unit/integrations-audit-redaction.test.ts +130 -0
- package/.framework/tests/unit/kb-ingest-lease.test.ts +19 -0
- package/.framework/tests/unit/logging-app-id.test.ts +75 -0
- package/.framework/tests/unit/pipeline-runner-background.test.ts +120 -0
- package/.framework/tests/unit/pipeline-runner.test.ts +153 -1
- package/.framework/tests/unit/principal-cache.test.ts +15 -0
- package/.framework/tests/unit/system-context-denial.test.ts +145 -0
- package/.framework/tests/unit/system-cron.test.ts +240 -0
- package/.framework/tests/unit/timers.test.ts +159 -0
- package/.framework/tests/unit/trigger-engine.test.ts +278 -91
- package/.framework/tests/unit/trigger-scheduler.test.ts +78 -0
- package/README.md +125 -166
- package/config/tsconfig.cli.json +2 -2
- package/netlify.toml +5 -0
- package/package.json +15 -4
- package/templates/project/package-lock.json +2 -2
- package/.framework/docs/admin-routes.md +0 -76
- package/.framework/docs/api-docs-progress.md +0 -38
- package/.framework/docs/api-governance.md +0 -146
- package/.framework/docs/api-testing-results.md +0 -212
- package/.framework/docs/assembly-launch-guide.md +0 -138
- package/.framework/docs/audit-results.md +0 -590
- package/.framework/docs/db-api-inventory.md +0 -95
- package/.framework/docs/gap-remediation-backlog.md +0 -103
- package/.framework/docs/ui-adoption-verification.md +0 -111
- package/.framework/docs/ui-api-coverage.md +0 -84
- package/.framework/docs/v2-compatibility-audit.md +0 -228
- package/.framework/mcp/index.ts +0 -133
- package/.framework/mcp/load-env.ts +0 -60
- package/.framework/mcp/shared/app-manifest.ts +0 -275
- package/.framework/mcp/shared/db.ts +0 -477
- package/.framework/mcp/shared/kb.ts +0 -118
- package/.framework/mcp/tools/architect.ts +0 -431
- package/.framework/mcp/tools/cil/context.ts +0 -345
- package/.framework/mcp/tools/cil/graph.ts +0 -242
- package/.framework/mcp/tools/cil/ingest.ts +0 -1217
- package/.framework/mcp/tools/cil/pipeline-orchestrator.ts +0 -693
- package/.framework/mcp/tools/cil/pipeline.ts +0 -767
- package/.framework/mcp/tools/cil/project.ts +0 -791
- package/.framework/mcp/tools/cil/retrieval.ts +0 -336
- package/.framework/mcp/tools/cil/search-core.ts +0 -454
- package/.framework/mcp/tools/cil/search.ts +0 -97
- package/.framework/mcp/tools/cil/suggest.ts +0 -186
- package/.framework/mcp/tools/cil/validate.ts +0 -1369
- package/.framework/mcp/tools/kb/delete.ts +0 -139
- package/.framework/mcp/tools/kb/index.ts +0 -52
- package/.framework/mcp/tools/kb/ingest.ts +0 -84
- package/.framework/mcp/tools/kb/list-types.ts +0 -102
- package/.framework/mcp/tools/kb/publish.ts +0 -100
- package/.framework/mcp/tools/kb/reindex.ts +0 -86
- package/.framework/mcp/tools/kb/revoke.ts +0 -85
- package/.framework/mcp/tools/kb/search.ts +0 -101
- package/.framework/mcp/tools/kb/upsert.ts +0 -125
- package/.framework/mcp/tools/observability.ts +0 -510
|
@@ -1,52 +1,94 @@
|
|
|
1
1
|
// CIL[BEGIN stable_id="~/.framework/functions/integrations.ts:module_header:module_header" type="module_header" identity="module_header" parent="~/.framework/functions/integrations.ts"]
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
2
|
+
/**
|
|
3
|
+
* @module integrations
|
|
4
|
+
* @audience both
|
|
5
|
+
* @layer shared-core
|
|
6
|
+
* @stability stable
|
|
7
|
+
*
|
|
8
|
+
* This module provides integration functions for handling various operations within the application. It serves as a middleware layer that processes requests, ensuring proper authentication and data sanitization before interacting with the database. INVARIANT: All requests must be authenticated as a system admin to access sensitive operations.
|
|
9
|
+
*
|
|
10
|
+
* @seeAlso middleware.ts (provides request handling capabilities).
|
|
11
|
+
* @seeAlso db.ts (contains database interaction functions).
|
|
12
|
+
* @seeAlso audits.ts (handles logging of operations).
|
|
13
|
+
* @seeAlso permissions.ts (ensures data access control).
|
|
14
|
+
*
|
|
15
|
+
* @cil-generated
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
10
26
|
|
|
11
27
|
import { createHandler } from './_shared/middleware'
|
|
12
|
-
import { joins } from './_shared/db'
|
|
28
|
+
import { joins, adminDb } from './_shared/db'
|
|
13
29
|
import { emitLog } from './_shared/audit'
|
|
14
30
|
import { sanitizeRecordData } from './_shared/permissions'
|
|
15
|
-
|
|
16
|
-
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
17
|
-
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
18
|
-
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
19
|
-
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
20
|
-
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
31
|
+
import { isSystemAdmin } from './_shared/principal'
|
|
21
32
|
// CIL[END stable_id="~/.framework/functions/integrations.ts:module_header:module_header"]
|
|
22
33
|
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
|
|
23
49
|
// CIL[BEGIN stable_id="~/.framework/functions/integrations.ts:deriveSlug:function" type="function" identity="deriveSlug" parent="~/.framework/functions/integrations.ts"]
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
50
|
+
/**
|
|
51
|
+
* Derives a URL-friendly slug from a given name, ensuring it is lowercase and replaces spaces with hyphens while removing invalid characters. This function can also use a provided slug if available.
|
|
52
|
+
*
|
|
53
|
+
* @inputSpec
|
|
54
|
+
* - name: string (required) — the name to derive the slug from.
|
|
55
|
+
* - slug: string (optional) — an optional slug to use instead of deriving from the name.
|
|
56
|
+
* @outputSpec string — a URL-friendly slug derived from the name or the provided slug.
|
|
57
|
+
* @sideEffects none
|
|
58
|
+
* @stability internal
|
|
59
|
+
* @cil-generated
|
|
60
|
+
*/
|
|
31
61
|
function deriveSlug(name: string, slug?: string): string {
|
|
32
62
|
return slug || name.toLowerCase().replace(/\s+/g, '-').replace(/[^a-z0-9-]/g, '')
|
|
33
63
|
}
|
|
34
64
|
// CIL[END stable_id="~/.framework/functions/integrations.ts:deriveSlug:function"]
|
|
35
65
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
|
|
42
81
|
// CIL[BEGIN stable_id="~/.framework/functions/integrations.ts:computeIsConfigured:function" type="function" identity="computeIsConfigured" parent="~/.framework/functions/integrations.ts"]
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
82
|
+
/**
|
|
83
|
+
* Determines if the provided credentials are configured correctly by checking for valid entries in the credentials object. This function ensures that all necessary credential values are present and valid.
|
|
84
|
+
*
|
|
85
|
+
* @inputSpec
|
|
86
|
+
* credentials: Record<string, any> | undefined (optional) — an object containing credential entries or undefined.
|
|
87
|
+
* @outputSpec boolean — returns true if all entries are valid, otherwise false.
|
|
88
|
+
* @sideEffects none
|
|
89
|
+
* @stability internal
|
|
90
|
+
* @cil-generated
|
|
91
|
+
*/
|
|
50
92
|
function computeIsConfigured(credentials: Record<string, any> | undefined): boolean {
|
|
51
93
|
if (!credentials || Object.keys(credentials).length === 0) return false
|
|
52
94
|
return Object.values(credentials).every((entry: any) => {
|
|
@@ -54,21 +96,33 @@ function computeIsConfigured(credentials: Record<string, any> | undefined): bool
|
|
|
54
96
|
return typeof entry.value === 'string' && entry.value.length > 0
|
|
55
97
|
})
|
|
56
98
|
}
|
|
57
|
-
// CIL[DOC-VECTOR type="context" content="purpose='Determine whether all credential entries are populated strings'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/audit.ts"]
|
|
58
|
-
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
59
|
-
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
60
|
-
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
61
|
-
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
62
|
-
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
63
99
|
// CIL[END stable_id="~/.framework/functions/integrations.ts:computeIsConfigured:function"]
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
|
|
64
115
|
// CIL[BEGIN stable_id="~/.framework/functions/integrations.ts:list:constant" type="constant" identity="list" parent="~/.framework/functions/integrations.ts"]
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
116
|
+
/**
|
|
117
|
+
* The 'list' constant defines an asynchronous handler that retrieves a list of integrations based on various query parameters, ensuring that the request context includes an account ID. It applies filters based on the provided query parameters.
|
|
118
|
+
*
|
|
119
|
+
* @throws Error — Account context required if ctx.accountId is missing.
|
|
120
|
+
* @sideEffects none
|
|
121
|
+
* @stability internal
|
|
122
|
+
* @calls adminDb.from('integrations'), ctx.db.from('integrations'), sanitizeRecordData
|
|
123
|
+
* @errorHandling none
|
|
124
|
+
* @cil-generated
|
|
125
|
+
*/
|
|
72
126
|
export const list = createHandler(async (ctx, _body) => {
|
|
73
127
|
const { integration_type, provider, is_active, is_configured, limit = 100, offset = 0 } = ctx.query || {}
|
|
74
128
|
|
|
@@ -76,7 +130,9 @@ export const list = createHandler(async (ctx, _body) => {
|
|
|
76
130
|
throw new Error('Account context required')
|
|
77
131
|
}
|
|
78
132
|
|
|
79
|
-
|
|
133
|
+
const db = isSystemAdmin(ctx.principal) ? adminDb : ctx.db
|
|
134
|
+
|
|
135
|
+
let query = db
|
|
80
136
|
.from('integrations')
|
|
81
137
|
.select(`*, ${joins.app}, ${joins.createdBy}`)
|
|
82
138
|
.order('name')
|
|
@@ -108,21 +164,32 @@ export const list = createHandler(async (ctx, _body) => {
|
|
|
108
164
|
|
|
109
165
|
return sanitized
|
|
110
166
|
})
|
|
111
|
-
// CIL[DOC-VECTOR type="context" content="purpose='List integration records with optional filters and pagination'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/audit.ts"]
|
|
112
|
-
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
113
|
-
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
114
|
-
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
115
|
-
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
116
|
-
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
117
167
|
// CIL[END stable_id="~/.framework/functions/integrations.ts:list:constant"]
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
|
|
118
183
|
// CIL[BEGIN stable_id="~/.framework/functions/integrations.ts:get:constant" type="constant" identity="get" parent="~/.framework/functions/integrations.ts"]
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
184
|
+
/**
|
|
185
|
+
* Retrieves a specific integration record from the database based on the provided integration ID. This function ensures that the caller has the necessary permissions and handles potential errors during the database query.
|
|
186
|
+
*
|
|
187
|
+
* @throws Error — Integration ID is required, Error — database query error
|
|
188
|
+
* @sideEffects none
|
|
189
|
+
* @stability internal
|
|
190
|
+
* @calls adminDb.from('integrations'), ctx.db.from('integrations'), sanitizeRecordData
|
|
191
|
+
* @cil-generated
|
|
192
|
+
*/
|
|
126
193
|
export const get = createHandler(async (ctx, _body) => {
|
|
127
194
|
const { id } = ctx.query || {}
|
|
128
195
|
|
|
@@ -130,7 +197,9 @@ export const get = createHandler(async (ctx, _body) => {
|
|
|
130
197
|
throw new Error('Integration ID is required')
|
|
131
198
|
}
|
|
132
199
|
|
|
133
|
-
const
|
|
200
|
+
const db = isSystemAdmin(ctx.principal) ? adminDb : ctx.db
|
|
201
|
+
|
|
202
|
+
const { data, error: err } = await db
|
|
134
203
|
.from('integrations')
|
|
135
204
|
.select(`*, ${joins.app}, ${joins.createdBy}`)
|
|
136
205
|
.eq('id', id)
|
|
@@ -140,21 +209,32 @@ export const get = createHandler(async (ctx, _body) => {
|
|
|
140
209
|
|
|
141
210
|
return await sanitizeRecordData(ctx, data, 'integration')
|
|
142
211
|
})
|
|
143
|
-
// CIL[DOC-VECTOR type="context" content="purpose='Retrieve a single integration by id'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/audit.ts"]
|
|
144
|
-
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
145
|
-
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
146
|
-
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
147
|
-
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
148
|
-
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
149
212
|
// CIL[END stable_id="~/.framework/functions/integrations.ts:get:constant"]
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
|
|
150
228
|
// CIL[BEGIN stable_id="~/.framework/functions/integrations.ts:create:constant" type="constant" identity="create" parent="~/.framework/functions/integrations.ts"]
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
229
|
+
/**
|
|
230
|
+
* Creates a new integration record in the database based on the provided parameters while ensuring required fields are present and validating user context. This function is essential for managing integrations within the application.
|
|
231
|
+
*
|
|
232
|
+
* @throws Error — name, integration_type, and provider are required; Error — User context (person and account) required; Error — database insert error.
|
|
233
|
+
* @sideEffects Writes a new record to the 'integrations' table and emits a log event.
|
|
234
|
+
* @stability internal
|
|
235
|
+
* @calls adminDb.from('integrations'), ctx.db.from('integrations'), emitLog
|
|
236
|
+
* @cil-generated
|
|
237
|
+
*/
|
|
158
238
|
export const create = createHandler(async (ctx, body) => {
|
|
159
239
|
const { app_id, name, description, integration_type, provider, version, config, credentials, metadata } = body
|
|
160
240
|
|
|
@@ -168,7 +248,9 @@ export const create = createHandler(async (ctx, body) => {
|
|
|
168
248
|
|
|
169
249
|
const safeCredentials = credentials || {}
|
|
170
250
|
|
|
171
|
-
const
|
|
251
|
+
const db = isSystemAdmin(ctx.principal) ? adminDb : ctx.db
|
|
252
|
+
|
|
253
|
+
const { data, error: err } = await db
|
|
172
254
|
.from('integrations')
|
|
173
255
|
.insert({
|
|
174
256
|
app_id: app_id || null,
|
|
@@ -183,7 +265,7 @@ export const create = createHandler(async (ctx, body) => {
|
|
|
183
265
|
credentials: safeCredentials,
|
|
184
266
|
metadata: metadata || {},
|
|
185
267
|
is_configured: computeIsConfigured(safeCredentials),
|
|
186
|
-
created_by: ctx.principal.id
|
|
268
|
+
created_by: ctx.principal.type === 'human' ? ctx.principal.id : null
|
|
187
269
|
})
|
|
188
270
|
.select()
|
|
189
271
|
.single()
|
|
@@ -197,21 +279,32 @@ export const create = createHandler(async (ctx, body) => {
|
|
|
197
279
|
|
|
198
280
|
return data
|
|
199
281
|
})
|
|
200
|
-
// CIL[DOC-VECTOR type="context" content="purpose='Create a new integration record'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/audit.ts"]
|
|
201
|
-
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
202
|
-
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
203
|
-
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
204
|
-
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
205
|
-
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
206
282
|
// CIL[END stable_id="~/.framework/functions/integrations.ts:create:constant"]
|
|
283
|
+
|
|
284
|
+
|
|
285
|
+
|
|
286
|
+
|
|
287
|
+
|
|
288
|
+
|
|
289
|
+
|
|
290
|
+
|
|
291
|
+
|
|
292
|
+
|
|
293
|
+
|
|
294
|
+
|
|
295
|
+
|
|
296
|
+
|
|
297
|
+
|
|
207
298
|
// CIL[BEGIN stable_id="~/.framework/functions/integrations.ts:update:constant" type="constant" identity="update" parent="~/.framework/functions/integrations.ts"]
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
299
|
+
/**
|
|
300
|
+
* The update constant defines a handler for updating integration records in the database. It ensures that required fields are present and only allowed fields are updated.
|
|
301
|
+
*
|
|
302
|
+
* @throws Error — Integration ID is required, Error — database update error
|
|
303
|
+
* @sideEffects DB writes to the 'integrations' table, emits a log event for the update.
|
|
304
|
+
* @stability internal
|
|
305
|
+
* @calls adminDb.from('integrations'), ctx.db.from('integrations'), emitLog
|
|
306
|
+
* @cil-generated
|
|
307
|
+
*/
|
|
215
308
|
export const update = createHandler(async (ctx, body) => {
|
|
216
309
|
const id = body?.id || ctx.query?.id
|
|
217
310
|
const { id: _bodyId, ...updates } = body || {}
|
|
@@ -230,7 +323,9 @@ export const update = createHandler(async (ctx, body) => {
|
|
|
230
323
|
updateData.is_configured = computeIsConfigured(updateData.credentials)
|
|
231
324
|
}
|
|
232
325
|
|
|
233
|
-
const
|
|
326
|
+
const db = isSystemAdmin(ctx.principal) ? adminDb : ctx.db
|
|
327
|
+
|
|
328
|
+
const { data, error: err } = await db
|
|
234
329
|
.from('integrations')
|
|
235
330
|
.update(updateData)
|
|
236
331
|
.eq('id', id)
|
|
@@ -239,28 +334,46 @@ export const update = createHandler(async (ctx, body) => {
|
|
|
239
334
|
|
|
240
335
|
if (err) throw err
|
|
241
336
|
|
|
337
|
+
// S-005: redact credentials from the audit payload — the DB write above is
|
|
338
|
+
// untouched, but `after` lands in public.logs and must never carry secrets.
|
|
339
|
+
const auditAfter = { ...updateData }
|
|
340
|
+
if (auditAfter.credentials !== undefined) {
|
|
341
|
+
auditAfter.credentials = { __redacted: true }
|
|
342
|
+
}
|
|
343
|
+
|
|
242
344
|
await emitLog(ctx, 'integration.updated',
|
|
243
345
|
{ type: 'integration', id },
|
|
244
|
-
{ after:
|
|
346
|
+
{ after: auditAfter }
|
|
245
347
|
)
|
|
246
348
|
|
|
247
349
|
return data
|
|
248
350
|
})
|
|
249
|
-
// CIL[DOC-VECTOR type="context" content="purpose='Update an existing integration record'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/audit.ts"]
|
|
250
|
-
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
251
|
-
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
252
|
-
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
253
|
-
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
254
|
-
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
255
351
|
// CIL[END stable_id="~/.framework/functions/integrations.ts:update:constant"]
|
|
352
|
+
|
|
353
|
+
|
|
354
|
+
|
|
355
|
+
|
|
356
|
+
|
|
357
|
+
|
|
358
|
+
|
|
359
|
+
|
|
360
|
+
|
|
361
|
+
|
|
362
|
+
|
|
363
|
+
|
|
364
|
+
|
|
365
|
+
|
|
366
|
+
|
|
256
367
|
// CIL[BEGIN stable_id="~/.framework/functions/integrations.ts:remove:constant" type="constant" identity="remove" parent="~/.framework/functions/integrations.ts"]
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
368
|
+
/**
|
|
369
|
+
* The 'remove' constant defines a handler for deleting an integration by its ID, marking it as inactive in the database. It ensures that the integration ID is provided and logs the deletion event.
|
|
370
|
+
*
|
|
371
|
+
* @throws Error — Integration ID is required, Error — Integration not found, Error — database error
|
|
372
|
+
* @sideEffects Updates the 'integrations' table in the database and emits a log event.
|
|
373
|
+
* @stability internal
|
|
374
|
+
* @calls adminDb.from('integrations'), ctx.db.from('integrations'), emitLog
|
|
375
|
+
* @cil-generated
|
|
376
|
+
*/
|
|
264
377
|
export const remove = createHandler(async (ctx, _body) => {
|
|
265
378
|
const id = ctx.query?.id
|
|
266
379
|
|
|
@@ -268,7 +381,9 @@ export const remove = createHandler(async (ctx, _body) => {
|
|
|
268
381
|
throw new Error('Integration ID is required')
|
|
269
382
|
}
|
|
270
383
|
|
|
271
|
-
const
|
|
384
|
+
const db = isSystemAdmin(ctx.principal) ? adminDb : ctx.db
|
|
385
|
+
|
|
386
|
+
const { data: current } = await db
|
|
272
387
|
.from('integrations')
|
|
273
388
|
.select('id, name, provider')
|
|
274
389
|
.eq('id', id)
|
|
@@ -276,7 +391,7 @@ export const remove = createHandler(async (ctx, _body) => {
|
|
|
276
391
|
|
|
277
392
|
if (!current) throw new Error('Integration not found')
|
|
278
393
|
|
|
279
|
-
const { data, error: err } = await
|
|
394
|
+
const { data, error: err } = await db
|
|
280
395
|
.from('integrations')
|
|
281
396
|
.update({ is_active: false, updated_at: new Date().toISOString() })
|
|
282
397
|
.eq('id', id)
|
|
@@ -293,20 +408,31 @@ export const remove = createHandler(async (ctx, _body) => {
|
|
|
293
408
|
return data
|
|
294
409
|
})
|
|
295
410
|
// CIL[END stable_id="~/.framework/functions/integrations.ts:remove:constant"]
|
|
411
|
+
|
|
412
|
+
|
|
413
|
+
|
|
414
|
+
|
|
415
|
+
|
|
416
|
+
|
|
417
|
+
|
|
418
|
+
|
|
419
|
+
|
|
420
|
+
|
|
421
|
+
|
|
422
|
+
|
|
423
|
+
|
|
424
|
+
|
|
425
|
+
|
|
296
426
|
// CIL[BEGIN stable_id="~/.framework/functions/integrations.ts:handler:constant" type="constant" identity="handler" parent="~/.framework/functions/integrations.ts"]
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
// CIL[DOC-CONTRACT inputs="ctx: RequestContext, body: any" outputs="Result from chosen handler" errors="Throws for unsupported method or delegate errors" side_effects="Delegates to CRUD handlers and helpers"]
|
|
307
|
-
// CIL[DOC-MICRO logic_summary="Selects a handler based on the request method and optional id in query" notable_decisions="[]"]
|
|
308
|
-
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
309
|
-
// CIL[DOC-STABILITY stability="stable"]
|
|
427
|
+
/**
|
|
428
|
+
* The handler processes incoming requests based on the HTTP method specified in the query parameters. It routes the request to the appropriate function for handling GET, POST, PATCH, or DELETE operations.
|
|
429
|
+
*
|
|
430
|
+
* @throws Error — Unsupported method: {method}
|
|
431
|
+
* @sideEffects none
|
|
432
|
+
* @stability internal
|
|
433
|
+
* @calls get, list, create, update, remove
|
|
434
|
+
* @cil-generated
|
|
435
|
+
*/
|
|
310
436
|
export const handler = createHandler(async (ctx, body) => {
|
|
311
437
|
const method = ctx.query?.method || 'GET'
|
|
312
438
|
|
|
@@ -327,10 +453,11 @@ export const handler = createHandler(async (ctx, body) => {
|
|
|
327
453
|
throw new Error(`Unsupported method: ${method}`)
|
|
328
454
|
}
|
|
329
455
|
})
|
|
330
|
-
// CIL[DOC-VECTOR type="context" content="purpose='Route integration HTTP requests by method'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/audit.ts"]
|
|
331
|
-
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
332
|
-
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
333
|
-
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
334
|
-
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
335
|
-
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
336
456
|
// CIL[END stable_id="~/.framework/functions/integrations.ts:handler:constant"]
|
|
457
|
+
|
|
458
|
+
|
|
459
|
+
|
|
460
|
+
|
|
461
|
+
|
|
462
|
+
|
|
463
|
+
|