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,39 +1,28 @@
1
- /**
2
- * @module src/hooks/useSchemaRecord
3
- * @audience installer
4
- * @layer frontend-hook
5
- * @stability stable
6
- *
7
- * Schema-record data management hooks. Two complementary hooks:
8
- *
9
- * - **`useSchemaRecord`** — given an already-fetched record and its schema
10
- * type, returns structured `FieldDefinition[]`, a managed `data` state
11
- * seeded from `record.data` with schema defaults, and field setters.
12
- * Used on detail/edit pages where the record is fetched by a parent hook.
13
- *
14
- * - **`useTypeSelection`** — fetches all types of a given `kind` and exposes
15
- * a `selectedTypeId` state. Used on create pages for the type-first flow
16
- * where the user picks a type before filling in fields.
17
- *
18
- * **Data seeding invariant:** `useSchemaRecord` re-seeds `data` state only
19
- * when `record.id` or `schemaType.id` changes, not on every render. This
20
- * prevents losing unsaved edits during re-renders.
21
- *
22
- * @seeAlso src/hooks/useEntityRecord.ts (fetches the record passed here)
23
- * @seeAlso src/hooks/useForm.ts (consumes FieldDefinition[] from this hook)
24
- * @seeAlso src/types/types.ts (FieldDefinition, ItemType)
25
- */
26
-
27
1
  import { useState, useEffect, useCallback } from 'react'
28
2
  import { apiFetch } from '../lib/api'
29
3
  import { FieldDefinition, ItemType } from '../types/types'
30
4
 
31
- // ─── TYPES ───────────────────────────────────────────────────────────────────
32
5
 
