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,22 +1,12 @@
1
-
2
-
3
-
4
-
5
- // CIL[BEGIN chunk_id="genericlistpage_module_header_1783930597" type="module_header" identity="imports" parent="none"]
6
- // CIL[DOC-MACRO purpose="Import hooks and runtime components for generic list page"]
7
- // CIL[DOC-RESPONSIBILITY responsibility="Provide data fetching and UI rendering dependencies"]
8
- // CIL[DOC-CONTEXT module="generic-list-page" layer="frontend-component" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\".framework/src/components/ui/dialog.tsx\",\"\\\"]"]
9
- // CIL[DOC-CONTRACT inputs="none" outputs="Imported modules" errors="none" side_effects="none"]
10
- // CIL[DOC-MICRO logic_summary="Imports schema hook, entity list hook, and runtime UI components" notable_decisions="[]"]
11
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
1
+ // CIL[BEGIN stable_id="~/.framework/src/components/app-shell/GenericListPage.tsx:module_header:module_header" type="module_header" identity="module_header" parent="~/.framework/src/components/app-shell/GenericListPage.tsx"]
2
+ // CIL[DOC-MACRO purpose="Imports and module setup for the generic list page"]
3
+ // CIL[DOC-RESPONSIBILITY responsibility="Provide dependencies for GenericListPage rendering"]
4
+ // CIL[DOC-CONTEXT module="app-shell" layer="framework" related_files=".framework/src/components/admin/PageInstructions.tsx,.framework/src/components/runtime/DataFilters.tsx,.framework/src/components/runtime/DataHeader.tsx,.framework/src/components/runtime/DataStats.tsx,.framework/src/components/runtime/DataTable.tsx,.framework/src/hooks/useEntityList.ts,.framework/src/hooks/useListSchema.ts"]
5
+ // CIL[DOC-CONTRACT inputs="none" outputs="none" errors="none" side_effects="none"]
6
+ // CIL[DOC-MICRO logic_summary="Imports hooks and UI subcomponents used by the list page" notable_decisions="[]"]
7
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
12
8
  // CIL[DOC-STABILITY stability="stable"]
13
- // CIL[DOC-AUDIENCE audience="developer"]
14
- // CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/src/pages/admin/RolesPage.tsx, .framework/src/components/ui/dialog.tsx, \."]
15
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
16
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
17
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
18
- // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
19
- // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
9
+ // CIL[DOC-AUDIENCE audience="framework"]
20
10
  import { useListSchema } from '../../hooks/useListSchema'
21
11
  import { useEntityList } from '../../hooks/useEntityList'
22
12
  import { DataHeader } from '../runtime/DataHeader'
@@ -24,54 +14,54 @@ import { DataStats } from '../runtime/DataStats'
24
14
  import { DataFilters } from '../runtime/DataFilters'
25
15
  import { DataTable } from '../runtime/DataTable'
26
16
  import { PageInstructions } from '../admin/PageInstructions'
