spine-framework 0.3.144 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (451) hide show
  1. package/.env.example +76 -0
  2. package/.framework/.spine-manifest.json +19 -0
  3. package/.framework/cli/commands/agents.ts +61 -33
  4. package/.framework/cli/commands/auth.ts +60 -28
  5. package/.framework/cli/commands/create-app.ts +212 -80
  6. package/.framework/cli/commands/dev.ts +184 -68
  7. package/.framework/cli/commands/doctor.ts +324 -152
  8. package/.framework/cli/commands/generate.ts +119 -68
  9. package/.framework/cli/commands/init.ts +141 -242
  10. package/.framework/cli/commands/install-app.ts +1336 -314
  11. package/.framework/cli/commands/items.ts +31 -29
  12. package/.framework/cli/commands/migrate.ts +299 -156
  13. package/.framework/cli/commands/migrations.ts +62 -30
  14. package/.framework/cli/commands/pipelines.ts +31 -29
  15. package/.framework/cli/commands/status.ts +105 -45
  16. package/.framework/cli/commands/system.ts +47 -42
  17. package/.framework/cli/commands/test.ts +161 -102
  18. package/.framework/cli/commands/upgrade.ts +260 -0
  19. package/.framework/cli/commands/validate-app.ts +517 -161
  20. package/.framework/cli/context.ts +117 -85
  21. package/.framework/cli/env-loader.ts +74 -43
  22. package/.framework/cli/index.ts +70 -46
  23. package/.framework/cli/lib/project-files.ts +404 -0
  24. package/.framework/docs/guides/testing-guide.md +1 -1
  25. package/.framework/docs/runtime-types.md +72 -72
  26. package/.framework/functions/_shared/access.ts +84 -0
  27. package/.framework/functions/_shared/agent-runner.ts +5051 -1026
  28. package/.framework/functions/_shared/app-manifest.ts +214 -94
  29. package/.framework/functions/_shared/ast.ts +214 -0
  30. package/.framework/functions/_shared/audit.ts +91 -55
  31. package/.framework/functions/_shared/cil.ts +368 -127
  32. package/.framework/functions/_shared/db.ts +337 -68
  33. package/.framework/functions/_shared/funnel.ts +228 -0
  34. package/.framework/functions/_shared/geo.ts +105 -0
  35. package/.framework/functions/_shared/hash-api-key.ts +94 -17
  36. package/.framework/functions/_shared/index.ts +22 -224
  37. package/.framework/functions/_shared/kb.ts +832 -58
  38. package/.framework/functions/_shared/llm.ts +118 -18
  39. package/.framework/functions/_shared/logging.ts +317 -19
  40. package/.framework/functions/_shared/middleware.ts +701 -131
  41. package/.framework/functions/_shared/notify.ts +70 -0
  42. package/.framework/functions/_shared/outcomes.ts +34 -19
  43. package/.framework/functions/_shared/permissions.ts +501 -315
  44. package/.framework/functions/_shared/pipeline-runner.ts +704 -155
  45. package/.framework/functions/_shared/principal.ts +436 -263
  46. package/.framework/functions/_shared/rate-limit.ts +233 -0
  47. package/.framework/functions/_shared/resolve-credentials.ts +86 -19
  48. package/.framework/functions/_shared/resolve-ids.ts +203 -139
  49. package/.framework/functions/_shared/retry-deliveries.ts +51 -16
  50. package/.framework/functions/_shared/schema-utils.ts +602 -521
  51. package/.framework/functions/_shared/security.ts +345 -0
  52. package/.framework/functions/_shared/testing.ts +197 -172
  53. package/.framework/functions/_shared/tracing.ts +351 -21
  54. package/.framework/functions/_shared/trigger-engine.ts +425 -136
  55. package/.framework/functions/_shared/webhook-registration.ts +71 -70
  56. package/.framework/functions/_shared/webhook-registry.ts +126 -83
  57. package/.framework/functions/account-nodes.ts +30 -30
  58. package/.framework/functions/adapters/generic-webhook-inbound.ts +49 -16
  59. package/.framework/functions/adapters/generic-webhook-outbound.ts +17 -17
  60. package/.framework/functions/adapters/openai-outbound.ts +15 -16
  61. package/.framework/functions/admin-data.ts +596 -173
  62. package/.framework/functions/admin-funnel.ts +64 -60
  63. package/.framework/functions/admin-install-funnel.ts +84 -66
  64. package/.framework/functions/admin-signals.ts +69 -51
  65. package/.framework/functions/ai-agents.ts +431 -106
  66. package/.framework/functions/ai-interactions.ts +186 -112
  67. package/.framework/functions/api-keys.ts +107 -107
  68. package/.framework/functions/apps.ts +154 -136
  69. package/.framework/functions/auth.ts +83 -65
  70. package/.framework/functions/cil-agent-ingest.ts +189 -232
  71. package/.framework/functions/cil-agent.ts +433 -177
  72. package/.framework/functions/cil-callmap.ts +642 -430
  73. package/.framework/functions/cil-config.ts +139 -135
  74. package/.framework/functions/cil-context.ts +214 -127
  75. package/.framework/functions/cil-doc.ts +587 -458
  76. package/.framework/functions/cil-embeddings.ts +453 -364
  77. package/.framework/functions/cil-graph.ts +427 -142
  78. package/.framework/functions/cil-ingest.ts +1418 -1154
  79. package/.framework/functions/cil-pipeline.ts +276 -21
  80. package/.framework/functions/cil-project.ts +659 -132
  81. package/.framework/functions/cil-validate.ts +198 -164
  82. package/.framework/functions/debug-auth.ts +57 -55
  83. package/.framework/functions/deliveries.ts +80 -21
  84. package/.framework/functions/embeddings.ts +1023 -318
  85. package/.framework/functions/eval-harness.ts +146 -108
  86. package/.framework/functions/integration-outbound.ts +205 -75
  87. package/.framework/functions/integration-routes.ts +128 -23
  88. package/.framework/functions/integrations.ts +125 -100
  89. package/.framework/functions/invites.ts +1095 -460
  90. package/.framework/functions/item-progress.ts +158 -102
  91. package/.framework/functions/kb.ts +34 -10
  92. package/.framework/functions/logs.ts +133 -133
  93. package/.framework/functions/observability.ts +152 -122
  94. package/.framework/functions/pipeline-executions.ts +147 -132
  95. package/.framework/functions/pipelines.ts +134 -119
  96. package/.framework/functions/prompt-configs.ts +96 -80
  97. package/.framework/functions/roles.ts +112 -82
  98. package/.framework/functions/security.ts +450 -0
  99. package/.framework/functions/system-cron.ts +117 -80
  100. package/.framework/functions/system.ts +158 -98
  101. package/.framework/functions/tests.ts +29 -29
  102. package/.framework/functions/timers.ts +94 -95
  103. package/.framework/functions/trigger-scheduler.ts +10 -0
  104. package/.framework/functions/triggers.ts +179 -149
  105. package/.framework/functions/types.ts +137 -125
  106. package/.framework/mcp/index.ts +133 -0
  107. package/.framework/mcp/load-env.ts +60 -0
  108. package/.framework/mcp/shared/app-manifest.ts +275 -0
  109. package/.framework/mcp/shared/db.ts +477 -0
  110. package/.framework/mcp/shared/kb.ts +118 -0
  111. package/.framework/mcp/tools/architect.ts +431 -0
  112. package/.framework/mcp/tools/cil/context.ts +345 -0
  113. package/.framework/mcp/tools/cil/graph.ts +242 -0
  114. package/.framework/mcp/tools/cil/ingest.ts +1217 -0
  115. package/.framework/mcp/tools/cil/pipeline-orchestrator.ts +693 -0
  116. package/.framework/mcp/tools/cil/pipeline.ts +767 -0
  117. package/.framework/mcp/tools/cil/project.ts +791 -0
  118. package/.framework/mcp/tools/cil/retrieval.ts +336 -0
  119. package/.framework/mcp/tools/cil/search-core.ts +454 -0
  120. package/.framework/mcp/tools/cil/search.ts +97 -0
  121. package/.framework/mcp/tools/cil/suggest.ts +186 -0
  122. package/.framework/mcp/tools/cil/validate.ts +1369 -0
  123. package/.framework/mcp/tools/kb/delete.ts +139 -0
  124. package/.framework/mcp/tools/kb/index.ts +52 -0
  125. package/.framework/mcp/tools/kb/ingest.ts +84 -0
  126. package/.framework/mcp/tools/kb/list-types.ts +102 -0
  127. package/.framework/mcp/tools/kb/publish.ts +100 -0
  128. package/.framework/mcp/tools/kb/reindex.ts +86 -0
  129. package/.framework/mcp/tools/kb/revoke.ts +85 -0
  130. package/.framework/mcp/tools/kb/search.ts +101 -0
  131. package/.framework/mcp/tools/kb/upsert.ts +125 -0
  132. package/.framework/mcp/tools/observability.ts +510 -0
  133. package/.framework/migrations/001_core_schema.sql +15 -0
  134. package/.framework/migrations/002_core_rls_and_functions.sql +15 -0
  135. package/.framework/migrations/003_core_system_data.sql +16 -1
  136. package/.framework/migrations/004_core_rpc_and_broker.sql +17 -1
  137. package/.framework/migrations/005_core_observability.sql +17 -1
  138. package/.framework/migrations/006_security_hardening_rls.sql +15 -0
  139. package/.framework/migrations/007_kb_article_list.sql +17 -1
  140. package/.framework/migrations/008_items_target.sql +15 -0
  141. package/.framework/migrations/009_roles_slug_unique.sql +15 -0
  142. package/.framework/migrations/010_auth_user_trigger.sql +15 -0
  143. package/.framework/migrations/011_spine_system_account.sql +16 -0
  144. package/.framework/migrations/012_service_role_grants.sql +16 -0
  145. package/.framework/migrations/013_get_account_apps_role_filter.sql +15 -0
  146. package/.framework/migrations/014_apps_required_roles.sql +16 -0
  147. package/.framework/migrations/015_types_kind_slug_unique.sql +20 -0
  148. package/.framework/migrations/016_cil_types.sql +281 -0
  149. package/.framework/migrations/017_cil_stable_ids.sql +37 -0
  150. package/.framework/migrations/018_runtime_tables.sql +129 -0
  151. package/.framework/migrations/019_agent_prompt_columns.sql +56 -0
  152. package/.framework/migrations/020_schema_reconciliation.sql +67 -0
  153. package/.framework/migrations/021_kb_embedding_lifecycle.sql +31 -0
  154. package/.framework/migrations/032_cil_status_migration.sql +73 -0
  155. package/.framework/migrations/033_cil_versioning.sql +73 -0
  156. package/.framework/migrations/034_match_embeddings_knn.sql +115 -0
  157. package/.framework/migrations/035_rate_limits.sql +55 -0
  158. package/.framework/migrations/036_demo_record_flags.sql +72 -0
  159. package/.framework/migrations/037_kb_types_canonical.sql +244 -0
  160. package/.framework/migrations/038_drop_demo_record_flags.sql +38 -0
  161. package/.framework/migrations/042_registration_hierarchy.sql +309 -0
  162. package/.framework/migrations/043_policy_actor_cleanup.sql +39 -0
  163. package/.framework/migrations/044_match_embeddings_filtered_knn.sql +151 -0
  164. package/.framework/migrations/045_security_critical_rls.sql +139 -0
  165. package/.framework/migrations/046_security_missing_rls.sql +79 -0
  166. package/.framework/migrations/047_people_updated_by.sql +27 -0
  167. package/.framework/migrations/048_watcher_last_seen_at.sql +24 -0
  168. package/.framework/migrations/049_security_blocklist.sql +148 -0
  169. package/.framework/migrations/050_notifications.sql +49 -0
  170. package/.framework/migrations/051_message_agent_fields.sql +74 -0
  171. package/.framework/migrations/052_registration_security.sql +421 -0
  172. package/.framework/migrations/053_builtin_action_seeds.sql +66 -0
  173. package/.framework/migrations/054_kb_ingest_lease.sql +157 -0
  174. package/.framework/migrations/055_type_id_drift_reconciliation.sql +33 -0
  175. package/.framework/migrations/056_slug_column_reconciliation.sql +38 -0
  176. package/.framework/migrations/057_pipelines_slug_identity.sql +14 -0
  177. package/.framework/migrations/058_account_data_field_declarations.sql +53 -0
  178. package/.framework/migrations/059_registration_placement_fixes.sql +269 -0
  179. package/.framework/migrations/060_account_person_record_permissions.sql +38 -0
  180. package/.framework/migrations/061_fk_dedup.sql +32 -0
  181. package/.framework/public/spine-logo.svg +10 -3
  182. package/.framework/scripts/app-install-cli.ts +190 -93
  183. package/.framework/scripts/assemble-frontend.sh +127 -44
  184. package/.framework/scripts/assemble-functions.sh +128 -30
  185. package/.framework/scripts/boundary-check.sh +6 -2
  186. package/.framework/scripts/build-manifest.sh +24 -68
  187. package/.framework/scripts/check-core-integrity.sh +15 -76
  188. package/.framework/scripts/checksum-manifest.mts +343 -0
  189. package/.framework/scripts/cil-migrate-markers.ts +403 -0
  190. package/.framework/scripts/fix-cil-markers.mjs +176 -0
  191. package/.framework/scripts/verify-integrity.sh +21 -57
  192. package/.framework/scripts/verify-manifest.mts +305 -0
  193. package/.framework/seeds/types/funnel_signal_use.json +74 -21
  194. package/.framework/seeds/types/spine_instance.json +73 -21
  195. package/.framework/src/App.tsx +118 -72
  196. package/.framework/src/apps/admin/index.tsx +855 -58
  197. package/.framework/src/components/AppWrapper.tsx +43 -45
  198. package/.framework/src/components/CustomAppLoader.tsx +160 -116
  199. package/.framework/src/components/admin/AdminListPage.tsx +46 -44
  200. package/.framework/src/components/admin/AdminSidebar.tsx +57 -47
  201. package/.framework/src/components/admin/AdminStatsCard.tsx +46 -44
  202. package/.framework/src/components/admin/PageInstructions.tsx +98 -2
  203. package/.framework/src/components/admin/SortableTableHeader.tsx +44 -45
  204. package/.framework/src/components/app-shell/GenericAppShell.tsx +64 -65
  205. package/.framework/src/components/app-shell/GenericDetailPage.tsx +44 -47
  206. package/.framework/src/components/app-shell/GenericListPage.tsx +45 -49
  207. package/.framework/src/components/app-sidebar.tsx +42 -45
  208. package/.framework/src/components/auth/ProtectedRoute.tsx +48 -41
  209. package/.framework/src/components/auth/TurnstileWidget.tsx +27 -0
  210. package/.framework/src/components/kb/KBArticleEditor.tsx +231 -22
  211. package/.framework/src/components/kb/KBArticleList.tsx +251 -10
  212. package/.framework/src/components/layout/AppShell.tsx +51 -45
  213. package/.framework/src/components/layout/Header.tsx +42 -43
  214. package/.framework/src/components/layout/Layout.tsx +46 -46
  215. package/.framework/src/components/layout/Sidebar.tsx +196 -96
  216. package/.framework/src/components/runtime/DataDetailHeader.tsx +55 -30
  217. package/.framework/src/components/runtime/DataDetailPage.tsx +31 -269
  218. package/.framework/src/components/runtime/DataFilters.tsx +49 -74
  219. package/.framework/src/components/runtime/DataHeader.tsx +53 -32
  220. package/.framework/src/components/runtime/DataListPage.tsx +51 -155
  221. package/.framework/src/components/runtime/DataStats.tsx +66 -44
  222. package/.framework/src/components/runtime/DataTable.tsx +49 -149
  223. package/.framework/src/components/runtime/SchemaDetailForm.tsx +45 -75
  224. package/.framework/src/components/runtime/index.ts +119 -16
  225. package/.framework/src/components/search-form.tsx +46 -29
  226. package/.framework/src/components/shared/AgentView.tsx +65 -48
  227. package/.framework/src/components/shared/FieldRenderer.tsx +144 -50
  228. package/.framework/src/components/shared/InviteManager.tsx +207 -97
  229. package/.framework/src/components/shared/MemberList.tsx +97 -0
  230. package/.framework/src/components/shared/SchemaFields.tsx +107 -86
  231. package/.framework/src/components/ui/DataTable.tsx +80 -68
  232. package/.framework/src/components/ui/Form.tsx +157 -146
  233. package/.framework/src/components/ui/ItemCard.tsx +74 -67
  234. package/.framework/src/components/ui/ItemListView.tsx +73 -68
  235. package/.framework/src/components/ui/LoadingSpinner.tsx +43 -48
  236. package/.framework/src/components/ui/Modal.tsx +78 -68
  237. package/.framework/src/components/ui/RichTextEditor.tsx +89 -69
  238. package/.framework/src/components/ui/accordion.tsx +85 -86
  239. package/.framework/src/components/ui/alert-dialog.tsx +197 -184
  240. package/.framework/src/components/ui/alert.tsx +105 -94
  241. package/.framework/src/components/ui/aspect-ratio.tsx +57 -43
  242. package/.framework/src/components/ui/avatar.tsx +122 -107
  243. package/.framework/src/components/ui/badge.tsx +60 -55
  244. package/.framework/src/components/ui/breadcrumb.tsx +127 -128
  245. package/.framework/src/components/ui/button-group.tsx +86 -72
  246. package/.framework/src/components/ui/button.tsx +71 -50
  247. package/.framework/src/components/ui/calendar.tsx +72 -57
  248. package/.framework/src/components/ui/card.tsx +136 -129
  249. package/.framework/src/components/ui/carousel.tsx +226 -107
  250. package/.framework/src/components/ui/chart.tsx +252 -147
  251. package/.framework/src/components/ui/checkbox.tsx +43 -44
  252. package/.framework/src/components/ui/collapsible.tsx +86 -71
  253. package/.framework/src/components/ui/combobox.tsx +282 -249
  254. package/.framework/src/components/ui/command.tsx +158 -146
  255. package/.framework/src/components/ui/context-menu.tsx +239 -240
  256. package/.framework/src/components/ui/dialog.tsx +174 -157
  257. package/.framework/src/components/ui/direction.tsx +72 -56
  258. package/.framework/src/components/ui/drawer.tsx +168 -169
  259. package/.framework/src/components/ui/dropdown-menu.tsx +254 -223
  260. package/.framework/src/components/ui/empty.tsx +131 -120
  261. package/.framework/src/components/ui/field.tsx +205 -173
  262. package/.framework/src/components/ui/hover-card.tsx +71 -72
  263. package/.framework/src/components/ui/input-group.tsx +148 -133
  264. package/.framework/src/components/ui/input-otp.tsx +99 -86
  265. package/.framework/src/components/ui/input.tsx +43 -41
  266. package/.framework/src/components/ui/item.tsx +207 -185
  267. package/.framework/src/components/ui/kbd.tsx +57 -56
  268. package/.framework/src/components/ui/label.tsx +45 -41
  269. package/.framework/src/components/ui/menubar.tsx +268 -236
  270. package/.framework/src/components/ui/native-select.tsx +85 -86
  271. package/.framework/src/components/ui/navigation-menu.tsx +166 -156
  272. package/.framework/src/components/ui/pagination.tsx +131 -141
  273. package/.framework/src/components/ui/popover.tsx +125 -128
  274. package/.framework/src/components/ui/progress.tsx +47 -44
  275. package/.framework/src/components/ui/radio-group.tsx +60 -55
  276. package/.framework/src/components/ui/resizable.tsx +85 -72
  277. package/.framework/src/components/ui/scroll-area.tsx +57 -58
  278. package/.framework/src/components/ui/select.tsx +182 -169
  279. package/.framework/src/components/ui/separator.tsx +42 -43
  280. package/.framework/src/components/ui/sheet.tsx +170 -159
  281. package/.framework/src/components/ui/sidebar.tsx +395 -398
  282. package/.framework/src/components/ui/skeleton.tsx +42 -43
  283. package/.framework/src/components/ui/slider.tsx +61 -44
  284. package/.framework/src/components/ui/sonner.tsx +44 -44
  285. package/.framework/src/components/ui/spinner.tsx +47 -42
  286. package/.framework/src/components/ui/switch.tsx +56 -42
  287. package/.framework/src/components/ui/table-primitives.tsx +272 -132
  288. package/.framework/src/components/ui/table.tsx +140 -142
  289. package/.framework/src/components/ui/tabs.tsx +110 -93
  290. package/.framework/src/components/ui/textarea.tsx +43 -44
  291. package/.framework/src/components/ui/toggle-group.tsx +87 -71
  292. package/.framework/src/components/ui/toggle.tsx +56 -56
  293. package/.framework/src/components/ui/tooltip.tsx +99 -85
  294. package/.framework/src/contexts/AppContext.tsx +166 -114
  295. package/.framework/src/contexts/AuthContext.tsx +232 -137
  296. package/.framework/src/hooks/use-mobile.ts +43 -44
  297. package/.framework/src/hooks/useApi.ts +185 -172
  298. package/.framework/src/hooks/useAppPath.ts +31 -29
  299. package/.framework/src/hooks/useApps.ts +77 -42
  300. package/.framework/src/hooks/useEntityList.ts +66 -29
  301. package/.framework/src/hooks/useEntityRecord.ts +76 -32
  302. package/.framework/src/hooks/useForm.ts +62 -30
  303. package/.framework/src/hooks/useListSchema.ts +60 -43
  304. package/.framework/src/hooks/useSchemaRecord.ts +115 -95
  305. package/.framework/src/lib/api.ts +258 -134
  306. package/.framework/src/lib/registration.ts +181 -0
  307. package/.framework/src/lib/supabase.ts +118 -81
  308. package/.framework/src/lib/utils.ts +266 -266
  309. package/.framework/src/main.tsx +43 -44
  310. package/.framework/src/pages/DashboardPage.tsx +44 -43
  311. package/.framework/src/pages/NoAppPage.tsx +50 -0
  312. package/.framework/src/pages/NotFoundPage.tsx +32 -29
  313. package/.framework/src/pages/SetupPage.tsx +34 -33
  314. package/.framework/src/pages/admin/AIAgentDetailPage.tsx +69 -58
  315. package/.framework/src/pages/admin/AIAgentsPage.tsx +43 -40
  316. package/.framework/src/pages/admin/APIKeyDetailPage.tsx +63 -55
  317. package/.framework/src/pages/admin/APIKeysPage.tsx +44 -42
  318. package/.framework/src/pages/admin/AlertsConfigPage.tsx +117 -94
  319. package/.framework/src/pages/admin/AppDetailPage.tsx +48 -42
  320. package/.framework/src/pages/admin/AppsPage.tsx +45 -42
  321. package/.framework/src/pages/admin/DeliveriesPage.tsx +49 -17
  322. package/.framework/src/pages/admin/DesignedPage.tsx +31 -30
  323. package/.framework/src/pages/admin/EmbeddingDetailPage.tsx +58 -0
  324. package/.framework/src/pages/admin/EmbeddingsPage.tsx +49 -0
  325. package/.framework/src/pages/admin/ExtendedShadcnTestPage.tsx +31 -29
  326. package/.framework/src/pages/admin/IncrementalShadcnTestPage.tsx +46 -29
  327. package/.framework/src/pages/admin/IntegratedDashboard.tsx +32 -29
  328. package/.framework/src/pages/admin/IntegrationDetailPage.tsx +68 -55
  329. package/.framework/src/pages/admin/IntegrationsPage.tsx +45 -42
  330. package/.framework/src/pages/admin/InvitesPage.tsx +60 -44
  331. package/.framework/src/pages/admin/LogsPage.tsx +87 -137
  332. package/.framework/src/pages/admin/MinimalShadcnTestPage.tsx +31 -29
  333. package/.framework/src/pages/admin/ObservabilityDashboard.tsx +150 -89
  334. package/.framework/src/pages/admin/PipelineDetailPage.tsx +77 -104
  335. package/.framework/src/pages/admin/PipelineExecutionsPage.tsx +44 -43
  336. package/.framework/src/pages/admin/PipelinesPage.tsx +59 -145
  337. package/.framework/src/pages/admin/PromptConfigDetailPage.tsx +53 -42
  338. package/.framework/src/pages/admin/PromptConfigsPage.tsx +47 -117
  339. package/.framework/src/pages/admin/ProperlyDesignedPage.tsx +31 -44
  340. package/.framework/src/pages/admin/RoleDetailPage.tsx +49 -92
  341. package/.framework/src/pages/admin/RolesPage.tsx +47 -164
  342. package/.framework/src/pages/admin/SecurityPage.tsx +310 -0
  343. package/.framework/src/pages/admin/SelectTestPage.tsx +30 -32
  344. package/.framework/src/pages/admin/ShadcnTestPage.tsx +37 -44
  345. package/.framework/src/pages/admin/SimpleDashboard.tsx +32 -44
  346. package/.framework/src/pages/admin/TestRunDetailPage.tsx +97 -44
  347. package/.framework/src/pages/admin/TestingDashboard.tsx +126 -71
  348. package/.framework/src/pages/admin/TimerDetailPage.tsx +67 -55
  349. package/.framework/src/pages/admin/TimersPage.tsx +44 -42
  350. package/.framework/src/pages/admin/TriggerDetailPage.tsx +47 -42
  351. package/.framework/src/pages/admin/TriggersPage.tsx +58 -57
  352. package/.framework/src/pages/admin/TypeDetailPage.tsx +91 -55
  353. package/.framework/src/pages/admin/TypesPage.tsx +45 -42
  354. package/.framework/src/pages/admin/cil/CILAgentPage.tsx +258 -128
  355. package/.framework/src/pages/admin/cil/CILChunkDetailPage.tsx +127 -123
  356. package/.framework/src/pages/admin/cil/CILDashboardPage.tsx +308 -235
  357. package/.framework/src/pages/admin/cil/CILFileListPage.tsx +159 -110
  358. package/.framework/src/pages/admin/cil/CILFileSelectPage.tsx +432 -0
  359. package/.framework/src/pages/admin/cil/CILGraphPage.tsx +200 -178
  360. package/.framework/src/pages/admin/cil/CILIngestionPage.tsx +286 -239
  361. package/.framework/src/pages/admin/cil/CILProjectsPage.tsx +211 -90
  362. package/.framework/src/pages/admin/cil/CILSearchPage.tsx +156 -143
  363. package/.framework/src/pages/admin/cil/CILSuggestionsPage.tsx +379 -0
  364. package/.framework/src/pages/admin/cil/CILVersionsPage.tsx +337 -0
  365. package/.framework/src/pages/admin/cil/FlexiblePipelinePage.tsx +219 -214
  366. package/.framework/src/pages/admin/kb/KBAdminPage.tsx +64 -0
  367. package/.framework/src/pages/auth/AuthConfirmPage.tsx +135 -65
  368. package/.framework/src/pages/auth/ForgotPasswordPage.tsx +39 -31
  369. package/.framework/src/pages/auth/LoginPage.tsx +38 -32
  370. package/.framework/src/pages/auth/PendingApprovalPage.tsx +31 -28
  371. package/.framework/src/pages/auth/RegisterPage.tsx +429 -155
  372. package/.framework/src/pages/spine-framework/APIPage.tsx +33 -30
  373. package/.framework/src/pages/spine-framework/CLIPage.tsx +32 -30
  374. package/.framework/src/types/auth.ts +101 -93
  375. package/.framework/src/types/types.ts +283 -262
  376. package/.framework/templates/project.json +87 -0
  377. package/.framework/templates/spine.config.neutral.json +7 -0
  378. package/.framework/tests/api/api-surface.test.ts +381 -0
  379. package/.framework/tests/fixtures/seed.ts +427 -0
  380. package/.framework/tests/fixtures/teardown.ts +228 -0
  381. package/.framework/tests/reporter.ts +351 -0
  382. package/.framework/tests/setup.ts +135 -0
  383. package/.framework/tests/ui/ui-sweep.ts +278 -0
  384. package/.framework/tests/unit/admin-data-logger.test.ts +310 -0
  385. package/.framework/tests/unit/agent-runner.test.ts +2389 -0
  386. package/.framework/tests/unit/ai-interactions.test.ts +81 -0
  387. package/.framework/tests/unit/app-manifest.test.ts +359 -0
  388. package/.framework/tests/unit/assembly-scripts.test.ts +172 -0
  389. package/.framework/tests/unit/cil-determinism.test.ts +85 -0
  390. package/.framework/tests/unit/core-isolation.test.ts +153 -0
  391. package/.framework/tests/unit/funnel-signals.test.ts +135 -0
  392. package/.framework/tests/unit/install-app.test.ts +1759 -0
  393. package/.framework/tests/unit/invites-security.test.ts +572 -0
  394. package/.framework/tests/unit/kb-ingest-lease.test.ts +287 -0
  395. package/.framework/tests/unit/kb-search.test.ts +119 -0
  396. package/.framework/tests/unit/migrate.test.ts +509 -0
  397. package/.framework/tests/unit/notify.test.ts +136 -0
  398. package/.framework/tests/unit/permissions.test.ts +269 -0
  399. package/.framework/tests/unit/pipeline-runner.test.ts +755 -0
  400. package/.framework/tests/unit/principal-cache.test.ts +138 -0
  401. package/.framework/tests/unit/retrieval-golden.test.ts +520 -0
  402. package/.framework/tests/unit/runtime-isolation.test.ts +642 -0
  403. package/.framework/tests/unit/schema-utils.test.ts +225 -0
  404. package/.framework/tests/unit/trigger-engine.test.ts +513 -0
  405. package/.framework/tests/unit/validate-app.test.ts +527 -0
  406. package/README.md +34 -3
  407. package/bin/spine-framework.cjs +1 -0
  408. package/config/tailwind.config.cjs +7 -0
  409. package/config/tsconfig.functions.json +42 -0
  410. package/config/tsconfig.json +37 -9
  411. package/config/vite.config.ts +31 -2
  412. package/netlify.toml +31 -3
  413. package/package.json +46 -29
  414. package/scripts/assemble-frontend.sh +127 -44
  415. package/scripts/assemble-functions.sh +127 -29
  416. package/scripts/boundary-check.sh +6 -2
  417. package/scripts/build-manifest.sh +24 -68
  418. package/scripts/checksum-manifest.mts +345 -0
  419. package/scripts/dev-clean.sh +86 -0
  420. package/scripts/dev-netlify.sh +49 -0
  421. package/scripts/netlify-dev-wrapper.sh +2 -0
  422. package/scripts/verify-install.ts +358 -0
  423. package/scripts/verify-integrity.sh +21 -57
  424. package/scripts/verify-manifest.mts +305 -0
  425. package/templates/project/gitignore +45 -0
  426. package/{config → templates/project}/package-lock.json +22335 -9366
  427. package/vitest.config.ts +46 -0
  428. package/.framework/public/spine.config.json +0 -91
  429. package/config/deno.lock +0 -108
  430. package/config/tsconfig.node.tsbuildinfo +0 -1
  431. package/config/tsconfig.tsbuildinfo +0 -1
  432. package/config/vite.config.d.ts +0 -2
  433. package/custom/.devin/AGENT.md +0 -357
  434. package/custom/.devin/skills/install-app/SKILL.md +0 -39
  435. package/custom/.devin/skills/spine-workbench-discovery/SKILL.md +0 -39
  436. package/custom/.devin/skills/spine-workbench-idea/SKILL.md +0 -36
  437. package/custom/.devin/skills/spine-workbench-implement/SKILL.md +0 -46
  438. package/custom/.devin/skills/spine-workbench-initiative/SKILL.md +0 -28
  439. package/custom/.devin/skills/spine-workbench-plan/SKILL.md +0 -38
  440. package/custom/.devin/workflows/app-install.yaml +0 -83
  441. package/custom/README.md +0 -79
  442. package/docs/README.md +0 -15
  443. package/scripts/app-install-cli.ts +0 -286
  444. package/scripts/check-core-integrity.sh +0 -82
  445. package/scripts/ingest-chunks.cjs +0 -202
  446. package/scripts/kb-chunk-parser.cjs +0 -312
  447. package/scripts/kb-chunk-parser.ts +0 -330
  448. package/scripts/kb-ingest-docs.ts +0 -203
  449. package/scripts/load-test-app-install.ts +0 -484
  450. package/scripts/test-login.js +0 -33
  451. package/spine.config.json +0 -91
