spine-framework 0.4.3 → 0.5.0-rc.4

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 (320) hide show
  1. package/.env.example +13 -3
  2. package/.framework/cli/commands/bootstrap.ts +392 -0
  3. package/.framework/cli/commands/dev.ts +91 -218
  4. package/.framework/cli/commands/doctor.ts +132 -26
  5. package/.framework/cli/commands/generate.ts +38 -298
  6. package/.framework/cli/commands/init.ts +20 -1
  7. package/.framework/cli/commands/migrate.ts +36 -30
  8. package/.framework/cli/commands/migrations.ts +16 -56
  9. package/.framework/cli/commands/upgrade.ts +35 -0
  10. package/.framework/cli/commands/validate-schema.ts +147 -0
  11. package/.framework/cli/context.ts +223 -110
  12. package/.framework/cli/index.ts +6 -0
  13. package/.framework/cli/lib/project-files.ts +241 -1
  14. package/.framework/functions/_shared/agent-runner.ts +1000 -81
  15. package/.framework/functions/_shared/cil.ts +2 -1
  16. package/.framework/functions/_shared/db.ts +3 -6
  17. package/.framework/functions/_shared/hash-api-key.ts +183 -79
  18. package/.framework/functions/_shared/kb.ts +61 -7
  19. package/.framework/functions/_shared/logging.ts +562 -224
  20. package/.framework/functions/_shared/message-sequence.ts +53 -0
  21. package/.framework/functions/_shared/middleware.ts +47 -44
  22. package/.framework/functions/_shared/pipeline-runner.ts +150 -37
  23. package/.framework/functions/_shared/principal.ts +9 -6
  24. package/.framework/functions/_shared/trigger-engine.ts +149 -40
  25. package/.framework/functions/admin-data.ts +48 -31
  26. package/.framework/functions/ai-agents.ts +103 -33
  27. package/.framework/functions/api-keys.ts +301 -122
  28. package/.framework/functions/apps.ts +43 -26
  29. package/.framework/functions/cil-ingest.ts +48 -15
  30. package/.framework/functions/debug-auth.ts +14 -8
  31. package/.framework/functions/deliveries.ts +39 -12
  32. package/.framework/functions/embeddings.ts +145 -76
  33. package/.framework/functions/integration-outbound.ts +67 -27
  34. package/.framework/functions/integrations.ts +254 -127
  35. package/.framework/functions/logs.ts +273 -133
  36. package/.framework/functions/observability.ts +277 -147
  37. package/.framework/functions/pipeline-executions.ts +1 -1
  38. package/.framework/functions/pipeline-runner-background.ts +120 -0
  39. package/.framework/functions/pipelines.ts +14 -9
  40. package/.framework/functions/prompt-configs.ts +7 -4
  41. package/.framework/functions/roles.ts +8 -5
  42. package/.framework/functions/security.ts +30 -17
  43. package/.framework/functions/system-cron.ts +250 -128
  44. package/.framework/functions/tests.ts +7 -6
  45. package/.framework/functions/timers.ts +310 -107
  46. package/.framework/functions/trigger-scheduler.ts +65 -5
  47. package/.framework/functions/triggers.ts +28 -13
  48. package/.framework/functions/types.ts +13 -10
  49. package/.framework/migrations/064_episode_leases.sql +196 -0
  50. package/.framework/migrations/065_execution_tables_updated_at.sql +20 -0
  51. package/.framework/migrations/066_episode_steal_thread_merge.sql +148 -0
  52. package/.framework/migrations/067_episode_lease_stale_steal.sql +93 -0
  53. package/.framework/migrations/068_cron_schedule_timer_rpcs.sql +251 -0
  54. package/.framework/migrations/069_log_stats_window.sql +54 -0
  55. package/.framework/migrations/070_app_type_schema_rpcs.sql +166 -0
  56. package/.framework/migrations/071_timer_interval_keys.sql +96 -0
  57. package/.framework/migrations/072_slug_autofill.sql +77 -0
  58. package/.framework/migrations/073_seed_member_roles.sql +26 -0
  59. package/.framework/schemas/spine.config.schema.json +62 -0
  60. package/.framework/src/App.tsx +3 -1
  61. package/.framework/src/apps/admin/index.tsx +1141 -775
  62. package/.framework/src/components/ErrorBoundary.tsx +136 -0
  63. package/.framework/src/components/admin/AdminListPage.tsx +81 -73
  64. package/.framework/src/components/admin/AdminSidebar.tsx +92 -81
  65. package/.framework/src/components/admin/EntitySelect.tsx +181 -0
  66. package/.framework/src/components/admin/PageInstructions.tsx +86 -127
  67. package/.framework/src/components/app-shell/GenericAppShell.tsx +3 -1
  68. package/.framework/src/components/app-shell/GenericDetailPage.tsx +37 -13
  69. package/.framework/src/components/app-shell/GenericListPage.tsx +28 -32
  70. package/.framework/src/components/auth/TurnstileWidget.tsx +9 -6
  71. package/.framework/src/components/kb/KBArticleEditor.tsx +49 -6
  72. package/.framework/src/components/layout/Layout.tsx +4 -2
  73. package/.framework/src/components/layout/Sidebar.tsx +304 -179
  74. package/.framework/src/components/runtime/DataDetailPage.tsx +67 -35
  75. package/.framework/src/components/runtime/DataHeader.tsx +96 -48
  76. package/.framework/src/components/runtime/DataListPage.tsx +3 -26
  77. package/.framework/src/components/runtime/DataStats.tsx +10 -10
  78. package/.framework/src/components/runtime/DataTable.tsx +12 -10
  79. package/.framework/src/components/ui/sheet.tsx +24 -26
  80. package/.framework/src/components/ui/textarea.tsx +74 -48
  81. package/.framework/src/hooks/useBranding.ts +47 -0
  82. package/.framework/src/hooks/useEntityList.ts +12 -9
  83. package/.framework/src/hooks/useListSchema.ts +108 -58
  84. package/.framework/src/instructions/README.md +57 -0
  85. package/.framework/src/instructions/ai-agents.md +69 -0
  86. package/.framework/src/instructions/alerts.md +80 -0
  87. package/.framework/src/instructions/api-keys.md +87 -0
  88. package/.framework/src/instructions/apps.md +77 -0
  89. package/.framework/src/instructions/concepts/ai-and-prompts.md +150 -0
  90. package/.framework/src/instructions/concepts/apps-and-renderers.md +162 -0
  91. package/.framework/src/instructions/concepts/auth-and-api-keys.md +133 -0
  92. package/.framework/src/instructions/concepts/automation.md +186 -0
  93. package/.framework/src/instructions/concepts/concurrency-and-idempotency.md +125 -0
  94. package/.framework/src/instructions/concepts/core-vs-custom.md +124 -0
  95. package/.framework/src/instructions/concepts/design-schema.md +152 -0
  96. package/.framework/src/instructions/concepts/integrations-and-webhooks.md +127 -0
  97. package/.framework/src/instructions/concepts/observability.md +116 -0
  98. package/.framework/src/instructions/concepts/permissions.md +150 -0
  99. package/.framework/src/instructions/concepts/runtime-records.md +111 -0
  100. package/.framework/src/instructions/concepts/scope-and-accounts.md +112 -0
  101. package/.framework/src/instructions/concepts/spine-way.md +172 -0
  102. package/.framework/src/instructions/deliveries.md +59 -0
  103. package/.framework/src/instructions/guide/00-orientation.md +106 -0
  104. package/.framework/src/instructions/guide/01-install-and-first-run.md +253 -0
  105. package/.framework/src/instructions/guide/02-project-map.md +147 -0
  106. package/.framework/src/instructions/guide/03-domain-model.md +223 -0
  107. package/.framework/src/instructions/guide/04-first-app.md +227 -0
  108. package/.framework/src/instructions/guide/05-glossary.md +183 -0
  109. package/.framework/src/instructions/integrations.md +96 -0
  110. package/.framework/src/instructions/internal/cil-markers.md +83 -0
  111. package/.framework/src/instructions/invites.md +60 -0
  112. package/.framework/src/instructions/kb.md +80 -0
  113. package/.framework/src/instructions/logs.md +77 -0
  114. package/.framework/src/instructions/observability.md +61 -0
  115. package/.framework/src/instructions/operations/deployment.md +115 -0
  116. package/.framework/src/instructions/operations/migrations.md +125 -0
  117. package/.framework/src/instructions/operations/security-checklist.md +148 -0
  118. package/.framework/src/instructions/operations/troubleshooting.md +170 -0
  119. package/.framework/src/instructions/operations/upgrade.md +116 -0
  120. package/.framework/src/instructions/pipeline-executions.md +62 -0
  121. package/.framework/src/instructions/pipelines.md +78 -0
  122. package/.framework/src/instructions/prompts.md +95 -0
  123. package/.framework/src/instructions/reference/api/admin-data.md +162 -0
  124. package/.framework/src/instructions/reference/api/auth.md +113 -0
  125. package/.framework/src/instructions/reference/api/errors-and-envelopes.md +113 -0
  126. package/.framework/src/instructions/reference/app-manifest.md +150 -0
  127. package/.framework/src/instructions/reference/cli.md +124 -0
  128. package/.framework/src/instructions/reference/database.md +132 -0
  129. package/.framework/src/instructions/reference/design-schema.md +280 -0
  130. package/.framework/src/instructions/reference/env-vars.md +133 -0
  131. package/.framework/src/instructions/reference/functions/account-nodes.md +75 -0
  132. package/.framework/src/instructions/reference/functions/admin-data.md +195 -0
  133. package/.framework/src/instructions/reference/functions/admin-funnel.md +90 -0
  134. package/.framework/src/instructions/reference/functions/admin-install-funnel.md +107 -0
  135. package/.framework/src/instructions/reference/functions/admin-signals.md +102 -0
  136. package/.framework/src/instructions/reference/functions/ai-agents.md +148 -0
  137. package/.framework/src/instructions/reference/functions/ai-interactions.md +156 -0
  138. package/.framework/src/instructions/reference/functions/api-keys.md +130 -0
  139. package/.framework/src/instructions/reference/functions/apps.md +140 -0
  140. package/.framework/src/instructions/reference/functions/auth.md +99 -0
  141. package/.framework/src/instructions/reference/functions/debug-auth.md +91 -0
  142. package/.framework/src/instructions/reference/functions/deliveries.md +110 -0
  143. package/.framework/src/instructions/reference/functions/embeddings.md +166 -0
  144. package/.framework/src/instructions/reference/functions/eval-harness.md +149 -0
  145. package/.framework/src/instructions/reference/functions/index.md +103 -0
  146. package/.framework/src/instructions/reference/functions/integration-outbound.md +200 -0
  147. package/.framework/src/instructions/reference/functions/integration-routes.md +151 -0
  148. package/.framework/src/instructions/reference/functions/integrations.md +130 -0
  149. package/.framework/src/instructions/reference/functions/invites.md +182 -0
  150. package/.framework/src/instructions/reference/functions/item-progress.md +107 -0
  151. package/.framework/src/instructions/reference/functions/kb.md +166 -0
  152. package/.framework/src/instructions/reference/functions/logs.md +141 -0
  153. package/.framework/src/instructions/reference/functions/observability.md +105 -0
  154. package/.framework/src/instructions/reference/functions/pipeline-executions.md +132 -0
  155. package/.framework/src/instructions/reference/functions/pipeline-runner-background.md +121 -0
  156. package/.framework/src/instructions/reference/functions/pipelines.md +136 -0
  157. package/.framework/src/instructions/reference/functions/prompt-configs.md +121 -0
  158. package/.framework/src/instructions/reference/functions/roles.md +121 -0
  159. package/.framework/src/instructions/reference/functions/security.md +140 -0
  160. package/.framework/src/instructions/reference/functions/system-cron.md +136 -0
  161. package/.framework/src/instructions/reference/functions/system.md +106 -0
  162. package/.framework/src/instructions/reference/functions/tests.md +97 -0
  163. package/.framework/src/instructions/reference/functions/timers.md +117 -0
  164. package/.framework/src/instructions/reference/functions/trigger-scheduler.md +102 -0
  165. package/.framework/src/instructions/reference/functions/triggers.md +140 -0
  166. package/.framework/src/instructions/reference/functions/types.md +146 -0
  167. package/.framework/src/instructions/reference/seeds.md +126 -0
  168. package/.framework/src/instructions/reference/shared-modules.md +127 -0
  169. package/.framework/src/instructions/reference/spine-config.md +114 -0
  170. package/.framework/src/instructions/roles.md +80 -0
  171. package/.framework/src/instructions/runtime-detail.md +70 -0
  172. package/.framework/src/instructions/runtime-list.md +77 -0
  173. package/.framework/src/instructions/security.md +67 -0
  174. package/.framework/src/instructions/tasks/add-a-pipeline.md +110 -0
  175. package/.framework/src/instructions/tasks/add-a-role.md +96 -0
  176. package/.framework/src/instructions/tasks/add-a-timer.md +114 -0
  177. package/.framework/src/instructions/tasks/add-a-trigger.md +106 -0
  178. package/.framework/src/instructions/tasks/add-a-type.md +151 -0
  179. package/.framework/src/instructions/tasks/add-a-webhook.md +108 -0
  180. package/.framework/src/instructions/tasks/add-an-ai-agent.md +108 -0
  181. package/.framework/src/instructions/tasks/add-an-integration.md +124 -0
  182. package/.framework/src/instructions/tasks/build-a-custom-page.md +118 -0
  183. package/.framework/src/instructions/tasks/package-and-install-an-app.md +127 -0
  184. package/.framework/src/instructions/tasks/test-your-code.md +108 -0
  185. package/.framework/src/instructions/tasks/write-a-function.md +132 -0
  186. package/.framework/src/instructions/tasks/write-a-migration.md +110 -0
  187. package/.framework/src/instructions/testing.md +59 -0
  188. package/.framework/src/instructions/timers.md +82 -0
  189. package/.framework/src/instructions/triggers.md +69 -0
  190. package/.framework/src/instructions/types.md +93 -0
  191. package/.framework/src/lib/branding.ts +128 -0
  192. package/.framework/src/pages/NoAppPage.tsx +3 -1
  193. package/.framework/src/pages/NotFoundPage.tsx +62 -31
  194. package/.framework/src/pages/SetupPage.tsx +5 -2
  195. package/.framework/src/pages/admin/AIAgentDetailPage.tsx +117 -106
  196. package/.framework/src/pages/admin/AIAgentsPage.tsx +86 -48
  197. package/.framework/src/pages/admin/APIKeyDetailPage.tsx +153 -152
  198. package/.framework/src/pages/admin/APIKeysPage.tsx +91 -90
  199. package/.framework/src/pages/admin/AlertsConfigPage.tsx +29 -18
  200. package/.framework/src/pages/admin/AppDetailPage.tsx +6 -60
  201. package/.framework/src/pages/admin/AppsPage.tsx +104 -66
  202. package/.framework/src/pages/admin/DeliveriesPage.tsx +5 -5
  203. package/.framework/src/pages/admin/EmbeddingDetailPage.tsx +5 -23
  204. package/.framework/src/pages/admin/EmbeddingsPage.tsx +5 -26
  205. package/.framework/src/pages/admin/IntegrationDetailPage.tsx +7 -7
  206. package/.framework/src/pages/admin/IntegrationsPage.tsx +85 -43
  207. package/.framework/src/pages/admin/LogsPage.tsx +144 -76
  208. package/.framework/src/pages/admin/ObservabilityDashboard.tsx +223 -140
  209. package/.framework/src/pages/admin/PipelineDetailPage.tsx +134 -113
  210. package/.framework/src/pages/admin/PipelineExecutionsPage.tsx +108 -45
  211. package/.framework/src/pages/admin/PipelinesPage.tsx +160 -115
  212. package/.framework/src/pages/admin/PromptConfigDetailPage.tsx +96 -98
  213. package/.framework/src/pages/admin/PromptConfigsPage.tsx +101 -59
  214. package/.framework/src/pages/admin/RoleDetailPage.tsx +90 -79
  215. package/.framework/src/pages/admin/RolesPage.tsx +86 -43
  216. package/.framework/src/pages/admin/SecurityPage.tsx +1 -1
  217. package/.framework/src/pages/admin/TestingDashboard.tsx +16 -28
  218. package/.framework/src/pages/admin/TimerDetailPage.tsx +117 -100
  219. package/.framework/src/pages/admin/TimersPage.tsx +90 -62
  220. package/.framework/src/pages/admin/TriggerDetailPage.tsx +90 -83
  221. package/.framework/src/pages/admin/TriggersPage.tsx +124 -99
  222. package/.framework/src/pages/admin/TypeDetailPage.tsx +152 -138
  223. package/.framework/src/pages/admin/TypesPage.tsx +90 -48
  224. package/.framework/src/pages/admin/cil/CILAgentPage.tsx +17 -25
  225. package/.framework/src/pages/admin/cil/CILChunkDetailPage.tsx +17 -27
  226. package/.framework/src/pages/admin/cil/CILDashboardPage.tsx +72 -40
  227. package/.framework/src/pages/admin/cil/CILFileListPage.tsx +321 -129
  228. package/.framework/src/pages/admin/cil/CILFileSelectPage.tsx +18 -29
  229. package/.framework/src/pages/admin/cil/CILGraphPage.tsx +26 -38
  230. package/.framework/src/pages/admin/cil/CILIngestionPage.tsx +34 -46
  231. package/.framework/src/pages/admin/cil/CILProjectsPage.tsx +189 -103
  232. package/.framework/src/pages/admin/cil/CILSearchPage.tsx +246 -136
  233. package/.framework/src/pages/admin/cil/CILSuggestionsPage.tsx +11 -22
  234. package/.framework/src/pages/admin/cil/CILVersionsPage.tsx +9 -20
  235. package/.framework/src/pages/admin/cil/FlexiblePipelinePage.tsx +26 -38
  236. package/.framework/src/pages/admin/kb/KBAdminPage.tsx +7 -26
  237. package/.framework/src/pages/auth/AuthConfirmPage.tsx +3 -1
  238. package/.framework/src/pages/auth/ForgotPasswordPage.tsx +3 -1
  239. package/.framework/src/pages/auth/LoginPage.tsx +4 -2
  240. package/.framework/src/pages/auth/RegisterPage.tsx +3 -1
  241. package/.framework/templates/agent/AGENTS.md +150 -0
  242. package/.framework/templates/agent/skills/spine-add-ai-agent/SKILL.md +58 -0
  243. package/.framework/templates/agent/skills/spine-add-automation/SKILL.md +62 -0
  244. package/.framework/templates/agent/skills/spine-add-integration/SKILL.md +63 -0
  245. package/.framework/templates/agent/skills/spine-architect/SKILL.md +86 -0
  246. package/.framework/templates/agent/skills/spine-install-app/SKILL.md +72 -0
  247. package/.framework/templates/agent/skills/spine-migration/SKILL.md +75 -0
  248. package/.framework/templates/agent/skills/spine-new-app/SKILL.md +67 -0
  249. package/.framework/templates/agent/skills/spine-new-function/SKILL.md +65 -0
  250. package/.framework/templates/agent/skills/spine-new-type/SKILL.md +65 -0
  251. package/.framework/templates/agent/skills/spine-schema/SKILL.md +77 -0
  252. package/.framework/templates/agent/skills/spine-test/SKILL.md +67 -0
  253. package/.framework/templates/agent/skills/spine-troubleshoot/SKILL.md +74 -0
  254. package/.framework/templates/agent/skills/spine-upgrade/SKILL.md +69 -0
  255. package/.framework/templates/project.json +5 -1
  256. package/.framework/tests/unit/account-scoping-gates.test.ts +392 -0
  257. package/.framework/tests/unit/agent-files.test.ts +355 -0
  258. package/.framework/tests/unit/agent-runner.test.ts +496 -47
  259. package/.framework/tests/unit/api-keys-create-scope-gate.test.ts +160 -0
  260. package/.framework/tests/unit/api-keys-omit-secret-fields.test.ts +38 -0
  261. package/.framework/tests/unit/bootstrap.test.ts +242 -0
  262. package/.framework/tests/unit/cli-context-api-key.test.ts +114 -0
  263. package/.framework/tests/unit/debug-auth.test.ts +38 -0
  264. package/.framework/tests/unit/deliveries-account-scoping.test.ts +185 -0
  265. package/.framework/tests/unit/episode-lease.test.ts +695 -0
  266. package/.framework/tests/unit/integration-outbound-credentials.test.ts +167 -0
  267. package/.framework/tests/unit/integrations-audit-redaction.test.ts +130 -0
  268. package/.framework/tests/unit/kb-ingest-lease.test.ts +19 -0
  269. package/.framework/tests/unit/logging-app-id.test.ts +75 -0
  270. package/.framework/tests/unit/pipeline-runner-background.test.ts +120 -0
  271. package/.framework/tests/unit/pipeline-runner.test.ts +153 -1
  272. package/.framework/tests/unit/principal-cache.test.ts +15 -0
  273. package/.framework/tests/unit/system-context-denial.test.ts +145 -0
  274. package/.framework/tests/unit/system-cron.test.ts +240 -0
  275. package/.framework/tests/unit/timers.test.ts +159 -0
  276. package/.framework/tests/unit/trigger-engine.test.ts +278 -91
  277. package/.framework/tests/unit/trigger-scheduler.test.ts +78 -0
  278. package/README.md +125 -166
  279. package/config/tsconfig.cli.json +2 -2
  280. package/netlify.toml +5 -0
  281. package/package.json +15 -4
  282. package/templates/project/package-lock.json +2 -2
  283. package/.framework/docs/admin-routes.md +0 -76
  284. package/.framework/docs/api-docs-progress.md +0 -38
  285. package/.framework/docs/api-governance.md +0 -146
  286. package/.framework/docs/api-testing-results.md +0 -212
  287. package/.framework/docs/assembly-launch-guide.md +0 -138
  288. package/.framework/docs/audit-results.md +0 -590
  289. package/.framework/docs/db-api-inventory.md +0 -95
  290. package/.framework/docs/gap-remediation-backlog.md +0 -103
  291. package/.framework/docs/ui-adoption-verification.md +0 -111
  292. package/.framework/docs/ui-api-coverage.md +0 -84
  293. package/.framework/docs/v2-compatibility-audit.md +0 -228
  294. package/.framework/mcp/index.ts +0 -133
  295. package/.framework/mcp/load-env.ts +0 -60
  296. package/.framework/mcp/shared/app-manifest.ts +0 -275
  297. package/.framework/mcp/shared/db.ts +0 -477
  298. package/.framework/mcp/shared/kb.ts +0 -118
  299. package/.framework/mcp/tools/architect.ts +0 -431
  300. package/.framework/mcp/tools/cil/context.ts +0 -345
  301. package/.framework/mcp/tools/cil/graph.ts +0 -242
  302. package/.framework/mcp/tools/cil/ingest.ts +0 -1217
  303. package/.framework/mcp/tools/cil/pipeline-orchestrator.ts +0 -693
  304. package/.framework/mcp/tools/cil/pipeline.ts +0 -767
  305. package/.framework/mcp/tools/cil/project.ts +0 -791
  306. package/.framework/mcp/tools/cil/retrieval.ts +0 -336
  307. package/.framework/mcp/tools/cil/search-core.ts +0 -454
  308. package/.framework/mcp/tools/cil/search.ts +0 -97
  309. package/.framework/mcp/tools/cil/suggest.ts +0 -186
  310. package/.framework/mcp/tools/cil/validate.ts +0 -1369
  311. package/.framework/mcp/tools/kb/delete.ts +0 -139
  312. package/.framework/mcp/tools/kb/index.ts +0 -52
  313. package/.framework/mcp/tools/kb/ingest.ts +0 -84
  314. package/.framework/mcp/tools/kb/list-types.ts +0 -102
  315. package/.framework/mcp/tools/kb/publish.ts +0 -100
  316. package/.framework/mcp/tools/kb/reindex.ts +0 -86
  317. package/.framework/mcp/tools/kb/revoke.ts +0 -85
  318. package/.framework/mcp/tools/kb/search.ts +0 -101
  319. package/.framework/mcp/tools/kb/upsert.ts +0 -125
  320. package/.framework/mcp/tools/observability.ts +0 -510
