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.
Files changed (319) hide show
  1. package/.framework/cli/commands/agents.ts +35 -37
  2. package/.framework/cli/commands/auth.ts +35 -34
  3. package/.framework/cli/commands/create-app.ts +104 -40
  4. package/.framework/cli/commands/dev.ts +104 -69
  5. package/.framework/cli/commands/doctor.ts +179 -69
  6. package/.framework/cli/commands/generate.ts +83 -143
  7. package/.framework/cli/commands/init.ts +72 -34
  8. package/.framework/cli/commands/install-app.ts +260 -125
  9. package/.framework/cli/commands/items.ts +33 -44
  10. package/.framework/cli/commands/migrate.ts +122 -40
  11. package/.framework/cli/commands/migrations.ts +33 -40
  12. package/.framework/cli/commands/pipelines.ts +31 -39
  13. package/.framework/cli/commands/status.ts +47 -23
  14. package/.framework/cli/commands/system.ts +47 -37
  15. package/.framework/cli/commands/test.ts +112 -68
  16. package/.framework/cli/commands/validate-app.ts +215 -121
  17. package/.framework/cli/context.ts +112 -130
  18. package/.framework/cli/env-loader.ts +47 -18
  19. package/.framework/cli/index.ts +81 -42
  20. package/.framework/docs/runtime-types.md +1024 -0
  21. package/.framework/functions/_shared/agent-runner.ts +1296 -961
  22. package/.framework/functions/_shared/app-manifest.ts +82 -68
  23. package/.framework/functions/_shared/audit.ts +135 -83
  24. package/.framework/functions/_shared/{cil-state.ts → cil.ts} +158 -56
  25. package/.framework/functions/_shared/db.ts +80 -126
  26. package/.framework/functions/_shared/hash-api-key.ts +63 -0
  27. package/.framework/functions/_shared/index.ts +224 -335
  28. package/.framework/functions/_shared/kb.ts +319 -0
  29. package/.framework/functions/_shared/llm.ts +92 -0
  30. package/.framework/functions/_shared/logging.ts +288 -0
  31. package/.framework/functions/_shared/middleware.ts +329 -365
  32. package/.framework/functions/_shared/outcomes.ts +36 -0
  33. package/.framework/functions/_shared/permissions.ts +359 -643
  34. package/.framework/functions/_shared/pipeline-runner.ts +243 -316
  35. package/.framework/functions/_shared/principal.ts +376 -468
  36. package/.framework/functions/_shared/resolve-credentials.ts +102 -0
  37. package/.framework/functions/_shared/resolve-ids.ts +188 -16
  38. package/.framework/functions/_shared/retry-deliveries.ts +104 -0
  39. package/.framework/functions/_shared/schema-utils.ts +611 -373
  40. package/.framework/functions/_shared/testing.ts +207 -137
  41. package/.framework/functions/_shared/tracing.ts +276 -0
  42. package/.framework/functions/_shared/trigger-engine.ts +159 -211
  43. package/.framework/functions/_shared/webhook-registration.ts +95 -81
  44. package/.framework/functions/_shared/webhook-registry.ts +153 -75
  45. package/.framework/functions/account-nodes.ts +31 -53
  46. package/.framework/functions/adapters/generic-webhook-inbound.ts +56 -0
  47. package/.framework/functions/adapters/generic-webhook-outbound.ts +43 -0
  48. package/.framework/functions/adapters/openai-outbound.ts +40 -0
  49. package/.framework/functions/admin-data.ts +685 -537
  50. package/.framework/functions/admin-funnel.ts +31 -20
  51. package/.framework/functions/admin-install-funnel.ts +47 -28
  52. package/.framework/functions/admin-signals.ts +47 -29
  53. package/.framework/functions/ai-agents.ts +122 -147
  54. package/.framework/functions/ai-interactions.ts +180 -90
  55. package/.framework/functions/api-keys.ts +250 -192
  56. package/.framework/functions/apps.ts +203 -197
  57. package/.framework/functions/auth.ts +98 -91
  58. package/.framework/functions/cil-agent-ingest.ts +773 -0
  59. package/.framework/functions/cil-agent.ts +592 -0
  60. package/.framework/functions/cil-callmap.ts +1227 -0
  61. package/.framework/functions/cil-config.ts +583 -0
  62. package/.framework/functions/cil-context.ts +445 -0
  63. package/.framework/functions/cil-doc.ts +1752 -0
  64. package/.framework/functions/cil-embeddings.ts +1202 -0
  65. package/.framework/functions/cil-graph.ts +585 -0
  66. package/.framework/functions/cil-ingest.ts +2416 -0
  67. package/.framework/functions/cil-pipeline.ts +318 -0
  68. package/.framework/functions/cil-project.ts +499 -0
  69. package/.framework/functions/cil-validate.ts +469 -0
  70. package/.framework/functions/debug-auth.ts +73 -53
  71. package/.framework/functions/deliveries.ts +117 -0
  72. package/.framework/functions/embeddings.ts +528 -516
  73. package/.framework/functions/eval-harness.ts +158 -106
  74. package/.framework/functions/integration-outbound.ts +311 -0
  75. package/.framework/functions/integration-routes.ts +240 -466
  76. package/.framework/functions/integrations.ts +132 -140
  77. package/.framework/functions/invites.ts +401 -201
  78. package/.framework/functions/item-progress.ts +113 -53
  79. package/.framework/functions/kb.ts +28 -0
  80. package/.framework/functions/logs.ts +239 -222
  81. package/.framework/functions/observability.ts +308 -259
  82. package/.framework/functions/pipeline-executions.ts +179 -235
  83. package/.framework/functions/pipelines.ts +163 -205
  84. package/.framework/functions/prompt-configs.ts +109 -156
  85. package/.framework/functions/roles.ts +97 -147
  86. package/.framework/functions/system-cron.ts +132 -218
  87. package/.framework/functions/system.ts +112 -52
  88. package/.framework/functions/tests.ts +32 -28
  89. package/.framework/functions/timers.ts +162 -210
  90. package/.framework/functions/triggers.ts +282 -346
  91. package/.framework/functions/types.ts +283 -400
  92. package/.framework/migrations/001_core_schema.sql +630 -0
  93. package/.framework/migrations/002_core_rls_and_functions.sql +532 -0
  94. package/.framework/migrations/{003_system_data.sql → 003_core_system_data.sql} +26 -153
  95. package/.framework/migrations/004_core_rpc_and_broker.sql +421 -0
  96. package/.framework/migrations/005_core_observability.sql +598 -0
  97. package/.framework/migrations/006_security_hardening_rls.sql +97 -0
  98. package/.framework/migrations/007_kb_article_list.sql +237 -0
  99. package/.framework/migrations/008_items_target.sql +8 -0
  100. package/.framework/migrations/009_roles_slug_unique.sql +11 -0
  101. package/.framework/public/spine.config.json +91 -0
  102. package/.framework/scripts/app-install-cli.ts +112 -98
  103. package/.framework/src/App.tsx +67 -20
  104. package/.framework/src/apps/admin/index.tsx +97 -27
  105. package/.framework/src/components/AppWrapper.tsx +50 -11
  106. package/.framework/src/components/CustomAppLoader.tsx +131 -22
  107. package/.framework/src/components/admin/AdminListPage.tsx +75 -8
  108. package/.framework/src/components/admin/AdminSidebar.tsx +148 -36
  109. package/.framework/src/components/admin/AdminStatsCard.tsx +48 -29
  110. package/.framework/src/components/admin/PageInstructions.tsx +49 -0
  111. package/.framework/src/components/admin/SortableTableHeader.tsx +49 -2
  112. package/.framework/src/components/app-shell/GenericAppShell.tsx +69 -11
  113. package/.framework/src/components/app-shell/GenericDetailPage.tsx +55 -10
  114. package/.framework/src/components/app-shell/GenericListPage.tsx +76 -9
  115. package/.framework/src/components/app-sidebar.tsx +50 -3
  116. package/.framework/src/components/auth/ProtectedRoute.tsx +53 -45
  117. package/.framework/src/components/kb/KBArticleEditor.tsx +409 -0
  118. package/.framework/src/components/kb/KBArticleList.tsx +557 -0
  119. package/.framework/src/components/layout/AppShell.tsx +54 -16
  120. package/.framework/src/components/layout/Header.tsx +50 -38
  121. package/.framework/src/components/layout/Layout.tsx +48 -32
  122. package/.framework/src/components/layout/Sidebar.tsx +167 -16
  123. package/.framework/src/components/runtime/DataDetailHeader.tsx +33 -1
  124. package/.framework/src/components/runtime/DataDetailPage.tsx +289 -4
  125. package/.framework/src/components/runtime/DataFilters.tsx +78 -1
  126. package/.framework/src/components/runtime/DataHeader.tsx +32 -29
  127. package/.framework/src/components/runtime/DataListPage.tsx +161 -2
  128. package/.framework/src/components/runtime/DataStats.tsx +48 -1
  129. package/.framework/src/components/runtime/DataTable.tsx +153 -1
  130. package/.framework/src/components/runtime/SchemaDetailForm.tsx +77 -46
  131. package/.framework/src/components/runtime/index.ts +16 -9
  132. package/.framework/src/components/search-form.tsx +33 -1
  133. package/.framework/src/components/shared/AgentView.tsx +48 -51
  134. package/.framework/src/components/shared/FieldRenderer.tsx +84 -67
  135. package/.framework/src/components/shared/InviteManager.tsx +113 -52
  136. package/.framework/src/components/shared/MemberList.tsx +182 -0
  137. package/.framework/src/components/shared/SchemaFields.tsx +96 -78
  138. package/.framework/src/components/ui/DataTable.tsx +86 -56
  139. package/.framework/src/components/ui/Form.tsx +188 -109
  140. package/.framework/src/components/ui/ItemCard.tsx +86 -58
  141. package/.framework/src/components/ui/ItemListView.tsx +88 -61
  142. package/.framework/src/components/ui/LoadingSpinner.tsx +52 -27
  143. package/.framework/src/components/ui/Modal.tsx +81 -4
  144. package/.framework/src/components/ui/RichTextEditor.tsx +101 -9
  145. package/.framework/src/components/ui/accordion.tsx +97 -5
  146. package/.framework/src/components/ui/alert-dialog.tsx +225 -13
  147. package/.framework/src/components/ui/alert.tsx +113 -6
  148. package/.framework/src/components/ui/aspect-ratio.tsx +49 -2
  149. package/.framework/src/components/ui/avatar.tsx +129 -7
  150. package/.framework/src/components/ui/badge.tsx +65 -3
  151. package/.framework/src/components/ui/breadcrumb.tsx +145 -8
  152. package/.framework/src/components/ui/button-group.tsx +81 -4
  153. package/.framework/src/components/ui/button.tsx +49 -2
  154. package/.framework/src/components/ui/calendar.tsx +65 -3
  155. package/.framework/src/components/ui/card.tsx +145 -8
  156. package/.framework/src/components/ui/carousel.tsx +129 -7
  157. package/.framework/src/components/ui/chart.tsx +161 -10
  158. package/.framework/src/components/ui/checkbox.tsx +49 -2
  159. package/.framework/src/components/ui/collapsible.tsx +81 -5
  160. package/.framework/src/components/ui/combobox.tsx +305 -20
  161. package/.framework/src/components/ui/command.tsx +177 -11
  162. package/.framework/src/components/ui/context-menu.tsx +273 -17
  163. package/.framework/src/components/ui/dialog.tsx +209 -27
  164. package/.framework/src/components/ui/direction.tsx +64 -4
  165. package/.framework/src/components/ui/drawer.tsx +193 -12
  166. package/.framework/src/components/ui/dropdown-menu.tsx +273 -18
  167. package/.framework/src/components/ui/empty.tsx +145 -9
  168. package/.framework/src/components/ui/field.tsx +209 -14
  169. package/.framework/src/components/ui/hover-card.tsx +81 -4
  170. package/.framework/src/components/ui/input-group.tsx +162 -10
  171. package/.framework/src/components/ui/input-otp.tsx +98 -5
  172. package/.framework/src/components/ui/input.tsx +49 -2
  173. package/.framework/src/components/ui/item.tsx +225 -13
  174. package/.framework/src/components/ui/kbd.tsx +65 -3
  175. package/.framework/src/components/ui/label.tsx +49 -2
  176. package/.framework/src/components/ui/menubar.tsx +289 -17
  177. package/.framework/src/components/ui/native-select.tsx +97 -5
  178. package/.framework/src/components/ui/navigation-menu.tsx +177 -10
  179. package/.framework/src/components/ui/pagination.tsx +161 -9
  180. package/.framework/src/components/ui/popover.tsx +145 -8
  181. package/.framework/src/components/ui/progress.tsx +49 -2
  182. package/.framework/src/components/ui/radio-group.tsx +65 -3
  183. package/.framework/src/components/ui/resizable.tsx +82 -4
  184. package/.framework/src/components/ui/scroll-area.tsx +65 -3
  185. package/.framework/src/components/ui/select.tsx +193 -11
  186. package/.framework/src/components/ui/separator.tsx +49 -2
  187. package/.framework/src/components/ui/sheet.tsx +193 -11
  188. package/.framework/src/components/ui/sidebar.tsx +481 -38
  189. package/.framework/src/components/ui/skeleton.tsx +49 -2
  190. package/.framework/src/components/ui/slider.tsx +49 -2
  191. package/.framework/src/components/ui/sonner.tsx +49 -2
  192. package/.framework/src/components/ui/spinner.tsx +49 -2
  193. package/.framework/src/components/ui/switch.tsx +49 -2
  194. package/.framework/src/components/ui/table-primitives.tsx +160 -33
  195. package/.framework/src/components/ui/table.tsx +161 -9
  196. package/.framework/src/components/ui/tabs.tsx +113 -6
  197. package/.framework/src/components/ui/textarea.tsx +49 -2
  198. package/.framework/src/components/ui/toggle-group.tsx +81 -4
  199. package/.framework/src/components/ui/toggle.tsx +65 -3
  200. package/.framework/src/components/ui/tooltip.tsx +97 -5
  201. package/.framework/src/contexts/AppContext.tsx +129 -45
  202. package/.framework/src/contexts/AuthContext.tsx +187 -144
  203. package/.framework/src/hooks/use-mobile.ts +48 -2
  204. package/.framework/src/hooks/useApi.ts +208 -159
  205. package/.framework/src/hooks/useAppPath.ts +32 -23
  206. package/.framework/src/hooks/useApps.ts +51 -20
  207. package/.framework/src/hooks/useEntityList.ts +32 -78
  208. package/.framework/src/hooks/useEntityRecord.ts +35 -96
  209. package/.framework/src/hooks/useForm.ts +32 -92
  210. package/.framework/src/hooks/useListSchema.ts +49 -78
  211. package/.framework/src/hooks/useSchemaRecord.ts +114 -105
  212. package/.framework/src/lib/api.ts +195 -116
  213. package/.framework/src/lib/supabase.ts +98 -64
  214. package/.framework/src/lib/utils.ts +287 -151
  215. package/.framework/src/main.tsx +49 -3
  216. package/.framework/src/pages/DashboardPage.tsx +52 -29
  217. package/.framework/src/pages/NotFoundPage.tsx +32 -10
  218. package/.framework/src/pages/SetupPage.tsx +32 -12
  219. package/.framework/src/pages/admin/AIAgentDetailPage.tsx +119 -10
  220. package/.framework/src/pages/admin/AIAgentsPage.tsx +48 -19
  221. package/.framework/src/pages/admin/APIKeyDetailPage.tsx +187 -17
  222. package/.framework/src/pages/admin/APIKeysPage.tsx +98 -22
  223. package/.framework/src/pages/admin/AlertsConfigPage.tsx +113 -26
  224. package/.framework/src/pages/admin/AppDetailPage.tsx +125 -8
  225. package/.framework/src/pages/admin/AppsPage.tsx +49 -2
  226. package/.framework/src/pages/admin/DeliveriesPage.tsx +196 -0
  227. package/.framework/src/pages/admin/DesignedPage.tsx +32 -18
  228. package/.framework/src/pages/admin/EmbeddingDetailPage.tsx +215 -484
  229. package/.framework/src/pages/admin/EmbeddingsPage.tsx +116 -319
  230. package/.framework/src/pages/admin/ExtendedShadcnTestPage.tsx +34 -9
  231. package/.framework/src/pages/admin/IncrementalShadcnTestPage.tsx +34 -9
  232. package/.framework/src/pages/admin/IntegratedDashboard.tsx +32 -16
  233. package/.framework/src/pages/admin/IntegrationDetailPage.tsx +183 -26
  234. package/.framework/src/pages/admin/IntegrationsPage.tsx +48 -19
  235. package/.framework/src/pages/admin/InvitesPage.tsx +48 -14
  236. package/.framework/src/pages/admin/LogsPage.tsx +422 -75
  237. package/.framework/src/pages/admin/MinimalShadcnTestPage.tsx +34 -9
  238. package/.framework/src/pages/admin/ObservabilityDashboard.tsx +113 -24
  239. package/.framework/src/pages/admin/PipelineDetailPage.tsx +206 -34
  240. package/.framework/src/pages/admin/PipelineExecutionsPage.tsx +50 -17
  241. package/.framework/src/pages/admin/PipelinesPage.tsx +160 -21
  242. package/.framework/src/pages/admin/PromptConfigDetailPage.tsx +378 -88
  243. package/.framework/src/pages/admin/PromptConfigsPage.tsx +125 -16
  244. package/.framework/src/pages/admin/ProperlyDesignedPage.tsx +49 -10
  245. package/.framework/src/pages/admin/RoleDetailPage.tsx +130 -10
  246. package/.framework/src/pages/admin/RolesPage.tsx +171 -18
  247. package/.framework/src/pages/admin/SelectTestPage.tsx +34 -9
  248. package/.framework/src/pages/admin/ShadcnTestPage.tsx +49 -11
  249. package/.framework/src/pages/admin/SimpleDashboard.tsx +49 -10
  250. package/.framework/src/pages/admin/TestRunDetailPage.tsx +49 -4
  251. package/.framework/src/pages/admin/TestingDashboard.tsx +98 -28
  252. package/.framework/src/pages/admin/TimerDetailPage.tsx +143 -33
  253. package/.framework/src/pages/admin/TimersPage.tsx +48 -20
  254. package/.framework/src/pages/admin/TriggerDetailPage.tsx +118 -30
  255. package/.framework/src/pages/admin/TriggersPage.tsx +64 -19
  256. package/.framework/src/pages/admin/TypeDetailPage.tsx +138 -15
  257. package/.framework/src/pages/admin/TypesPage.tsx +48 -20
  258. package/.framework/src/pages/admin/cil/CILAgentPage.tsx +465 -0
  259. package/.framework/src/pages/admin/cil/CILChunkDetailPage.tsx +787 -0
  260. package/.framework/src/pages/admin/cil/CILDashboardPage.tsx +699 -0
  261. package/.framework/src/pages/admin/cil/CILFileListPage.tsx +647 -0
  262. package/.framework/src/pages/admin/cil/CILGraphPage.tsx +616 -0
  263. package/.framework/src/pages/admin/cil/CILIngestionPage.tsx +1402 -0
  264. package/.framework/src/pages/admin/cil/CILProjectsPage.tsx +614 -0
  265. package/.framework/src/pages/admin/cil/CILSearchPage.tsx +571 -0
  266. package/.framework/src/pages/admin/cil/FlexiblePipelinePage.tsx +731 -0
  267. package/.framework/src/pages/admin/kb/KBAdminPage.tsx +64 -0
  268. package/.framework/src/pages/auth/AuthConfirmPage.tsx +52 -51
  269. package/.framework/src/pages/auth/ForgotPasswordPage.tsx +31 -22
  270. package/.framework/src/pages/auth/LoginPage.tsx +50 -23
  271. package/.framework/src/pages/auth/PendingApprovalPage.tsx +31 -15
  272. package/.framework/src/pages/auth/RegisterPage.tsx +281 -317
  273. package/.framework/src/pages/spine-framework/APIPage.tsx +33 -0
  274. package/.framework/src/pages/spine-framework/CLIPage.tsx +33 -0
  275. package/.framework/src/types/auth.ts +128 -71
  276. package/.framework/src/types/types.ts +373 -157
  277. package/custom/.devin/skills/spine-workbench-discovery/SKILL.md +39 -0
  278. package/custom/.devin/skills/spine-workbench-idea/SKILL.md +36 -0
  279. package/custom/.devin/skills/spine-workbench-implement/SKILL.md +46 -0
  280. package/custom/.devin/skills/spine-workbench-initiative/SKILL.md +28 -0
  281. package/custom/.devin/skills/spine-workbench-plan/SKILL.md +38 -0
  282. package/docs/README.md +9 -130
  283. package/netlify.toml +5 -2
  284. package/package.json +13 -25
  285. package/scripts/kb-ingest-docs.ts +203 -0
  286. package/spine.config.json +65 -4
  287. package/.framework/migrations/001_schema.sql +0 -425
  288. package/.framework/migrations/002_rls_and_functions.sql +0 -763
  289. package/.framework/migrations/004_enhancements.sql +0 -43
  290. package/.framework/migrations/005_auth_user_trigger.sql +0 -105
  291. package/.framework/migrations/006_fix_current_actor_id.sql +0 -21
  292. package/.framework/migrations/016_invites.sql +0 -27
  293. package/.framework/migrations/017_fix_get_account_apps.sql +0 -78
  294. package/.framework/migrations/018_apps_required_roles.sql +0 -17
  295. package/.framework/migrations/019_triggers_unique_constraint.sql +0 -13
  296. package/.framework/migrations/020_get_account_apps_role_filter.sql +0 -117
  297. package/.framework/migrations/021_app_domains.sql +0 -112
  298. package/.framework/migrations/022_route_prefix_domain_unique.sql +0 -21
  299. package/.framework/migrations/023_match_embeddings_rpc.sql +0 -78
  300. package/.framework/migrations/024_messages_account_id.sql +0 -9
  301. package/.framework/migrations/025_retype_threads_messages.sql +0 -240
  302. package/.framework/migrations/026_fix_rls_policies.sql +0 -47
  303. package/.framework/migrations/027_embedding_lifecycle.sql +0 -176
  304. package/.framework/migrations/028_fix_message_data_permissions.sql +0 -49
  305. package/.framework/migrations/029_tighten_support_triage_prompt.sql +0 -41
  306. package/.framework/migrations/030_messages_updated_by.sql +0 -6
  307. package/.framework/migrations/031_seed_upsert_constraints.sql +0 -35
  308. package/docs/APPS.md +0 -232
  309. package/docs/ARCHITECTURE.md +0 -246
  310. package/docs/INSTALL.md +0 -155
  311. package/docs/design-schema-spec.md +0 -1837
  312. package/docs/dev-guides/01-create-an-app.md +0 -183
  313. package/docs/dev-guides/02-create-a-function.md +0 -178
  314. package/docs/dev-guides/03-create-a-component.md +0 -178
  315. package/docs/dev-guides/04-webhook-handlers.md +0 -129
  316. package/docs/dev-guides/05-testing.md +0 -168
  317. package/docs/dev-guides/README.md +0 -40
  318. package/docs/npm-packages-plan.md +0 -288
  319. 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
- * Diagnostic snapshot: confirms the middleware is running and reports
33
- * whether a principal was resolved plus env var presence/absence.
34
- *
35
- * @returns `{ data: { message, hasPrincipal, principalType, requestId, envVars } }`
36
- * @sideEffects none
37
- * @calledBy handler (?method=debug or default)
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
- * Validates that the provided JWT was successfully decoded by middleware.
57
- * Returns principal type, id, and accountId on success.
58
- *
59
- * @returns `{ data: { tokenValid, principal } }` or `{ data: null, error: string }`
60
- * @sideEffects none
61
- * @calledBy handler (?method=testJwt)
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
- // ─── MAIN HANDLER ────────────────────────────────────────────────────────────
85
-
86
- /**
87
- * Netlify function entry point. Routes by ?method (debug | testJwt),
88
- * defaulting to debug. Note: uses raw Netlify event/context signature
89
- * rather than `createHandler` wrapper to allow unauthenticated access.
90
- * @calledBy Netlify function routing (GET)
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"]