@@ -1,25 +1,26 @@
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"]
1
+ // CIL[BEGIN stable_id="~/.framework/functions/cil-validate.ts:module_header:module_header" type="module_header" identity="module_header" parent="~/.framework/functions/cil-validate.ts"]
2
+ // CIL[DOC-MACRO purpose="Netlify function endpoint for validating and updating CIL chunk content hashes"]
3
+ // CIL[DOC-RESPONSIBILITY responsibility="Expose HTTP actions to verify chunk drift, compute hashes, update stored hashes, and validate source files"]
4
+ // CIL[DOC-CONTEXT module="cil-validate" layer="functions" related_files=".framework/functions/_shared/cil.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts"]
5
+ // CIL[DOC-CONTRACT inputs="HTTP request with action query and JSON body" outputs="JSON validation summary, hash value, or updated hash record" errors="Missing required fields, unknown action, chunk not found, file not found, missing repo_path" side_effects="Queries and updates the adminDb items table, reads source files from disk"]
6
+ // CIL[DOC-MICRO logic_summary="Dispatches to validate, update_hash, compute_hash, or validate_file actions and returns structured results" notable_decisions="[]"]
7
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
8
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"]
9
+ // CIL[DOC-AUDIENCE audience="system-maintainers"]
16
10
 
