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
|
@@ -0,0 +1,469 @@
|
|
|
1
|
+
// CIL[BEGIN chunk_id="custom_apps_cortex_functions_custom_cil_validate_module_header_1784235266" type="module_header" identity="module_header" parent="none"]
|
|
2
|
+
// CIL[DOC-MACRO purpose="Module header and top-level exports for cortex.functions.custom_cil-validate"]
|
|
3
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Own module-level imports, exports, and configuration for cortex.functions.custom_cil-validate"]
|
|
4
|
+
// CIL[DOC-CONTEXT module="cortex.functions.custom_cil-validate" layer="function" related_files="[\".framework/migrations/015_simplify_apps_table.sql\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/components/ui/table-primitives.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"\\\"]"]
|
|
5
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="module exports and side effects" errors="none" side_effects="none"]
|
|
6
|
+
// CIL[DOC-MICRO logic_summary="Declares module scope, imports dependencies, and exports public surface of cortex.functions.custom_cil-validate" notable_decisions="[]"]
|
|
7
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
8
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
9
|
+
// CIL[DOC-AUDIENCE audience="developer"]
|
|
10
|
+
// CIL[DOC-VECTOR type="context" content="Layer: function. Direct callers: 0. Direct calls: 0. Related files: .framework/migrations/015_simplify_apps_table.sql, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, custom/apps/portal/pages/ContentPage.tsx, .framework/src/components/ui/table-primitives.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, \."]
|
|
11
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
12
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
13
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
14
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
15
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
import { createHandler } from './_shared/middleware'
|
|
19
|
+
import { adminDb } from './_shared/db'
|
|
20
|
+
import * as crypto from 'crypto'
|
|
21
|
+
import * as fs from 'fs'
|
|
22
|
+
import * as path from 'path'
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
// CIL[END chunk_id="custom_apps_cortex_functions_custom_cil_validate_module_header_1784235266"]
|
|
31
|
+
// CIL[BEGIN chunk_id="custom_apps_cortex_functions_custom_cil_validate_chunktovalidate_1784235266" type="interface" identity="chunktovalidate" parent="none"]
|
|
32
|
+
// CIL[DOC-MACRO purpose="Defines the chunktovalidate type contract in cortex.functions.custom_cil-validate"]
|
|
33
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Describe the shape and allowed fields for chunktovalidate"]
|
|
34
|
+
// CIL[DOC-CONTEXT module="cortex.functions.custom_cil-validate" layer="function" related_files="[\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\".framework/migrations/015_simplify_apps_table.sql\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"\\\"]"]
|
|
35
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="type definition for chunktovalidate" errors="none" side_effects="none"]
|
|
36
|
+
// CIL[DOC-MICRO logic_summary="Declares TypeScript type/interface chunktovalidate with member definitions" notable_decisions="[]"]
|
|
37
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
38
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
39
|
+
// CIL[DOC-VECTOR type="context" content="Layer: function. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/TypeDetailPage.tsx, .framework/functions/_shared/principal.ts, .framework/src/pages/admin/IntegrationsPage.tsx, .framework/migrations/015_simplify_apps_table.sql, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, \."]
|
|
40
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
41
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
42
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
43
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
44
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
45
|
+
interface ChunkToValidate {
|
|
46
|
+
chunk_id: string
|
|
47
|
+
chunk_name: string
|
|
48
|
+
content: string
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
// CIL[END chunk_id="custom_apps_cortex_functions_custom_cil_validate_chunktovalidate_1784235266"]
|
|
56
|
+
// CIL[BEGIN chunk_id="custom_apps_cortex_functions_custom_cil_validate_validationresult_1784235266" type="interface" identity="validationresult" parent="none"]
|
|
57
|
+
// CIL[DOC-MACRO purpose="Defines the validationresult type contract in cortex.functions.custom_cil-validate"]
|
|
58
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Describe the shape and allowed fields for validationresult"]
|
|
59
|
+
// CIL[DOC-CONTEXT module="cortex.functions.custom_cil-validate" layer="function" related_files="[\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\".framework/migrations/015_simplify_apps_table.sql\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"\\\"]"]
|
|
60
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="type definition for validationresult" errors="none" side_effects="none"]
|
|
61
|
+
// CIL[DOC-MICRO logic_summary="Declares TypeScript type/interface validationresult with member definitions" notable_decisions="[]"]
|
|
62
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
63
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
64
|
+
// CIL[DOC-VECTOR type="context" content="Layer: function. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/TypeDetailPage.tsx, .framework/functions/_shared/principal.ts, .framework/src/pages/admin/IntegrationsPage.tsx, .framework/migrations/015_simplify_apps_table.sql, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, \."]
|
|
65
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
66
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
67
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
68
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
69
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
70
|
+
interface ValidationResult {
|
|
71
|
+
chunk_id: string
|
|
72
|
+
chunk_name: string
|
|
73
|
+
status: 'current' | 'drift_detected' | 'not_found'
|
|
74
|
+
stored_hash: string | null
|
|
75
|
+
validation_hash: string
|
|
76
|
+
message: string
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
// CIL[END chunk_id="custom_apps_cortex_functions_custom_cil_validate_validationresult_1784235266"]
|
|
84
|
+
// CIL[BEGIN chunk_id="custom_apps_cortex_functions_custom_cil_validate_validaterequest_1784235266" type="interface" identity="validaterequest" parent="none"]
|
|
85
|
+
// CIL[DOC-MACRO purpose="Defines the validaterequest type contract in cortex.functions.custom_cil-validate"]
|
|
86
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Describe the shape and allowed fields for validaterequest"]
|
|
87
|
+
// CIL[DOC-CONTEXT module="cortex.functions.custom_cil-validate" layer="function" related_files="[\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\".framework/migrations/015_simplify_apps_table.sql\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"\\\"]"]
|
|
88
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="type definition for validaterequest" errors="none" side_effects="none"]
|
|
89
|
+
// CIL[DOC-MICRO logic_summary="Declares TypeScript type/interface validaterequest with member definitions" notable_decisions="[]"]
|
|
90
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
91
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
92
|
+
// CIL[DOC-VECTOR type="context" content="Layer: function. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/TypeDetailPage.tsx, .framework/functions/_shared/principal.ts, .framework/src/pages/admin/IntegrationsPage.tsx, .framework/migrations/015_simplify_apps_table.sql, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, \."]
|
|
93
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
94
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
95
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
96
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
97
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
98
|
+
interface ValidateRequest {
|
|
99
|
+
file_path?: string
|
|
100
|
+
chunks: ChunkToValidate[]
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
// CIL[END chunk_id="custom_apps_cortex_functions_custom_cil_validate_validaterequest_1784235266"]
|
|
108
|
+
// CIL[BEGIN chunk_id="custom_apps_cortex_functions_custom_cil_validate_updatehashrequest_1784235266" type="interface" identity="updatehashrequest" parent="none"]
|
|
109
|
+
// CIL[DOC-MACRO purpose="Defines the updatehashrequest type contract in cortex.functions.custom_cil-validate"]
|
|
110
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Describe the shape and allowed fields for updatehashrequest"]
|
|
111
|
+
// CIL[DOC-CONTEXT module="cortex.functions.custom_cil-validate" layer="function" related_files="[\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\".framework/migrations/015_simplify_apps_table.sql\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"\\\"]"]
|
|
112
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="type definition for updatehashrequest" errors="none" side_effects="none"]
|
|
113
|
+
// CIL[DOC-MICRO logic_summary="Declares TypeScript type/interface updatehashrequest with member definitions" notable_decisions="[]"]
|
|
114
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
115
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
116
|
+
// CIL[DOC-VECTOR type="context" content="Layer: function. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/TypeDetailPage.tsx, .framework/functions/_shared/principal.ts, .framework/src/pages/admin/IntegrationsPage.tsx, .framework/migrations/015_simplify_apps_table.sql, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, \."]
|
|
117
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
118
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
119
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
120
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
121
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
122
|
+
interface UpdateHashRequest {
|
|
123
|
+
chunk_id: string
|
|
124
|
+
content: string
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
// CIL[END chunk_id="custom_apps_cortex_functions_custom_cil_validate_updatehashrequest_1784235266"]
|
|
135
|
+
// CIL[BEGIN chunk_id="custom_apps_cortex_functions_custom_cil_validate_normalisecontent_1784235266" type="function" identity="normalisecontent" parent="none"]
|
|
136
|
+
// CIL[DOC-MACRO purpose="Implements normalisecontent logic in cortex.functions.custom_cil-validate"]
|
|
137
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Execute normalisecontent and return its computed result"]
|
|
138
|
+
// CIL[DOC-CONTEXT module="cortex.functions.custom_cil-validate" layer="function" related_files="[]"]
|
|
139
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="return value from function execution" errors="throws on invalid input or runtime failure" side_effects="none"]
|
|
140
|
+
// CIL[DOC-MICRO logic_summary="Provides normalisecontent with normaliseContent(raw: string inputs, handling internal flow and returning a result" notable_decisions="[]"]
|
|
141
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
142
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
143
|
+
// CIL[DOC-VECTOR type="context" content="Layer: function. Direct callers: 0. Direct calls: 0. Related files: none."]
|
|
144
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
145
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
146
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
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
|
+
function normaliseContent(raw: string): string {
|
|
150
|
+
const lines = raw.replace(/\r\n/g, '\n').split('\n')
|
|
151
|
+
const filtered = lines.filter(line => {
|
|
152
|
+
const trimmed = line.trim()
|
|
153
|
+
|
|
154
|
+
return !trimmed.match(/^\/\/\s*[─\-]+\s*CHUNK_(START|END):/) &&
|
|
155
|
+
!trimmed.match(/^\/\*\*?\s*CHUNK_(START|END):.+\*\//)
|
|
156
|
+
})
|
|
157
|
+
|
|
158
|
+
const collapsed: string[] = []
|
|
159
|
+
let lastBlank = false
|
|
160
|
+
for (const line of filtered) {
|
|
161
|
+
const isBlank = line.trim() === ''
|
|
162
|
+
if (isBlank && lastBlank) continue
|
|
163
|
+
collapsed.push(line)
|
|
164
|
+
lastBlank = isBlank
|
|
165
|
+
}
|
|
166
|
+
return collapsed.join('\n').trim()
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
// CIL[END chunk_id="custom_apps_cortex_functions_custom_cil_validate_normalisecontent_1784235266"]
|
|
174
|
+
// CIL[BEGIN chunk_id="custom_apps_cortex_functions_custom_cil_validate_computehash_1784235266" type="function" identity="computehash" parent="none"]
|
|
175
|
+
// CIL[DOC-MACRO purpose="Implements computehash logic in cortex.functions.custom_cil-validate"]
|
|
176
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Execute computehash and return its computed result"]
|
|
177
|
+
// CIL[DOC-CONTEXT module="cortex.functions.custom_cil-validate" layer="function" related_files="[]"]
|
|
178
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="return value from function execution" errors="throws on invalid input or runtime failure" side_effects="none"]
|
|
179
|
+
// CIL[DOC-MICRO logic_summary="Provides computehash with computeHash(content: string inputs, handling internal flow and returning a result" notable_decisions="[]"]
|
|
180
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
181
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
182
|
+
// CIL[DOC-VECTOR type="context" content="Layer: function. Direct callers: 0. Direct calls: 0. Related files: none."]
|
|
183
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
184
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
185
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
186
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
187
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
188
|
+
function computeHash(content: string): string {
|
|
189
|
+
return crypto.createHash('sha256').update(normaliseContent(content)).digest('hex').slice(0, 16)
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
// CIL[END chunk_id="custom_apps_cortex_functions_custom_cil_validate_computehash_1784235266"]
|
|
199
|
+
// CIL[BEGIN chunk_id="custom_apps_cortex_functions_custom_cil_validate_handler_1784235266" type="variable" identity="handler" parent="none"]
|
|
200
|
+
// CIL[DOC-MACRO purpose="Defines handler configuration or state in cortex.functions.custom_cil-validate"]
|
|
201
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Hold the value and default configuration for handler"]
|
|
202
|
+
// CIL[DOC-CONTEXT module="cortex.functions.custom_cil-validate" layer="function" related_files="[]"]
|
|
203
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="value of handler" errors="none" side_effects="none"]
|
|
204
|
+
// CIL[DOC-MICRO logic_summary="Declares handler with initial value or constant binding used by cortex.functions.custom_cil-validate" notable_decisions="[]"]
|
|
205
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
206
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
207
|
+
// CIL[DOC-VECTOR type="context" content="Layer: function. Direct callers: 0. Direct calls: 0. Related files: none."]
|
|
208
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
209
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
210
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
211
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
212
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
213
|
+
export const handler = createHandler(async (ctx, body) => {
|
|
214
|
+
const action = ctx.query?.action
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
if (action === 'validate' || !action) {
|
|
218
|
+
const req = body as ValidateRequest
|
|
219
|
+
if (!req?.chunks || !Array.isArray(req.chunks)) {
|
|
220
|
+
throw new Error('chunks array is required')
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
const results: ValidationResult[] = []
|
|
224
|
+
|
|
225
|
+
for (const chunk of req.chunks) {
|
|
226
|
+
const validationHash = computeHash(chunk.content)
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
const { data: item, error } = await adminDb
|
|
230
|
+
.from('items')
|
|
231
|
+
.select('id, data')
|
|
232
|
+
.eq('id', chunk.chunk_id)
|
|
233
|
+
.maybeSingle()
|
|
234
|
+
|
|
235
|
+
if (error || !item) {
|
|
236
|
+
results.push({
|
|
237
|
+
chunk_id: chunk.chunk_id,
|
|
238
|
+
chunk_name: chunk.chunk_name,
|
|
239
|
+
status: 'not_found',
|
|
240
|
+
stored_hash: null,
|
|
241
|
+
validation_hash: validationHash,
|
|
242
|
+
message: 'Chunk not found in graph — needs ingestion',
|
|
243
|
+
})
|
|
244
|
+
continue
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
const storedHash: string | null = item.data?.stored_hash || null
|
|
248
|
+
|
|
249
|
+
if (!storedHash) {
|
|
250
|
+
results.push({
|
|
251
|
+
chunk_id: chunk.chunk_id,
|
|
252
|
+
chunk_name: chunk.chunk_name,
|
|
253
|
+
status: 'drift_detected',
|
|
254
|
+
stored_hash: null,
|
|
255
|
+
validation_hash: validationHash,
|
|
256
|
+
message: 'No stored hash — chunk has never been hash-verified',
|
|
257
|
+
})
|
|
258
|
+
continue
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
const status: 'current' | 'drift_detected' =
|
|
262
|
+
storedHash === validationHash ? 'current' : 'drift_detected'
|
|
263
|
+
|
|
264
|
+
results.push({
|
|
265
|
+
chunk_id: chunk.chunk_id,
|
|
266
|
+
chunk_name: chunk.chunk_name,
|
|
267
|
+
status,
|
|
268
|
+
stored_hash: storedHash,
|
|
269
|
+
validation_hash: validationHash,
|
|
270
|
+
message: status === 'current'
|
|
271
|
+
? 'Embedding is current — content matches stored hash'
|
|
272
|
+
: 'Content has drifted since last ingestion — re-ingest required before trusting contract',
|
|
273
|
+
})
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
const driftCount = results.filter(r => r.status === 'drift_detected').length
|
|
277
|
+
const currentCount = results.filter(r => r.status === 'current').length
|
|
278
|
+
|
|
279
|
+
return {
|
|
280
|
+
file_path: req.file_path || null,
|
|
281
|
+
results,
|
|
282
|
+
summary: {
|
|
283
|
+
total: results.length,
|
|
284
|
+
current: currentCount,
|
|
285
|
+
drift_detected: driftCount,
|
|
286
|
+
not_found: results.filter(r => r.status === 'not_found').length,
|
|
287
|
+
trust_rating: results.length > 0 ? Math.round((currentCount / results.length) * 100) : 0,
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
|
|
293
|
+
if (action === 'update_hash') {
|
|
294
|
+
const req = body as UpdateHashRequest
|
|
295
|
+
if (!req?.chunk_id) throw new Error('chunk_id is required')
|
|
296
|
+
if (!req?.content) throw new Error('content is required')
|
|
297
|
+
|
|
298
|
+
const newHash = computeHash(req.content)
|
|
299
|
+
|
|
300
|
+
const { data: item } = await adminDb
|
|
301
|
+
.from('items')
|
|
302
|
+
.select('id, data')
|
|
303
|
+
.eq('id', req.chunk_id)
|
|
304
|
+
.maybeSingle()
|
|
305
|
+
|
|
306
|
+
if (!item) throw new Error(`Chunk not found: ${req.chunk_id}`)
|
|
307
|
+
|
|
308
|
+
const { error } = await adminDb
|
|
309
|
+
.from('items')
|
|
310
|
+
.update({
|
|
311
|
+
data: { ...item.data, stored_hash: newHash, hash_updated_at: new Date().toISOString() },
|
|
312
|
+
updated_at: new Date().toISOString(),
|
|
313
|
+
})
|
|
314
|
+
.eq('id', req.chunk_id)
|
|
315
|
+
|
|
316
|
+
if (error) throw new Error(`Failed to update hash: ${error.message}`)
|
|
317
|
+
|
|
318
|
+
return {
|
|
319
|
+
chunk_id: req.chunk_id,
|
|
320
|
+
new_hash: newHash,
|
|
321
|
+
updated_at: new Date().toISOString(),
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
|
|
326
|
+
if (action === 'compute_hash') {
|
|
327
|
+
const content = body?.content
|
|
328
|
+
if (!content) throw new Error('content is required')
|
|
329
|
+
return { hash: computeHash(content) }
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
|
|
333
|
+
|
|
334
|
+
|
|
335
|
+
|
|
336
|
+
|
|
337
|
+
|
|
338
|
+
|
|
339
|
+
if (action === 'validate_file') {
|
|
340
|
+
const fileId = ctx.query?.file_id || body?.file_id
|
|
341
|
+
const repoPathOverride: string | null = ctx.query?.repo_path || body?.repo_path || null
|
|
342
|
+
|
|
343
|
+
if (!fileId) throw new Error('file_id is required')
|
|
344
|
+
|
|
345
|
+
|
|
346
|
+
const { data: fileItem } = await adminDb
|
|
347
|
+
.from('items')
|
|
348
|
+
.select('id, title, data')
|
|
349
|
+
.eq('id', fileId)
|
|
350
|
+
.maybeSingle()
|
|
351
|
+
|
|
352
|
+
if (!fileItem) throw new Error(`File not found: ${fileId}`)
|
|
353
|
+
|
|
354
|
+
const filePath: string = fileItem.data?.file_path || fileItem.title
|
|
355
|
+
const projectId: string = fileItem.data?.project_id
|
|
356
|
+
|
|
357
|
+
|
|
358
|
+
let repoPath = repoPathOverride
|
|
359
|
+
if (!repoPath && projectId) {
|
|
360
|
+
const { data: project } = await adminDb
|
|
361
|
+
.from('items')
|
|
362
|
+
.select('data')
|
|
363
|
+
.eq('id', projectId)
|
|
364
|
+
.maybeSingle()
|
|
365
|
+
repoPath = project?.data?.repo_path || null
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
if (!repoPath) throw new Error('Could not determine repo_path. Pass repo_path in request body or ensure project has repo_path set.')
|
|
369
|
+
|
|
370
|
+
const absPath = path.join(repoPath, filePath)
|
|
371
|
+
if (!fs.existsSync(absPath)) {
|
|
372
|
+
throw new Error(`Source file not found on disk: ${absPath}`)
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
const content = fs.readFileSync(absPath, 'utf-8')
|
|
376
|
+
const lines = content.split('\n')
|
|
377
|
+
|
|
378
|
+
|
|
379
|
+
const { data: chunks } = await adminDb
|
|
380
|
+
.from('items')
|
|
381
|
+
.select('id, data')
|
|
382
|
+
.filter('data->>file_id', 'eq', fileId)
|
|
383
|
+
.filter('data->>kb_type', 'eq', 'cil_chunk')
|
|
384
|
+
.eq('is_active', true)
|
|
385
|
+
|
|
386
|
+
if (!chunks?.length) {
|
|
387
|
+
return {
|
|
388
|
+
file_id: fileId,
|
|
389
|
+
file_path: filePath,
|
|
390
|
+
results: [],
|
|
391
|
+
summary: { total: 0, current: 0, drift_detected: 0, not_found: 0, trust_rating: 100 },
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
const results: ValidationResult[] = []
|
|
396
|
+
|
|
397
|
+
for (const chunk of chunks) {
|
|
398
|
+
const d = chunk.data || {}
|
|
399
|
+
const lineStart: number = d.line_start || 0
|
|
400
|
+
const lineEnd: number = d.line_end || 0
|
|
401
|
+
const chunkName: string = d.chunk_name || ''
|
|
402
|
+
const storedHash: string | null = d.stored_hash || null
|
|
403
|
+
|
|
404
|
+
if (!lineStart || !lineEnd) {
|
|
405
|
+
results.push({
|
|
406
|
+
chunk_id: chunk.id,
|
|
407
|
+
chunk_name: chunkName,
|
|
408
|
+
status: 'not_found',
|
|
409
|
+
stored_hash: storedHash,
|
|
410
|
+
validation_hash: '',
|
|
411
|
+
message: 'Chunk has no line_start / line_end — cannot extract from file',
|
|
412
|
+
})
|
|
413
|
+
continue
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
|
|
417
|
+
const chunkLines = lines.slice(lineStart - 1, lineEnd)
|
|
418
|
+
const liveContent = chunkLines.join('\n')
|
|
419
|
+
const validationHash = computeHash(liveContent)
|
|
420
|
+
|
|
421
|
+
if (!storedHash) {
|
|
422
|
+
results.push({
|
|
423
|
+
chunk_id: chunk.id,
|
|
424
|
+
chunk_name: chunkName,
|
|
425
|
+
status: 'drift_detected',
|
|
426
|
+
stored_hash: null,
|
|
427
|
+
validation_hash: validationHash,
|
|
428
|
+
message: 'No stored hash — chunk has never been hash-verified',
|
|
429
|
+
})
|
|
430
|
+
continue
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
const status: 'current' | 'drift_detected' = storedHash === validationHash ? 'current' : 'drift_detected'
|
|
434
|
+
results.push({
|
|
435
|
+
chunk_id: chunk.id,
|
|
436
|
+
chunk_name: chunkName,
|
|
437
|
+
status,
|
|
438
|
+
stored_hash: storedHash,
|
|
439
|
+
validation_hash: validationHash,
|
|
440
|
+
message: status === 'current'
|
|
441
|
+
? 'Content matches stored hash'
|
|
442
|
+
: 'Content has drifted since last ingestion — re-ingest required',
|
|
443
|
+
})
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
const currentCount = results.filter(r => r.status === 'current').length
|
|
447
|
+
const driftCount = results.filter(r => r.status === 'drift_detected').length
|
|
448
|
+
|
|
449
|
+
return {
|
|
450
|
+
file_id: fileId,
|
|
451
|
+
file_path: filePath,
|
|
452
|
+
repo_path: repoPath,
|
|
453
|
+
results,
|
|
454
|
+
summary: {
|
|
455
|
+
total: results.length,
|
|
456
|
+
current: currentCount,
|
|
457
|
+
drift_detected: driftCount,
|
|
458
|
+
not_found: results.filter(r => r.status === 'not_found').length,
|
|
459
|
+
trust_rating: results.length > 0 ? Math.round((currentCount / results.length) * 100) : 0,
|
|
460
|
+
},
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
throw new Error(`Unknown action: ${action}. Valid: validate, validate_file, update_hash, compute_hash`)
|
|
465
|
+
})
|
|
466
|
+
|
|
467
|
+
|
|
468
|
+
|
|
469
|
+
// CIL[END chunk_id="custom_apps_cortex_functions_custom_cil_validate_handler_1784235266"]
|
|
@@ -1,41 +1,48 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @module debug-auth
|
|
3
|
-
* @audience core-contributor
|
|
4
|
-
* @layer api-handler
|
|
5
|
-
* @stability internal
|
|
6
|
-
*
|
|
7
|
-
* Development/diagnostic endpoint for verifying that authentication
|
|
8
|
-
* middleware is resolving principals correctly. **Never expose this in
|
|
9
|
-
* production without access controls.**
|
|
10
|
-
*
|
|
11
|
-
* **Routed by:** `GET /.netlify/functions/debug-auth`
|
|
12
|
-
*
|
|
13
|
-
* **Actions (via ?method):**
|
|
14
|
-
* | ?method | handler | description |
|
|
15
|
-
* |----------|----------|-------------------------------------|
|
|
16
|
-
* | debug | debug | env check + principal presence |
|
|
17
|
-
* | testJwt | testJwt | validates JWT, returns principal ID |
|
|
18
|
-
*
|
|
19
|
-
* **Authorization:** None — intentionally unauthenticated so broken JWT
|
|
20
|
-
* flows can be diagnosed. Reveals only presence/absence of env vars and
|
|
21
|
-
* principal shape, never secret values.
|
|
22
|
-
*
|
|
23
|
-
* @seeAlso auth.ts (production auth context endpoint)
|
|
24
|
-
* @seeAlso middleware.ts (createHandler — JWT resolution logic)
|
|
25
|
-
*/
|
|
26
1
|
|
|
27
|
-
import { createHandler } from './_shared/middleware'
|
|
28
2
|
|
|
29
|
-
// ─── HANDLERS ─────────────────────────────────────────────────────────────────
|
|
30
3
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
// CIL[BEGIN chunk_id="debug-auth_moduleheader_1783969696" type="module_header" identity="imports" parent="none"]
|
|
15
|
+
// CIL[DOC-MACRO purpose="Import middleware for debug auth module"]
|
|
16
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Import request handler creation utility"]
|
|
17
|
+
// CIL[DOC-CONTEXT module="debug-auth" layer="backend_functions" related_files="[\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/migrations/015_simplify_apps_table.sql\",\".framework/functions/_shared/principal.ts\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/functions/_shared/schema-utils.ts\",\"\\\"]"]
|
|
18
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="imported_modules" errors="none" side_effects="none"]
|
|
19
|
+
// CIL[DOC-MICRO logic_summary="Import createHandler for debug authentication functions" notable_decisions="[]"]
|
|
20
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
21
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
22
|
+
// CIL[DOC-AUDIENCE audience="developer"]
|
|
23
|
+
// CIL[DOC-VECTOR type="context" content="Layer: backend_functions. Direct callers: 0. Direct calls: 0. Related files: custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/migrations/015_simplify_apps_table.sql, .framework/functions/_shared/principal.ts, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/functions/_shared/schema-utils.ts, \."]
|
|
24
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
25
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
26
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
27
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
28
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
29
|
+
|
|
30
|
+
import { createHandler } from './_shared/middleware'
|
|
31
|
+
// CIL[END chunk_id="debug-auth_moduleheader_1783969696"]
|
|
32
|
+
// CIL[BEGIN chunk_id="debug-auth_debug_1783969696" type="function" identity="debug" parent="none"]
|
|
33
|
+
// CIL[DOC-MACRO purpose="Debug authentication endpoint"]
|
|
34
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Return auth context and environment info"]
|
|
35
|
+
// CIL[DOC-CONTEXT module="debug-auth" layer="backend_functions" related_files="[\"\\\"]"]
|
|
36
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="debug_info" errors="none" side_effects="none"]
|
|
37
|
+
// CIL[DOC-MICRO logic_summary="Return principal info, request ID, and environment variables status" notable_decisions="[]"]
|
|
38
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
39
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
40
|
+
// CIL[DOC-VECTOR type="context" content="Layer: backend_functions. Direct callers: 1. Direct calls: 0. Related files: \."]
|
|
41
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 1. Total affected: 1."]
|
|
42
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
43
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
44
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
45
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
39
46
|
const debug = createHandler(async (ctx, _body) => {
|
|
40
47
|
const envObj = (globalThis as any).process?.env || {}
|
|
41
48
|
return {
|
|
@@ -51,15 +58,21 @@ const debug = createHandler(async (ctx, _body) => {
|
|
|
51
58
|
}
|
|
52
59
|
}
|
|
53
60
|
})
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
61
|
+
// CIL[END chunk_id="debug-auth_debug_1783969696"]
|
|
62
|
+
// CIL[BEGIN chunk_id="debug-auth_testjwt_1783969696" type="function" identity="testJwt" parent="none"]
|
|
63
|
+
// CIL[DOC-MACRO purpose="Test JWT token validation"]
|
|
64
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Validate and return JWT principal information"]
|
|
65
|
+
// CIL[DOC-CONTEXT module="debug-auth" layer="backend_functions" related_files="[\".framework/functions/_shared/schema-utils.ts\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"\\\"]"]
|
|
66
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="principal_info" errors="auth_errors" side_effects="none"]
|
|
67
|
+
// CIL[DOC-MICRO logic_summary="Extract and return principal details from validated JWT token" notable_decisions="[]"]
|
|
68
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
69
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
70
|
+
// CIL[DOC-VECTOR type="context" content="Layer: backend_functions. Direct callers: 1. Direct calls: 0. Related files: .framework/functions/_shared/schema-utils.ts, .framework/src/pages/admin/TypeDetailPage.tsx, \."]
|
|
71
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 1. Total affected: 1."]
|
|
72
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
73
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
74
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
75
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
63
76
|
const testJwt = createHandler(async (ctx, _body) => {
|
|
64
77
|
const envObj = (globalThis as any).process?.env || {}
|
|
65
78
|
if (!ctx.principal) {
|
|
@@ -80,15 +93,21 @@ const testJwt = createHandler(async (ctx, _body) => {
|
|
|
80
93
|
}
|
|
81
94
|
}
|
|
82
95
|
})
|
|
83
|
-
|
|
84
|
-
//
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
96
|
+
// CIL[END chunk_id="debug-auth_testjwt_1783969696"]
|
|
97
|
+
// CIL[BEGIN chunk_id="debug-auth_handler_1783969696" type="function" identity="handler" parent="none"]
|
|
98
|
+
// CIL[DOC-MACRO purpose="Route debug auth HTTP methods"]
|
|
99
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Dispatch requests to debug authentication operations"]
|
|
100
|
+
// CIL[DOC-CONTEXT module="debug-auth" layer="backend_functions" related_files="[\".framework/functions/_shared/principal.ts\",\"\\\"]"]
|
|
101
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="function_responses" errors="method_errors" side_effects="none"]
|
|
102
|
+
// CIL[DOC-MICRO logic_summary="Route method parameter to debug or testJwt functions" notable_decisions="[]"]
|
|
103
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
104
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
105
|
+
// CIL[DOC-VECTOR type="context" content="Layer: backend_functions. Direct callers: 0. Direct calls: 0. Related files: .framework/functions/_shared/principal.ts, \."]
|
|
106
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
107
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
108
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
109
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
110
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
92
111
|
export async function handler(event: any, context: any) {
|
|
93
112
|
const method = event.queryStringParameters?.method || 'debug'
|
|
94
113
|
|
|
@@ -105,3 +124,4 @@ export async function handler(event: any, context: any) {
|
|
|
105
124
|
|
|
106
125
|
return ctx
|
|
107
126
|
}
|
|
127
|
+
// CIL[END chunk_id="debug-auth_handler_1783969696"]
|