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,3 +1,12 @@
1
+ // CIL[BEGIN stable_id="~/.framework/src/lib/api.ts:module_header:module_header" type="module_header" identity="module_header" parent="~/.framework/src/lib/api.ts"]
2
+ // CIL[DOC-MACRO purpose="API client for Spine: auth, account, and request tracing helpers."]
3
+ // CIL[DOC-RESPONSIBILITY responsibility="Provide authenticated fetch utilities and session tracing for the framework."]
4
+ // CIL[DOC-CONTEXT module="framework-api" layer="lib" related_files=".framework/src/lib/supabase.ts"]
5
+ // CIL[DOC-CONTRACT inputs="module imports" outputs="auth headers, account ID, trace IDs, wrapped fetch" errors="none" side_effects="registers unauthorized callback"]
6
+ // CIL[DOC-MICRO logic_summary="Exports helpers for Supabase auth, account scoping, and W3C trace context propagation." notable_decisions="Uses crypto.randomUUID for hex IDs; propagates traceparent on every request."]
7
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
8
+ // CIL[DOC-STABILITY stability="stable"]
9
+ // CIL[DOC-AUDIENCE audience="framework consumers and app developers"]
1
10
 
2
11
 
3
12
 
@@ -8,140 +17,141 @@
8
17
 
9
18
 
10
19
 
11
- // CIL[BEGIN chunk_id="api_imports_1783716639" type="module_header" identity="imports" parent="none"]
12
- // CIL[DOC-MACRO purpose="Import Supabase client for authentication"]
13
- // CIL[DOC-RESPONSIBILITY responsibility="Provide Supabase client dependency"]
14
- // CIL[DOC-CONTEXT module="api" layer="utility" related_files="[\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/functions/_shared/schema-utils.ts\",\"custom/apps/portal/pages/ContentPage.tsx\",\"\\\"]"]
15
- // CIL[DOC-CONTRACT inputs="none" outputs="supabase client" errors="none" side_effects="none"]
16
- // CIL[DOC-MICRO logic_summary="Import statement for external dependency" notable_decisions="[]"]
17
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
18
- // CIL[DOC-STABILITY stability="stable"]
19
- // CIL[DOC-AUDIENCE audience="developer"]
20
- // CIL[DOC-VECTOR type="context" content="Layer: utility. Direct callers: 0. Direct calls: 0. Related files: custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/functions/_shared/principal.ts, .framework/functions/_shared/schema-utils.ts, custom/apps/portal/pages/ContentPage.tsx, \."]
21
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
22
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
23
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
24
- // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
25
- // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
26
20
  import { supabase } from './supabase'
27
- // CIL[END chunk_id="api_imports_1783716639"]
28
- // CIL[BEGIN chunk_id="api__accountid_1783716639" type="variable" identity="_accountId" parent="none"]
29
- // CIL[DOC-MACRO purpose="Store current account context"]
30
- // CIL[DOC-RESPONSIBILITY responsibility="Maintain account ID state"]
31
- // CIL[DOC-CONTEXT module="api" layer="state" related_files="[\".framework/src/pages/admin/RolesPage.tsx\",\"\\\"]"]
32
- // CIL[DOC-CONTRACT inputs="none" outputs="account ID storage" errors="none" side_effects="state_modification"]
33
- // CIL[DOC-MICRO logic_summary="Module-level variable for account context" 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: state. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/RolesPage.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."]
21
+ // CIL[DOC-VECTOR type="context" content="purpose='API client for Spine: auth, account, and request tracing helpers.'; No verified external callers; imports: .framework/src/lib/supabase.ts"]
22
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
23
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
24
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
40
25
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
41
26
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
42
- let _accountId: string | null = null
43
- // CIL[END chunk_id="api__accountid_1783716639"]
44
- // CIL[BEGIN chunk_id="api_setaccountid_1783716639" type="function" identity="setAccountId" parent="none"]
45
- // CIL[DOC-MACRO purpose="Set current account context"]
46
- // CIL[DOC-RESPONSIBILITY responsibility="Update account ID state"]
47
- // CIL[DOC-CONTEXT module="api" layer="state" related_files="[\".framework/src/pages/admin/RolesPage.tsx\",\"\\\"]"]
48
- // CIL[DOC-CONTRACT inputs="none" outputs="none" errors="none" side_effects="state_modification"]
49
- // CIL[DOC-MICRO logic_summary="Assign account ID to module variable" notable_decisions="[]"]
50
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
27
+ // CIL[END stable_id="~/.framework/src/lib/api.ts:module_header:module_header"]
28
+
29
+ // CIL[BEGIN stable_id="~/.framework/src/lib/api.ts:_accountid:constant" type="constant" identity="_accountid" parent="~/.framework/src/lib/api.ts"]
30
+ // CIL[DOC-MACRO purpose="Holds the currently selected account ID in memory."]
31
+ // CIL[DOC-RESPONSIBILITY responsibility="Store mutable account ID state for authenticated requests."]
32
+ // CIL[DOC-CONTEXT module="framework-api" layer="lib" related_files=".framework/src/lib/api.ts,.framework/src/lib/supabase.ts"]
33
+ // CIL[DOC-CONTRACT inputs="set by setAccountId" outputs="read by getAuthHeaders and getAccountId" errors="none" side_effects="module-scoped mutable state"]
34
+ // CIL[DOC-MICRO logic_summary="Module-level nullable string storing the active account ID." notable_decisions="Null default; no persistence."]
35
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
51
36
  // CIL[DOC-STABILITY stability="stable"]
