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
@@ -0,0 +1,181 @@
1
+ // CIL[BEGIN stable_id="~/.framework/src/lib/registration.ts:module_header:module_header" type="module_header" identity="module_header" parent="~/.framework/src/lib/registration.ts"]
2
+ // CIL[DOC-MACRO purpose="Client helpers for resumable registration completion"]
3
+ // CIL[DOC-RESPONSIBILITY responsibility="Persist non-secret pending registration intent in sessionStorage and finalize registration through the authenticated invites API"]
4
+ // CIL[DOC-CONTEXT module="framework-api" layer="lib" related_files=".framework/src/lib/api.ts,.framework/src/pages/auth/RegisterPage.tsx,.framework/src/pages/auth/AuthConfirmPage.tsx"]
5
+ // CIL[DOC-CONTRACT inputs="module imports" outputs="pending-intent storage helpers, RegistrationError, finalizeRegistration" errors="none" side_effects="reads/writes sessionStorage"]
6
+ // CIL[DOC-MICRO logic_summary="Exports spine.pending_registration sessionStorage helpers plus finalizeRegistration, which POSTs {app, path, account_name} to invites?action=complete-registration via apiFetch (Bearer session) and returns the server-truth {status, account_slug, role_slug}" notable_decisions="Never stores password or invite token; invite claim happens in the auth.users trigger at signUp, so invite intent only needs {invite:true}"]
7
+ // CIL[DOC-CONFIDENCE pass="first" score="0.85" flags="none"]
8
+ // CIL[DOC-STABILITY stability="experimental"]
9
+ // CIL[DOC-AUDIENCE audience="framework developers"]
10
+ // CIL[DOC-NOTE type="contract" content="complete-registration is authenticated server-side (createHandler rejects anonymous). Email/role/account target are resolved from ctx.principal + installed app config — the client sends only app, path, account_name."]
11
+
12
+ import { apiFetch } from './api'
13
+ // CIL[END stable_id="~/.framework/src/lib/registration.ts:module_header:module_header"]
14
+
15
+ // CIL[BEGIN stable_id="~/.framework/src/lib/registration.ts:pendingregistrationintent:interface" type="interface" identity="PendingRegistrationIntent" parent="~/.framework/src/lib/registration.ts"]
16
+ // CIL[DOC-MACRO purpose="Describe the resumable registration intent persisted across email confirmation"]
17
+ // CIL[DOC-RESPONSIBILITY responsibility="Type for the non-secret pending registration payload stored in sessionStorage"]
18
+ // CIL[DOC-CONTEXT module="framework-api" layer="lib" related_files=".framework/src/lib/registration.ts"]
19
+ // CIL[DOC-CONTRACT inputs="none" outputs="PendingRegistrationIntent object" errors="none" side_effects="none"]
20
+ // CIL[DOC-MICRO logic_summary="{app, path, account_name, invite} — no password, email, or invite token" notable_decisions="path is optional because invite intents ({invite:true}) need no server call"]
21
+ // CIL[DOC-CONFIDENCE pass="first" score="0.85" flags="none"]
22
+ // CIL[DOC-STABILITY stability="experimental"]
23
+ export interface PendingRegistrationIntent {
24
+ app?: string
25
+ path?: 'new_account' | 'existing_account' | 'join_request'
26
+ account_name?: string
27
+ invite?: boolean
28
+ }
29
+ // CIL[END stable_id="~/.framework/src/lib/registration.ts:pendingregistrationintent:interface"]
30
+
31
+ // CIL[BEGIN stable_id="~/.framework/src/lib/registration.ts:pending_registration_key:constant" type="constant" identity="PENDING_REGISTRATION_KEY" parent="~/.framework/src/lib/registration.ts"]
32
+ // CIL[DOC-MACRO purpose="sessionStorage key for the pending registration intent"]
33
+ // CIL[DOC-RESPONSIBILITY responsibility="Single source for the 'spine.pending_registration' storage key"]
34
+ // CIL[DOC-CONTEXT module="framework-api" layer="lib" related_files=".framework/src/lib/registration.ts"]
35
+ // CIL[DOC-CONTRACT inputs="none" outputs="string constant" errors="none" side_effects="none"]
36
+ // CIL[DOC-MICRO logic_summary="Constant string 'spine.pending_registration'" notable_decisions="[]"]
37
+ // CIL[DOC-CONFIDENCE pass="first" score="0.85" flags="none"]
38
+ // CIL[DOC-STABILITY stability="experimental"]
39
+ export const PENDING_REGISTRATION_KEY = 'spine.pending_registration'
40
+ // CIL[END stable_id="~/.framework/src/lib/registration.ts:pending_registration_key:constant"]
41
+
42
+ // CIL[BEGIN stable_id="~/.framework/src/lib/registration.ts:registrationerror:class" type="class" identity="RegistrationError" parent="~/.framework/src/lib/registration.ts"]
43
+ // CIL[DOC-MACRO purpose="Error type distinguishing definitive server rejections from transient network failures"]
44
+ // CIL[DOC-RESPONSIBILITY responsibility="Carry a serverResponded flag so callers know whether a stored intent should be cleared (definitive) or kept for retry (transient)"]
45
+ // CIL[DOC-CONTEXT module="framework-api" layer="lib" related_files=".framework/src/lib/registration.ts"]
46
+ // CIL[DOC-CONTRACT inputs="message, serverResponded" outputs="Error subclass" errors="none" side_effects="none"]
47
+ // CIL[DOC-MICRO logic_summary="Extends Error with a serverResponded boolean" notable_decisions="serverResponded=true whenever the invites API returned a response (error body or non-OK status); false only for fetch-level/network failures"]
48
+ // CIL[DOC-CONFIDENCE pass="first" score="0.85" flags="none"]
49
+ // CIL[DOC-STABILITY stability="experimental"]
50
+ export class RegistrationError extends Error {
51
+ serverResponded: boolean
52
+ constructor(message: string, serverResponded: boolean) {
53
+ super(message)
54
+ this.name = 'RegistrationError'
55
+ this.serverResponded = serverResponded
56
+ }
57
+ }
58
+ // CIL[END stable_id="~/.framework/src/lib/registration.ts:registrationerror:class"]
59
+
60
+ // CIL[BEGIN stable_id="~/.framework/src/lib/registration.ts:savependingregistration:function" type="function" identity="savePendingRegistration" parent="~/.framework/src/lib/registration.ts"]
61
+ // CIL[DOC-MACRO purpose="Persist the pending registration intent so a confirmation round-trip can resume it"]
62
+ // CIL[DOC-RESPONSIBILITY responsibility="Write the intent JSON to sessionStorage under spine.pending_registration"]
63
+ // CIL[DOC-CONTEXT module="framework-api" layer="lib" related_files=".framework/src/lib/registration.ts"]
64
+ // CIL[DOC-CONTRACT inputs="intent: PendingRegistrationIntent" outputs="void" errors="storage exceptions swallowed" side_effects="sessionStorage write"]
65
+ // CIL[DOC-MICRO logic_summary="JSON.stringify intent into sessionStorage, swallowing storage errors" notable_decisions="Must be called BEFORE complete-registration so a lost response can still resume"]
66
+ // CIL[DOC-CONFIDENCE pass="first" score="0.85" flags="none"]
67
+ // CIL[DOC-STABILITY stability="experimental"]
68
+ export function savePendingRegistration(intent: PendingRegistrationIntent): void {
69
+ try {
70
+ sessionStorage.setItem(PENDING_REGISTRATION_KEY, JSON.stringify(intent))
71
+ } catch {
72
+ // sessionStorage may be unavailable (private mode, SSR); resume simply won't fire
73
+ }
74
+ }
75
+ // CIL[END stable_id="~/.framework/src/lib/registration.ts:savependingregistration:function"]
76
+
77
+ // CIL[BEGIN stable_id="~/.framework/src/lib/registration.ts:readpendingregistration:function" type="function" identity="readPendingRegistration" parent="~/.framework/src/lib/registration.ts"]
78
+ // CIL[DOC-MACRO purpose="Read the persisted pending registration intent"]
79
+ // CIL[DOC-RESPONSIBILITY responsibility="Parse and return the sessionStorage intent, or null when absent/corrupt"]
80
+ // CIL[DOC-CONTEXT module="framework-api" layer="lib" related_files=".framework/src/lib/registration.ts"]
81
+ // CIL[DOC-CONTRACT inputs="none" outputs="PendingRegistrationIntent | null" errors="parse/storage errors return null" side_effects="sessionStorage read"]
82
+ // CIL[DOC-MICRO logic_summary="JSON.parse the stored value; validates it is a plain object" notable_decisions="[]"]
83
+ // CIL[DOC-CONFIDENCE pass="first" score="0.85" flags="none"]
84
+ // CIL[DOC-STABILITY stability="experimental"]
85
+ export function readPendingRegistration(): PendingRegistrationIntent | null {
86
+ try {
87
+ const raw = sessionStorage.getItem(PENDING_REGISTRATION_KEY)
88
+ if (!raw) return null
89
+ const parsed = JSON.parse(raw)
90
+ if (!parsed || typeof parsed !== 'object') return null
91
+ return parsed as PendingRegistrationIntent
92
+ } catch {
93
+ return null
94
+ }
95
+ }
96
+ // CIL[END stable_id="~/.framework/src/lib/registration.ts:readpendingregistration:function"]
97
+
98
+ // CIL[BEGIN stable_id="~/.framework/src/lib/registration.ts:clearpendingregistration:function" type="function" identity="clearPendingRegistration" parent="~/.framework/src/lib/registration.ts"]
99
+ // CIL[DOC-MACRO purpose="Remove the persisted pending registration intent"]
100
+ // CIL[DOC-RESPONSIBILITY responsibility="Delete spine.pending_registration from sessionStorage on success or definitive failure"]
101
+ // CIL[DOC-CONTEXT module="framework-api" layer="lib" related_files=".framework/src/lib/registration.ts"]
102
+ // CIL[DOC-CONTRACT inputs="none" outputs="void" errors="storage exceptions swallowed" side_effects="sessionStorage removeItem"]
103
+ // CIL[DOC-MICRO logic_summary="removeItem wrapped in try/catch" notable_decisions="[]"]
104
+ // CIL[DOC-CONFIDENCE pass="first" score="0.85" flags="none"]
105
+ // CIL[DOC-STABILITY stability="experimental"]
106
+ export function clearPendingRegistration(): void {
107
+ try {
108
+ sessionStorage.removeItem(PENDING_REGISTRATION_KEY)
109
+ } catch {
110
+ // ignore
111
+ }
112
+ }
113
+ // CIL[END stable_id="~/.framework/src/lib/registration.ts:clearpendingregistration:function"]
114
+
115
+ // CIL[BEGIN stable_id="~/.framework/src/lib/registration.ts:completeregistrationresult:interface" type="interface" identity="CompleteRegistrationResult" parent="~/.framework/src/lib/registration.ts"]
116
+ // CIL[DOC-MACRO purpose="Normalized result returned by the authenticated complete-registration endpoint"]
117
+ // CIL[DOC-RESPONSIBILITY responsibility="Type for {status, account_slug, role_slug} — server-truth placement and role"]
118
+ // CIL[DOC-CONTEXT module="framework-api" layer="lib" related_files=".framework/src/lib/registration.ts"]
119
+ // CIL[DOC-CONTRACT inputs="none" outputs="CompleteRegistrationResult object" errors="none" side_effects="none"]
120
+ // CIL[DOC-MICRO logic_summary="status 'active'|'pending'; role_slug is the server-assigned role (never trust the client guess)" notable_decisions="[]"]
121
+ // CIL[DOC-CONFIDENCE pass="first" score="0.85" flags="none"]
122
+ // CIL[DOC-STABILITY stability="experimental"]
123
+ export interface CompleteRegistrationResult {
124
+ status: 'active' | 'pending'
125
+ account_slug?: string
126
+ role_slug?: string
127
+ }
128
+ // CIL[END stable_id="~/.framework/src/lib/registration.ts:completeregistrationresult:interface"]
129
+
130
+ // CIL[BEGIN stable_id="~/.framework/src/lib/registration.ts:finalizeregistration:function" type="function" identity="finalizeRegistration" parent="~/.framework/src/lib/registration.ts"]
131
+ // CIL[DOC-MACRO purpose="Complete registration through the authenticated invites endpoint"]
132
+ // CIL[DOC-RESPONSIBILITY responsibility="POST {app, path, account_name} to invites?action=complete-registration via apiFetch and normalize the response"]
133
+ // CIL[DOC-CONTEXT module="framework-api" layer="lib" related_files=".framework/src/lib/api.ts,.framework/src/lib/registration.ts"]
134
+ // CIL[DOC-CONTRACT inputs="intent: PendingRegistrationIntent (path required; invite intents rejected)" outputs="Promise<CompleteRegistrationResult>" errors="RegistrationError — serverResponded=true for {error} bodies and non-OK responses, false for network failures" side_effects="authenticated HTTP POST to /.netlify/functions/invites"]
135
+ // CIL[DOC-MICRO logic_summary="Sends only {app, path, account_name}; the server binds email/role/account from ctx.principal and installed app config" notable_decisions="Never forwards role_slug, email, target_account, or target_account_id — placement is server-resolved"]
136
+ // CIL[DOC-CONFIDENCE pass="first" score="0.85" flags="none"]
137
+ // CIL[DOC-STABILITY stability="experimental"]
138
+ export async function finalizeRegistration(
139
+ intent: PendingRegistrationIntent
140
+ ): Promise<CompleteRegistrationResult> {
141
+ if (intent.invite || !intent.path) {
142
+ // Invite claims happen in the auth.users trigger at signUp time — there is
143
+ // nothing for complete-registration to do.
144
+ throw new RegistrationError('No registration action to complete for this intent', true)
145
+ }
146
+
147
+ let res: Response
148
+ try {
149
+ res = await apiFetch('/.netlify/functions/invites?action=complete-registration', {
150
+ method: 'POST',
151
+ headers: { 'Content-Type': 'application/json' },
152
+ body: JSON.stringify({
153
+ app: intent.app,
154
+ path: intent.path,
155
+ account_name: intent.account_name,
156
+ }),
157
+ })
158
+ } catch (err: any) {
159
+ throw new RegistrationError(err?.message || 'Network error completing registration', false)
160
+ }
161
+
162
+ const json = await res.json().catch(() => null)
163
+
164
+ if (json?.error) {
165
+ throw new RegistrationError(String(json.error), true)
166
+ }
167
+ if (!res.ok) {
168
+ throw new RegistrationError(
169
+ json?.message || `Registration failed (HTTP ${res.status})`,
170
+ true
171
+ )
172
+ }
173
+
174
+ const data = json?.data ?? json ?? {}
175
+ return {
176
+ status: data.status === 'pending' ? 'pending' : 'active',
177
+ account_slug: data.account_slug,
178
+ role_slug: data.role_slug,
179
+ }
180
+ }
181
+ // CIL[END stable_id="~/.framework/src/lib/registration.ts:finalizeregistration:function"]
@@ -1,62 +1,88 @@
1
+ // CIL[BEGIN stable_id="~/.framework/src/lib/supabase.ts:module_header:module_header" type="module_header" identity="module_header" parent="~/.framework/src/lib/supabase.ts"]
2
+ // CIL[DOC-MACRO purpose="Module setup and imports for supabase.ts"]
3
+ // CIL[DOC-RESPONSIBILITY responsibility="Establish the public surface and dependencies of supabase.ts"]
4
+ // CIL[DOC-CONTEXT module=".framework/src/lib/supabase.ts" layer="lib" related_files=".framework/src/lib/supabase.ts"]
5
+ // CIL[DOC-CONTRACT inputs="none" outputs="none" errors="none" side_effects="none"]
6
+ // CIL[DOC-MICRO logic_summary="Imports required modules for supabase.ts" notable_decisions="[]"]
7
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
8
+ // CIL[DOC-AUDIENCE audience="framework"]
9
+ // CIL[DOC-STABILITY stability="stable"]
1
10
 