27
- // CIL[END chunk_id="genericlistpage_module_header_1783930597"]
28
- // CIL[BEGIN chunk_id="genericlistpage_genericlistpageprops_1783930597" type="interface" identity="GenericListPageProps" parent="none"]
29
- // CIL[DOC-MACRO purpose="Define props interface for generic list page component"]
30
- // CIL[DOC-RESPONSIBILITY responsibility="Specify configuration for schema-driven list display"]
31
- // CIL[DOC-CONTEXT module="generic-list-page" layer="frontend-component" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/functions/_shared/schema-utils.ts\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\"\\\"]"]
32
- // CIL[DOC-CONTRACT inputs="none" outputs="Type definition" errors="none" side_effects="none"]
33
- // CIL[DOC-MICRO logic_summary="Interface with type slug, view configuration, and routing paths" notable_decisions="[]"]
34
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
35
- // CIL[DOC-STABILITY stability="stable"]
36
- // CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/functions/_shared/schema-utils.ts, .framework/src/pages/admin/IntegrationsPage.tsx, \."]
37
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
38
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
39
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
17
+ // CIL[DOC-VECTOR type="context" content="purpose='Imports and module setup for the generic list page'; No verified external callers; imports: .framework/src/hooks/useListSchema.ts,.framework/src/hooks/useEntityList.ts,.framework/src/components/runtime/DataHeader.tsx"]
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"]
40
21
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
41
22
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
23
+ // CIL[END stable_id="~/.framework/src/components/app-shell/GenericListPage.tsx:module_header:module_header"]
24
+
25
+ // CIL[BEGIN stable_id="~/.framework/src/components/app-shell/GenericListPage.tsx:genericlistpageprops:interface" type="interface" identity="genericlistpageprops" parent="~/.framework/src/components/app-shell/GenericListPage.tsx"]
26
+ // CIL[DOC-MACRO purpose="Props interface for GenericListPage"]
27
+ // CIL[DOC-RESPONSIBILITY responsibility="Define the expected props for the list page"]
28
+ // CIL[DOC-CONTEXT module="app-shell" layer="framework" related_files=".framework/src/components/admin/PageInstructions.tsx,.framework/src/components/app-shell/GenericListPage.tsx,.framework/src/components/runtime/DataFilters.tsx,.framework/src/components/runtime/DataHeader.tsx,.framework/src/components/runtime/DataStats.tsx,.framework/src/components/runtime/DataTable.tsx,.framework/src/hooks/useEntityList.ts,.framework/src/hooks/useListSchema.ts"]
29
+ // CIL[DOC-CONTRACT inputs="none" outputs="none" errors="none" side_effects="none"]
30
+ // CIL[DOC-MICRO logic_summary="TypeScript interface describing typeSlug, viewSlug, appPrefix, and detailPath" notable_decisions="[]"]
31
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
32
+ // CIL[DOC-STABILITY stability="stable"]
42
33
  interface GenericListPageProps {
43
34
  typeSlug: string
44
35
  viewSlug?: string
45
36
  appPrefix: string
46
37
  detailPath: string
47
38
  }