52
- // CIL[DOC-VECTOR type="context" content="Layer: state. Direct callers: 1. Direct calls: 0. Related files: .framework/src/pages/admin/RolesPage.tsx, \."]
53
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 1. Total affected: 1."]
54
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
55
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
37
+ let _accountId: string | null = null
38
+ // CIL[DOC-VECTOR type="context" content="purpose='Holds the currently selected account ID in memory.'; No verified external callers; imports: .framework/src/lib/supabase.ts"]
39
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
40
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
41
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
56
42
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
57
43
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
44
+ // CIL[END stable_id="~/.framework/src/lib/api.ts:_accountid:constant"]
45
+
46
+
47
+ // CIL[BEGIN stable_id="~/.framework/src/lib/api.ts:setAccountId:function" type="function" identity="setAccountId" parent="~/.framework/src/lib/api.ts"]
48
+ // CIL[DOC-MACRO purpose="Set the active account ID for subsequent API calls."]
49
+ // CIL[DOC-RESPONSIBILITY responsibility="Update the in-memory account ID variable."]
50
+ // CIL[DOC-CONTEXT module="framework-api" layer="lib" related_files=".framework/src/lib/api.ts,.framework/src/lib/supabase.ts"]
51
+ // CIL[DOC-CONTRACT inputs="id: string | null" outputs="void" errors="none" side_effects="mutates _accountId"]
52
+ // CIL[DOC-MICRO logic_summary="Assigns the provided id to the _accountId module variable." notable_decisions="Accepts null to clear selection."]
53
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
54
+ // CIL[DOC-STABILITY stability="stable"]
58
55
  export function setAccountId(id: string | null) {
59
56
  _accountId = id
60
57
  }
61
- // CIL[END chunk_id="api_setaccountid_1783716639"]
62
- // CIL[BEGIN chunk_id="api_getaccountid_1783716639" type="function" identity="getAccountId" parent="none"]
63
- // CIL[DOC-MACRO purpose="Get current account context"]
64
- // CIL[DOC-RESPONSIBILITY responsibility="Retrieve account ID state"]
65
- // CIL[DOC-CONTEXT module="api" layer="state" related_files="[\".framework/src/pages/admin/RolesPage.tsx\",\"\\\"]"]
66
- // CIL[DOC-CONTRACT inputs="none" outputs="account_id: string|null" errors="none" side_effects="none"]
67
- // CIL[DOC-MICRO logic_summary="Return account ID from module variable" notable_decisions="[]"]
68
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
69
- // CIL[DOC-STABILITY stability="stable"]
70
- // CIL[DOC-VECTOR type="context" content="Layer: state. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/RolesPage.tsx, \."]
71
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
72
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
73
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
58
+ // CIL[DOC-VECTOR type="context" content="purpose='Set the active account ID for subsequent API calls.'; No verified external callers; imports: .framework/src/lib/supabase.ts"]
59
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
60
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
61
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
74
62
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
75
63
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
64
+ // CIL[END stable_id="~/.framework/src/lib/api.ts:setAccountId:function"]
65
+
66
+ // CIL[BEGIN stable_id="~/.framework/src/lib/api.ts:getAccountId:function" type="function" identity="getAccountId" parent="~/.framework/src/lib/api.ts"]
67
+ // CIL[DOC-MACRO purpose="Return the currently selected account ID."]
68
+ // CIL[DOC-RESPONSIBILITY responsibility="Expose the in-memory account ID value."]
69
+ // CIL[DOC-CONTEXT module="framework-api" layer="lib" related_files=".framework/src/lib/api.ts,.framework/src/lib/supabase.ts"]
70
+ // CIL[DOC-CONTRACT inputs="none" outputs="string | null" errors="none" side_effects="none"]
71
+ // CIL[DOC-MICRO logic_summary="Returns the current _accountId value." notable_decisions="Simple getter."]
72
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
73
+ // CIL[DOC-STABILITY stability="stable"]
76
74
  export function getAccountId(): string | null {
77
75
  return _accountId
78
76
  }