2
11
 
3
12
 
4
13
 
5
14
 
6
15
 
7
- // CIL[BEGIN chunk_id="supabase_module_header_1783672456" type="module_header" identity="imports" parent="none"]
8
- // CIL[DOC-MACRO purpose="Import Supabase client"]
9
- // CIL[DOC-RESPONSIBILITY responsibility="Import Supabase client factory"]
10
- // CIL[DOC-CONTEXT module="supabase" layer="frontend-hook" related_files="[\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"\\\"]"]
11
- // CIL[DOC-CONTRACT inputs="none" outputs="createClient function" errors="none" side_effects="none"]
12
- // CIL[DOC-MICRO logic_summary="Imports Supabase client creation function" notable_decisions="[]"]
13
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
14
- // CIL[DOC-STABILITY stability="stable"]
15
- // CIL[DOC-AUDIENCE audience="developer"]
16
- // CIL[DOC-VECTOR type="context" content="Layer: frontend-hook. Direct callers: 0. Direct calls: 0. Related files: custom/apps/cortex/pages/operations/OperationsDashboard.tsx, \."]
17
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
18
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
19
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
16
+
17
+ import { createClient } from '@supabase/supabase-js'
18
+ // CIL[DOC-VECTOR type="context" content="purpose='Module setup and imports for supabase.ts'; No verified external callers; imports: none"]
19
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
20
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
21
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
20
22
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
21
23
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
22
- import { createClient } from '@supabase/supabase-js'
23
- // CIL[END chunk_id="supabase_module_header_1783672456"]
24
- // CIL[BEGIN chunk_id="supabase_envvars_1783672456" type="variable" identity="environmentVariables" parent="none"]
25
- // CIL[DOC-MACRO purpose="Load Supabase environment variables"]
26
- // CIL[DOC-RESPONSIBILITY responsibility="Validate and store Supabase config"]
27
- // CIL[DOC-CONTEXT module="supabase" layer="frontend-hook" related_files="[\"\\\"]"]
28
- // CIL[DOC-CONTRACT inputs="none" outputs="Environment variables" errors="Error on missing vars" side_effects="May throw error"]
29
- // CIL[DOC-MICRO logic_summary="Loads and validates required Supabase env vars" notable_decisions="[]"]
30
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
24
+ // CIL[END stable_id="~/.framework/src/lib/supabase.ts:module_header:module_header"]
25
+ // CIL[BEGIN stable_id="~/.framework/src/lib/supabase.ts:supabaseUrl:constant" type="constant" identity="supabaseUrl" parent="~/.framework/src/lib/supabase.ts"]
26
+ // CIL[DOC-MACRO purpose="Define the supabaseUrl constant"]
27
+ // CIL[DOC-RESPONSIBILITY responsibility="Expose the supabaseUrl value to consumers"]
28
+ // CIL[DOC-CONTEXT module=".framework/src/lib/supabase.ts" layer="lib" related_files=".framework/src/lib/supabase.ts"]
29
+ // CIL[DOC-CONTRACT inputs="none" outputs="string value from import.meta.env" errors="none" side_effects="none"]
30
+ // CIL[DOC-MICRO logic_summary="Binds the expression to the supabaseUrl identifier" notable_decisions="[]"]
31
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
31
32
  // CIL[DOC-STABILITY stability="stable"]