17
11
 
18
12
  import { createHandler } from './_shared/middleware'
19
13
  import { adminDb } from './_shared/db'
20
- import * as crypto from 'crypto'
14
+ import { computeContentHash } from './_shared/cil'
21
15
  import * as fs from 'fs'
22
16
  import * as path from 'path'
17
+ // CIL[DOC-VECTOR type="context" content="purpose='Netlify function endpoint for validating and updating CIL chunk content hashes'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/cil.ts"]
18
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
19
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
20
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
21
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
22
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
23
+ // CIL[END stable_id="~/.framework/functions/cil-validate.ts:module_header:module_header"]
23
24
 
24
25
 
25
26
 
@@ -27,102 +28,107 @@ import * as path from 'path'
27
28
 
28
29
 
29
30
 
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"]
31
+ // CIL[BEGIN stable_id="~/.framework/functions/cil-validate.ts:ChunkToValidate:interface" type="interface" identity="ChunkToValidate" parent="~/.framework/functions/cil-validate.ts"]
32
+ // CIL[DOC-MACRO purpose="Shape of a chunk reference used in validation requests"]
33
+ // CIL[DOC-RESPONSIBILITY responsibility="Define the type contract for chunks submitted to the validate action"]
34
+ // CIL[DOC-CONTEXT module="cil-validate" layer="functions" related_files=".framework/functions/_shared/cil.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/cil-validate.ts"]
35
+ // CIL[DOC-CONTRACT inputs="raw JSON with optional chunk_id, stable_id, version_id, required chunk_name, and content" outputs="typed ChunkToValidate interface" errors="none" side_effects="none"]
36
+ // CIL[DOC-MICRO logic_summary="TypeScript interface with optional identifiers and required chunk_name and content fields" notable_decisions="[]"]
37
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
38
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
39
  interface ChunkToValidate {
46
- chunk_id: string
40
+ chunk_id?: string
47
41
  chunk_name: string
48
- content: string
42
+ content: string
43
+ stable_id?: string
44
+ version_id?: string
49
45
  }
