spine-framework 0.3.124 → 0.3.126

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (319) hide show
  1. package/.framework/cli/commands/agents.ts +35 -37
  2. package/.framework/cli/commands/auth.ts +35 -34
  3. package/.framework/cli/commands/create-app.ts +104 -40
  4. package/.framework/cli/commands/dev.ts +104 -69
  5. package/.framework/cli/commands/doctor.ts +179 -69
  6. package/.framework/cli/commands/generate.ts +83 -143
  7. package/.framework/cli/commands/init.ts +72 -34
  8. package/.framework/cli/commands/install-app.ts +260 -125
  9. package/.framework/cli/commands/items.ts +33 -44
  10. package/.framework/cli/commands/migrate.ts +122 -40
  11. package/.framework/cli/commands/migrations.ts +33 -40
  12. package/.framework/cli/commands/pipelines.ts +31 -39
  13. package/.framework/cli/commands/status.ts +47 -23
  14. package/.framework/cli/commands/system.ts +47 -37
  15. package/.framework/cli/commands/test.ts +112 -68
  16. package/.framework/cli/commands/validate-app.ts +215 -121
  17. package/.framework/cli/context.ts +112 -130
  18. package/.framework/cli/env-loader.ts +47 -18
  19. package/.framework/cli/index.ts +81 -42
  20. package/.framework/docs/runtime-types.md +1024 -0
  21. package/.framework/functions/_shared/agent-runner.ts +1296 -961
  22. package/.framework/functions/_shared/app-manifest.ts +82 -68
  23. package/.framework/functions/_shared/audit.ts +135 -83
  24. package/.framework/functions/_shared/{cil-state.ts → cil.ts} +158 -56
  25. package/.framework/functions/_shared/db.ts +80 -126
  26. package/.framework/functions/_shared/hash-api-key.ts +63 -0
  27. package/.framework/functions/_shared/index.ts +224 -335
  28. package/.framework/functions/_shared/kb.ts +319 -0
  29. package/.framework/functions/_shared/llm.ts +92 -0
  30. package/.framework/functions/_shared/logging.ts +288 -0
  31. package/.framework/functions/_shared/middleware.ts +329 -365
  32. package/.framework/functions/_shared/outcomes.ts +36 -0
  33. package/.framework/functions/_shared/permissions.ts +359 -643
  34. package/.framework/functions/_shared/pipeline-runner.ts +243 -316
  35. package/.framework/functions/_shared/principal.ts +376 -468
  36. package/.framework/functions/_shared/resolve-credentials.ts +102 -0
  37. package/.framework/functions/_shared/resolve-ids.ts +188 -16
  38. package/.framework/functions/_shared/retry-deliveries.ts +104 -0
  39. package/.framework/functions/_shared/schema-utils.ts +611 -373
  40. package/.framework/functions/_shared/testing.ts +207 -137
  41. package/.framework/functions/_shared/tracing.ts +276 -0
  42. package/.framework/functions/_shared/trigger-engine.ts +159 -211
  43. package/.framework/functions/_shared/webhook-registration.ts +95 -81
  44. package/.framework/functions/_shared/webhook-registry.ts +153 -75
  45. package/.framework/functions/account-nodes.ts +31 -53
  46. package/.framework/functions/adapters/generic-webhook-inbound.ts +56 -0
  47. package/.framework/functions/adapters/generic-webhook-outbound.ts +43 -0
  48. package/.framework/functions/adapters/openai-outbound.ts +40 -0
  49. package/.framework/functions/admin-data.ts +685 -537
  50. package/.framework/functions/admin-funnel.ts +31 -20
  51. package/.framework/functions/admin-install-funnel.ts +47 -28
  52. package/.framework/functions/admin-signals.ts +47 -29
  53. package/.framework/functions/ai-agents.ts +122 -147
  54. package/.framework/functions/ai-interactions.ts +180 -90
  55. package/.framework/functions/api-keys.ts +250 -192
  56. package/.framework/functions/apps.ts +203 -197
  57. package/.framework/functions/auth.ts +98 -91
  58. package/.framework/functions/cil-agent-ingest.ts +773 -0
  59. package/.framework/functions/cil-agent.ts +592 -0
  60. package/.framework/functions/cil-callmap.ts +1227 -0
  61. package/.framework/functions/cil-config.ts +583 -0
  62. package/.framework/functions/cil-context.ts +445 -0
  63. package/.framework/functions/cil-doc.ts +1752 -0
  64. package/.framework/functions/cil-embeddings.ts +1202 -0
  65. package/.framework/functions/cil-graph.ts +585 -0
  66. package/.framework/functions/cil-ingest.ts +2416 -0
  67. package/.framework/functions/cil-pipeline.ts +318 -0
  68. package/.framework/functions/cil-project.ts +499 -0
  69. package/.framework/functions/cil-validate.ts +469 -0
  70. package/.framework/functions/debug-auth.ts +73 -53
  71. package/.framework/functions/deliveries.ts +117 -0
  72. package/.framework/functions/embeddings.ts +528 -516
  73. package/.framework/functions/eval-harness.ts +158 -106
  74. package/.framework/functions/integration-outbound.ts +311 -0
  75. package/.framework/functions/integration-routes.ts +240 -466
  76. package/.framework/functions/integrations.ts +132 -140
  77. package/.framework/functions/invites.ts +401 -201
  78. package/.framework/functions/item-progress.ts +113 -53
  79. package/.framework/functions/kb.ts +28 -0
  80. package/.framework/functions/logs.ts +239 -222
  81. package/.framework/functions/observability.ts +308 -259
  82. package/.framework/functions/pipeline-executions.ts +179 -235
  83. package/.framework/functions/pipelines.ts +163 -205
  84. package/.framework/functions/prompt-configs.ts +109 -156
  85. package/.framework/functions/roles.ts +97 -147
  86. package/.framework/functions/system-cron.ts +132 -218
  87. package/.framework/functions/system.ts +112 -52
  88. package/.framework/functions/tests.ts +32 -28
  89. package/.framework/functions/timers.ts +162 -210
  90. package/.framework/functions/triggers.ts +282 -346
  91. package/.framework/functions/types.ts +283 -400
  92. package/.framework/migrations/001_core_schema.sql +630 -0
  93. package/.framework/migrations/002_core_rls_and_functions.sql +532 -0
  94. package/.framework/migrations/{003_system_data.sql → 003_core_system_data.sql} +26 -153
  95. package/.framework/migrations/004_core_rpc_and_broker.sql +421 -0
  96. package/.framework/migrations/005_core_observability.sql +598 -0
  97. package/.framework/migrations/006_security_hardening_rls.sql +97 -0
  98. package/.framework/migrations/007_kb_article_list.sql +237 -0
  99. package/.framework/migrations/008_items_target.sql +8 -0
  100. package/.framework/migrations/009_roles_slug_unique.sql +11 -0
  101. package/.framework/public/spine.config.json +91 -0
  102. package/.framework/scripts/app-install-cli.ts +112 -98
  103. package/.framework/src/App.tsx +67 -20
  104. package/.framework/src/apps/admin/index.tsx +97 -27
  105. package/.framework/src/components/AppWrapper.tsx +50 -11
  106. package/.framework/src/components/CustomAppLoader.tsx +131 -22
  107. package/.framework/src/components/admin/AdminListPage.tsx +75 -8
  108. package/.framework/src/components/admin/AdminSidebar.tsx +148 -36
  109. package/.framework/src/components/admin/AdminStatsCard.tsx +48 -29
  110. package/.framework/src/components/admin/PageInstructions.tsx +49 -0
  111. package/.framework/src/components/admin/SortableTableHeader.tsx +49 -2
  112. package/.framework/src/components/app-shell/GenericAppShell.tsx +69 -11
  113. package/.framework/src/components/app-shell/GenericDetailPage.tsx +55 -10
  114. package/.framework/src/components/app-shell/GenericListPage.tsx +76 -9
  115. package/.framework/src/components/app-sidebar.tsx +50 -3
  116. package/.framework/src/components/auth/ProtectedRoute.tsx +53 -45
  117. package/.framework/src/components/kb/KBArticleEditor.tsx +409 -0
  118. package/.framework/src/components/kb/KBArticleList.tsx +557 -0
  119. package/.framework/src/components/layout/AppShell.tsx +54 -16
  120. package/.framework/src/components/layout/Header.tsx +50 -38
  121. package/.framework/src/components/layout/Layout.tsx +48 -32
  122. package/.framework/src/components/layout/Sidebar.tsx +167 -16
  123. package/.framework/src/components/runtime/DataDetailHeader.tsx +33 -1
  124. package/.framework/src/components/runtime/DataDetailPage.tsx +289 -4
  125. package/.framework/src/components/runtime/DataFilters.tsx +78 -1
  126. package/.framework/src/components/runtime/DataHeader.tsx +32 -29
  127. package/.framework/src/components/runtime/DataListPage.tsx +161 -2
  128. package/.framework/src/components/runtime/DataStats.tsx +48 -1
  129. package/.framework/src/components/runtime/DataTable.tsx +153 -1
  130. package/.framework/src/components/runtime/SchemaDetailForm.tsx +77 -46
  131. package/.framework/src/components/runtime/index.ts +16 -9
  132. package/.framework/src/components/search-form.tsx +33 -1
  133. package/.framework/src/components/shared/AgentView.tsx +48 -51
  134. package/.framework/src/components/shared/FieldRenderer.tsx +84 -67
  135. package/.framework/src/components/shared/InviteManager.tsx +113 -52
  136. package/.framework/src/components/shared/MemberList.tsx +182 -0
  137. package/.framework/src/components/shared/SchemaFields.tsx +96 -78
  138. package/.framework/src/components/ui/DataTable.tsx +86 -56
  139. package/.framework/src/components/ui/Form.tsx +188 -109
  140. package/.framework/src/components/ui/ItemCard.tsx +86 -58
  141. package/.framework/src/components/ui/ItemListView.tsx +88 -61
  142. package/.framework/src/components/ui/LoadingSpinner.tsx +52 -27
  143. package/.framework/src/components/ui/Modal.tsx +81 -4
  144. package/.framework/src/components/ui/RichTextEditor.tsx +101 -9
  145. package/.framework/src/components/ui/accordion.tsx +97 -5
  146. package/.framework/src/components/ui/alert-dialog.tsx +225 -13
  147. package/.framework/src/components/ui/alert.tsx +113 -6
  148. package/.framework/src/components/ui/aspect-ratio.tsx +49 -2
  149. package/.framework/src/components/ui/avatar.tsx +129 -7
  150. package/.framework/src/components/ui/badge.tsx +65 -3
  151. package/.framework/src/components/ui/breadcrumb.tsx +145 -8
  152. package/.framework/src/components/ui/button-group.tsx +81 -4
  153. package/.framework/src/components/ui/button.tsx +49 -2
  154. package/.framework/src/components/ui/calendar.tsx +65 -3
  155. package/.framework/src/components/ui/card.tsx +145 -8
  156. package/.framework/src/components/ui/carousel.tsx +129 -7
  157. package/.framework/src/components/ui/chart.tsx +161 -10
  158. package/.framework/src/components/ui/checkbox.tsx +49 -2
  159. package/.framework/src/components/ui/collapsible.tsx +81 -5
  160. package/.framework/src/components/ui/combobox.tsx +305 -20
  161. package/.framework/src/components/ui/command.tsx +177 -11
  162. package/.framework/src/components/ui/context-menu.tsx +273 -17
  163. package/.framework/src/components/ui/dialog.tsx +209 -27
  164. package/.framework/src/components/ui/direction.tsx +64 -4
  165. package/.framework/src/components/ui/drawer.tsx +193 -12
  166. package/.framework/src/components/ui/dropdown-menu.tsx +273 -18
  167. package/.framework/src/components/ui/empty.tsx +145 -9
  168. package/.framework/src/components/ui/field.tsx +209 -14
  169. package/.framework/src/components/ui/hover-card.tsx +81 -4
  170. package/.framework/src/components/ui/input-group.tsx +162 -10
  171. package/.framework/src/components/ui/input-otp.tsx +98 -5
  172. package/.framework/src/components/ui/input.tsx +49 -2
  173. package/.framework/src/components/ui/item.tsx +225 -13
  174. package/.framework/src/components/ui/kbd.tsx +65 -3
  175. package/.framework/src/components/ui/label.tsx +49 -2
  176. package/.framework/src/components/ui/menubar.tsx +289 -17
  177. package/.framework/src/components/ui/native-select.tsx +97 -5
  178. package/.framework/src/components/ui/navigation-menu.tsx +177 -10
  179. package/.framework/src/components/ui/pagination.tsx +161 -9
  180. package/.framework/src/components/ui/popover.tsx +145 -8
  181. package/.framework/src/components/ui/progress.tsx +49 -2
  182. package/.framework/src/components/ui/radio-group.tsx +65 -3
  183. package/.framework/src/components/ui/resizable.tsx +82 -4
  184. package/.framework/src/components/ui/scroll-area.tsx +65 -3
  185. package/.framework/src/components/ui/select.tsx +193 -11
  186. package/.framework/src/components/ui/separator.tsx +49 -2
  187. package/.framework/src/components/ui/sheet.tsx +193 -11
  188. package/.framework/src/components/ui/sidebar.tsx +481 -38
  189. package/.framework/src/components/ui/skeleton.tsx +49 -2
  190. package/.framework/src/components/ui/slider.tsx +49 -2
  191. package/.framework/src/components/ui/sonner.tsx +49 -2
  192. package/.framework/src/components/ui/spinner.tsx +49 -2
  193. package/.framework/src/components/ui/switch.tsx +49 -2
  194. package/.framework/src/components/ui/table-primitives.tsx +160 -33
  195. package/.framework/src/components/ui/table.tsx +161 -9
  196. package/.framework/src/components/ui/tabs.tsx +113 -6
  197. package/.framework/src/components/ui/textarea.tsx +49 -2
  198. package/.framework/src/components/ui/toggle-group.tsx +81 -4
  199. package/.framework/src/components/ui/toggle.tsx +65 -3
  200. package/.framework/src/components/ui/tooltip.tsx +97 -5
  201. package/.framework/src/contexts/AppContext.tsx +129 -45
  202. package/.framework/src/contexts/AuthContext.tsx +187 -144
  203. package/.framework/src/hooks/use-mobile.ts +48 -2
  204. package/.framework/src/hooks/useApi.ts +208 -159
  205. package/.framework/src/hooks/useAppPath.ts +32 -23
  206. package/.framework/src/hooks/useApps.ts +51 -20
  207. package/.framework/src/hooks/useEntityList.ts +32 -78
  208. package/.framework/src/hooks/useEntityRecord.ts +35 -96
  209. package/.framework/src/hooks/useForm.ts +32 -92
  210. package/.framework/src/hooks/useListSchema.ts +49 -78
  211. package/.framework/src/hooks/useSchemaRecord.ts +114 -105
  212. package/.framework/src/lib/api.ts +195 -116
  213. package/.framework/src/lib/supabase.ts +98 -64
  214. package/.framework/src/lib/utils.ts +287 -151
  215. package/.framework/src/main.tsx +49 -3
  216. package/.framework/src/pages/DashboardPage.tsx +52 -29
  217. package/.framework/src/pages/NotFoundPage.tsx +32 -10
  218. package/.framework/src/pages/SetupPage.tsx +32 -12
  219. package/.framework/src/pages/admin/AIAgentDetailPage.tsx +119 -10
  220. package/.framework/src/pages/admin/AIAgentsPage.tsx +48 -19
  221. package/.framework/src/pages/admin/APIKeyDetailPage.tsx +187 -17
  222. package/.framework/src/pages/admin/APIKeysPage.tsx +98 -22
  223. package/.framework/src/pages/admin/AlertsConfigPage.tsx +113 -26
  224. package/.framework/src/pages/admin/AppDetailPage.tsx +125 -8
  225. package/.framework/src/pages/admin/AppsPage.tsx +49 -2
  226. package/.framework/src/pages/admin/DeliveriesPage.tsx +196 -0
  227. package/.framework/src/pages/admin/DesignedPage.tsx +32 -18
  228. package/.framework/src/pages/admin/EmbeddingDetailPage.tsx +215 -484
  229. package/.framework/src/pages/admin/EmbeddingsPage.tsx +116 -319
  230. package/.framework/src/pages/admin/ExtendedShadcnTestPage.tsx +34 -9
  231. package/.framework/src/pages/admin/IncrementalShadcnTestPage.tsx +34 -9
  232. package/.framework/src/pages/admin/IntegratedDashboard.tsx +32 -16
  233. package/.framework/src/pages/admin/IntegrationDetailPage.tsx +183 -26
  234. package/.framework/src/pages/admin/IntegrationsPage.tsx +48 -19
  235. package/.framework/src/pages/admin/InvitesPage.tsx +48 -14
  236. package/.framework/src/pages/admin/LogsPage.tsx +422 -75
  237. package/.framework/src/pages/admin/MinimalShadcnTestPage.tsx +34 -9
  238. package/.framework/src/pages/admin/ObservabilityDashboard.tsx +113 -24
  239. package/.framework/src/pages/admin/PipelineDetailPage.tsx +206 -34
  240. package/.framework/src/pages/admin/PipelineExecutionsPage.tsx +50 -17
  241. package/.framework/src/pages/admin/PipelinesPage.tsx +160 -21
  242. package/.framework/src/pages/admin/PromptConfigDetailPage.tsx +378 -88
  243. package/.framework/src/pages/admin/PromptConfigsPage.tsx +125 -16
  244. package/.framework/src/pages/admin/ProperlyDesignedPage.tsx +49 -10
  245. package/.framework/src/pages/admin/RoleDetailPage.tsx +130 -10
  246. package/.framework/src/pages/admin/RolesPage.tsx +171 -18
  247. package/.framework/src/pages/admin/SelectTestPage.tsx +34 -9
  248. package/.framework/src/pages/admin/ShadcnTestPage.tsx +49 -11
  249. package/.framework/src/pages/admin/SimpleDashboard.tsx +49 -10
  250. package/.framework/src/pages/admin/TestRunDetailPage.tsx +49 -4
  251. package/.framework/src/pages/admin/TestingDashboard.tsx +98 -28
  252. package/.framework/src/pages/admin/TimerDetailPage.tsx +143 -33
  253. package/.framework/src/pages/admin/TimersPage.tsx +48 -20
  254. package/.framework/src/pages/admin/TriggerDetailPage.tsx +118 -30
  255. package/.framework/src/pages/admin/TriggersPage.tsx +64 -19
  256. package/.framework/src/pages/admin/TypeDetailPage.tsx +138 -15
  257. package/.framework/src/pages/admin/TypesPage.tsx +48 -20
  258. package/.framework/src/pages/admin/cil/CILAgentPage.tsx +465 -0
  259. package/.framework/src/pages/admin/cil/CILChunkDetailPage.tsx +787 -0
  260. package/.framework/src/pages/admin/cil/CILDashboardPage.tsx +699 -0
  261. package/.framework/src/pages/admin/cil/CILFileListPage.tsx +647 -0
  262. package/.framework/src/pages/admin/cil/CILGraphPage.tsx +616 -0
  263. package/.framework/src/pages/admin/cil/CILIngestionPage.tsx +1402 -0
  264. package/.framework/src/pages/admin/cil/CILProjectsPage.tsx +614 -0
  265. package/.framework/src/pages/admin/cil/CILSearchPage.tsx +571 -0
  266. package/.framework/src/pages/admin/cil/FlexiblePipelinePage.tsx +731 -0
  267. package/.framework/src/pages/admin/kb/KBAdminPage.tsx +64 -0
  268. package/.framework/src/pages/auth/AuthConfirmPage.tsx +52 -51
  269. package/.framework/src/pages/auth/ForgotPasswordPage.tsx +31 -22
  270. package/.framework/src/pages/auth/LoginPage.tsx +50 -23
  271. package/.framework/src/pages/auth/PendingApprovalPage.tsx +31 -15
  272. package/.framework/src/pages/auth/RegisterPage.tsx +281 -317
  273. package/.framework/src/pages/spine-framework/APIPage.tsx +33 -0
  274. package/.framework/src/pages/spine-framework/CLIPage.tsx +33 -0
  275. package/.framework/src/types/auth.ts +128 -71
  276. package/.framework/src/types/types.ts +373 -157
  277. package/custom/.devin/skills/spine-workbench-discovery/SKILL.md +39 -0
  278. package/custom/.devin/skills/spine-workbench-idea/SKILL.md +36 -0
  279. package/custom/.devin/skills/spine-workbench-implement/SKILL.md +46 -0
  280. package/custom/.devin/skills/spine-workbench-initiative/SKILL.md +28 -0
  281. package/custom/.devin/skills/spine-workbench-plan/SKILL.md +38 -0
  282. package/docs/README.md +9 -130
  283. package/netlify.toml +5 -2
  284. package/package.json +13 -25
  285. package/scripts/kb-ingest-docs.ts +203 -0
  286. package/spine.config.json +65 -4
  287. package/.framework/migrations/001_schema.sql +0 -425
  288. package/.framework/migrations/002_rls_and_functions.sql +0 -763
  289. package/.framework/migrations/004_enhancements.sql +0 -43
  290. package/.framework/migrations/005_auth_user_trigger.sql +0 -105
  291. package/.framework/migrations/006_fix_current_actor_id.sql +0 -21
  292. package/.framework/migrations/016_invites.sql +0 -27
  293. package/.framework/migrations/017_fix_get_account_apps.sql +0 -78
  294. package/.framework/migrations/018_apps_required_roles.sql +0 -17
  295. package/.framework/migrations/019_triggers_unique_constraint.sql +0 -13
  296. package/.framework/migrations/020_get_account_apps_role_filter.sql +0 -117
  297. package/.framework/migrations/021_app_domains.sql +0 -112
  298. package/.framework/migrations/022_route_prefix_domain_unique.sql +0 -21
  299. package/.framework/migrations/023_match_embeddings_rpc.sql +0 -78
  300. package/.framework/migrations/024_messages_account_id.sql +0 -9
  301. package/.framework/migrations/025_retype_threads_messages.sql +0 -240
  302. package/.framework/migrations/026_fix_rls_policies.sql +0 -47
  303. package/.framework/migrations/027_embedding_lifecycle.sql +0 -176
  304. package/.framework/migrations/028_fix_message_data_permissions.sql +0 -49
  305. package/.framework/migrations/029_tighten_support_triage_prompt.sql +0 -41
  306. package/.framework/migrations/030_messages_updated_by.sql +0 -6
  307. package/.framework/migrations/031_seed_upsert_constraints.sql +0 -35
  308. package/docs/APPS.md +0 -232
  309. package/docs/ARCHITECTURE.md +0 -246
  310. package/docs/INSTALL.md +0 -155
  311. package/docs/design-schema-spec.md +0 -1837
  312. package/docs/dev-guides/01-create-an-app.md +0 -183
  313. package/docs/dev-guides/02-create-a-function.md +0 -178
  314. package/docs/dev-guides/03-create-a-component.md +0 -178
  315. package/docs/dev-guides/04-webhook-handlers.md +0 -129
  316. package/docs/dev-guides/05-testing.md +0 -168
  317. package/docs/dev-guides/README.md +0 -40
  318. package/docs/npm-packages-plan.md +0 -288
  319. package/docs/spine-core--api-reference.md +0 -822