32
- // CIL[DOC-VECTOR type="context" content="Layer: frontend-hook. Direct callers: 0. Direct calls: 0. Related files: \."]
33
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
34
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
35
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
33
+ const supabaseUrl = import.meta.env.VITE_SUPABASE_URL
34
+ // CIL[DOC-VECTOR type="context" content="purpose='Define the supabaseUrl constant'; No verified external callers; imports: none"]
35
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
36
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
37
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
36
38
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
37
39
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
38
- const supabaseUrl = import.meta.env.VITE_SUPABASE_URL
40
+ // CIL[END stable_id="~/.framework/src/lib/supabase.ts:supabaseUrl:constant"]
41
+ // CIL[BEGIN stable_id="~/.framework/src/lib/supabase.ts:supabaseAnonKey:constant" type="constant" identity="supabaseAnonKey" parent="~/.framework/src/lib/supabase.ts"]
42
+ // CIL[DOC-MACRO purpose="Define the supabaseAnonKey constant"]
43
+ // CIL[DOC-RESPONSIBILITY responsibility="Expose the supabaseAnonKey value to consumers"]
44
+ // CIL[DOC-CONTEXT module=".framework/src/lib/supabase.ts" layer="lib" related_files=".framework/src/lib/supabase.ts"]
45
+ // CIL[DOC-CONTRACT inputs="none" outputs="string value from import.meta.env" errors="none" side_effects="none"]
46
+ // CIL[DOC-MICRO logic_summary="Binds the expression to the supabaseAnonKey identifier" notable_decisions="[]"]
47
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
48
+ // CIL[DOC-STABILITY stability="stable"]
39
49
  const supabaseAnonKey = import.meta.env.VITE_SUPABASE_ANON_KEY