33
- /**
34
- * A record from the `types` table as loaded for schema resolution.
35
- * @prop design_schema - Full design schema including fields and views
36
- */
6
+
7
+
8
+
9
+
10
+
11
+ // CIL[BEGIN chunk_id="uschemarecord_module_header_1783718716" type="module_header" identity="module_header" parent="none"]
12
+ // CIL[DOC-MACRO purpose="Define SchemaType interface for type records"]
13
+ // CIL[DOC-RESPONSIBILITY responsibility="Own the SchemaType interface definition"]
14
+ // CIL[DOC-CONTEXT module="useSchemaRecord" layer="frontend-hook" related_files="[\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/functions/_shared/schema-utils.ts\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/functions/_shared/db.ts\",\"\\\"]"]
15
+ // CIL[DOC-CONTRACT inputs="none" outputs="interface definition" errors="none" side_effects="none"]
16
+ // CIL[DOC-MICRO logic_summary="Interface with id, name, slug, optional fields, and design_schema" 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: frontend-hook. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/TypeDetailPage.tsx, .framework/functions/_shared/schema-utils.ts, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/functions/_shared/principal.ts, .framework/functions/_shared/db.ts, \."]
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"]
37
26
  export interface SchemaType {
38
27
  id: string
39
28
  name: string
@@ -44,11 +33,21 @@ export interface SchemaType {
44
33
  app_id?: string
45
34
  design_schema: ItemType['design_schema']
46
35
  }
47
-
48
- /**
49
- * A generic record that may carry its resolved type in a nested `type` join.
50
- * @prop data - The JSONB `data` column; all custom field values live here
51
- */
36
+ // CIL[END chunk_id="uschemarecord_module_header_1783718716"]
37
+ // CIL[BEGIN chunk_id="uschemarecord_schemarecord_1783718716" type="interface" identity="SchemaRecord" parent="none"]
38
+ // CIL[DOC-MACRO purpose="Define SchemaRecord interface for generic records"]
39
+ // CIL[DOC-RESPONSIBILITY responsibility="Own the SchemaRecord interface definition"]
40
+ // CIL[DOC-CONTEXT module="useSchemaRecord" layer="frontend-hook" related_files="[\".framework/functions/_shared/schema-utils.ts\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/functions/_shared/principal.ts\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\"\\\"]"]
41
+ // CIL[DOC-CONTRACT inputs="none" outputs="interface definition" errors="none" side_effects="none"]
42
+ // CIL[DOC-MICRO logic_summary="Interface with id, optional type_id/type, data JSONB, and index signature" notable_decisions="[]"]
43
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
44
+ // CIL[DOC-STABILITY stability="stable"]
45
+ // CIL[DOC-VECTOR type="context" content="Layer: frontend-hook. Direct callers: 0. Direct calls: 0. Related files: .framework/functions/_shared/schema-utils.ts, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/functions/_shared/principal.ts, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/IntegrationsPage.tsx, \."]
46
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
47
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
48
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
49
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
50
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
52
51
  export interface SchemaRecord {
53
52
  id: string
54
53
  type_id?: string
@@ -56,23 +55,39 @@ export interface SchemaRecord {
56
55
  data: Record<string, any>
57
56
  [key: string]: any
58
57
  }
59
-
60
- /** Options for `useSchemaRecord`. */
58
+ // CIL[END chunk_id="uschemarecord_schemarecord_1783718716"]
59
+ // CIL[BEGIN chunk_id="uschemarecord_options_1783718716" type="interface" identity="UseSchemaRecordOptions" parent="none"]
60
+ // CIL[DOC-MACRO purpose="Define options interface for useSchemaRecord hook"]
61
+ // CIL[DOC-RESPONSIBILITY responsibility="Own the UseSchemaRecordOptions interface definition"]
62
+ // CIL[DOC-CONTEXT module="useSchemaRecord" 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\",\"\\\"]"]
63
+ // CIL[DOC-CONTRACT inputs="none" outputs="interface definition" errors="none" side_effects="none"]
64
+ // CIL[DOC-MICRO logic_summary="Simple interface with typeApiKind field" notable_decisions="[]"]
65
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
66
+ // CIL[DOC-STABILITY stability="stable"]
67
+ // 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, \."]
68
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
69
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
70
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
71
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
72
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
61
73
  export interface UseSchemaRecordOptions {
62
- typeApiKind: string // e.g. 'account', 'person', 'item'
74
+ typeApiKind: string
63
75
  }
64
-
65
- /**
66
- * Return value of `useSchemaRecord`.
67
- *
68
- * @prop fields - Ordered `FieldDefinition[]` from schema; empty if no schema
69
- * @prop data - Managed field values (seeded from `record.data` + defaults)
70
- * @prop setData - Replace the entire data map
71
- * @prop setField - Update a single field by name
72
- * @prop schemaType - The resolved schema type (passed through)
73
- * @prop loading - Always false (data is derived, not fetched here)
74
- * @prop error - Always null
75
- */
76
+ // CIL[END chunk_id="uschemarecord_options_1783718716"]
77
+ // CIL[BEGIN chunk_id="uschemarecord_result_1783718716" type="interface" identity="UseSchemaRecordResult" parent="none"]
78
+ // CIL[DOC-MACRO purpose="Define return type for useSchemaRecord hook"]
79
+ // CIL[DOC-RESPONSIBILITY responsibility="Own the UseSchemaRecordResult interface definition"]
80
+ // CIL[DOC-CONTEXT module="useSchemaRecord" 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\",\"\\\"]"]
81
+ // CIL[DOC-CONTRACT inputs="none" outputs="interface definition" errors="none" side_effects="none"]
82
+ // CIL[DOC-MICRO logic_summary="Interface with fields array, managed data, setters, and metadata" notable_decisions="[]"]
83
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
84
+ // CIL[DOC-STABILITY stability="stable"]
85
+ // 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, \."]
86
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
87
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
88
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
89
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
90
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
76
91
  export interface UseSchemaRecordResult {
77
92
  fields: FieldDefinition[]
78
93
  data: Record<string, any>
@@ -82,38 +97,29 @@ export interface UseSchemaRecordResult {
82
97
  loading: boolean
83
98
  error: string | null
84
99
  }
85
-
86
- // ─── useSchemaRecord ─────────────────────────────────────────────────────────
87
-
88
- /**
89
- * Given an already-fetched record and its resolved schema type, returns
90
- * structured field definitions and a managed data state for the record's
91
- * `.data` JSONB column, with schema defaults seeded on load.
92
- *
93
- * Does NOT fetch anything — this is a pure derived-state hook.
94
- *
95
- * @param record - Fetched record (or null while loading)
96
- * @param schemaType - Resolved schema type (or null while loading)
97
- * @returns `UseSchemaRecordResult`
98
- *
99
- * @inputSpec record.data: Record<string, any> | undefined — custom field values
100
- * @inputSpec schemaType.design_schema.fields: FieldDefinition map
101
- * @outputSpec fields: FieldDefinition[] — ordered array with `.name` injected
102
- * @sideEffects React state mutations (data re-seed on record/type change only)
103
- * @calledBy DataDetailPage.tsx, create pages
104
- *
105
- * @example
106
- * ```tsx
107
- * const { fields, data, setField } = useSchemaRecord(record, schemaType)
108
- * ```
109
- */
100
+ // CIL[END chunk_id="uschemarecord_result_1783718716"]
101
+ // CIL[BEGIN chunk_id="uschemarecord_usefunction_1783718716" type="function" identity="useSchemaRecord" parent="none"]
102
+ // CIL[DOC-LEARNING topic="runtime-type:generic/schema_defaults" content="useSchemaRecord seeds empty record state from schemaType.design_schema.fields using each field's default value. It provides the schema used by GenericDetailPage for new records."]
103
+ // CIL[DOC-NOTE type="design_schema_caveat" content="A field missing a default will be undefined. The hook depends on the type record being loaded from the types table, which can fail if the type slug or kind is wrong."]
104
+ // CIL[DOC-MACRO purpose="Manage record data state with schema defaults and field definitions"]
105
+ // CIL[DOC-RESPONSIBILITY responsibility="Provide derived state management for record data and fields"]
106
+ // CIL[DOC-CONTEXT module="useSchemaRecord" layer="frontend-hook" related_files="[]"]
107
+ // CIL[DOC-CONTRACT inputs="none" outputs="managed data, field definitions, setters" errors="none" side_effects="React state mutations"]
108
+ // CIL[DOC-MICRO logic_summary="Seed data from record.data with schema defaults, provide field setters, re-seed only on record/type change" notable_decisions="['reseed_on_id_change_only', 'default_value_seeding']"]
109
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
110
+ // CIL[DOC-STABILITY stability="stable"]
111
+ // CIL[DOC-VECTOR type="context" content="Layer: frontend-hook. Direct callers: 0. Direct calls: 0. Related files: none."]
112
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
113
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
114
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
115
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
116
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
110
117
  export function useSchemaRecord(
111
118
  record: SchemaRecord | null,
112
119
  schemaType: SchemaType | null
113
120
  ): UseSchemaRecordResult {
114
121
  const [data, setDataState] = useState<Record<string, any>>({})
115
122
 
116
- // Re-seed data state only when the record id or schema type id changes
117
123
  const recordId = record?.id ?? null
118
124
  const schemaTypeId = schemaType?.id ?? null
119
125
 
@@ -122,7 +128,6 @@ export function useSchemaRecord(
122
128
 
123
129
  const base = record.data ? { ...record.data } : {}
124
130
 
125
- // Seed defaults for fields that have no value
126
131
  if (schemaType?.design_schema?.fields) {
127
132
  for (const [name, field] of Object.entries(schemaType.design_schema.fields)) {
128
133
  if (base[name] === undefined && (field as any).defaultValue !== undefined) {
@@ -132,7 +137,6 @@ export function useSchemaRecord(
132
137
  }
133
138
 
134
139
  setDataState(base)
135
- // eslint-disable-next-line react-hooks/exhaustive-deps
136
140
  }, [recordId, schemaTypeId])
137
141
 
138
142
  const setData = useCallback((newData: Record<string, any>) => {
@@ -157,19 +161,21 @@ export function useSchemaRecord(
157
161
  error: null
158
162
  }
159
163
  }
160
-
161
- // ─── useTypeSelection ─────────────────────────────────────────────────────────
162
-
163
- /**
164
- * Return value of `useTypeSelection`.
165
- *
166
- * @prop types - All active types of the requested kind
167
- * @prop selectedType - The full `SchemaType` for `selectedTypeId`, or null
168
- * @prop selectedTypeId - Controlled string state for the `<select>` value
169
- * @prop setSelectedTypeId - Setter for `selectedTypeId`
170
- * @prop loading - True while fetching types
171
- * @prop error - Error message or null
172
- */
164
+ // CIL[END chunk_id="uschemarecord_usefunction_1783718716"]
165
+ // CIL[BEGIN chunk_id="uschemarecord_typeselectionresult_1783718716" type="interface" identity="UseTypeSelectionResult" parent="none"]
166
+ // CIL[DOC-MACRO purpose="Define return type for useTypeSelection hook"]
167
+ // CIL[DOC-RESPONSIBILITY responsibility="Own the UseTypeSelectionResult interface definition"]
168
+ // CIL[DOC-CONTEXT module="useSchemaRecord" layer="frontend-hook" related_files="[]"]
169
+ // CIL[DOC-CONTRACT inputs="none" outputs="interface definition" errors="none" side_effects="none"]
170
+ // CIL[DOC-MICRO logic_summary="Interface with types array, selected type/id, setters, and loading state" notable_decisions="[]"]
171
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
172
+ // CIL[DOC-STABILITY stability="stable"]
173
+ // CIL[DOC-VECTOR type="context" content="Layer: frontend-hook. Direct callers: 0. Direct calls: 0. Related files: none."]
174
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
175
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
176
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
177
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
178
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
173
179
  export interface UseTypeSelectionResult {
174
180
  types: SchemaType[]
175
181
  selectedType: SchemaType | null
@@ -178,19 +184,21 @@ export interface UseTypeSelectionResult {
178
184
  loading: boolean
179
185
  error: string | null
180
186
  }
181
-
182
- /**
183
- * Fetches all active types of a given `kind` and exposes a controlled
184
- * `selectedTypeId` state for the type-first create flow.
185
- *
186
- * @param kind - Type kind: `'account'`, `'person'`, `'item'`, etc.
187
- * @returns `UseTypeSelectionResult`
188
- *
189
- * @inputSpec kind: string — passed as `?kind=<kind>&is_active=true` to `/api/types`
190
- * @outputSpec types: SchemaType[] — active types; empty while loading
191
- * @sideEffects Network request via apiFetch on mount and kind change
192
- * @calledBy Create pages (e.g. AccountCreatePage, ItemCreatePage)
193
- */
187
+ // CIL[END chunk_id="uschemarecord_typeselectionresult_1783718716"]
188
+ // CIL[BEGIN chunk_id="uschemarecord_typeselection_1783718716" type="function" identity="useTypeSelection" parent="none"]
189
+ // CIL[DOC-MACRO purpose="Fetch and manage type selection for create flows"]
190
+ // CIL[DOC-RESPONSIBILITY responsibility="Fetch active types by kind and manage selection state"]
191
+ // CIL[DOC-CONTEXT module="useSchemaRecord" layer="frontend-hook" related_files="[]"]
192
+ // CIL[DOC-CONTRACT inputs="none" outputs="types array, selected type, selection state" errors="network errors" side_effects="Network requests, React state mutations"]
193
+ // CIL[DOC-MICRO logic_summary="Fetch active types by kind on mount and kind change, manage selectedTypeId state, resolve selectedType by id" notable_decisions="['controlled_selection_state', 'fetch_on_kind_change']"]
194
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
195
+ // CIL[DOC-STABILITY stability="stable"]
196
+ // CIL[DOC-VECTOR type="context" content="Layer: frontend-hook. Direct callers: 0. Direct calls: 0. Related files: none."]
197
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
198
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
199
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
200
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
201
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
194
202
  export function useTypeSelection(kind: string): UseTypeSelectionResult {
195
203
  const [types, setTypes] = useState<SchemaType[]>([])
196
204
  const [selectedTypeId, setSelectedTypeId] = useState('')
@@ -221,3 +229,4 @@ export function useTypeSelection(kind: string): UseTypeSelectionResult {
221
229
 
222
230
  return { types, selectedType, selectedTypeId, setSelectedTypeId, loading, error }
223
231
  }
232
+ // CIL[END chunk_id="uschemarecord_typeselection_1783718716"]