@@ -1,31 +1,23 @@
1
- /**
2
- * @module src/hooks/useForm
3
- * @audience installer
4
- * @layer frontend-hook
5
- * @stability stable
6
- *
7
- * Schema-aware form state hook. Manages field values, touched state,
8
- * per-field validation (required, email, url, number range, text
9
- * length/pattern), and form submission with async support.
10
- *
11
- * Designed to work directly with `FieldDefinition[]` arrays produced
12
- * by `useSchemaRecord` or static field arrays in admin forms.
13
- *
14
- * **Validation order per field:**
15
- * 1. Required check
16
- * 2. Type-specific rule (email regex, URL parse, number range, text length/pattern)
17
- * 3. Custom `validate` function (whole-form)
18
- *
19
- * @seeAlso src/types/types.ts (FieldDefinition — field schema shape)
20
- * @seeAlso src/hooks/useSchemaRecord.ts (produces FieldDefinition[] for this hook)
21
- * @seeAlso src/components/shared/SchemaFields.tsx (renders fields from FieldDefinition[])
22
- */
23
1
 
2
+
3
+ // CIL[BEGIN chunk_id="useform_module_header_1783719596" type="module_header" identity="module_header" parent="none"]
4
+ // CIL[DOC-MACRO purpose="Define form hook types and interfaces"]
5
+ // CIL[DOC-RESPONSIBILITY responsibility="Type definitions for form management"]
6
+ // CIL[DOC-CONTEXT module="useForm" layer="frontend-hook" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/functions/_shared/schema-utils.ts\",\"\\\"]"]
7
+ // CIL[DOC-CONTRACT inputs="none" outputs="UseFormOptions and UseFormReturn interfaces" errors="none" side_effects="Type declarations"]
8
+ // CIL[DOC-MICRO logic_summary="Exports interfaces for form options, return values, and field definitions" notable_decisions="[]"]
9
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
10
+ // CIL[DOC-STABILITY stability="stable"]
11
+ // CIL[DOC-AUDIENCE audience="developer"]
12
+ // CIL[DOC-VECTOR type="context" content="Layer: frontend-hook. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/IntegrationsPage.tsx, .framework/functions/_shared/principal.ts, .framework/functions/_shared/schema-utils.ts, \."]
13
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
14
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
15
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
16
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
17
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
24
18
  import { useState, useCallback, useEffect } from 'react'