50
+ // CIL[DOC-VECTOR type="context" content="purpose='Define the supabaseAnonKey constant'; No verified external callers; imports: none"]
51
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
52
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
53
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
54
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
55
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
56
+ // CIL[END stable_id="~/.framework/src/lib/supabase.ts:supabaseAnonKey:constant"]
40
57
 
58
+ // CIL[BEGIN stable_id="~/.framework/src/lib/supabase.ts:supabase_env_check:variable" type="variable" identity="supabase_env_check" parent="~/.framework/src/lib/supabase.ts"]
59
+ // CIL[DOC-MACRO purpose="Runtime guard for supabase_env_check"]
60
+ // CIL[DOC-RESPONSIBILITY responsibility="Ensure required conditions are met before execution"]
61
+ // CIL[DOC-CONTEXT module=".framework/src/lib/supabase.ts" layer="lib" related_files=".framework/src/lib/supabase.ts"]
62
+ // CIL[DOC-CONTRACT inputs="none" outputs="none" errors="throws Error if validation fails" side_effects="none"]
63
+ // CIL[DOC-MICRO logic_summary="Validates environment and throws if the guard fails" notable_decisions="[]"]
64
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
65
+ // CIL[DOC-STABILITY stability="stable"]
41
66
  if (!supabaseUrl || !supabaseAnonKey) {
42
67
  throw new Error('Missing Supabase environment variables')
43
68
  }