@@ -1,12 +1,29 @@
1
1
  // CIL[BEGIN stable_id="~/.framework/src/pages/admin/TypeDetailPage.tsx:module_header:module_header" type="module_header" identity="module_header" parent="~/.framework/src/pages/admin/TypeDetailPage.tsx"]
2
- // CIL[DOC-MACRO purpose="Admin type detail page for viewing, creating, and editing Spine type schemas"]
3
- // CIL[DOC-RESPONSIBILITY responsibility="Imports React hooks, shared UI components, and exports the TypeDetailPage component"]
4
- // CIL[DOC-CONTEXT module="admin" layer="page" related_files=".framework/src/components/admin/PageInstructions.tsx,.framework/src/components/ui/DataTable.tsx,.framework/src/components/ui/Modal.tsx,.framework/src/components/ui/alert.tsx,.framework/src/components/ui/badge.tsx,.framework/src/components/ui/button.tsx,.framework/src/components/ui/card.tsx,.framework/src/components/ui/checkbox.tsx,.framework/src/components/ui/input.tsx,.framework/src/components/ui/label.tsx,.framework/src/components/ui/select.tsx,.framework/src/components/ui/skeleton.tsx,.framework/src/components/ui/textarea.tsx,.framework/src/hooks/useApi.ts,.framework/src/lib/api.ts,.framework/src/lib/utils.ts"]
5
- // CIL[DOC-CONTRACT inputs="none" outputs="rendered admin page module" errors="none" side_effects="none"]
6
- // CIL[DOC-MICRO logic_summary="Top-level module header that wires dependencies for the type detail page" notable_decisions="[]"]
7
- // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
8
- // CIL[DOC-STABILITY stability="stable"]
9
- // CIL[DOC-AUDIENCE audience="human, ai"]
2
+ /**
3
+ * @module TypeDetailPage
4
+ * @audience internal
5
+ * @layer app-specific
6
+ * @stability stable
7
+ *
8
+ * This module represents the Type Detail Page in the admin section of the application, allowing users to view and manage details of a specific type. It integrates with the API to fetch and update type data, providing a user-friendly interface with various UI components for interaction.
9
+ * INVARIANT: The user must have appropriate permissions to access this page and perform actions on types.
10
+ *
11
+ * @seeAlso useApi (provides API interaction hooks).
12
+ * @seeAlso Button (UI component for actions).
13
+ * @seeAlso Modal (UI component for confirmations).
14
+ * @seeAlso DataTable (UI component for displaying data).
15
+ *
16
+ * @cil-generated
17
+ */
18
+
19
+
20
+
21
+
22
+
23
+
24
+
25
+
26
+
10
27
 