46
+ // CIL[DOC-VECTOR type="context" content="purpose='Shape of a chunk reference used in validation requests'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/cil.ts"]
47
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
48
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
49
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
50
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
51
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
52
+ // CIL[END stable_id="~/.framework/functions/cil-validate.ts:ChunkToValidate:interface"]
50
53
 
51
54
 
52
55
 
53
56
 
54
57
 
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"]
58
+ // CIL[BEGIN stable_id="~/.framework/functions/cil-validate.ts:ValidationResult:interface" type="interface" identity="ValidationResult" parent="~/.framework/functions/cil-validate.ts"]
59
+ // CIL[DOC-MACRO purpose="Shape of the result returned for a validated chunk"]
60
+ // CIL[DOC-RESPONSIBILITY responsibility="Report whether a chunk is current, drifted, or not found"]
61
+ // CIL[DOC-CONTEXT module="cil-validate" layer="functions" related_files=".framework/functions/_shared/cil.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/cil-validate.ts"]
62
+ // CIL[DOC-CONTRACT inputs="chunk metadata, stored and computed hashes, and status message" outputs="typed ValidationResult interface" errors="none" side_effects="none"]
63
+ // CIL[DOC-STABILITY stability="internal"]
64
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
65
+ // CIL[DOC-MICRO logic_summary="TypeScript interface describing validation outcome fields" notable_decisions="[]"]
70
66
  interface ValidationResult {
71
67
  chunk_id: string
68
+ stable_id: string | null
72
69
  chunk_name: string
73
70
  status: 'current' | 'drift_detected' | 'not_found'
74
71
  stored_hash: string | null
75
72
  validation_hash: string
76
73
  message: string
77
74
  }