79
- // CIL[END chunk_id="api_getaccountid_1783716639"]
80
- // CIL[BEGIN chunk_id="api_authpaths_1783716639" type="variable" identity="AUTH_PATHS" parent="none"]
81
- // CIL[DOC-MACRO purpose="Define authentication API endpoints"]
82
- // CIL[DOC-RESPONSIBILITY responsibility="Maintain auth path configuration"]
83
- // CIL[DOC-CONTEXT module="api" layer="config" related_files="[\".framework/src/pages/admin/IntegrationsPage.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/functions/_shared/schema-utils.ts\",\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\"\\\"]"]
84
- // CIL[DOC-CONTRACT inputs="none" outputs="auth paths array" errors="none" side_effects="none"]
85
- // CIL[DOC-MICRO logic_summary="Constant array of auth endpoint paths" notable_decisions="[]"]
86
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
87
- // CIL[DOC-STABILITY stability="stable"]
88
- // CIL[DOC-VECTOR type="context" content="Layer: config. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/IntegrationsPage.tsx, .framework/functions/_shared/principal.ts, .framework/functions/_shared/schema-utils.ts, custom/apps/cortex/functions/custom_cil-embeddings.ts, \."]
89
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
90
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
91
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
77
+ // CIL[DOC-VECTOR type="context" content="purpose='Return the currently selected account ID.'; No verified external callers; imports: .framework/src/lib/supabase.ts"]
78
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
79
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
80
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
92
81
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
93
82
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
94
- const AUTH_PATHS = ['/api/auth', '/api/admin-data']
95
- // CIL[END chunk_id="api_authpaths_1783716639"]
96
- // CIL[BEGIN chunk_id="api__unauthorizedcallback_1783716639" type="variable" identity="_onUnauthorizedCallback" parent="none"]
97
- // CIL[DOC-MACRO purpose="Store unauthorized response handler"]
98
- // CIL[DOC-RESPONSIBILITY responsibility="Maintain callback state for 401 errors"]
99
- // CIL[DOC-CONTEXT module="api" layer="state" related_files="[]"]
100
- // CIL[DOC-CONTRACT inputs="none" outputs="callback storage" errors="none" side_effects="state_modification"]
101
- // CIL[DOC-MICRO logic_summary="Module-level variable for unauthorized callback" notable_decisions="[]"]
102
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
83
+ // CIL[END stable_id="~/.framework/src/lib/api.ts:getAccountId:function"]
84
+
85
+
86
+ // CIL[BEGIN stable_id="~/.framework/src/lib/api.ts:AUTH_PATHS:constant" type="constant" identity="AUTH_PATHS" parent="~/.framework/src/lib/api.ts"]
87
+ // CIL[DOC-MACRO purpose="List of auth-related API paths used to suppress unauthorized callbacks."]
88
+ // CIL[DOC-RESPONSIBILITY responsibility="Define paths that should not trigger the unauthorized callback on 401."]
89
+ // CIL[DOC-CONTEXT module="framework-api" layer="lib" related_files=".framework/src/lib/api.ts,.framework/src/lib/supabase.ts"]
90
+ // CIL[DOC-CONTRACT inputs="none" outputs="readonly string array" errors="none" side_effects="none"]
91
+ // CIL[DOC-MICRO logic_summary="Constant array of auth/admin API path prefixes." notable_decisions="Frozen at module scope."]
92
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
103
93
  // CIL[DOC-STABILITY stability="stable"]