11
28
 
12
29
 
@@ -31,23 +48,31 @@ import { Alert, AlertDescription, AlertTitle } from '../../components/ui/alert'
31
48
  import { DataTable } from '../../components/ui/DataTable'
32
49
  import { ArrowLeft, Pencil, Trash2, AlertCircle } from 'lucide-react'
33
50
  import { formatDateTime } from '../../lib/utils'
34
- import { PageInstructions } from '../../components/admin/PageInstructions'
35
-
36
- // CIL[DOC-VECTOR type="context" content="purpose='Admin type detail page for viewing, creating, and editing Spine type schemas'; No verified external callers; imports: .framework/src/hooks/useApi.ts,.framework/src/lib/api.ts,.framework/src/components/ui/button.tsx"]
37
- // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
38
- // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
39
- // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
40
- // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
41
- // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
42
51
  // CIL[END stable_id="~/.framework/src/pages/admin/TypeDetailPage.tsx:module_header:module_header"]
52
+
53
+
54
+
55
+
56
+
57
+
58
+
59
+
60
+
61
+
62
+
63
+
64
+
65
+
66
+
67
+
43
68
  // CIL[BEGIN stable_id="~/.framework/src/pages/admin/TypeDetailPage.tsx:Type:interface" type="interface" identity="Type" parent="~/.framework/src/pages/admin/TypeDetailPage.tsx"]