75
+ // CIL[END stable_id="~/.framework/functions/cil-validate.ts:ValidationResult:interface"]
78
76
 
79
77
 
78
+ // CIL[DOC-VECTOR type="context" content="purpose='Shape of the result returned for a validated chunk'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/cil.ts"]
79
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
80
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
81
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
82
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
83
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
80
84
 
81
85
 
82
86
 
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"]
87
+ // CIL[BEGIN stable_id="~/.framework/functions/cil-validate.ts:ValidateRequest:interface" type="interface" identity="ValidateRequest" parent="~/.framework/functions/cil-validate.ts"]
88
+ // CIL[DOC-MACRO purpose="Shape of a batch chunk validation request"]
89
+ // CIL[DOC-RESPONSIBILITY responsibility="Collect optional file path and an array of chunks to validate"]
90
+ // CIL[DOC-CONTEXT module="cil-validate" layer="functions" related_files=".framework/functions/_shared/cil.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/cil-validate.ts"]
91
+ // CIL[DOC-CONTRACT inputs="optional file_path and chunks array" outputs="typed ValidateRequest interface" errors="none" side_effects="none"]
92
+ // CIL[DOC-STABILITY stability="internal"]
93
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
94
+ // CIL[DOC-MICRO logic_summary="TypeScript interface with optional file_path and required chunks array" notable_decisions="[]"]
98
95
  interface ValidateRequest {
99
96
  file_path?: string
100
97
  chunks: ChunkToValidate[]
101
98
  }