104
- // CIL[DOC-VECTOR type="context" content="Layer: state. Direct callers: 0. Direct calls: 0. Related files: none."]
105
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
106
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
107
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
94
+ const AUTH_PATHS = ['/api/auth', '/api/admin-data']
95
+ // CIL[DOC-VECTOR type="context" content="purpose='List of auth-related API paths used to suppress unauthorized callbacks.'; No verified external callers; imports: .framework/src/lib/supabase.ts"]
96
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
97
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
98
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
108
99
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
109
100
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
110
- let _onUnauthorizedCallback: (() => void) | null = null
111
- // CIL[END chunk_id="api__unauthorizedcallback_1783716639"]
112
- // CIL[BEGIN chunk_id="api_onunauthorized_1783716639" type="function" identity="onUnauthorized" parent="none"]
113
- // CIL[DOC-MACRO purpose="Register unauthorized response handler"]
114
- // CIL[DOC-RESPONSIBILITY responsibility="Manage 401 error callback lifecycle"]
115
- // CIL[DOC-CONTEXT module="api" layer="error_handling" related_files="[]"]
116
- // CIL[DOC-CONTRACT inputs="none" outputs="cleanup: () => void" errors="none" side_effects="state_modification"]
117
- // CIL[DOC-MICRO logic_summary="Set callback and return cleanup function" notable_decisions="[]"]
118
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
101
+ // CIL[END stable_id="~/.framework/src/lib/api.ts:AUTH_PATHS:constant"]
102
+
103
+
104
+
105
+
106
+ // CIL[BEGIN stable_id="~/.framework/src/lib/api.ts:_onunauthorizedcallback:constant" type="constant" identity="_onunauthorizedcallback" parent="~/.framework/src/lib/api.ts"]
107
+ // CIL[DOC-MACRO purpose="Holds the registered 401 callback for the app."]
108
+ // CIL[DOC-RESPONSIBILITY responsibility="Store the callback invoked when a request returns 401."]
109
+ // CIL[DOC-CONTEXT module="framework-api" layer="lib" related_files=".framework/src/lib/api.ts,.framework/src/lib/supabase.ts"]
110
+ // CIL[DOC-CONTRACT inputs="set by onUnauthorized" outputs="invoked by apiFetch" errors="none" side_effects="module-scoped mutable state"]
111
+ // CIL[DOC-MICRO logic_summary="Module-level nullable callback for unauthorized request handling." notable_decisions="Single callback only."]
112
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
119
113
  // CIL[DOC-STABILITY stability="stable"]
120
- // CIL[DOC-VECTOR type="context" content="Layer: error_handling. Direct callers: 0. Direct calls: 0. Related files: none."]
121
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
122
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
123
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
114
+ let _onUnauthorizedCallback: (() => void) | null = null
115
+ // CIL[DOC-VECTOR type="context" content="purpose='Holds the registered 401 callback for the app.'; No verified external callers; imports: .framework/src/lib/supabase.ts"]
116
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
117
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
118
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
124
119
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
125
120
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
121
+ // CIL[END stable_id="~/.framework/src/lib/api.ts:_onunauthorizedcallback:constant"]
122
+
123
+
124
+
125
+ // CIL[BEGIN stable_id="~/.framework/src/lib/api.ts:onUnauthorized:function" type="function" identity="onUnauthorized" parent="~/.framework/src/lib/api.ts"]
126
+ // CIL[DOC-MACRO purpose="Register a callback to run when a 401 response is received."]
127
+ // CIL[DOC-RESPONSIBILITY responsibility="Manage the unauthorized callback subscription and cleanup."]
128
+ // CIL[DOC-CONTEXT module="framework-api" layer="lib" related_files=".framework/src/lib/api.ts,.framework/src/lib/supabase.ts"]
129
+ // CIL[DOC-CONTRACT inputs="cb: () => void" outputs="unsubscribe function" errors="none" side_effects="sets _onUnauthorizedCallback"]
130
+ // CIL[DOC-MICRO logic_summary="Assigns the provided callback and returns a cleanup function that clears it." notable_decisions="Only one callback can be registered at a time; cleanup returns callback to null."]
131
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
132
+ // CIL[DOC-STABILITY stability="stable"]
126
133
  export function onUnauthorized(cb: () => void): () => void {
127
134
  _onUnauthorizedCallback = cb
128
135
  return () => { _onUnauthorizedCallback = null }
129
136
  }