25
19
  import { FieldDefinition, FormState, ValidationError } from '../types/types'
26
20
 
27
- // ─── TYPES ───────────────────────────────────────────────────────────────────
28
-
29
21
  interface UseFormOptions {
30
22
  initialValues: Record<string, any>
31
23
  fields: FieldDefinition[]
@@ -34,23 +26,6 @@ interface UseFormOptions {
34
26
  onChange?: (values: Record<string, any>) => void
35
27
  }
36
28
 
37
- /**
38
- * Return value of `useForm`.
39
- *
40
- * @prop data - Current field values keyed by field name
41
- * @prop errors - Per-field error messages (empty string = cleared, absent = untouched)
42
- * @prop touched - Fields the user has interacted with
43
- * @prop isSubmitting - True while `onSubmit` promise is pending
44
- * @prop isValid - True when `errors` is empty
45
- * @prop isDirty - True when any touched field differs from `initialValues`
46
- * @prop handleChange - Update a field value (clears error, marks touched)
47
- * @prop handleBlur - Mark a field touched and run field-level validation
48
- * @prop handleSubmit - Validate all fields, then call `onSubmit` if valid
49
- * @prop resetForm - Restore all state to `initialValues`
50
- * @prop setFieldValue - Programmatic field update (same as handleChange)
51
- * @prop setFieldError - Inject a server-side error for a field
52
- * @prop clearErrors - Clear all errors (e.g. after navigation)
53
- */
54
29
  interface UseFormReturn {
55
30
  data: Record<string, any>
56
31
  errors: Record<string, string>
@@ -66,36 +41,21 @@ interface UseFormReturn {
66
41
  setFieldError: (field: string, error: string) => void
67
42
  clearErrors: () => void
68
43
  }
69
-
70
- // ─── HOOK ────────────────────────────────────────────────────────────────────
71
-
72
- /**
73
- * Schema-driven form state and validation hook.
74
- *
75
- * @param options.initialValues - Seed values for all fields
76
- * @param options.fields - `FieldDefinition[]` from schema or static config
77
- * @param options.onSubmit - Async submit handler; called only if validation passes
78
- * @param options.validate - Optional whole-form custom validator returning
79
- * `Record<fieldName, errorMessage>`
80
- * @param options.onChange - Called on every field change with the full values map
81
- *
82
- * @returns `UseFormReturn` — see interface for full description
83
- *
84
- * @inputSpec fields[].data_type: 'email'|'url'|'number'|'text'|'textarea'
85
- * drives built-in validation rules
86
- * @inputSpec fields[].validation.minLength/maxLength/pattern: text constraints
87
- * @sideEffects React state mutations only
88
- * @calledBy SchemaDetailForm.tsx, all admin detail pages
89
- *
90
- * @example
91
- * ```tsx
92
- * const form = useForm({
93
- * initialValues: { name: '', email: '' },
94
- * fields: [{ name: 'email', data_type: 'email', required: true, label: 'Email' }],
95
- * onSubmit: async (values) => await save(values)
96
- * })
97
- * ```
98
- */
44
+ // CIL[END chunk_id="useform_module_header_1783719596"]
45
+ // CIL[BEGIN chunk_id="useform_useform_1783719596" type="function" identity="useForm" parent="none"]
46
+ // CIL[DOC-MACRO purpose="Schema-driven form state and validation management"]
47
+ // CIL[DOC-RESPONSIBILITY responsibility="Form validation, state management, submission handling"]
48
+ // CIL[DOC-CONTEXT module="useForm" layer="frontend-hook" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/functions/_shared/schema-utils.ts\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\"\\\"]"]
49
+ // CIL[DOC-CONTRACT inputs="none" outputs="UseFormReturn with form state and handlers" errors="Validation errors, submission errors" side_effects="React state updates, API calls via onSubmit"]
50
+ // CIL[DOC-MICRO logic_summary="Implements field-level validation, form submission, error handling, and state management for schema-driven forms" notable_decisions="[]"]
51
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
52
+ // CIL[DOC-STABILITY stability="stable"]
53
+ // CIL[DOC-VECTOR type="context" content="Layer: frontend-hook. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, .framework/functions/_shared/schema-utils.ts, .framework/src/pages/admin/TypeDetailPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/RolesPage.tsx, \."]
54
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
55
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
56
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
57
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
58
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
99
59
  export function useForm({
100
60
  initialValues,
101
61
  fields,
@@ -109,22 +69,18 @@ export function useForm({
109
69
  const [isSubmitting, setIsSubmitting] = useState(false)
110
70
  const [submitCount, setSubmitCount] = useState(0)
111
71
 
112
- // Validate a single field
113
72
  const validateField = useCallback((field: string, value: any): string | null => {
114
73
  const fieldDef = fields.find(f => f.name === field)
115
74
  if (!fieldDef) return null
116
75
 
117
- // Required validation
118
76
  if (fieldDef.required && (!value || value === '')) {
119
77
  return `${fieldDef.label || field} is required`
120
78
  }
121
79
 
122
- // Skip validation for empty optional fields
123
80
  if (!fieldDef.required && (!value || value === '')) {
124
81
  return null
125
82
  }
126
83
 
127
- // Type-specific validation
128
84
  switch (fieldDef.data_type) {
129
85
  case 'email':
130
86
  const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/
@@ -171,11 +127,9 @@ export function useForm({
171
127
  return null
172
128
  }, [fields])
173
129
 
174
- // Validate all fields
175
130
  const validateForm = useCallback((values: Record<string, any>): Record<string, string> => {
176
131
  const newErrors: Record<string, string> = {}
177
132
 
178
- // Run field-level validation
179
133
  fields.forEach(field => {
180
134
  if (!field.name) return
181
135
  const fieldErr = validateField(field.name, values[field.name])
@@ -184,7 +138,6 @@ export function useForm({
184
138
  }
185
139
  })
186
140
 
187
- // Run custom validation
188
141
  if (validate) {
189
142
  const customErrors = validate(values)
190
143
  Object.assign(newErrors, customErrors)
@@ -193,12 +146,10 @@ export function useForm({
193
146
  return newErrors
194
147
  }, [fields, validate, validateField])
195
148
 
196
- // Handle field change
197
149
  const handleChange = useCallback((field: string, value: any) => {
198
150
  const newData = { ...data, [field]: value }
199
151
  setData(newData)
200
152
 
201
- // Clear error for this field when user starts typing
202
153
  if (errors[field]) {
203
154
  setErrors(prev => {
204
155
  const newErrors = { ...prev }
@@ -207,18 +158,14 @@ export function useForm({
207
158
  })
208
159
  }
209
160
 
210
- // Mark field as touched
211
161
  setTouched(prev => ({ ...prev, [field]: true }))
212
162
 
213
- // Call onChange callback
214
163
  onChange?.(newData)
215
164
  }, [data, errors, onChange])
216
165
 
217
- // Handle field blur
218
166
  const handleBlur = useCallback((field: string) => {
219
167
  setTouched(prev => ({ ...prev, [field]: true }))
220
168
 
221
- // Validate field on blur
222
169
  const error = validateField(field, data[field])
223
170
  setErrors(prev => ({
224
171
  ...prev,
@@ -226,18 +173,15 @@ export function useForm({
226
173
  }))
227
174
  }, [data, validateField])
228
175
 
229
- // Handle form submission
230
176
  const handleSubmit = useCallback(async (e?: React.FormEvent) => {
231
177
  e?.preventDefault()
232
178
 
233
- // Mark all fields as touched
234
179
  const allTouched = fields.reduce((acc, field) => {
235
180
  if (field.name) acc[field.name] = true
236
181
  return acc
237
182
  }, {} as Record<string, boolean>)
238
183
  setTouched(allTouched)
239
184
 
240
- // Validate form
241
185
  const newErrors = validateForm(data)
242
186
  setErrors(newErrors)
243
187
 
@@ -258,7 +202,6 @@ export function useForm({
258
202
  }
259
203
  }, [data, fields, validateForm, onSubmit])
260
204
 
261
- // Reset form
262
205
  const resetForm = useCallback(() => {
263
206
  setData(initialValues)
264
207
  setErrors({})
@@ -267,12 +210,10 @@ export function useForm({
267
210
  setSubmitCount(0)
268
211
  }, [initialValues])
269
212
 
270
- // Set field value
271
213
  const setFieldValue = useCallback((field: string, value: any) => {
272
214
  handleChange(field, value)
273
215
  }, [handleChange])
274
216
 
275
- // Set field error
276
217
  const setFieldError = useCallback((field: string, error: string) => {
277
218
  setErrors(prev => ({
278
219
  ...prev,
@@ -280,12 +221,10 @@ export function useForm({
280
221
  }))
281
222
  }, [])
282
223
 
283
- // Clear all errors
284
224
  const clearErrors = useCallback(() => {
285
225
  setErrors({})
286
226
  }, [])
287
227
 
288
- // Calculate derived state
289
228
  const isValid = Object.keys(errors).length === 0
290
229
  const isDirty = Object.keys(touched).some(field => data[field] !== initialValues[field])
291
230
 
@@ -305,3 +244,4 @@ export function useForm({
305
244
  clearErrors
306
245
  }
307
246
  }
247
+ // CIL[END chunk_id="useform_useform_1783719596"]
@@ -1,58 +1,43 @@
1
- /**
2
- * @module src/hooks/useListSchema
3
- * @audience installer
4
- * @layer frontend-hook
5
- * @stability stable
6
- *
7
- * Resolves the `DesignSchema` and target `View` for a list page. Because
8
- * the `design_schema` is stamp-copied onto records, this hook uses a
9
- * two-stage resolution strategy to handle stale or missing stamps:
10
- *
11
- * **Resolution order:**
12
- * 1. Fetch one sample record via `admin-data?action=list&limit=1`
13
- * 2. If the sample record's `design_schema` has the requested view, use it
14
- * 3. Otherwise, fall back to the canonical `types` table entry for the entity kind
15
- * 4. If no records exist, return a minimal fallback schema so the page renders
16
- *
17
- * **Auth retry:** Auth errors (JWT not ready) trigger a 300 ms retry instead
18
- * of silently falling back to an empty schema (which would render a blank list).
19
- *
20
- * **Entity → kind mapping** (used for the types fallback):
21
- * `accounts→account`, `people→person`, `items→item`, `threads→thread`,
22
- * `messages→message`, `links→link`, `attachments→attachment`, `watchers→watcher`
23
- *
24
- * @seeAlso src/lib/api.ts (apiFetch)
25
- * @seeAlso src/types/types.ts (DesignSchema, View)
26
- * @seeAlso src/components/runtime/DataListPage.tsx (primary consumer)
27
- * @seeAlso functions/admin-data.ts (list action endpoint)
28
- */
29
-
30
1
  import { useState, useEffect } from 'react'
31
2
  import { apiFetch } from '../lib/api'
32
3
  import { DesignSchema, View } from '../types/types'
33
4
 
34
- // ─── TYPES ───────────────────────────────────────────────────────────────────
35
5
 
36
- /**
37
- * Options for `useListSchema`.
38
- *
39
- * @prop entity - Entity table name (e.g. `'accounts'`, `'items'`)
40
- * @prop viewSlug - View key in `design_schema.views`; defaults to `'default_list'`
41
- */
6
+
7
+ // CIL[BEGIN chunk_id="uselistschema_module_header_1783718716" type="module_header" identity="module_header" parent="none"]
8
+ // CIL[DOC-MACRO purpose="Define options interface for useListSchema hook"]
9
+ // CIL[DOC-RESPONSIBILITY responsibility="Own the UseListSchemaOptions interface definition"]
10
+ // CIL[DOC-CONTEXT module="useListSchema" layer="frontend-hook" related_files="[\".framework/functions/_shared/schema-utils.ts\",\".framework/functions/_shared/principal.ts\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\"\\\"]"]
11
+ // CIL[DOC-CONTRACT inputs="none" outputs="interface definition" errors="none" side_effects="none"]
12
+ // CIL[DOC-MICRO logic_summary="Simple interface with entity and optional viewSlug" 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: .framework/functions/_shared/schema-utils.ts, .framework/functions/_shared/principal.ts, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/src/pages/admin/IntegrationsPage.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."]
20
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
21
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
42
22
  interface UseListSchemaOptions {
43
23
  entity: string
44
24
  viewSlug?: string
45
25
  }
46
-
47
- /**
48
- * Return value of `useListSchema`.
49
- *
50
- * @prop schema - Resolved `DesignSchema` or null while loading
51
- * @prop view - The specific `View` for `viewSlug`, or null while loading
52
- * @prop loading - True during initial fetch and auth retry
53
- * @prop error - Error message if schema resolution fails
54
- * @prop refetch - Manually re-run schema resolution
55
- */
26
+ // CIL[END chunk_id="uselistschema_module_header_1783718716"]
27
+ // CIL[BEGIN chunk_id="uselistschema_useresult_1783718716" type="interface" identity="UseListSchemaResult" parent="none"]
28
+ // CIL[DOC-MACRO purpose="Define return type for useListSchema hook"]
29
+ // CIL[DOC-RESPONSIBILITY responsibility="Own the UseListSchemaResult interface definition"]
30
+ // CIL[DOC-CONTEXT module="useListSchema" layer="frontend-hook" related_files="[\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/functions/_shared/schema-utils.ts\",\".framework/functions/_shared/principal.ts\",\".framework/functions/_shared/db.ts\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"\\\"]"]
31
+ // CIL[DOC-CONTRACT inputs="none" outputs="interface definition" errors="none" side_effects="none"]
32
+ // CIL[DOC-MICRO logic_summary="Interface with schema, view, loading, error, and refetch fields" notable_decisions="[]"]
33
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
34
+ // CIL[DOC-STABILITY stability="stable"]
35
+ // CIL[DOC-VECTOR type="context" content="Layer: frontend-hook. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/TypeDetailPage.tsx, .framework/functions/_shared/schema-utils.ts, .framework/functions/_shared/principal.ts, .framework/functions/_shared/db.ts, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, \."]
36
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
37
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
38
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
39
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
40
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
56
41
  interface UseListSchemaResult {
57
42
  schema: DesignSchema | null
58
43
  view: View | null
@@ -60,29 +45,23 @@ interface UseListSchemaResult {
60
45
  error: string | null
61
46
  refetch: () => void
62
47
  }
63
-
64
- // ─── HOOK ────────────────────────────────────────────────────────────────────
65
-
66
- /**
67
- * Resolves the `DesignSchema` and target `View` for a list page, using a
68
- * two-stage fallback strategy (stamped record → canonical type → minimal fallback).
69
- *
70
- * @param options.entity - Entity name, e.g. `'accounts'`
71
- * @param options.viewSlug - View key; defaults to `'default_list'`
72
- * @returns `UseListSchemaResult` — schema, view, loading, error, refetch
73
- *
74
- * @inputSpec options.entity: string — must be non-empty or an error is set
75
- * @outputSpec schema: DesignSchema — minimal fallback if no records exist
76
- * @outputSpec view: View — matches `viewSlug` from the resolved schema
77
- * @throws never (all errors are caught and stored in `error` state)
78
- * @sideEffects Network requests (1–2 calls); React state mutations; 300ms setTimeout on auth retry
79
- * @calledBy DataListPage.tsx
80
- *
81
- * @example
82
- * ```tsx
83
- * const { schema, view, loading } = useListSchema({ entity: 'accounts' })
84
- * ```
85
- */
48
+ // CIL[END chunk_id="uselistschema_useresult_1783718716"]
49
+ // CIL[BEGIN chunk_id="uselistschema_usefunction_1783718716" type="function" identity="useListSchema" parent="none"]
50
+ // CIL[DOC-LEARNING topic="runtime-type:generic/list_schema" content="useListSchema first tries to use a sample record's stamped design_schema and views.default_list. If the sample lacks a schema, it falls back to the types table for the current entity's type."]
51
+ // CIL[DOC-NOTE type="design_schema_caveat" content="Falling back to the types table only works when a single type is selected. Multiple types in a list require every type to define a compatible default_list view."]
52
+ // CIL[DOC-MACRO purpose="Resolve DesignSchema and View for list pages with fallback strategy"]
53
+ // CIL[DOC-RESPONSIBILITY responsibility="Fetch schema with two-stage fallback and manage React state"]
54
+ // CIL[DOC-CONTEXT module="useListSchema" layer="frontend-hook" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\"\\\"]"]
55
+ // CIL[DOC-CONTRACT inputs="none" outputs="resolved schema and view" errors="network errors, auth errors" side_effects="React state mutations, network requests, setTimeout"]
56
+ // CIL[DOC-MICRO logic_summary="Fetch sample record, use stamped schema or fallback to types table, handle auth retry with 300ms delay" notable_decisions="['auth_retry_delay', 'fallback_schema_for_empty_data']"]
57
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
58
+ // CIL[DOC-STABILITY stability="stable"]
59
+ // CIL[DOC-VECTOR type="context" content="Layer: frontend-hook. Direct callers: 3. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/IntegrationsPage.tsx, .framework/src/pages/admin/RolesPage.tsx, \."]
60
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 3. Total affected: 5."]
61
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
62
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
63
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
64
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
86
65
  export function useListSchema(options: UseListSchemaOptions): UseListSchemaResult {
87
66
  const { entity, viewSlug = 'default_list' } = options
88
67
 
@@ -98,7 +77,6 @@ export function useListSchema(options: UseListSchemaOptions): UseListSchemaResul
98
77
  setLoading(true)
99
78
  setError(null)
100
79
 
101
- // Fetch a sample record to get its design_schema
102
80
  const response = await apiFetch(`/api/admin-data?action=list&entity=${entity}&limit=1`)
103
81
 
104
82
  if (!response.ok) {
@@ -108,9 +86,6 @@ export function useListSchema(options: UseListSchemaOptions): UseListSchemaResul
108
86
  const data = await response.json()
109
87
 
110
88
  if (data.error) {
111
- // Auth errors (session not yet ready) should not silently fall back to
112
- // an empty schema — that causes the list to render with no columns.
113
- // Retry once after a short delay to allow the session to hydrate.
114
89
  if (
115
90
  data.error.includes('Invalid authentication') ||
116
91
  data.error.includes('Unauthorized') ||
@@ -124,7 +99,6 @@ export function useListSchema(options: UseListSchemaOptions): UseListSchemaResul
124
99
  throw new Error(data.error || 'Failed to fetch records')
125
100
  }
126
101
 
127
- // No records yet — use a minimal fallback schema so the list page still renders
128
102
  if (!data.data || data.data.length === 0) {
129
103
  if (cancelled) return
130
104
  const fallback: DesignSchema = {
@@ -151,7 +125,6 @@ export function useListSchema(options: UseListSchemaOptions): UseListSchemaResul
151
125
 
152
126
  const sampleRecord = data.data[0]
153
127
 
154
- // If the sample record has a design_schema with the requested view, use it directly
155
128
  const stampedSchema = sampleRecord.design_schema as DesignSchema | undefined
156
129
  const stampedView = stampedSchema?.views?.[viewSlug]
157
130
 
@@ -160,7 +133,6 @@ export function useListSchema(options: UseListSchemaOptions): UseListSchemaResul
160
133
  setSchema(stampedSchema)
161
134
  setView(stampedView)
162
135
  } else {
163
- // Schema missing or stale — fetch current design_schema from the types table
164
136
  const kindMap: Record<string, string> = { accounts: 'account', people: 'person', items: 'item', threads: 'thread', messages: 'message', links: 'link', attachments: 'attachment', watchers: 'watcher', item_progress: 'progress' }
165
137
  const kind = kindMap[entity]
166
138
  let resolvedSchema: DesignSchema | null = null
@@ -183,7 +155,6 @@ export function useListSchema(options: UseListSchemaOptions): UseListSchemaResul
183
155
  setSchema(resolvedSchema)
184
156
  setView(resolvedView)
185
157
  } else {
186
- // Schema found but view key missing — use minimal fallback
187
158
  const fallback: DesignSchema = {
188
159
  fields: {},
189
160
  record_permissions: {},
@@ -205,7 +176,6 @@ export function useListSchema(options: UseListSchemaOptions): UseListSchemaResul
205
176
  setView(fallback.views![viewSlug]!)
206
177
  }
207
178
  } else {
208
- // No type found in registry — use minimal fallback
209
179
  const fallback: DesignSchema = {
210
180
  fields: {},
211
181
  record_permissions: {},
@@ -262,3 +232,4 @@ export function useListSchema(options: UseListSchemaOptions): UseListSchemaResul
262
232
  refetch: fetchSchema
263
233
  }
264
234
  }
235
+ // CIL[END chunk_id="uselistschema_usefunction_1783718716"]