99
+ // CIL[END stable_id="~/.framework/functions/cil-validate.ts:ValidateRequest:interface"]
102
100
 
101
+ // CIL[DOC-VECTOR type="context" content="purpose='Shape of a batch chunk validation request'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/cil.ts"]
102
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
103
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
104
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
105
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
106
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
103
107
 
104
108
 
105
109
 
106
110
 
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"]
111
+ // CIL[BEGIN stable_id="~/.framework/functions/cil-validate.ts:UpdateHashRequest:interface" type="interface" identity="UpdateHashRequest" parent="~/.framework/functions/cil-validate.ts"]
112
+ // CIL[DOC-MACRO purpose="Shape of a request to update a stored content hash"]
113
+ // CIL[DOC-RESPONSIBILITY responsibility="Identify a chunk by stable_id or chunk_id and provide new content"]
114
+ // CIL[DOC-CONTEXT module="cil-validate" layer="functions" related_files=".framework/functions/_shared/cil.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/cil-validate.ts"]
115
+ // CIL[DOC-CONTRACT inputs="optional chunk_id, stable_id, version_id and required content" outputs="typed UpdateHashRequest interface" errors="none" side_effects="none"]
116
+ // CIL[DOC-MICRO logic_summary="TypeScript interface with optional identifiers and required content field" notable_decisions="[]"]
117
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
115
118
  // 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