130
- // CIL[END chunk_id="api_onunauthorized_1783716639"]
131
- // CIL[BEGIN chunk_id="api_normalizeheaders_1783716639" type="function" identity="normalizeHeaders" parent="none"]
132
- // CIL[DOC-MACRO purpose="Convert headers to plain object format"]
133
- // CIL[DOC-RESPONSIBILITY responsibility="Normalize header data structures"]
134
- // CIL[DOC-CONTEXT module="api" layer="utility" related_files="[]"]
135
- // CIL[DOC-CONTRACT inputs="none" outputs="Record<string,string>" errors="none" side_effects="none"]
136
- // CIL[DOC-MICRO logic_summary="Handle Headers, array, and object formats" notable_decisions="[]"]
137
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
138
- // CIL[DOC-STABILITY stability="stable"]
139
- // CIL[DOC-VECTOR type="context" content="Layer: utility. Direct callers: 0. Direct calls: 0. Related files: none."]
140
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
141
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
142
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
137
+ // CIL[DOC-VECTOR type="context" content="purpose='Register a callback to run when a 401 response is received.'; No verified external callers; imports: .framework/src/lib/supabase.ts"]
138
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
139
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
140
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
143
141
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
144
142
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
143
+ // CIL[END stable_id="~/.framework/src/lib/api.ts:onUnauthorized:function"]
144
+
145
+
146
+
147
+ // CIL[BEGIN stable_id="~/.framework/src/lib/api.ts:normalizeHeaders:function" type="function" identity="normalizeHeaders" parent="~/.framework/src/lib/api.ts"]
148
+ // CIL[DOC-MACRO purpose="Normalize HeadersInit into a flat Record<string, string>."]
149
+ // CIL[DOC-RESPONSIBILITY responsibility="Convert various header input forms into a consistent object."]
150
+ // CIL[DOC-CONTEXT module="framework-api" layer="lib" related_files=".framework/src/lib/api.ts,.framework/src/lib/supabase.ts"]
151
+ // CIL[DOC-CONTRACT inputs="headers?: HeadersInit" outputs="Record<string, string>" errors="none" side_effects="none"]
152
+ // CIL[DOC-MICRO logic_summary="Handles undefined, Headers object, array of pairs, and plain object by coercing all values to strings." notable_decisions="Lowercases keys are preserved as-is; values are String(value)-coerced."]
153
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
154
+ // CIL[DOC-STABILITY stability="stable"]
145
155
  function normalizeHeaders(headers?: HeadersInit): Record<string, string> {
146
156
  if (!headers) return {}
147
157
 
@@ -157,21 +167,22 @@ function normalizeHeaders(headers?: HeadersInit): Record<string, string> {
157
167
  Object.entries(headers).map(([key, value]) => [key, String(value)])
158
168
  )
159
169
  }