48
- // CIL[END chunk_id="genericlistpage_genericlistpageprops_1783930597"]
49
- // CIL[BEGIN chunk_id="genericlistpage_genericlistpage_1783930597" type="function" identity="GenericListPage" parent="none"]
50
- // CIL[DOC-LEARNING topic="runtime-type:generic/list_view" content="GenericListPage uses record.design_schema.views.default_list with type list and display table/card/board. It reads fields map for display_type, sortable, and searchable. It also uses default_sort, stats, filters, and group_by when present."]
51
- // CIL[DOC-NOTE type="design_schema_caveat" content="A missing default_list view causes the list to render no columns unless useListSchema falls back to the types table. display_type must be one FieldRenderer recognizes or the cell falls back to text."]
52
- // CIL[DOC-MACRO purpose="Schema-driven list page with data table and filters"]
53
- // CIL[DOC-RESPONSIBILITY responsibility="Render list view based on type schema and view configuration"]
54
- // CIL[DOC-CONTEXT module="generic-list-page" layer="frontend-component" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\".framework/migrations/015_simplify_apps_table.sql\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"\\\"]"]
55
- // CIL[DOC-CONTRACT inputs="none" outputs="JSX list page with data table" errors="Schema loading errors" side_effects="Data fetching, renders UI components"]
56
- // CIL[DOC-MICRO logic_summary="Resolves schema and view, builds config, fetches data, renders runtime components" notable_decisions="[]"]
57
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
58
- // CIL[DOC-STABILITY stability="stable"]
59
- // CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/IntegrationsPage.tsx, .framework/migrations/015_simplify_apps_table.sql, .framework/src/pages/admin/TypeDetailPage.tsx, \."]
60
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
61
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
62
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
39
+ // CIL[DOC-VECTOR type="context" content="purpose='Props interface for GenericListPage'; No verified external callers; imports: .framework/src/hooks/useListSchema.ts,.framework/src/hooks/useEntityList.ts,.framework/src/components/runtime/DataHeader.tsx"]
40
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
41
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
42
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
63
43
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
64
44
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
45
+ // CIL[END stable_id="~/.framework/src/components/app-shell/GenericListPage.tsx:genericlistpageprops:interface"]
46
+
47
+ // CIL[BEGIN stable_id="~/.framework/src/components/app-shell/GenericListPage.tsx:genericlistpage:function" type="function" identity="genericlistpage" parent="~/.framework/src/components/app-shell/GenericListPage.tsx"]
48
+ // CIL[DOC-MACRO purpose="Render the generic list page for an app type"]
49
+ // CIL[DOC-RESPONSIBILITY responsibility="Display a sortable, filterable data table with schema-driven headers, stats, filters, and instructions"]
50
+ // CIL[DOC-CONTEXT module="app-shell" layer="framework" related_files=".framework/src/components/admin/PageInstructions.tsx,.framework/src/components/app-shell/GenericListPage.tsx,.framework/src/components/runtime/DataFilters.tsx,.framework/src/components/runtime/DataHeader.tsx,.framework/src/components/runtime/DataStats.tsx,.framework/src/components/runtime/DataTable.tsx,.framework/src/hooks/useEntityList.ts,.framework/src/hooks/useListSchema.ts"]
51
+ // CIL[DOC-CONTRACT inputs="typeSlug: string, viewSlug?: string, appPrefix: string, detailPath: string" outputs="JSX.Element" errors="none" side_effects="none"]
52
+ // CIL[DOC-MICRO logic_summary="Resolve the list schema, build a config, load entity data, and render the list page with header, instructions, stats, filters, and table" notable_decisions="[]"]
53
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
54
+ // CIL[DOC-STABILITY stability="stable"]
65
55
  export function GenericListPage({ typeSlug, viewSlug, appPrefix, detailPath }: GenericListPageProps) {
66
56
  const resolvedViewSlug = viewSlug || 'default_list'
67
57
 
68
-
58
+
69
59
  const { schema, view, loading: schemaLoading, error: schemaError } = useListSchema({
70
60
  entity: 'items',
71
61
  viewSlug: resolvedViewSlug
72
62
  })
73
63
 
74
-
64
+
75
65
  const config = view && schema ? {
76
66
  entity: 'items',
77
67
  typeSlug,
@@ -180,4 +170,10 @@ export function GenericListPage({ typeSlug, viewSlug, appPrefix, detailPath }: G
180
170
  </div>
181
171
  )
182
172
  }
183
- // CIL[END chunk_id="genericlistpage_genericlistpage_1783930597"]
173
+ // CIL[DOC-VECTOR type="context" content="purpose='Render the generic list page for an app type'; No verified external callers; imports: .framework/src/hooks/useListSchema.ts,.framework/src/hooks/useEntityList.ts,.framework/src/components/runtime/DataHeader.tsx"]
174
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
175
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
176
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
177
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
178
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
179
+ // CIL[END stable_id="~/.framework/src/components/app-shell/GenericListPage.tsx:genericlistpage:function"]
@@ -1,22 +1,12 @@
1
-
2
-
3
-
4
-
5
- // CIL[BEGIN chunk_id="app-sidebar_module_header_1783930597" type="module_header" identity="imports" parent="none"]
6
- // CIL[DOC-MACRO purpose="Import React and UI components for sidebar navigation"]
7
- // CIL[DOC-RESPONSIBILITY responsibility="Provide all external dependencies for the sidebar component"]
8
- // CIL[DOC-CONTEXT module="app-sidebar" layer="frontend-component" related_files="[\".framework/src/components/layout/Sidebar.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/components/ui/dialog.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"\\\"]"]
9
- // CIL[DOC-CONTRACT inputs="none" outputs="Imported modules" errors="none" side_effects="none"]
10
- // CIL[DOC-MICRO logic_summary="Imports React, UI components, and icons needed for sidebar" notable_decisions="[]"]
11
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
1
+ // CIL[BEGIN stable_id="~/.framework/src/components/app-sidebar.tsx:module_header:module_header" type="module_header" identity="module_header" parent="~/.framework/src/components/app-sidebar.tsx:file"]
2
+ // CIL[DOC-MACRO purpose="Provides a documentation navigation sidebar with collapsible sections and search integration"]
3
+ // CIL[DOC-RESPONSIBILITY responsibility="Imports React, local sidebar primitives, the search form, and Lucide icons used by AppSidebar"]
4
+ // CIL[DOC-CONTEXT module="app-sidebar.tsx" layer="components" related_files=".framework/src/components/search-form.tsx,.framework/src/components/ui/collapsible.tsx,.framework/src/components/ui/sidebar.tsx"]
5
+ // CIL[DOC-CONTRACT inputs="none" outputs="local bindings for React, Sidebar primitives, SearchForm, and Lucide icons" errors="none" side_effects="none"]
6
+ // CIL[DOC-MICRO logic_summary="Imports React, sidebar UI components, search-form, and icons for the documentation sidebar." notable_decisions="[]"]
7
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
12
8
  // CIL[DOC-STABILITY stability="stable"]
13
- // CIL[DOC-AUDIENCE audience="developer"]
14
- // CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 0. Direct calls: 0. Related files: .framework/src/components/layout/Sidebar.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, custom/apps/portal/pages/ContentPage.tsx, .framework/src/components/ui/dialog.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, \."]
15
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
16
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
17
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
18
- // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
19
- // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
9
+ // CIL[DOC-AUDIENCE audience="UI component consumers, React developers, design system maintainers"]
20
10
  import * as React from "react"
21
11
 
22
12
  import { SearchForm } from "./search-form"
@@ -39,21 +29,21 @@ import {
39
29
  SidebarRail,
40
30
  } from "./ui/sidebar"
41
31
  import { GalleryVerticalEndIcon, PlusIcon, MinusIcon } from "lucide-react"
42
- // CIL[END chunk_id="app-sidebar_module_header_1783930597"]
43
- // CIL[BEGIN chunk_id="app-sidebar_data_1783930597" type="constant" identity="data" parent="none"]
44
- // CIL[DOC-MACRO purpose="Define navigation structure for documentation sidebar"]
45
- // CIL[DOC-RESPONSIBILITY responsibility="Provide hierarchical navigation data with sections and items"]
46
- // CIL[DOC-CONTEXT module="app-sidebar" layer="frontend-component" related_files="[\".framework/src/components/layout/Sidebar.tsx\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/functions/_shared/schema-utils.ts\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"\\\"]"]
47
- // CIL[DOC-CONTRACT inputs="none" outputs="Navigation data object" errors="none" side_effects="none"]
48
- // CIL[DOC-MICRO logic_summary="Static navigation tree with Getting Started, Build Your Application, API Reference, Architecture, and Community sections" notable_decisions="[]"]
49
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
50
- // CIL[DOC-STABILITY stability="stable"]
51
- // CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 0. Direct calls: 0. Related files: .framework/src/components/layout/Sidebar.tsx, .framework/src/pages/admin/IntegrationsPage.tsx, .framework/functions/_shared/principal.ts, .framework/functions/_shared/schema-utils.ts, .framework/src/pages/admin/TypeDetailPage.tsx, \."]
52
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
53
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
54
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
32
+ // CIL[DOC-VECTOR type="context" content="purpose='Provides a documentation navigation sidebar with collapsible sections and search integration'; No verified external callers; imports: .framework/src/components/search-form.tsx,.framework/src/components/ui/collapsible.tsx,.framework/src/components/ui/sidebar.tsx"]
33
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
34
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
35
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
55
36
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
56
37
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
38
+ // CIL[END stable_id="~/.framework/src/components/app-sidebar.tsx:module_header:module_header"]
39
+ // CIL[BEGIN stable_id="~/.framework/src/components/app-sidebar.tsx:data:constant" type="constant" identity="data" parent="~/.framework/src/components/app-sidebar.tsx:module_header:module_header"]
40
+ // CIL[DOC-MACRO purpose="Defines the static navigation data for the documentation sidebar sections"]
41
+ // CIL[DOC-RESPONSIBILITY responsibility="Holds the navMain array of documentation topics, URLs, and nested items"]
42
+ // CIL[DOC-CONTEXT module="app-sidebar.tsx" layer="components" related_files=".framework/src/components/app-sidebar.tsx,.framework/src/components/search-form.tsx,.framework/src/components/ui/collapsible.tsx,.framework/src/components/ui/sidebar.tsx"]
43
+ // CIL[DOC-CONTRACT inputs="none" outputs="data object with navMain navigation tree" errors="none" side_effects="none"]
44
+ // CIL[DOC-MICRO logic_summary="Constant object defining documentation navigation sections with titles, URLs, and nested items." notable_decisions="[]"]
45
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
46
+ // CIL[DOC-STABILITY stability="stable"]
57
47
  const data = {
58
48
  navMain: [
59
49
  {
@@ -193,21 +183,22 @@ const data = {
193
183
  },
194
184
  ],
195
185
  }
196
- // CIL[END chunk_id="app-sidebar_data_1783930597"]
197
- // CIL[BEGIN chunk_id="app-sidebar_appsidebar_1783930597" type="function" identity="AppSidebar" parent="none"]
198
- // CIL[DOC-MACRO purpose="Render main navigation sidebar with collapsible sections"]
199
- // CIL[DOC-RESPONSIBILITY responsibility="Create sidebar UI with header, navigation items, and search"]
200
- // CIL[DOC-CONTEXT module="app-sidebar" layer="frontend-component" related_files="[\".framework/src/components/layout/Sidebar.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/functions/_shared/schema-utils.ts\",\".framework/src/pages/admin/RolesPage.tsx\",\".framework/src/components/ui/dialog.tsx\",\"\\\"]"]
201
- // CIL[DOC-CONTRACT inputs="none" outputs="JSX sidebar component" errors="none" side_effects="Renders navigation UI"]
202
- // CIL[DOC-MICRO logic_summary="Maps navigation data to collapsible sidebar sections with icons and active states" notable_decisions="[]"]
203
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
204
- // CIL[DOC-STABILITY stability="stable"]
205
- // CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 0. Direct calls: 0. Related files: .framework/src/components/layout/Sidebar.tsx, custom/apps/portal/pages/ContentPage.tsx, .framework/functions/_shared/schema-utils.ts, .framework/src/pages/admin/RolesPage.tsx, .framework/src/components/ui/dialog.tsx, \."]
206
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
207
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
208
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
186
+
187
+ // CIL[DOC-VECTOR type="context" content="purpose='Defines the static navigation data for the documentation sidebar sections'; No verified external callers; imports: .framework/src/components/search-form.tsx,.framework/src/components/ui/collapsible.tsx,.framework/src/components/ui/sidebar.tsx"]
188
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
189
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
190
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
209
191
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
210
192
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
193
+ // CIL[END stable_id="~/.framework/src/components/app-sidebar.tsx:data:constant"]
194
+ // CIL[BEGIN stable_id="~/.framework/src/components/app-sidebar.tsx:appsidebar:function" type="function" identity="AppSidebar" parent="~/.framework/src/components/app-sidebar.tsx:module_header:module_header"]
195
+ // CIL[DOC-MACRO purpose="Renders the application sidebar with a header, search, and collapsible navigation menu"]
196
+ // CIL[DOC-RESPONSIBILITY responsibility="Displays the documentation navigation sidebar using the data constant and UI primitives"]
197
+ // CIL[DOC-CONTEXT module="app-sidebar.tsx" layer="components" related_files=".framework/src/components/app-sidebar.tsx,.framework/src/components/search-form.tsx,.framework/src/components/ui/collapsible.tsx,.framework/src/components/ui/sidebar.tsx"]
198
+ // CIL[DOC-CONTRACT inputs="props (React.ComponentProps<typeof Sidebar>)" outputs="JSX.Element" errors="none" side_effects="Renders sidebar DOM elements"]
199
+ // CIL[DOC-MICRO logic_summary="Renders a Sidebar with header, SearchForm, and collapsible nav groups driven by data.navMain." notable_decisions="[]"]
200
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
201
+ // CIL[DOC-STABILITY stability="stable"]
211
202
  export function AppSidebar({ ...props }: React.ComponentProps<typeof Sidebar>) {
212
203
  return (
213
204
  <Sidebar {...props}>
@@ -272,4 +263,10 @@ export function AppSidebar({ ...props }: React.ComponentProps<typeof Sidebar>) {
272
263
  </Sidebar>
273
264
  )
274
265
  }
275
- // CIL[END chunk_id="app-sidebar_appsidebar_1783930597"]
266
+ // CIL[DOC-VECTOR type="context" content="purpose='Renders the application sidebar with a header, search, and collapsible navigation menu'; No verified external callers; imports: .framework/src/components/search-form.tsx,.framework/src/components/ui/collapsible.tsx,.framework/src/components/ui/sidebar.tsx"]
267
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
268
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
269
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
270
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
271
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
272
+ // CIL[END stable_id="~/.framework/src/components/app-sidebar.tsx:appsidebar:function"]
@@ -5,58 +5,59 @@
5
5
 
6
6
 
7
7
 
8
- // CIL[BEGIN chunk_id="protectedroute_module_header_1783930597" type="module_header" identity="imports" parent="none"]
9
- // CIL[DOC-MACRO purpose="Import React and routing components for authentication"]
10
- // CIL[DOC-RESPONSIBILITY responsibility="Provide core dependencies for route protection"]
11
- // CIL[DOC-CONTEXT module="protected-route" layer="frontend-component" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/components/ui/dialog.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/functions/_shared/principal.ts\",\"\\\"]"]
12
- // CIL[DOC-CONTRACT inputs="none" outputs="Imported modules" errors="none" side_effects="none"]
13
- // CIL[DOC-MICRO logic_summary="Imports React, Navigate for routing, and useAuth hook" notable_decisions="[]"]
14
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
8
+
9
+
10
+ // CIL[BEGIN stable_id="~/.framework/src/components/auth/ProtectedRoute.tsx:module_header:module_header" type="module_header" identity="module_header" parent=""]
11
+ // CIL[DOC-MACRO purpose="Provide the module-level imports for the ProtectedRoute component"]
12
+ // CIL[DOC-RESPONSIBILITY responsibility="Import the React runtime, Navigate router utility, and the Auth context hook"]
13
+ // CIL[DOC-CONTEXT module="components/auth" layer="presentation" related_files=".framework/src/contexts/AuthContext.tsx"]
14
+ // CIL[DOC-CONTRACT inputs="none" outputs="none" errors="none" side_effects="none"]
15
+ // CIL[DOC-MICRO logic_summary="Imports React, Navigate from react-router-dom, and useAuth from the AuthContext for use by the ProtectedRoute function" notable_decisions="[]"]
16
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
15
17
  // CIL[DOC-STABILITY stability="stable"]
16
- // CIL[DOC-AUDIENCE audience="developer"]
17
- // CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/components/ui/dialog.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/functions/_shared/principal.ts, \."]
18
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
19
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
20
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
21
- // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
22
- // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
18
+ // CIL[DOC-AUDIENCE audience="developers"]
19
+
23
20
  import React from 'react'
24
21
  import { Navigate } from 'react-router-dom'
25
22
  import { useAuth } from '../../contexts/AuthContext'
26
- // CIL[END chunk_id="protectedroute_module_header_1783930597"]
27
- // CIL[BEGIN chunk_id="protectedroute_protectedrouteprops_1783930597" type="interface" identity="ProtectedRouteProps" parent="none"]
28
- // CIL[DOC-MACRO purpose="Define props interface for route protection component"]
29
- // CIL[DOC-RESPONSIBILITY responsibility="Specify configurable options for protected routes"]
30
- // CIL[DOC-CONTEXT module="protected-route" layer="frontend-component" related_files="[\".framework/functions/_shared/schema-utils.ts\",\".framework/src/components/ui/dialog.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/functions/_shared/principal.ts\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"\\\"]"]
31
- // CIL[DOC-CONTRACT inputs="none" outputs="Type definition" errors="none" side_effects="none"]
32
- // CIL[DOC-MICRO logic_summary="Interface with optional system admin requirement flag" notable_decisions="[]"]
33
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
34
- // CIL[DOC-STABILITY stability="stable"]
35
- // CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 0. Direct calls: 0. Related files: .framework/functions/_shared/schema-utils.ts, .framework/src/components/ui/dialog.tsx, custom/apps/portal/pages/ContentPage.tsx, .framework/functions/_shared/principal.ts, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, \."]
36
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
37
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
38
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
23
+ // CIL[DOC-VECTOR type="context" content="purpose='Provide the module-level imports for the ProtectedRoute component'; No verified external callers; imports: .framework/src/contexts/AuthContext.tsx"]
24
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
25
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
26
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
39
27
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
40
28
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
29
+ // CIL[END stable_id="~/.framework/src/components/auth/ProtectedRoute.tsx:module_header:module_header"]
30
+
31
+ // CIL[BEGIN stable_id="~/.framework/src/components/auth/ProtectedRoute.tsx:protectedrouteprops:interface" type="interface" identity="ProtectedRouteProps" parent="module_header"]
32
+ // CIL[DOC-MACRO purpose="Define the props contract for the ProtectedRoute component"]
33
+ // CIL[DOC-RESPONSIBILITY responsibility="Declare the typed shape of props accepted by the ProtectedRoute function"]
34
+ // CIL[DOC-CONTEXT module="components/auth" layer="presentation" related_files=".framework/src/components/auth/ProtectedRoute.tsx,.framework/src/contexts/AuthContext.tsx"]
35
+ // CIL[DOC-CONTRACT inputs="children React.ReactNode, requireSystemAdmin boolean" outputs="none" errors="none" side_effects="none"]
36
+ // CIL[DOC-MICRO logic_summary="Defines an interface with children of type React.ReactNode and an optional requireSystemAdmin boolean" notable_decisions="[]"]
37
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
38
+ // CIL[DOC-STABILITY stability="stable"]
39
+
41
40
  interface ProtectedRouteProps {
42
41
  children: React.ReactNode
43
42
  requireSystemAdmin?: boolean
44
43
  }
45
- // CIL[END chunk_id="protectedroute_protectedrouteprops_1783930597"]
46
- // CIL[BEGIN chunk_id="protectedroute_protectedroute_1783930597" type="function" identity="ProtectedRoute" parent="none"]
47
- // CIL[DOC-MACRO purpose="Route guard component enforcing authentication and role checks"]
48
- // CIL[DOC-RESPONSIBILITY responsibility="Protect routes from unauthorized access with optional admin validation"]
49
- // CIL[DOC-CONTEXT module="protected-route" layer="frontend-component" related_files="[\".framework/src/pages/admin/RolesPage.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/components/ui/dialog.tsx\",\"\\\"]"]
50
- // CIL[DOC-CONTRACT inputs="none" outputs="Protected content or redirect/denial UI" errors="none" side_effects="Navigation redirects, renders access denied UI"]
51
- // CIL[DOC-MICRO logic_summary="Checks user auth state and optional system_admin role, redirects to login or shows access denied" notable_decisions="[]"]
52
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
53
- // CIL[DOC-STABILITY stability="stable"]
54
- // CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/RolesPage.tsx, custom/apps/portal/pages/ContentPage.tsx, .framework/src/components/ui/dialog.tsx, \."]
55
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
56
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
57
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
44
+ // CIL[DOC-VECTOR type="context" content="purpose='Define the props contract for the ProtectedRoute component'; No verified external callers; imports: .framework/src/contexts/AuthContext.tsx"]
45
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
46
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
47
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
58
48
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
59
49
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
50
+ // CIL[END stable_id="~/.framework/src/components/auth/ProtectedRoute.tsx:protectedrouteprops:interface"]
51
+
52
+ // CIL[BEGIN stable_id="~/.framework/src/components/auth/ProtectedRoute.tsx:protectedroute:function" type="function" identity="ProtectedRoute" parent="module_header"]
53
+ // CIL[DOC-MACRO purpose="Guard a React route by authentication and optional system-admin role"]
54
+ // CIL[DOC-RESPONSIBILITY responsibility="Render children when the user is authenticated and authorized, redirect anonymous users to login, and deny non-admin users when required"]
55
+ // CIL[DOC-CONTEXT module="components/auth" layer="presentation" related_files=".framework/src/components/auth/ProtectedRoute.tsx,.framework/src/contexts/AuthContext.tsx"]
56
+ // CIL[DOC-CONTRACT inputs="children React.ReactNode, requireSystemAdmin boolean" outputs="ReactElement | null" errors="none" side_effects="Navigates to /login via Navigate, and to /dashboard via window.location when denied"]
57
+ // CIL[DOC-MICRO logic_summary="Obtains user from useAuth; if user is missing redirects to /login; if requireSystemAdmin is true and user does not hold system_admin role renders an Access Denied view with a dashboard button; otherwise renders children" notable_decisions="[]"]
58
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
59
+ // CIL[DOC-STABILITY stability="stable"]
60
+
60
61
  export function ProtectedRoute({ children, requireSystemAdmin = false }: ProtectedRouteProps) {
61
62
  const { user } = useAuth()
62
63
 
@@ -93,4 +94,10 @@ export function ProtectedRoute({ children, requireSystemAdmin = false }: Protect
93
94
 
94
95
  return <>{children}</>
95
96
  }
96
- // CIL[END chunk_id="protectedroute_protectedroute_1783930597"]
97
+ // CIL[DOC-VECTOR type="context" content="purpose='Guard a React route by authentication and optional system-admin role'; No verified external callers; imports: .framework/src/contexts/AuthContext.tsx"]
98
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
99
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
100
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
101
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
102
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
103
+ // CIL[END stable_id="~/.framework/src/components/auth/ProtectedRoute.tsx:protectedroute:function"]
@@ -0,0 +1,27 @@
1
+ // CIL[BEGIN stable_id="~/.framework/src/components/auth/TurnstileWidget.tsx:module_header:module_header" type="module_header" identity="module_header" parent="~/.framework/src/components/auth/TurnstileWidget.tsx"]
2
+ // CIL[DOC-MACRO purpose="Optional Cloudflare Turnstile bot-protection widget for auth surfaces"]
3
+ // CIL[DOC-RESPONSIBILITY responsibility="Render a Turnstile challenge when VITE_TURNSTILE_SITE_KEY is configured; render nothing and stay inert otherwise"]
4
+ // CIL[DOC-CONTEXT module="auth" layer="presentation" related_files=".framework/src/pages/auth/RegisterPage.tsx,.framework/src/pages/auth/LoginPage.tsx,.framework/src/pages/auth/ForgotPasswordPage.tsx,.framework/src/contexts/AuthContext.tsx"]
5
+ // CIL[DOC-CONTRACT inputs="onToken: (token|null)=>void" outputs="JSX | null; token via callback" errors="onError/onExpire clear the token" side_effects="loads challenges.cloudflare.com script when rendered"]
6
+ // CIL[DOC-MICRO logic_summary="Site key comes from import.meta.env at build time; absent key returns null so packaged installs and local dev keep existing behavior" notable_decisions="One Turnstile site should cover both the prod domain and localhost so the same key works everywhere"]
7
+ // CIL[DOC-STABILITY stability="stable"]
8
+ // CIL[DOC-AUDIENCE audience="internal"]
9
+
10
+ import { Turnstile } from '@marsidev/react-turnstile'
11
+
12
+ const SITE_KEY = (import.meta.env.VITE_TURNSTILE_SITE_KEY as string | undefined) || ''
13
+
14
+ export const turnstileEnabled = !!SITE_KEY
15
+
16
+ export function TurnstileWidget({ onToken }: { onToken: (token: string | null) => void }) {
17
+ if (!SITE_KEY) return null
18
+ return (
19
+ <Turnstile
20
+ siteKey={SITE_KEY}
21
+ onSuccess={onToken}
22
+ onExpire={() => onToken(null)}
23
+ onError={() => onToken(null)}
24
+ />
25
+ )
26
+ }
27
+ // CIL[END stable_id="~/.framework/src/components/auth/TurnstileWidget.tsx:module_header:module_header"]