119
  interface UpdateHashRequest {
123
- chunk_id: string
120
+ chunk_id?: string
121
+ stable_id?: string
122
+ version_id?: string
124
123
  content: string
125
124
  }
125
+ // CIL[DOC-VECTOR type="context" content="purpose='Shape of a request to update a stored content hash'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/cil.ts"]
126
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
127
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
128
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
129
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
130
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
131
+ // CIL[END stable_id="~/.framework/functions/cil-validate.ts:UpdateHashRequest:interface"]
126
132
 
127
133
 
128
134
 
@@ -131,85 +137,111 @@ interface UpdateHashRequest {
131
137
 
132
138
 
133
139
 
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"]
140
+ // CIL[BEGIN stable_id="~/.framework/functions/cil-validate.ts:computeHash:function" type="function" identity="computeHash" parent="~/.framework/functions/cil-validate.ts"]
141
+ // CIL[DOC-MACRO purpose="Compute the stored content hash for a given string"]
142
+ // CIL[DOC-RESPONSIBILITY responsibility="Delegate to the shared computeContentHash implementation"]
143
+ // CIL[DOC-CONTEXT module="cil-validate" layer="functions" related_files=".framework/functions/_shared/cil.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/cil-validate.ts"]
144
+ // CIL[DOC-CONTRACT inputs="content string" outputs="hash string" errors="none" side_effects="none"]
145
+ // CIL[DOC-MICRO logic_summary="Thin wrapper around computeContentHash from _shared/cil" notable_decisions="[]"]
146
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
142
147
  // 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."]
148
+ function computeHash(content: string): string {
149
+ return computeContentHash(content)
150
+ }
151
+ // CIL[DOC-VECTOR type="context" content="purpose='Compute the stored content hash for a given string'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/cil.ts"]
152
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
153
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
154
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
147
155
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
148
156
  // 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
- }
157
+ // CIL[END stable_id="~/.framework/functions/cil-validate.ts:computeHash:function"]
168
158
 
169
159
 
170
160
 
171
161
 
172
162
 
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
163
 
194
164
 
195
165
 