44
- // CIL[END chunk_id="supabase_envvars_1783672456"]
45
- // CIL[BEGIN chunk_id="supabase_client_1783672456" type="variable" identity="supabase" parent="none"]
46
- // CIL[DOC-MACRO purpose="Create Supabase client singleton"]
47
- // CIL[DOC-RESPONSIBILITY responsibility="Initialize Supabase client with auth config"]
48
- // CIL[DOC-CONTEXT module="supabase" layer="frontend-hook" related_files="[\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/src/components/ui/dialog.tsx\",\"\\\"]"]
49
- // CIL[DOC-CONTRACT inputs="none" outputs="Supabase client instance" errors="none" side_effects="Reads localStorage"]
50
- // CIL[DOC-MICRO logic_summary="Configures session persistence, auto-refresh, and a no-op auth lock to bypass navigator.locks" notable_decisions="[]"]
51
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
52
- // CIL[DOC-STABILITY stability="stable"]
53
- // CIL[DOC-NOTE type="caution" content="No-op lock bypasses navigator.locks to avoid NavigatorLockAcquireTimeoutError during login"]
54
- // CIL[DOC-VECTOR type="context" content="Layer: frontend-hook. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/TypeDetailPage.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."]
69
+ // CIL[DOC-VECTOR type="context" content="purpose='Runtime guard for supabase_env_check'; No verified external callers; imports: none"]
70
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
71
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
72
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
58
73
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
59
74
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
75
+ // CIL[END stable_id="~/.framework/src/lib/supabase.ts:supabase_env_check:variable"]
76
+
77
+
78
+ // CIL[BEGIN stable_id="~/.framework/src/lib/supabase.ts:supabase:constant" type="constant" identity="supabase" parent="~/.framework/src/lib/supabase.ts"]
79
+ // CIL[DOC-MACRO purpose="Define the supabase constant"]
80
+ // CIL[DOC-RESPONSIBILITY responsibility="Expose the supabase value to consumers"]
81
+ // CIL[DOC-CONTEXT module=".framework/src/lib/supabase.ts" layer="lib" related_files=".framework/src/lib/supabase.ts"]
82
+ // CIL[DOC-CONTRACT inputs="none" outputs="SupabaseClient instance" errors="none" side_effects="none"]
83
+ // CIL[DOC-MICRO logic_summary="Binds the expression to the supabase identifier" notable_decisions="[]"]
84
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
85
+ // CIL[DOC-STABILITY stability="stable"]
60
86
  export const supabase = createClient(supabaseUrl, supabaseAnonKey, {
61
87
  auth: {
62
88
  persistSession: true,
@@ -65,64 +91,75 @@ export const supabase = createClient(supabaseUrl, supabaseAnonKey, {
65
91
  lock: async <T>(_name: string, _acquireTimeout: number, fn: () => Promise<T>): Promise<T> => await fn(),
66
92
  },
67
93
  })
68
- // CIL[END chunk_id="supabase_client_1783672456"]
69
- // CIL[BEGIN chunk_id="supabase_getcurrentsession_1783672456" type="function" identity="getCurrentSession" parent="none"]
70
- // CIL[DOC-MACRO purpose="Get current Supabase session"]
71
- // CIL[DOC-RESPONSIBILITY responsibility="Retrieve active auth session"]
72
- // CIL[DOC-CONTEXT module="supabase" layer="frontend-hook" related_files="[\".framework/src/pages/admin/RolesPage.tsx\",\"\\\"]"]
73
- // CIL[DOC-CONTRACT inputs="none" outputs="Session object or null" errors="Supabase AuthError" side_effects="Reads localStorage"]
74
- // CIL[DOC-MICRO logic_summary="Calls Supabase getSession and handles errors" notable_decisions="[]"]
75
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
76
- // CIL[DOC-STABILITY stability="stable"]
77
- // CIL[DOC-VECTOR type="context" content="Layer: frontend-hook. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/RolesPage.tsx, \."]
78
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
79
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
80
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
94
+ // CIL[DOC-VECTOR type="context" content="purpose='Define the supabase constant'; No verified external callers; imports: none"]
95
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
96
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
97
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
81
98
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
82
99
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
100
+ // CIL[END stable_id="~/.framework/src/lib/supabase.ts:supabase:constant"]
101
+
102
+
103
+ // CIL[BEGIN stable_id="~/.framework/src/lib/supabase.ts:getCurrentSession:function" type="function" identity="getCurrentSession" parent="~/.framework/src/lib/supabase.ts"]
104
+ // CIL[DOC-MACRO purpose="Implement getCurrentSession"]
105
+ // CIL[DOC-RESPONSIBILITY responsibility="Execute the core logic for getCurrentSession"]
106
+ // CIL[DOC-CONTEXT module=".framework/src/lib/supabase.ts" layer="lib" related_files=".framework/src/lib/supabase.ts"]
107
+ // CIL[DOC-CONTRACT inputs="none" outputs="result of the operation" errors="propagates dependency errors" side_effects="none"]
108
+ // CIL[DOC-MICRO logic_summary="Processes inputs, performs work, and returns output for getCurrentSession" notable_decisions="[]"]
109
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
110
+ // CIL[DOC-STABILITY stability="stable"]
83
111
  export const getCurrentSession = async () => {
84
112
  const { data: { session }, error } = await supabase.auth.getSession()
85
113
  if (error) throw error
86
114
  return session
87
115
  }
88
- // CIL[END chunk_id="supabase_getcurrentsession_1783672456"]
89
- // CIL[BEGIN chunk_id="supabase_getcurrentuser_1783672456" type="function" identity="getCurrentUser" parent="none"]
90
- // CIL[DOC-MACRO purpose="Get current Supabase user"]
91
- // CIL[DOC-RESPONSIBILITY responsibility="Retrieve authenticated user data"]
92
- // CIL[DOC-CONTEXT module="supabase" layer="frontend-hook" related_files="[\".framework/src/pages/admin/RolesPage.tsx\",\"\\\"]"]
93
- // CIL[DOC-CONTRACT inputs="none" outputs="User object or null" errors="Supabase AuthError" side_effects="Reads localStorage"]
94
- // CIL[DOC-MICRO logic_summary="Calls Supabase getUser and handles errors" notable_decisions="[]"]
95
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
96
- // CIL[DOC-STABILITY stability="stable"]
97
- // CIL[DOC-VECTOR type="context" content="Layer: frontend-hook. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/RolesPage.tsx, \."]
98
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
99
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
100
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
116
+ // CIL[DOC-VECTOR type="context" content="purpose='Implement getCurrentSession'; No verified external callers; imports: none"]
117
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
118
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
119
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
101
120
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
102
121
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
122
+ // CIL[END stable_id="~/.framework/src/lib/supabase.ts:getCurrentSession:function"]
123
+
124
+
125
+ // CIL[BEGIN stable_id="~/.framework/src/lib/supabase.ts:getCurrentUser:function" type="function" identity="getCurrentUser" parent="~/.framework/src/lib/supabase.ts"]
126
+ // CIL[DOC-MACRO purpose="Implement getCurrentUser"]
127
+ // CIL[DOC-RESPONSIBILITY responsibility="Execute the core logic for getCurrentUser"]
128
+ // CIL[DOC-CONTEXT module=".framework/src/lib/supabase.ts" layer="lib" related_files=".framework/src/lib/supabase.ts"]
129
+ // CIL[DOC-CONTRACT inputs="none" outputs="result of the operation" errors="propagates dependency errors" side_effects="none"]
130
+ // CIL[DOC-MICRO logic_summary="Processes inputs, performs work, and returns output for getCurrentUser" notable_decisions="[]"]
131
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
132
+ // CIL[DOC-STABILITY stability="stable"]
103
133
  export const getCurrentUser = async () => {
104
134
  const { data: { user }, error } = await supabase.auth.getUser()
105
135
  if (error) throw error
106
136
  return user
107
137
  }
108
- // CIL[END chunk_id="supabase_getcurrentuser_1783672456"]
109
- // CIL[BEGIN chunk_id="supabase_refreshsession_1783672456" type="function" identity="refreshSession" parent="none"]
110
- // CIL[DOC-MACRO purpose="Refresh Supabase session"]
111
- // CIL[DOC-RESPONSIBILITY responsibility="Force session token refresh"]
112
- // CIL[DOC-CONTEXT module="supabase" layer="frontend-hook" related_files="[]"]
113
- // CIL[DOC-CONTRACT inputs="none" outputs="Session data" errors="Supabase AuthError" side_effects="Updates localStorage"]
114
- // CIL[DOC-MICRO logic_summary="Calls Supabase refreshSession and handles errors" notable_decisions="[]"]
115
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
116
- // CIL[DOC-STABILITY stability="stable"]
117
- // CIL[DOC-VECTOR type="context" content="Layer: frontend-hook. Direct callers: 0. Direct calls: 0. Related files: none."]
118
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
119
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
120
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
138
+ // CIL[DOC-VECTOR type="context" content="purpose='Implement getCurrentUser'; No verified external callers; imports: none"]
139
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
140
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
141
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
121
142
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
122
143
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
144
+ // CIL[END stable_id="~/.framework/src/lib/supabase.ts:getCurrentUser:function"]
145
+
146
+ // CIL[BEGIN stable_id="~/.framework/src/lib/supabase.ts:refreshSession:function" type="function" identity="refreshSession" parent="~/.framework/src/lib/supabase.ts"]
147
+ // CIL[DOC-MACRO purpose="Implement refreshSession"]
148
+ // CIL[DOC-RESPONSIBILITY responsibility="Execute the core logic for refreshSession"]
149
+ // CIL[DOC-CONTEXT module=".framework/src/lib/supabase.ts" layer="lib" related_files=".framework/src/lib/supabase.ts"]
150
+ // CIL[DOC-CONTRACT inputs="none" outputs="result of the operation" errors="propagates dependency errors" side_effects="none"]
151
+ // CIL[DOC-MICRO logic_summary="Processes inputs, performs work, and returns output for refreshSession" notable_decisions="[]"]
152
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
153
+ // CIL[DOC-STABILITY stability="stable"]
123
154
  export const refreshSession = async () => {
124
155
  const { data, error } = await supabase.auth.refreshSession()
125
156
  if (error) throw error
126
157
  return data
127
158
  }
128
- // CIL[END chunk_id="supabase_refreshsession_1783672456"]
159
+ // CIL[DOC-VECTOR type="context" content="purpose='Implement refreshSession'; No verified external callers; imports: none"]
160
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
161
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
162
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
163
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
164
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
165
+ // CIL[END stable_id="~/.framework/src/lib/supabase.ts:refreshSession:function"]