160
- // CIL[END chunk_id="api_normalizeheaders_1783716639"]
161
- // CIL[BEGIN chunk_id="api_getauthheaders_1783716639" type="function" identity="getAuthHeaders" parent="none"]
162
- // CIL[DOC-MACRO purpose="Build authentication headers for API requests"]
163
- // CIL[DOC-RESPONSIBILITY responsibility="Generate auth and account context headers"]
164
- // CIL[DOC-CONTEXT module="api" layer="auth" related_files="[]"]
165
- // CIL[DOC-CONTRACT inputs="none" outputs="Record<string,string>" errors="supabase_errors" side_effects="none"]
166
- // CIL[DOC-MICRO logic_summary="Get session token and add account ID to headers" notable_decisions="[]"]
167
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
168
- // CIL[DOC-STABILITY stability="stable"]
169
- // CIL[DOC-VECTOR type="context" content="Layer: auth. Direct callers: 0. Direct calls: 0. Related files: none."]
170
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
171
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
172
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
170
+ // CIL[DOC-VECTOR type="context" content="purpose='Normalize HeadersInit into a flat Record<string, string>.'; No verified external callers; imports: .framework/src/lib/supabase.ts"]
171
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
172
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
173
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
173
174
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
174
175
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
176
+ // CIL[END stable_id="~/.framework/src/lib/api.ts:normalizeHeaders:function"]
177
+
178
+ // CIL[BEGIN stable_id="~/.framework/src/lib/api.ts:getAuthHeaders:function" type="function" identity="getAuthHeaders" parent="~/.framework/src/lib/api.ts"]
179
+ // CIL[DOC-MACRO purpose="Build authorization headers from the current Supabase session and account."]
180
+ // CIL[DOC-RESPONSIBILITY responsibility="Produce headers including bearer token and account ID when available."]
181
+ // CIL[DOC-CONTEXT module="framework-api" layer="lib" related_files=".framework/src/lib/api.ts,.framework/src/lib/supabase.ts"]
182
+ // CIL[DOC-CONTRACT inputs="none (uses supabase global and _accountId)" outputs="Promise<Record<string, string>>" errors="none" side_effects="calls supabase.auth.getSession()"]
183
+ // CIL[DOC-MICRO logic_summary="Retrieves the Supabase session, adds Authorization bearer token if present, and adds X-Account-Id if _accountId is set." notable_decisions="Returns empty headers when no session or account."]
184
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
185
+ // CIL[DOC-STABILITY stability="stable"]
175
186
  export async function getAuthHeaders(): Promise<Record<string, string>> {
176
187
  const headers: Record<string, string> = {}
177
188
 
@@ -188,43 +199,134 @@ export async function getAuthHeaders(): Promise<Record<string, string>> {
188
199
 
189
200
  return headers
190
201
  }
191
- // CIL[END chunk_id="api_getauthheaders_1783716639"]
192
- // CIL[BEGIN chunk_id="api_apifetch_1783716639" type="function" identity="apiFetch" parent="none"]
193
- // CIL[DOC-MACRO purpose="Authenticated HTTP request wrapper"]
194
- // CIL[DOC-RESPONSIBILITY responsibility="Handle API requests with auth and error handling"]
195
- // CIL[DOC-CONTEXT module="api" layer="client" related_files="[]"]
196
- // CIL[DOC-CONTRACT inputs="none" outputs="Response" errors="network_errors" side_effects="callback_execution"]
197
- // CIL[DOC-MICRO logic_summary="Add auth headers, clean invalid tokens, handle 401s" notable_decisions="[]"]
198
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
199
- // CIL[DOC-STABILITY stability="stable"]
200
- // CIL[DOC-VECTOR type="context" content="Layer: client. Direct callers: 0. Direct calls: 0. Related files: none."]
201
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
202
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
203
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
202
+ // CIL[DOC-VECTOR type="context" content="purpose='Build authorization headers from the current Supabase session and account.'; No verified external callers; imports: .framework/src/lib/supabase.ts"]
203
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
204
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
205
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
204
206
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
205
207
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
208
+ // CIL[END stable_id="~/.framework/src/lib/api.ts:getAuthHeaders:function"]
209
+
210
+
211
+
212
+ // CIL[BEGIN stable_id="~/.framework/src/lib/api.ts:_sessionTraceId:constant" type="constant" identity="_sessionTraceId" parent="~/.framework/src/lib/api.ts"]
213
+ // CIL[DOC-MACRO purpose="Caches the generated session trace ID for reuse."]
214
+ // CIL[DOC-RESPONSIBILITY responsibility="Hold the lazy-initialized session-level trace identifier."]
215
+ // CIL[DOC-CONTEXT module="framework-api" layer="lib" related_files=".framework/src/lib/api.ts,.framework/src/lib/supabase.ts"]
216
+ // CIL[DOC-CONTRACT inputs="initialized by getSessionTraceId" outputs="read by getSessionTraceId" errors="none" side_effects="module-scoped mutable state"]
217
+ // CIL[DOC-MICRO logic_summary="Nullable string caching the 32-character session trace ID." notable_decisions="Lazily initialized on first access."]
218
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
219
+ // CIL[DOC-STABILITY stability="stable"]
206
220
  let _sessionTraceId: string | null = null
221
+ // CIL[DOC-VECTOR type="context" content="purpose='Caches the generated session trace ID for reuse.'; No verified external callers; imports: .framework/src/lib/supabase.ts"]
222
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
223
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
224
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
225
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
226
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
227
+ // CIL[END stable_id="~/.framework/src/lib/api.ts:_sessionTraceId:constant"]
228
+
229
+
230
+
231
+
232
+
233
+ // CIL[BEGIN stable_id="~/.framework/src/lib/api.ts:_sessionTraceState:constant" type="constant" identity="_sessionTraceState" parent="~/.framework/src/lib/api.ts"]
234
+ // CIL[DOC-MACRO purpose="Stores the last tracestate header received from a response."]
235
+ // CIL[DOC-RESPONSIBILITY responsibility="Hold the latest server-provided tracestate value."]
236
+ // CIL[DOC-CONTEXT module="framework-api" layer="lib" related_files=".framework/src/lib/api.ts,.framework/src/lib/supabase.ts"]
237
+ // CIL[DOC-CONTRACT inputs="set by apiFetch on response" outputs="read by future apiFetch headers (not yet)" errors="none" side_effects="module-scoped mutable state"]
238
+ // CIL[DOC-MICRO logic_summary="String cache for the most recent response tracestate header." notable_decisions="Currently written but not read back into outgoing headers."]
239
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
240
+ // CIL[DOC-STABILITY stability="experimental"]
207
241
  let _sessionTraceState: string = ''
242
+ // CIL[DOC-VECTOR type="context" content="purpose='Stores the last tracestate header received from a response.'; No verified external callers; imports: .framework/src/lib/supabase.ts"]
243
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
244
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
245
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
246
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
247
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
248
+ // CIL[END stable_id="~/.framework/src/lib/api.ts:_sessionTraceState:constant"]
249
+
208
250
 
251
+
252
+
253
+ // CIL[BEGIN stable_id="~/.framework/src/lib/api.ts:generateHexId:function" type="function" identity="generateHexId" parent="~/.framework/src/lib/api.ts"]
254
+ // CIL[DOC-MACRO purpose="Generate a random lowercase hex string of the requested length."]
255
+ // CIL[DOC-RESPONSIBILITY responsibility="Produce cryptographic random hex IDs for trace context."]
256
+ // CIL[DOC-CONTEXT module="framework-api" layer="lib" related_files=".framework/src/lib/api.ts,.framework/src/lib/supabase.ts"]
257
+ // CIL[DOC-CONTRACT inputs="length: number" outputs="string" errors="none" side_effects="none (but uses crypto)"]
258
+ // CIL[DOC-MICRO logic_summary="Uses crypto.randomUUID, strips dashes, and concatenates or slices to the desired length." notable_decisions="Falls back to a second UUID if requested length exceeds 32."]
259
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
260
+ // CIL[DOC-STABILITY stability="stable"]
209
261
  function generateHexId(length: number): string {
210
262
  const uuid = crypto.randomUUID().replace(/-/g, '')
211
263
  if (length > uuid.length) {
212
264
  return (uuid + crypto.randomUUID().replace(/-/g, '')).slice(0, length).toLowerCase()
213
265
  }
266
+
267
+
214
268
  return uuid.slice(0, length).toLowerCase()
215
269
  }
270
+ // CIL[DOC-VECTOR type="context" content="purpose='Generate a random lowercase hex string of the requested length.'; No verified external callers; imports: .framework/src/lib/supabase.ts"]
271
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
272
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
273
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
274
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
275
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
276
+ // CIL[END stable_id="~/.framework/src/lib/api.ts:generateHexId:function"]
216
277
 
278
+
279
+ // CIL[BEGIN stable_id="~/.framework/src/lib/api.ts:getSessionTraceId:function" type="function" identity="getSessionTraceId" parent="~/.framework/src/lib/api.ts"]
280
+ // CIL[DOC-MACRO purpose="Return the cached session trace ID, generating it on first call."]
281
+ // CIL[DOC-RESPONSIBILITY responsibility="Lazy-initialize and reuse the 32-character session trace ID."]
282
+ // CIL[DOC-CONTEXT module="framework-api" layer="lib" related_files=".framework/src/lib/api.ts,.framework/src/lib/supabase.ts"]
283
+ // CIL[DOC-CONTRACT inputs="none" outputs="string" errors="none" side_effects="may set _sessionTraceId"]
284
+ // CIL[DOC-MICRO logic_summary="Checks _sessionTraceId and, if null, generates a 32-char hex ID and caches it." notable_decisions="Generates once per module session."]
285
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
286
+ // CIL[DOC-STABILITY stability="stable"]
217
287
  function getSessionTraceId(): string {
218
288
  if (!_sessionTraceId) {
219
289
  _sessionTraceId = generateHexId(32)
220
290
  }
221
291
  return _sessionTraceId
222
292
  }
293
+ // CIL[DOC-VECTOR type="context" content="purpose='Return the cached session trace ID, generating it on first call.'; No verified external callers; imports: .framework/src/lib/supabase.ts"]
294
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
295
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
296
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
297
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
298
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
299
+ // CIL[END stable_id="~/.framework/src/lib/api.ts:getSessionTraceId:function"]
223
300
 
301
+
302
+ // CIL[BEGIN stable_id="~/.framework/src/lib/api.ts:buildTraceParent:function" type="function" identity="buildTraceParent" parent="~/.framework/src/lib/api.ts"]
303
+ // CIL[DOC-MACRO purpose="Build a W3C traceparent header value."]
304
+ // CIL[DOC-RESPONSIBILITY responsibility="Compose a traceparent string from session and span IDs."]
305
+ // CIL[DOC-CONTEXT module="framework-api" layer="lib" related_files=".framework/src/lib/api.ts,.framework/src/lib/supabase.ts"]
306
+ // CIL[DOC-CONTRACT inputs="none (uses getSessionTraceId and generateHexId)" outputs="string" errors="none" side_effects="none"]
307
+ // CIL[DOC-MICRO logic_summary="Returns `00-{sessionTraceId}-{16-char span id}-01` in W3C traceparent format." notable_decisions="Fixed version 00 and sampled flag 01."]
308
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
309
+ // CIL[DOC-STABILITY stability="stable"]
224
310
  function buildTraceParent(): string {
225
311
  return `00-${getSessionTraceId()}-${generateHexId(16)}-01`
226
312
  }
313
+ // CIL[DOC-VECTOR type="context" content="purpose='Build a W3C traceparent header value.'; No verified external callers; imports: .framework/src/lib/supabase.ts"]
314
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
315
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
316
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
317
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
318
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
319
+ // CIL[END stable_id="~/.framework/src/lib/api.ts:buildTraceParent:function"]
320
+
227
321
 
322
+ // CIL[BEGIN stable_id="~/.framework/src/lib/api.ts:apiFetch:function" type="function" identity="apiFetch" parent="~/.framework/src/lib/api.ts"]
323
+ // CIL[DOC-MACRO purpose="Make an authenticated HTTP request with traceparent and 401 handling."]
324
+ // CIL[DOC-RESPONSIBILITY responsibility="Wrap fetch with auth headers, trace context, and unauthorized callback dispatch."]
325
+ // CIL[DOC-CONTEXT module="framework-api" layer="lib" related_files=".framework/src/lib/api.ts,.framework/src/lib/supabase.ts"]
326
+ // CIL[DOC-CONTRACT inputs="path: string, options: RequestInit = {}" outputs="Promise<Response>" errors="none explicit" side_effects="may invoke _onUnauthorizedCallback, mutates _sessionTraceState, logs request ID"]
327
+ // CIL[DOC-MICRO logic_summary="Builds auth and trace headers, merges user headers, calls fetch, logs request/trace IDs, updates tracestate, and triggers the unauthorized callback for non-auth 401s." notable_decisions="Cleans up Bearer null/undefined/empty from user headers; suppresses callback for AUTH_PATHS."]
328
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
329
+ // CIL[DOC-STABILITY stability="stable"]
228
330
  export async function apiFetch(path: string, options: RequestInit = {}): Promise<Response> {
229
331
  const authHeaders = await getAuthHeaders()
230
332
  const optionHeaders = normalizeHeaders(options.headers)
@@ -240,12 +342,21 @@ export async function apiFetch(path: string, options: RequestInit = {}): Promise
240
342
 
241
343
  const traceparent = buildTraceParent()
242
344
 
345
+ // Best-effort app hint for server-side app-scoped behavior (knowledge
346
+ // envelope, logging). Derived from the route prefix; the server validates
347
+ // the slug against installed apps and the principal's required_roles.
348
+ const appSegment = typeof window !== 'undefined'
349
+ ? (window.location.pathname.split('/')[1] || '')
350
+ : ''
351
+ const appHint = /^[a-z][a-z0-9-]*$/.test(appSegment) ? appSegment : null
352
+
243
353
  const fetchOptions = {
244
354
  ...options,
245
355
  headers: {
246
356
  ...authHeaders,
247
357
  ...optionHeaders,
248
358
  traceparent,
359
+ ...(appHint && !optionHeaders['x-app-id'] ? { 'x-app-id': appHint } : {}),
249
360
  },
250
361
  }
251
362
 
@@ -253,7 +364,14 @@ export async function apiFetch(path: string, options: RequestInit = {}): Promise
253
364
 
254
365
  const requestId = response.headers.get('X-Request-ID') || response.headers.get('x-request-id')
255
366
  const responseTraceparent = response.headers.get('traceparent') || response.headers.get('Traceparent')
256
- if (requestId) {
367
+ // Debug-only: per-request tracing noise is opt-in — every apiFetch call
368
+ // logs otherwise, which floods the console during polling-heavy views.
369
+ // Enable with localStorage.spine_debug_api = '1'.
370
+ if (
371
+ requestId &&
372
+ typeof localStorage !== 'undefined' &&
373
+ localStorage.getItem('spine_debug_api') === '1'
374
+ ) {
257
375
  console.log('[Spine] requestId:', requestId, 'traceparent:', responseTraceparent || traceparent)
258
376
  }
259
377
 
@@ -269,4 +387,10 @@ export async function apiFetch(path: string, options: RequestInit = {}): Promise
269
387
 
270
388
  return response
271
389
  }
272
- // CIL[END chunk_id="api_apifetch_1783716639"]
390
+ // CIL[DOC-VECTOR type="context" content="purpose='Make an authenticated HTTP request with traceparent and 401 handling.'; No verified external callers; imports: .framework/src/lib/supabase.ts"]
391
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
392
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
393
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
394
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
395
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
396
+ // CIL[END stable_id="~/.framework/src/lib/api.ts:apiFetch:function"]