44
- // CIL[DOC-MACRO purpose="Shape of a Spine type record used by the admin detail page"]
45
- // CIL[DOC-RESPONSIBILITY responsibility="Declare the Type data structure including design_schema, validation_schema, view_config, ownership, and timestamps"]
46
- // CIL[DOC-CONTEXT module="admin" layer="type" related_files=".framework/src/components/admin/PageInstructions.tsx,.framework/src/components/ui/DataTable.tsx,.framework/src/components/ui/Modal.tsx,.framework/src/components/ui/alert.tsx,.framework/src/components/ui/badge.tsx,.framework/src/components/ui/button.tsx,.framework/src/components/ui/card.tsx,.framework/src/components/ui/checkbox.tsx,.framework/src/components/ui/input.tsx,.framework/src/components/ui/label.tsx,.framework/src/components/ui/select.tsx,.framework/src/components/ui/skeleton.tsx,.framework/src/components/ui/textarea.tsx,.framework/src/hooks/useApi.ts,.framework/src/lib/api.ts,.framework/src/lib/utils.ts,.framework/src/pages/admin/TypeDetailPage.tsx"]
47
- // CIL[DOC-CONTRACT inputs="API or form data" outputs="Type-typed object" errors="none" side_effects="none"]
48
- // CIL[DOC-MICRO logic_summary="Interface describing a configurable runtime record type with schemas and metadata" notable_decisions="[]"]
49
- // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
50
- // CIL[DOC-STABILITY stability="stable"]
69
+ /**
70
+ * The Type interface defines the structure of a type object used in the admin panel, encapsulating various attributes related to types. It serves to standardize the representation of types across the application.
71
+ *
72
+ * @sideEffects none
73
+ * @stability stable
74
+ * @cil-generated
75
+ */
51
76
  interface Type {
52
77
  id: string
53
78
  name: string
@@ -61,7 +86,6 @@ interface Type {
61
86
  record_permissions?: Record<string, string[]>
62
87
  }
63
88
  validation_schema?: Record<string, any>
64
- view_config?: Record<string, any>
65
89
  ownership: string
66
90
  is_active: boolean
67
91
  app_id?: string
@@ -69,22 +93,31 @@ interface Type {
69
93
  created_at: string
70
94
  updated_at: string
71
95
  }
72
- // CIL[DOC-VECTOR type="context" content="purpose='Shape of a Spine type record used by the admin detail page'; No verified external callers; imports: .framework/src/hooks/useApi.ts,.framework/src/lib/api.ts,.framework/src/components/ui/button.tsx"]
73
- // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
74
- // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
75
- // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
76
- // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
77
- // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
78
96
  // CIL[END stable_id="~/.framework/src/pages/admin/TypeDetailPage.tsx:Type:interface"]
79
97
 
98
+
99
+
100
+
101
+
102
+
103
+
104
+
105
+
106
+
107
+
108
+
109
+
110
+
111
+
112
+
80
113
  // CIL[BEGIN stable_id="~/.framework/src/pages/admin/TypeDetailPage.tsx:TypeItem:interface" type="interface" identity="TypeItem" parent="~/.framework/src/pages/admin/TypeDetailPage.tsx"]
81
- // CIL[DOC-MACRO purpose="Shape of a runtime item that belongs to a Spine type"]
82
- // CIL[DOC-RESPONSIBILITY responsibility="Declare the TypeItem data structure with data, metadata, and audit fields"]
83
- // CIL[DOC-CONTEXT module="admin" layer="type" related_files=".framework/src/components/admin/PageInstructions.tsx,.framework/src/components/ui/DataTable.tsx,.framework/src/components/ui/Modal.tsx,.framework/src/components/ui/alert.tsx,.framework/src/components/ui/badge.tsx,.framework/src/components/ui/button.tsx,.framework/src/components/ui/card.tsx,.framework/src/components/ui/checkbox.tsx,.framework/src/components/ui/input.tsx,.framework/src/components/ui/label.tsx,.framework/src/components/ui/select.tsx,.framework/src/components/ui/skeleton.tsx,.framework/src/components/ui/textarea.tsx,.framework/src/hooks/useApi.ts,.framework/src/lib/api.ts,.framework/src/lib/utils.ts,.framework/src/pages/admin/TypeDetailPage.tsx"]
84
- // CIL[DOC-CONTRACT inputs="admin-data API response" outputs="TypeItem-typed array" errors="none" side_effects="none"]
85
- // CIL[DOC-MICRO logic_summary="Interface describing a single runtime record of a type" notable_decisions="[]"]
86
- // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
87
- // CIL[DOC-STABILITY stability="stable"]
114
+ /**
115
+ * The TypeItem interface defines the structure of a type item used in the admin module, encapsulating essential attributes for managing type data. It serves as a blueprint for creating and manipulating type items within the application.
116
+ *
117
+ * @sideEffects none
118
+ * @stability stable
119
+ * @cil-generated
120
+ */
88
121
  interface TypeItem {
89
122
  id: string
90
123
  item_type_id: string
@@ -95,22 +128,37 @@ interface TypeItem {
95
128
  created_by: string
96
129
  account_id: string
97
130
  }
98
- // CIL[DOC-VECTOR type="context" content="purpose='Shape of a runtime item that belongs to a Spine type'; No verified external callers; imports: .framework/src/hooks/useApi.ts,.framework/src/lib/api.ts,.framework/src/components/ui/button.tsx"]
99
- // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
100
- // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
101
- // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
102
- // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
103
- // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
104
131
  // CIL[END stable_id="~/.framework/src/pages/admin/TypeDetailPage.tsx:TypeItem:interface"]
105
132
 
133
+
134
+
135
+
136
+
137
+
138
+
139
+
140
+
141
+
142
+
143
+
144
+
145
+
146
+
147
+
106
148
  // CIL[BEGIN stable_id="~/.framework/src/pages/admin/TypeDetailPage.tsx:TypeDetailPage:component" type="component" identity="TypeDetailPage" parent="~/.framework/src/pages/admin/TypeDetailPage.tsx"]
107
- // CIL[DOC-MACRO purpose="Render and manage the admin type detail page with create, edit, view, and delete flows"]
108
- // CIL[DOC-RESPONSIBILITY responsibility="Fetch type and item data, validate JSON schemas, and present edit/read UI"]
109
- // CIL[DOC-CONTEXT module="admin" layer="page" related_files=".framework/src/components/admin/PageInstructions.tsx,.framework/src/components/ui/DataTable.tsx,.framework/src/components/ui/Modal.tsx,.framework/src/components/ui/alert.tsx,.framework/src/components/ui/badge.tsx,.framework/src/components/ui/button.tsx,.framework/src/components/ui/card.tsx,.framework/src/components/ui/checkbox.tsx,.framework/src/components/ui/input.tsx,.framework/src/components/ui/label.tsx,.framework/src/components/ui/select.tsx,.framework/src/components/ui/skeleton.tsx,.framework/src/components/ui/textarea.tsx,.framework/src/hooks/useApi.ts,.framework/src/lib/api.ts,.framework/src/lib/utils.ts,.framework/src/pages/admin/TypeDetailPage.tsx"]
110
- // CIL[DOC-CONTRACT inputs="id and kind route params, available apps list, user interactions" outputs="Rendered admin UI, API save/delete requests" errors="Fetch failures, invalid JSON, save errors" side_effects="Browser alert, navigation, useState updates, API calls"]
111
- // CIL[DOC-MICRO logic_summary="Component loads a type by id or slug, allows editing design/view JSON, lists related items, and supports deletion" notable_decisions="[]"]
112
- // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
113
- // CIL[DOC-STABILITY stability="stable"]
149
+ /**
150
+ * The TypeDetailPage component manages the creation and editing of type entities within the admin interface. It handles fetching available applications and type details based on the provided parameters.
151
+ *
152
+ * @macro Component for managing type details in an admin interface.
153
+ * @micro Utilizes React hooks for state management and side effects, including API calls to fetch data.
154
+ * @outputSpec JSX.Element — renders the type detail page UI.
155
+ * @throws Error — Type ID or slug is required
156
+ * @sideEffects Fetches data from external API endpoints.
157
+ * @stability stable
158
+ * @calls apiFetch, useApi, useParams, useNavigate
159
+ * @errorHandling Logs errors to the console during API fetch failures.
160
+ * @cil-generated
161
+ */
114
162
  export function TypeDetailPage() {
115
163
  const { id, kind } = useParams<{ id: string, kind: string }>()
116
164
  const navigate = useNavigate()
@@ -127,13 +175,13 @@ export function TypeDetailPage() {
127
175
  color: '',
128
176
  kind: typeKind,
129
177
  design_schema: { fields: {} },
130
- view_config: {},
131
178
  ownership: 'app',
132
179
  app_id: '',
133
180
  is_active: true
134
181
  })
135
182
  const [schemaText, setSchemaText] = useState(JSON.stringify({ fields: {} }, null, 2))
136
- const [viewConfigText, setViewConfigText] = useState(JSON.stringify({}, null, 2))
183
+ const [formError, setFormError] = useState<string | null>(null)
184
+
137
185
  const [availableApps, setAvailableApps] = useState<Array<{id: string, name: string}>>([])
138
186
 
139
187
  React.useEffect(() => {
@@ -185,8 +233,8 @@ export function TypeDetailPage() {
185
233
  if (!id) throw new Error('Type ID or slug is required')
186
234
  const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i
187
235
  const url = uuidRegex.test(id)
188
- ? `/api/types?action=get&id=${id}`
189
- : `/api/types?action=get&slug=${id}`
236
+ ? `/api/types?action=get&id=${id}&include_schema=true`
237
+ : `/api/types?action=get&slug=${id}&include_schema=true`
190
238
  const response = await apiFetch(url)
191
239
  if (!response.ok) {
192
240
  throw new Error(response.status === 500 ? 'Type not found' : 'Failed to fetch type')
@@ -208,39 +256,31 @@ export function TypeDetailPage() {
208
256
  color: type.color || '',
209
257
  kind: type.kind || 'item',
210
258
  design_schema: type.design_schema || { fields: {} },
211
- view_config: type.view_config || {},
212
259
  ownership: type.ownership || 'system',
213
260
  app_id: type.app_id || '',
214
261
  is_active: type.is_active ?? true
215
262
  })
216
263
  setSchemaText(JSON.stringify(type.design_schema || { fields: {} }, null, 2))
217
- setViewConfigText(JSON.stringify(type.view_config || {}, null, 2))
218
264
  }
219
265
  }, [type])
220
266
 
221
267
  const handleSave = async () => {
222
268
  try {
269
+ setFormError(null)
223
270
  const { app_id } = editData
224
271
  const ownership = (editData.ownership || '').toLowerCase()
225
272
  if (ownership !== 'system' && !app_id) {
226
273
  throw new Error('App selection is required when ownership is not "System"')
227
274
  }
228
275
  let parsedSchema = { fields: {} }
229
- let parsedViewConfig = {}
230
276
  try {
231
277
  parsedSchema = JSON.parse(schemaText)
232
278
  } catch (error) {
233
279
  console.warn('Invalid JSON in schema field, using default:', error)
234
280
  }
235
- try {
236
- parsedViewConfig = JSON.parse(viewConfigText)
237
- } catch (error) {
238
- console.warn('Invalid JSON in view config field, using default:', error)
239
- }
240
281
  const saveData = {
241
282
  ...editData,
242
283
  design_schema: parsedSchema,
243
- view_config: parsedViewConfig,
244
284
  app_id: editData.app_id || null
245
285
  }
246
286
  const url = isCreateMode
@@ -263,7 +303,7 @@ export function TypeDetailPage() {
263
303
  }
264
304
  } catch (error) {
265
305
  console.error(`Error ${isCreateMode ? 'creating' : 'updating'} type:`, error)
266
- alert(error instanceof Error ? error.message : 'Unknown error occurred')
306
+ setFormError(error instanceof Error ? error.message : 'Unknown error occurred')
267
307
  }
268
308
  }
269
309
 
@@ -280,13 +320,11 @@ export function TypeDetailPage() {
280
320
  icon: type.icon || '',
281
321
  color: type.color || '',
282
322
  design_schema: type.design_schema || { fields: {} },
283
- view_config: type.view_config || {},
284
323
  ownership: type.ownership || 'system',
285
324
  app_id: type.app_id || '',
286
325
  is_active: type.is_active ?? true
287
326
  })
288
327
  setSchemaText(JSON.stringify(type.design_schema || { fields: {} }, null, 2))
289
- setViewConfigText(JSON.stringify(type.view_config || {}, null, 2))
290
328
  }