166
+ // CIL[BEGIN stable_id="~/.framework/functions/cil-validate.ts:resolveChunk:function" type="function" identity="resolveChunk" parent="~/.framework/functions/cil-validate.ts"]
167
+ // CIL[DOC-MACRO purpose="Resolve a chunk record from the graph by stable_id, version_id, or chunk_id"]
168
+ // CIL[DOC-RESPONSIBILITY responsibility="Look up the active chunk record and fallback through versioned and legacy identifiers"]
169
+ // CIL[DOC-CONTEXT module="cil-validate" layer="functions" related_files=".framework/functions/_shared/cil.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/cil-validate.ts"]
170
+ // CIL[DOC-CONTRACT inputs="input: object with optional chunk_id, stable_id, and version_id" outputs="item id and data or null" errors="none" side_effects="none"]
171
+ // CIL[DOC-MICRO logic_summary="Query adminDb by stable_id/version, fallback to active version via project, then chunk_id" notable_decisions="[]"]
172
+ // CIL[DOC-NOTE type="parameter" content="input: object containing optional chunk_id, stable_id, and version_id"]
173
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
174
+ // CIL[DOC-STABILITY stability="stable"]
175
+ async function resolveChunk(
176
+ input: { chunk_id?: string; stable_id?: string; version_id?: string }
177
+ ): Promise<{ id: string; data: any } | null> {
178
+ if (input.stable_id) {
179
+ if (input.version_id) {
180
+ const { data: item } = await adminDb
181
+ .from('items')
182
+ .select('id, data')
183
+ .filter('data->>kb_type', 'eq', 'cil_chunk')
184
+ .filter('data->>stable_id', 'eq', input.stable_id)
185
+ .filter('data->>version_id', 'eq', input.version_id)
186
+ .maybeSingle()
187
+ if (item) return item
188
+ } else {
189
+ const { data: candidates } = await adminDb
190
+ .from('items')
191
+ .select('id, data')
192
+ .filter('data->>kb_type', 'eq', 'cil_chunk')
193
+ .filter('data->>stable_id', 'eq', input.stable_id)
194
+ .limit(1)
195
+ const candidate = candidates?.[0]
196
+ if (candidate?.data?.project_id) {
197
+ const { data: project } = await adminDb
198
+ .from('items')
199
+ .select('id, data')
200
+ .eq('id', candidate.data.project_id)
201
+ .maybeSingle()
202
+ const activeVersionId = project?.data?.active_version_id
203
+ if (activeVersionId) {
204
+ const { data: item } = await adminDb
205
+ .from('items')
206
+ .select('id, data')
207
+ .filter('data->>kb_type', 'eq', 'cil_chunk')
208
+ .filter('data->>stable_id', 'eq', input.stable_id)
209
+ .filter('data->>version_id', 'eq', activeVersionId)
210
+ .maybeSingle()
211
+ if (item) return item
212
+ }
213
+ }
214
+ if (candidate) return candidate
215
+ }
216
+ }
196
217
 
218
+ if (input.chunk_id) {
219
+ const { data: item } = await adminDb
220
+ .from('items')
221
+ .select('id, data')
222
+ .eq('id', input.chunk_id)
223
+ .maybeSingle()
224
+ if (item) return item
225
+ }
197
226
 
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."]
227
+ return null
228
+ }
229
+ // CIL[DOC-VECTOR type="context" content="purpose='Resolve a chunk record from the graph by stable_id, version_id, or chunk_id'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/cil.ts"]
230
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
231
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
232
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
211
233
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
212
234
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
235
+ // CIL[END stable_id="~/.framework/functions/cil-validate.ts:resolveChunk:function"]
236
+
237
+ // CIL[BEGIN stable_id="~/.framework/functions/cil-validate.ts:handler:constant" type="constant" identity="handler" parent="~/.framework/functions/cil-validate.ts"]
238
+ // CIL[DOC-MACRO purpose="Netlify function handler that dispatches CIL validation actions"]
239
+ // CIL[DOC-RESPONSIBILITY responsibility="Handle validate, update_hash, compute_hash, and validate_file HTTP actions"]
240
+ // CIL[DOC-CONTEXT module="cil-validate" layer="functions" related_files=".framework/functions/_shared/cil.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/cil-validate.ts"]
241
+ // CIL[DOC-CONTRACT inputs="HTTP context and parsed request body" outputs="JSON response" errors="Validation or action errors" side_effects="Reads files, queries and updates adminDb"]
242
+ // CIL[DOC-MICRO logic_summary="Switch on action, validate inputs, process chunks or files, and return summary" notable_decisions="[]"]
243
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
244
+ // CIL[DOC-STABILITY stability="stable"]
213
245
  export const handler = createHandler(async (ctx, body) => {
214
246
  const action = ctx.query?.action
215
247
 
@@ -225,16 +257,12 @@ export const handler = createHandler(async (ctx, body) => {
225
257
  for (const chunk of req.chunks) {
226
258
  const validationHash = computeHash(chunk.content)
227
259
 
228
-
229
- const { data: item, error } = await adminDb
230
- .from('items')
231
- .select('id, data')
232
- .eq('id', chunk.chunk_id)
233
- .maybeSingle()
260
+ const item = await resolveChunk(chunk)
234
261
 
235
- if (error || !item) {
262
+ if (!item) {
236
263
  results.push({
237
- chunk_id: chunk.chunk_id,
264
+ chunk_id: chunk.chunk_id || chunk.stable_id || '',
265
+ stable_id: chunk.stable_id || null,
238
266
  chunk_name: chunk.chunk_name,
239
267
  status: 'not_found',
240
268
  stored_hash: null,
@@ -244,11 +272,12 @@ export const handler = createHandler(async (ctx, body) => {
244
272
  continue
245
273
  }
246
274
 
247
- const storedHash: string | null = item.data?.stored_hash || null
275
+ const storedHash: string | null = item.data?.content_hash || item.data?.stored_hash || null
248
276
 
249
277
  if (!storedHash) {
250
278
  results.push({
251
- chunk_id: chunk.chunk_id,
279
+ chunk_id: item.id,
280
+ stable_id: item.data?.stable_id || null,
252
281
  chunk_name: chunk.chunk_name,
253
282
  status: 'drift_detected',
254
283
  stored_hash: null,
@@ -262,7 +291,8 @@ export const handler = createHandler(async (ctx, body) => {
262
291
  storedHash === validationHash ? 'current' : 'drift_detected'
263
292
 
264
293
  results.push({
265
- chunk_id: chunk.chunk_id,
294
+ chunk_id: item.id,
295
+ stable_id: item.data?.stable_id || null,
266
296
  chunk_name: chunk.chunk_name,
267
297
  status,
268
298
  stored_hash: storedHash,
@@ -292,31 +322,27 @@ export const handler = createHandler(async (ctx, body) => {
292
322
 
293
323
  if (action === 'update_hash') {
294
324
  const req = body as UpdateHashRequest
295
- if (!req?.chunk_id) throw new Error('chunk_id is required')
325
+ if (!req?.chunk_id && !req?.stable_id) throw new Error('chunk_id or stable_id is required')
296
326
  if (!req?.content) throw new Error('content is required')
297
327
 
298
328
  const newHash = computeHash(req.content)
299
329
 
300
- const { data: item } = await adminDb
301
- .from('items')
302
- .select('id, data')
303
- .eq('id', req.chunk_id)
304
- .maybeSingle()
330
+ const item = await resolveChunk(req)
305
331
 
306
- if (!item) throw new Error(`Chunk not found: ${req.chunk_id}`)
332
+ if (!item) throw new Error(`Chunk not found: ${req.chunk_id || req.stable_id}`)
307
333
 
308
334
  const { error } = await adminDb
309
335
  .from('items')
310
336
  .update({
311
- data: { ...item.data, stored_hash: newHash, hash_updated_at: new Date().toISOString() },
337
+ data: { ...item.data, content_hash: newHash, stored_hash: newHash, hash_updated_at: new Date().toISOString() },
312
338
  updated_at: new Date().toISOString(),
313
339
  })
314
- .eq('id', req.chunk_id)
340
+ .eq('id', item.id)
315
341
 
316
342
  if (error) throw new Error(`Failed to update hash: ${error.message}`)
317
343
 
318
344
  return {
319
- chunk_id: req.chunk_id,
345
+ chunk_id: item.id,
320
346
  new_hash: newHash,
321
347
  updated_at: new Date().toISOString(),
322
348
  }
@@ -399,11 +425,12 @@ export const handler = createHandler(async (ctx, body) => {
399
425
  const lineStart: number = d.line_start || 0
400
426
  const lineEnd: number = d.line_end || 0
401
427
  const chunkName: string = d.chunk_name || ''
402
- const storedHash: string | null = d.stored_hash || null
428
+ const storedHash: string | null = d.content_hash || d.stored_hash || null
403
429
 
404
430
  if (!lineStart || !lineEnd) {
405
431
  results.push({
406
432
  chunk_id: chunk.id,
433
+ stable_id: d.stable_id || null,
407
434
  chunk_name: chunkName,
408
435
  status: 'not_found',
409
436
  stored_hash: storedHash,
@@ -421,6 +448,7 @@ export const handler = createHandler(async (ctx, body) => {
421
448
  if (!storedHash) {
422
449
  results.push({
423
450
  chunk_id: chunk.id,
451
+ stable_id: d.stable_id || null,
424
452
  chunk_name: chunkName,
425
453
  status: 'drift_detected',
426
454
  stored_hash: null,
@@ -433,6 +461,7 @@ export const handler = createHandler(async (ctx, body) => {
433
461
  const status: 'current' | 'drift_detected' = storedHash === validationHash ? 'current' : 'drift_detected'
434
462
  results.push({
435
463
  chunk_id: chunk.id,
464
+ stable_id: d.stable_id || null,
436
465
  chunk_name: chunkName,
437
466
  status,
438
467
  stored_hash: storedHash,
@@ -463,7 +492,12 @@ export const handler = createHandler(async (ctx, body) => {
463
492
 
464
493
  throw new Error(`Unknown action: ${action}. Valid: validate, validate_file, update_hash, compute_hash`)
465
494
  })
495
+ // CIL[DOC-VECTOR type="context" content="purpose='Netlify function handler that dispatches CIL validation actions'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/cil.ts"]
496
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
497
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
498
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
499
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
500
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
501
+ // CIL[END stable_id="~/.framework/functions/cil-validate.ts:handler:constant"]
466
502
 
467
503
 
468
-
469
- // CIL[END chunk_id="custom_apps_cortex_functions_custom_cil_validate_handler_1784235266"]