291
329
  setIsEditing(false)
292
330
  }
@@ -350,7 +388,6 @@ export function TypeDetailPage() {
350
388
  <AlertTitle>Failed to load type details</AlertTitle>
351
389
  <AlertDescription>{error || 'Type not found'}</AlertDescription>
352
390
  <Button onClick={() => refetch()} variant="outline" className="mt-4">Retry</Button>
353
-
354
391
  </Alert>
355
392
  )
356
393
  }
@@ -359,15 +396,20 @@ export function TypeDetailPage() {
359
396
 
360
397
 
361
398
 
399
+ /**
400
+ * The 'itemColumns' constant defines the structure of columns for displaying items in a table format, including their keys, titles, and rendering logic. It is used to present item data in a user-friendly manner within the admin interface.
401
+ *
402
+ * @sideEffects none
403
+ * @stability stable
404
+ * @calls formatDateTime
405
+ * @cil-generated
406
+ */
362
407
  const itemColumns = [
363
408
  {
364
409
  key: 'id' as keyof TypeItem,
365
410
  title: 'ID',
366
411
  render: (row: any) => (
367
412
  <span className="font-mono text-xs">{row.id?.slice(0, 8)}...</span>
368
-
369
-
370
-
371
413
  )
372
414
  },
373
415
  {
@@ -378,12 +420,26 @@ export function TypeDetailPage() {
378
420
 
379
421
 
380
422
 
423
+ /**
424
+ * The constant 'firstFieldKey' retrieves the first key from the 'fields' object in the 'design_schema' of a given 'type'. It exists to facilitate access to the first field's key for further processing in the module.
425
+ *
426
+ * @sideEffects none
427
+ * @stability stable
428
+ * @cil-generated
429
+ */
381
430
  const firstFieldKey = Object.keys(type?.design_schema?.fields || {})[0]
382
431
 
383
432
 
384
433
 
385
434
 
386
435
 
436
+ /**
437
+ * The constant 'displayValue' determines the value to display based on the presence of 'firstFieldKey'. It defaults to 'No data' if 'firstFieldKey' is not defined or if the corresponding data is unavailable.
438
+ *
439
+ * @sideEffects none
440
+ * @stability stable
441
+ * @cil-generated
442
+ */
387
443
  const displayValue = firstFieldKey ? row.data?.[firstFieldKey] : 'No data'
388
444
 
389
445
  return (
@@ -435,7 +491,8 @@ export function TypeDetailPage() {
435
491
  </div>
436
492
  </div>
437
493
 
438
- <div className="flex space-x-2">
494
+ <div className="flex space-x-2 items-center">
495
+ {formError && <p className="text-sm text-red-600 mr-auto">{formError}</p>}
439
496
  {isEditing ? (
440
497
  <>
441
498
  <Button variant="outline" onClick={handleCancel}>Cancel</Button>
@@ -463,55 +520,6 @@ export function TypeDetailPage() {
463
520
  )}
464
521
  </div>
465
522
  </div>
466
-
467
- <PageInstructions
468
- description="Manage type schemas, fields, and permissions for items, accounts, or people."
469
- sections={[
470
- { title: 'What this type controls', content: 'A type is the design schema for a runtime record kind. It defines the fields, default list/detail views, record permissions, icon, color, and metadata that the generic admin and runtime UIs use to create, validate, and display records.' },
471
- { title: 'Fields explained', content: <ul className="list-disc pl-4 space-y-1">
472
- <li><strong>Name</strong> — string. The display label for the type. Empty name blocks save.</li>
473
- <li><strong>Slug</strong> — string. A unique, URL-friendly identifier scoped by kind. Used for type resolution and must be globally unique.</li>
474
- <li><strong>Description</strong> — string. Optional human-readable context.</li>
475
- <li><strong>Kind</strong> — select. item, account, person, thread, or message. Determines which runtime table the type governs.</li>
476
- <li><strong>Ownership</strong> — select. system, app, or tenant. Controls the data scope and who can manage the type.</li>
477
- <li><strong>Is Active</strong> — checkbox. Inactive types cannot have records created.</li>
478
-
479
- ]
480
- <li><strong>App ID</strong> — select. Optional owning app. None means a system type. Selecting an app scopes the type to that app.</li>
481
- ]
482
- <li><strong>Icon</strong> — string. An icon name for the UI stored in the types row.</li>
483
- <li><strong>Color</strong> — select. The theme color for the type stored in the types row.</li>
484
- <li><strong>Created / Updated</strong> — read-only timestamps.</li>
485
- <li><strong>Design Schema (JSON)</strong> — JSON. The full design_schema with fields, views, and record_permissions. The validation_schema is regenerated from this on save.</li>
486
- <li><strong>View Config (JSON)</strong> — JSON. Optional view_config object stored alongside the design schema.</li>
487
- </ul> },
488
- { title: 'Options and values', content: <ul className="list-disc pl-4 space-y-1">
489
- <li><strong>Kind</strong>: <em>item</em> for records, <em>account</em> for accounts, <em>person</em> for people, <em>thread</em> for threads, <em>message</em> for messages.</li>
490
- <li><strong>Ownership</strong>: <em>system</em> for platform types, <em>app</em> for an app, <em>tenant</em> for account-specific.</li>
491
- <li><strong>Color</strong>: blue, green, red, yellow, purple, pink, indigo, gray, slate.</li>
492
- <li><strong>Design Schema</strong>: must include fields, default_list, default_detail, and record_permissions to satisfy the generic UI.</li>
493
- </ul> },
494
- { title: 'Downstream impact', content: <ul className="list-disc pl-4 space-y-1">
495
- <li>Generic List and Detail pages render directly from this schema. A missing view or bad field will break those pages.</li>
496
- <li>Record creation and validation use the design schema. Bad permissions or data_type values can cause permission errors or failed saves.</li>
497
- <li>Other apps, pipelines, and triggers resolve types by slug; duplicate or changed slugs break those lookups.</li>
498
- </ul> },
499
- { title: 'How to create, save, and validate', content: <ol className="list-decimal pl-4 space-y-1">
500
- <li>In create mode, choose a kind, name, slug, and ownership, then fill the Design Schema and optional View Config JSON.</li>
501
- <li>Click Create or Save Changes. The form validates that the JSON is valid; the API regenerates validation_schema from design_schema.</li>
502
- <li>Delete is disabled for system-owned types. Delete opens a confirmation modal for others.</li>
503
- </ol> },
504
- { title: 'Common mistakes', content: <ul className="list-disc pl-4 space-y-1">
505
-
506
- ]
507
- <li>Reusing a slug for the same kind, which breaks type resolution.</li>
508
- ]
509
- <li>Missing default_list or default_detail in the design schema, causing the generic UI to fail.</li>
510
- <li>Using an unknown data_type or display_type, leading to validation or rendering errors.</li>
511
- </ul> },
512
- ]}
513
- />
514
-
515
523
  {isEditing ? (
516
524
  <>
517
525
  <Card>
@@ -661,20 +669,17 @@ export function TypeDetailPage() {
661
669
  rows={8}
662
670
  placeholder='Enter JSON design schema with fields, views, and record_permissions'
663
671
  />
672
+ {(() => {
673
+ try {
674
+ JSON.parse(schemaText)
675
+ return null
676
+ } catch (err) {
677
+ return <p className="text-xs text-red-600">Invalid JSON: {(err as Error).message}</p>
678
+ }
679
+ })()}
664
680
  <p className="text-xs text-muted-foreground">JSON schema defining the fields, list/detail views, and record permissions for this type. The validation_schema is generated from this on save.</p>
665
681
  </div>
666
682
 
667
- <div className="mt-8 space-y-2">
668
- <Label>View Config</Label>
669
- <Textarea
670
- value={viewConfigText}
671
- onChange={(e) => setViewConfigText(e.target.value)}
672
- className="font-mono text-sm"
673
- rows={4}
674
- placeholder='Enter optional view_config JSON'
675
- />
676
- <p className="text-xs text-muted-foreground">Optional JSON view configuration stored alongside the design schema.</p>
677
- </div>
678
683
  </CardContent>
679
684
  </Card>
680
685
  </>
@@ -760,6 +765,15 @@ export function TypeDetailPage() {
760
765
  {JSON.stringify(type?.design_schema || { fields: {} }, null, 2)}
761
766
  </pre>
762
767
  </div>
768
+
769
+ {type?.validation_schema && (
770
+ <div className="mt-4 space-y-2">
771
+ <h3 className="text-sm font-medium text-muted-foreground">Validation Schema (auto-generated on save)</h3>
772
+ <pre className="text-xs bg-muted p-3 rounded border overflow-auto max-h-48">
773
+ {JSON.stringify(type.validation_schema, null, 2)}
774
+ </pre>
775
+ </div>
776
+ )}
763
777
  </CardContent>
764
778
  </Card>
765
779
 
@@ -843,11 +857,11 @@ export function TypeDetailPage() {
843
857
  </div>
844
858
  )
845
859
  }
860
+ // CIL[END stable_id="~/.framework/src/pages/admin/TypeDetailPage.tsx:TypeDetailPage:component"]
861
+
862
+
863
+
864
+
865
+
866
+
846
867
 
847
- // CIL[DOC-VECTOR type="context" content="purpose='Render and manage the admin type detail page with create, edit, view, and delete flows'; No verified external callers; imports: .framework/src/hooks/useApi.ts,.framework/src/lib/api.ts,.framework/src/components/ui/button.tsx"]
848
- // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
849
- // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
850
- // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
851
- // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
852
- // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
853
- // CIL[END stable_id="~/.framework/src/pages/admin/TypeDetailPage.tsx:TypeDetailPage:component"]