spine-framework 0.3.144 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (451) hide show
  1. package/.env.example +76 -0
  2. package/.framework/.spine-manifest.json +19 -0
  3. package/.framework/cli/commands/agents.ts +61 -33
  4. package/.framework/cli/commands/auth.ts +60 -28
  5. package/.framework/cli/commands/create-app.ts +212 -80
  6. package/.framework/cli/commands/dev.ts +184 -68
  7. package/.framework/cli/commands/doctor.ts +324 -152
  8. package/.framework/cli/commands/generate.ts +119 -68
  9. package/.framework/cli/commands/init.ts +141 -242
  10. package/.framework/cli/commands/install-app.ts +1336 -314
  11. package/.framework/cli/commands/items.ts +31 -29
  12. package/.framework/cli/commands/migrate.ts +299 -156
  13. package/.framework/cli/commands/migrations.ts +62 -30
  14. package/.framework/cli/commands/pipelines.ts +31 -29
  15. package/.framework/cli/commands/status.ts +105 -45
  16. package/.framework/cli/commands/system.ts +47 -42
  17. package/.framework/cli/commands/test.ts +161 -102
  18. package/.framework/cli/commands/upgrade.ts +260 -0
  19. package/.framework/cli/commands/validate-app.ts +517 -161
  20. package/.framework/cli/context.ts +117 -85
  21. package/.framework/cli/env-loader.ts +74 -43
  22. package/.framework/cli/index.ts +70 -46
  23. package/.framework/cli/lib/project-files.ts +404 -0
  24. package/.framework/docs/guides/testing-guide.md +1 -1
  25. package/.framework/docs/runtime-types.md +72 -72
  26. package/.framework/functions/_shared/access.ts +84 -0
  27. package/.framework/functions/_shared/agent-runner.ts +5051 -1026
  28. package/.framework/functions/_shared/app-manifest.ts +214 -94
  29. package/.framework/functions/_shared/ast.ts +214 -0
  30. package/.framework/functions/_shared/audit.ts +91 -55
  31. package/.framework/functions/_shared/cil.ts +368 -127
  32. package/.framework/functions/_shared/db.ts +337 -68
  33. package/.framework/functions/_shared/funnel.ts +228 -0
  34. package/.framework/functions/_shared/geo.ts +105 -0
  35. package/.framework/functions/_shared/hash-api-key.ts +94 -17
  36. package/.framework/functions/_shared/index.ts +22 -224
  37. package/.framework/functions/_shared/kb.ts +832 -58
  38. package/.framework/functions/_shared/llm.ts +118 -18
  39. package/.framework/functions/_shared/logging.ts +317 -19
  40. package/.framework/functions/_shared/middleware.ts +701 -131
  41. package/.framework/functions/_shared/notify.ts +70 -0
  42. package/.framework/functions/_shared/outcomes.ts +34 -19
  43. package/.framework/functions/_shared/permissions.ts +501 -315
  44. package/.framework/functions/_shared/pipeline-runner.ts +704 -155
  45. package/.framework/functions/_shared/principal.ts +436 -263
  46. package/.framework/functions/_shared/rate-limit.ts +233 -0
  47. package/.framework/functions/_shared/resolve-credentials.ts +86 -19
  48. package/.framework/functions/_shared/resolve-ids.ts +203 -139
  49. package/.framework/functions/_shared/retry-deliveries.ts +51 -16
  50. package/.framework/functions/_shared/schema-utils.ts +602 -521
  51. package/.framework/functions/_shared/security.ts +345 -0
  52. package/.framework/functions/_shared/testing.ts +197 -172
  53. package/.framework/functions/_shared/tracing.ts +351 -21
  54. package/.framework/functions/_shared/trigger-engine.ts +425 -136
  55. package/.framework/functions/_shared/webhook-registration.ts +71 -70
  56. package/.framework/functions/_shared/webhook-registry.ts +126 -83
  57. package/.framework/functions/account-nodes.ts +30 -30
  58. package/.framework/functions/adapters/generic-webhook-inbound.ts +49 -16
  59. package/.framework/functions/adapters/generic-webhook-outbound.ts +17 -17
  60. package/.framework/functions/adapters/openai-outbound.ts +15 -16
  61. package/.framework/functions/admin-data.ts +596 -173
  62. package/.framework/functions/admin-funnel.ts +64 -60
  63. package/.framework/functions/admin-install-funnel.ts +84 -66
  64. package/.framework/functions/admin-signals.ts +69 -51
  65. package/.framework/functions/ai-agents.ts +431 -106
  66. package/.framework/functions/ai-interactions.ts +186 -112
  67. package/.framework/functions/api-keys.ts +107 -107
  68. package/.framework/functions/apps.ts +154 -136
  69. package/.framework/functions/auth.ts +83 -65
  70. package/.framework/functions/cil-agent-ingest.ts +189 -232
  71. package/.framework/functions/cil-agent.ts +433 -177
  72. package/.framework/functions/cil-callmap.ts +642 -430
  73. package/.framework/functions/cil-config.ts +139 -135
  74. package/.framework/functions/cil-context.ts +214 -127
  75. package/.framework/functions/cil-doc.ts +587 -458
  76. package/.framework/functions/cil-embeddings.ts +453 -364
  77. package/.framework/functions/cil-graph.ts +427 -142
  78. package/.framework/functions/cil-ingest.ts +1418 -1154
  79. package/.framework/functions/cil-pipeline.ts +276 -21
  80. package/.framework/functions/cil-project.ts +659 -132
  81. package/.framework/functions/cil-validate.ts +198 -164
  82. package/.framework/functions/debug-auth.ts +57 -55
  83. package/.framework/functions/deliveries.ts +80 -21
  84. package/.framework/functions/embeddings.ts +1023 -318
  85. package/.framework/functions/eval-harness.ts +146 -108
  86. package/.framework/functions/integration-outbound.ts +205 -75
  87. package/.framework/functions/integration-routes.ts +128 -23
  88. package/.framework/functions/integrations.ts +125 -100
  89. package/.framework/functions/invites.ts +1095 -460
  90. package/.framework/functions/item-progress.ts +158 -102
  91. package/.framework/functions/kb.ts +34 -10
  92. package/.framework/functions/logs.ts +133 -133
  93. package/.framework/functions/observability.ts +152 -122
  94. package/.framework/functions/pipeline-executions.ts +147 -132
  95. package/.framework/functions/pipelines.ts +134 -119
  96. package/.framework/functions/prompt-configs.ts +96 -80
  97. package/.framework/functions/roles.ts +112 -82
  98. package/.framework/functions/security.ts +450 -0
  99. package/.framework/functions/system-cron.ts +117 -80
  100. package/.framework/functions/system.ts +158 -98
  101. package/.framework/functions/tests.ts +29 -29
  102. package/.framework/functions/timers.ts +94 -95
  103. package/.framework/functions/trigger-scheduler.ts +10 -0
  104. package/.framework/functions/triggers.ts +179 -149
  105. package/.framework/functions/types.ts +137 -125
  106. package/.framework/mcp/index.ts +133 -0
  107. package/.framework/mcp/load-env.ts +60 -0
  108. package/.framework/mcp/shared/app-manifest.ts +275 -0
  109. package/.framework/mcp/shared/db.ts +477 -0
  110. package/.framework/mcp/shared/kb.ts +118 -0
  111. package/.framework/mcp/tools/architect.ts +431 -0
  112. package/.framework/mcp/tools/cil/context.ts +345 -0
  113. package/.framework/mcp/tools/cil/graph.ts +242 -0
  114. package/.framework/mcp/tools/cil/ingest.ts +1217 -0
  115. package/.framework/mcp/tools/cil/pipeline-orchestrator.ts +693 -0
  116. package/.framework/mcp/tools/cil/pipeline.ts +767 -0
  117. package/.framework/mcp/tools/cil/project.ts +791 -0
  118. package/.framework/mcp/tools/cil/retrieval.ts +336 -0
  119. package/.framework/mcp/tools/cil/search-core.ts +454 -0
  120. package/.framework/mcp/tools/cil/search.ts +97 -0
  121. package/.framework/mcp/tools/cil/suggest.ts +186 -0
  122. package/.framework/mcp/tools/cil/validate.ts +1369 -0
  123. package/.framework/mcp/tools/kb/delete.ts +139 -0
  124. package/.framework/mcp/tools/kb/index.ts +52 -0
  125. package/.framework/mcp/tools/kb/ingest.ts +84 -0
  126. package/.framework/mcp/tools/kb/list-types.ts +102 -0
  127. package/.framework/mcp/tools/kb/publish.ts +100 -0
  128. package/.framework/mcp/tools/kb/reindex.ts +86 -0
  129. package/.framework/mcp/tools/kb/revoke.ts +85 -0
  130. package/.framework/mcp/tools/kb/search.ts +101 -0
  131. package/.framework/mcp/tools/kb/upsert.ts +125 -0
  132. package/.framework/mcp/tools/observability.ts +510 -0
  133. package/.framework/migrations/001_core_schema.sql +15 -0
  134. package/.framework/migrations/002_core_rls_and_functions.sql +15 -0
  135. package/.framework/migrations/003_core_system_data.sql +16 -1
  136. package/.framework/migrations/004_core_rpc_and_broker.sql +17 -1
  137. package/.framework/migrations/005_core_observability.sql +17 -1
  138. package/.framework/migrations/006_security_hardening_rls.sql +15 -0
  139. package/.framework/migrations/007_kb_article_list.sql +17 -1
  140. package/.framework/migrations/008_items_target.sql +15 -0
  141. package/.framework/migrations/009_roles_slug_unique.sql +15 -0
  142. package/.framework/migrations/010_auth_user_trigger.sql +15 -0
  143. package/.framework/migrations/011_spine_system_account.sql +16 -0
  144. package/.framework/migrations/012_service_role_grants.sql +16 -0
  145. package/.framework/migrations/013_get_account_apps_role_filter.sql +15 -0
  146. package/.framework/migrations/014_apps_required_roles.sql +16 -0
  147. package/.framework/migrations/015_types_kind_slug_unique.sql +20 -0
  148. package/.framework/migrations/016_cil_types.sql +281 -0
  149. package/.framework/migrations/017_cil_stable_ids.sql +37 -0
  150. package/.framework/migrations/018_runtime_tables.sql +129 -0
  151. package/.framework/migrations/019_agent_prompt_columns.sql +56 -0
  152. package/.framework/migrations/020_schema_reconciliation.sql +67 -0
  153. package/.framework/migrations/021_kb_embedding_lifecycle.sql +31 -0
  154. package/.framework/migrations/032_cil_status_migration.sql +73 -0
  155. package/.framework/migrations/033_cil_versioning.sql +73 -0
  156. package/.framework/migrations/034_match_embeddings_knn.sql +115 -0
  157. package/.framework/migrations/035_rate_limits.sql +55 -0
  158. package/.framework/migrations/036_demo_record_flags.sql +72 -0
  159. package/.framework/migrations/037_kb_types_canonical.sql +244 -0
  160. package/.framework/migrations/038_drop_demo_record_flags.sql +38 -0
  161. package/.framework/migrations/042_registration_hierarchy.sql +309 -0
  162. package/.framework/migrations/043_policy_actor_cleanup.sql +39 -0
  163. package/.framework/migrations/044_match_embeddings_filtered_knn.sql +151 -0
  164. package/.framework/migrations/045_security_critical_rls.sql +139 -0
  165. package/.framework/migrations/046_security_missing_rls.sql +79 -0
  166. package/.framework/migrations/047_people_updated_by.sql +27 -0
  167. package/.framework/migrations/048_watcher_last_seen_at.sql +24 -0
  168. package/.framework/migrations/049_security_blocklist.sql +148 -0
  169. package/.framework/migrations/050_notifications.sql +49 -0
  170. package/.framework/migrations/051_message_agent_fields.sql +74 -0
  171. package/.framework/migrations/052_registration_security.sql +421 -0
  172. package/.framework/migrations/053_builtin_action_seeds.sql +66 -0
  173. package/.framework/migrations/054_kb_ingest_lease.sql +157 -0
  174. package/.framework/migrations/055_type_id_drift_reconciliation.sql +33 -0
  175. package/.framework/migrations/056_slug_column_reconciliation.sql +38 -0
  176. package/.framework/migrations/057_pipelines_slug_identity.sql +14 -0
  177. package/.framework/migrations/058_account_data_field_declarations.sql +53 -0
  178. package/.framework/migrations/059_registration_placement_fixes.sql +269 -0
  179. package/.framework/migrations/060_account_person_record_permissions.sql +38 -0
  180. package/.framework/migrations/061_fk_dedup.sql +32 -0
  181. package/.framework/public/spine-logo.svg +10 -3
  182. package/.framework/scripts/app-install-cli.ts +190 -93
  183. package/.framework/scripts/assemble-frontend.sh +127 -44
  184. package/.framework/scripts/assemble-functions.sh +128 -30
  185. package/.framework/scripts/boundary-check.sh +6 -2
  186. package/.framework/scripts/build-manifest.sh +24 -68
  187. package/.framework/scripts/check-core-integrity.sh +15 -76
  188. package/.framework/scripts/checksum-manifest.mts +343 -0
  189. package/.framework/scripts/cil-migrate-markers.ts +403 -0
  190. package/.framework/scripts/fix-cil-markers.mjs +176 -0
  191. package/.framework/scripts/verify-integrity.sh +21 -57
  192. package/.framework/scripts/verify-manifest.mts +305 -0
  193. package/.framework/seeds/types/funnel_signal_use.json +74 -21
  194. package/.framework/seeds/types/spine_instance.json +73 -21
  195. package/.framework/src/App.tsx +118 -72
  196. package/.framework/src/apps/admin/index.tsx +855 -58
  197. package/.framework/src/components/AppWrapper.tsx +43 -45
  198. package/.framework/src/components/CustomAppLoader.tsx +160 -116
  199. package/.framework/src/components/admin/AdminListPage.tsx +46 -44
  200. package/.framework/src/components/admin/AdminSidebar.tsx +57 -47
  201. package/.framework/src/components/admin/AdminStatsCard.tsx +46 -44
  202. package/.framework/src/components/admin/PageInstructions.tsx +98 -2
  203. package/.framework/src/components/admin/SortableTableHeader.tsx +44 -45
  204. package/.framework/src/components/app-shell/GenericAppShell.tsx +64 -65
  205. package/.framework/src/components/app-shell/GenericDetailPage.tsx +44 -47
  206. package/.framework/src/components/app-shell/GenericListPage.tsx +45 -49
  207. package/.framework/src/components/app-sidebar.tsx +42 -45
  208. package/.framework/src/components/auth/ProtectedRoute.tsx +48 -41
  209. package/.framework/src/components/auth/TurnstileWidget.tsx +27 -0
  210. package/.framework/src/components/kb/KBArticleEditor.tsx +231 -22
  211. package/.framework/src/components/kb/KBArticleList.tsx +251 -10
  212. package/.framework/src/components/layout/AppShell.tsx +51 -45
  213. package/.framework/src/components/layout/Header.tsx +42 -43
  214. package/.framework/src/components/layout/Layout.tsx +46 -46
  215. package/.framework/src/components/layout/Sidebar.tsx +196 -96
  216. package/.framework/src/components/runtime/DataDetailHeader.tsx +55 -30
  217. package/.framework/src/components/runtime/DataDetailPage.tsx +31 -269
  218. package/.framework/src/components/runtime/DataFilters.tsx +49 -74
  219. package/.framework/src/components/runtime/DataHeader.tsx +53 -32
  220. package/.framework/src/components/runtime/DataListPage.tsx +51 -155
  221. package/.framework/src/components/runtime/DataStats.tsx +66 -44
  222. package/.framework/src/components/runtime/DataTable.tsx +49 -149
  223. package/.framework/src/components/runtime/SchemaDetailForm.tsx +45 -75
  224. package/.framework/src/components/runtime/index.ts +119 -16
  225. package/.framework/src/components/search-form.tsx +46 -29
  226. package/.framework/src/components/shared/AgentView.tsx +65 -48
  227. package/.framework/src/components/shared/FieldRenderer.tsx +144 -50
  228. package/.framework/src/components/shared/InviteManager.tsx +207 -97
  229. package/.framework/src/components/shared/MemberList.tsx +97 -0
  230. package/.framework/src/components/shared/SchemaFields.tsx +107 -86
  231. package/.framework/src/components/ui/DataTable.tsx +80 -68
  232. package/.framework/src/components/ui/Form.tsx +157 -146
  233. package/.framework/src/components/ui/ItemCard.tsx +74 -67
  234. package/.framework/src/components/ui/ItemListView.tsx +73 -68
  235. package/.framework/src/components/ui/LoadingSpinner.tsx +43 -48
  236. package/.framework/src/components/ui/Modal.tsx +78 -68
  237. package/.framework/src/components/ui/RichTextEditor.tsx +89 -69
  238. package/.framework/src/components/ui/accordion.tsx +85 -86
  239. package/.framework/src/components/ui/alert-dialog.tsx +197 -184
  240. package/.framework/src/components/ui/alert.tsx +105 -94
  241. package/.framework/src/components/ui/aspect-ratio.tsx +57 -43
  242. package/.framework/src/components/ui/avatar.tsx +122 -107
  243. package/.framework/src/components/ui/badge.tsx +60 -55
  244. package/.framework/src/components/ui/breadcrumb.tsx +127 -128
  245. package/.framework/src/components/ui/button-group.tsx +86 -72
  246. package/.framework/src/components/ui/button.tsx +71 -50
  247. package/.framework/src/components/ui/calendar.tsx +72 -57
  248. package/.framework/src/components/ui/card.tsx +136 -129
  249. package/.framework/src/components/ui/carousel.tsx +226 -107
  250. package/.framework/src/components/ui/chart.tsx +252 -147
  251. package/.framework/src/components/ui/checkbox.tsx +43 -44
  252. package/.framework/src/components/ui/collapsible.tsx +86 -71
  253. package/.framework/src/components/ui/combobox.tsx +282 -249
  254. package/.framework/src/components/ui/command.tsx +158 -146
  255. package/.framework/src/components/ui/context-menu.tsx +239 -240
  256. package/.framework/src/components/ui/dialog.tsx +174 -157
  257. package/.framework/src/components/ui/direction.tsx +72 -56
  258. package/.framework/src/components/ui/drawer.tsx +168 -169
  259. package/.framework/src/components/ui/dropdown-menu.tsx +254 -223
  260. package/.framework/src/components/ui/empty.tsx +131 -120
  261. package/.framework/src/components/ui/field.tsx +205 -173
  262. package/.framework/src/components/ui/hover-card.tsx +71 -72
  263. package/.framework/src/components/ui/input-group.tsx +148 -133
  264. package/.framework/src/components/ui/input-otp.tsx +99 -86
  265. package/.framework/src/components/ui/input.tsx +43 -41
  266. package/.framework/src/components/ui/item.tsx +207 -185
  267. package/.framework/src/components/ui/kbd.tsx +57 -56
  268. package/.framework/src/components/ui/label.tsx +45 -41
  269. package/.framework/src/components/ui/menubar.tsx +268 -236
  270. package/.framework/src/components/ui/native-select.tsx +85 -86
  271. package/.framework/src/components/ui/navigation-menu.tsx +166 -156
  272. package/.framework/src/components/ui/pagination.tsx +131 -141
  273. package/.framework/src/components/ui/popover.tsx +125 -128
  274. package/.framework/src/components/ui/progress.tsx +47 -44
  275. package/.framework/src/components/ui/radio-group.tsx +60 -55
  276. package/.framework/src/components/ui/resizable.tsx +85 -72
  277. package/.framework/src/components/ui/scroll-area.tsx +57 -58
  278. package/.framework/src/components/ui/select.tsx +182 -169
  279. package/.framework/src/components/ui/separator.tsx +42 -43
  280. package/.framework/src/components/ui/sheet.tsx +170 -159
  281. package/.framework/src/components/ui/sidebar.tsx +395 -398
  282. package/.framework/src/components/ui/skeleton.tsx +42 -43
  283. package/.framework/src/components/ui/slider.tsx +61 -44
  284. package/.framework/src/components/ui/sonner.tsx +44 -44
  285. package/.framework/src/components/ui/spinner.tsx +47 -42
  286. package/.framework/src/components/ui/switch.tsx +56 -42
  287. package/.framework/src/components/ui/table-primitives.tsx +272 -132
  288. package/.framework/src/components/ui/table.tsx +140 -142
  289. package/.framework/src/components/ui/tabs.tsx +110 -93
  290. package/.framework/src/components/ui/textarea.tsx +43 -44
  291. package/.framework/src/components/ui/toggle-group.tsx +87 -71
  292. package/.framework/src/components/ui/toggle.tsx +56 -56
  293. package/.framework/src/components/ui/tooltip.tsx +99 -85
  294. package/.framework/src/contexts/AppContext.tsx +166 -114
  295. package/.framework/src/contexts/AuthContext.tsx +232 -137
  296. package/.framework/src/hooks/use-mobile.ts +43 -44
  297. package/.framework/src/hooks/useApi.ts +185 -172
  298. package/.framework/src/hooks/useAppPath.ts +31 -29
  299. package/.framework/src/hooks/useApps.ts +77 -42
  300. package/.framework/src/hooks/useEntityList.ts +66 -29
  301. package/.framework/src/hooks/useEntityRecord.ts +76 -32
  302. package/.framework/src/hooks/useForm.ts +62 -30
  303. package/.framework/src/hooks/useListSchema.ts +60 -43
  304. package/.framework/src/hooks/useSchemaRecord.ts +115 -95
  305. package/.framework/src/lib/api.ts +258 -134
  306. package/.framework/src/lib/registration.ts +181 -0
  307. package/.framework/src/lib/supabase.ts +118 -81
  308. package/.framework/src/lib/utils.ts +266 -266
  309. package/.framework/src/main.tsx +43 -44
  310. package/.framework/src/pages/DashboardPage.tsx +44 -43
  311. package/.framework/src/pages/NoAppPage.tsx +50 -0
  312. package/.framework/src/pages/NotFoundPage.tsx +32 -29
  313. package/.framework/src/pages/SetupPage.tsx +34 -33
  314. package/.framework/src/pages/admin/AIAgentDetailPage.tsx +69 -58
  315. package/.framework/src/pages/admin/AIAgentsPage.tsx +43 -40
  316. package/.framework/src/pages/admin/APIKeyDetailPage.tsx +63 -55
  317. package/.framework/src/pages/admin/APIKeysPage.tsx +44 -42
  318. package/.framework/src/pages/admin/AlertsConfigPage.tsx +117 -94
  319. package/.framework/src/pages/admin/AppDetailPage.tsx +48 -42
  320. package/.framework/src/pages/admin/AppsPage.tsx +45 -42
  321. package/.framework/src/pages/admin/DeliveriesPage.tsx +49 -17
  322. package/.framework/src/pages/admin/DesignedPage.tsx +31 -30
  323. package/.framework/src/pages/admin/EmbeddingDetailPage.tsx +58 -0
  324. package/.framework/src/pages/admin/EmbeddingsPage.tsx +49 -0
  325. package/.framework/src/pages/admin/ExtendedShadcnTestPage.tsx +31 -29
  326. package/.framework/src/pages/admin/IncrementalShadcnTestPage.tsx +46 -29
  327. package/.framework/src/pages/admin/IntegratedDashboard.tsx +32 -29
  328. package/.framework/src/pages/admin/IntegrationDetailPage.tsx +68 -55
  329. package/.framework/src/pages/admin/IntegrationsPage.tsx +45 -42
  330. package/.framework/src/pages/admin/InvitesPage.tsx +60 -44
  331. package/.framework/src/pages/admin/LogsPage.tsx +87 -137
  332. package/.framework/src/pages/admin/MinimalShadcnTestPage.tsx +31 -29
  333. package/.framework/src/pages/admin/ObservabilityDashboard.tsx +150 -89
  334. package/.framework/src/pages/admin/PipelineDetailPage.tsx +77 -104
  335. package/.framework/src/pages/admin/PipelineExecutionsPage.tsx +44 -43
  336. package/.framework/src/pages/admin/PipelinesPage.tsx +59 -145
  337. package/.framework/src/pages/admin/PromptConfigDetailPage.tsx +53 -42
  338. package/.framework/src/pages/admin/PromptConfigsPage.tsx +47 -117
  339. package/.framework/src/pages/admin/ProperlyDesignedPage.tsx +31 -44
  340. package/.framework/src/pages/admin/RoleDetailPage.tsx +49 -92
  341. package/.framework/src/pages/admin/RolesPage.tsx +47 -164
  342. package/.framework/src/pages/admin/SecurityPage.tsx +310 -0
  343. package/.framework/src/pages/admin/SelectTestPage.tsx +30 -32
  344. package/.framework/src/pages/admin/ShadcnTestPage.tsx +37 -44
  345. package/.framework/src/pages/admin/SimpleDashboard.tsx +32 -44
  346. package/.framework/src/pages/admin/TestRunDetailPage.tsx +97 -44
  347. package/.framework/src/pages/admin/TestingDashboard.tsx +126 -71
  348. package/.framework/src/pages/admin/TimerDetailPage.tsx +67 -55
  349. package/.framework/src/pages/admin/TimersPage.tsx +44 -42
  350. package/.framework/src/pages/admin/TriggerDetailPage.tsx +47 -42
  351. package/.framework/src/pages/admin/TriggersPage.tsx +58 -57
  352. package/.framework/src/pages/admin/TypeDetailPage.tsx +91 -55
  353. package/.framework/src/pages/admin/TypesPage.tsx +45 -42
  354. package/.framework/src/pages/admin/cil/CILAgentPage.tsx +258 -128
  355. package/.framework/src/pages/admin/cil/CILChunkDetailPage.tsx +127 -123
  356. package/.framework/src/pages/admin/cil/CILDashboardPage.tsx +308 -235
  357. package/.framework/src/pages/admin/cil/CILFileListPage.tsx +159 -110
  358. package/.framework/src/pages/admin/cil/CILFileSelectPage.tsx +432 -0
  359. package/.framework/src/pages/admin/cil/CILGraphPage.tsx +200 -178
  360. package/.framework/src/pages/admin/cil/CILIngestionPage.tsx +286 -239
  361. package/.framework/src/pages/admin/cil/CILProjectsPage.tsx +211 -90
  362. package/.framework/src/pages/admin/cil/CILSearchPage.tsx +156 -143
  363. package/.framework/src/pages/admin/cil/CILSuggestionsPage.tsx +379 -0
  364. package/.framework/src/pages/admin/cil/CILVersionsPage.tsx +337 -0
  365. package/.framework/src/pages/admin/cil/FlexiblePipelinePage.tsx +219 -214
  366. package/.framework/src/pages/admin/kb/KBAdminPage.tsx +64 -0
  367. package/.framework/src/pages/auth/AuthConfirmPage.tsx +135 -65
  368. package/.framework/src/pages/auth/ForgotPasswordPage.tsx +39 -31
  369. package/.framework/src/pages/auth/LoginPage.tsx +38 -32
  370. package/.framework/src/pages/auth/PendingApprovalPage.tsx +31 -28
  371. package/.framework/src/pages/auth/RegisterPage.tsx +429 -155
  372. package/.framework/src/pages/spine-framework/APIPage.tsx +33 -30
  373. package/.framework/src/pages/spine-framework/CLIPage.tsx +32 -30
  374. package/.framework/src/types/auth.ts +101 -93
  375. package/.framework/src/types/types.ts +283 -262
  376. package/.framework/templates/project.json +87 -0
  377. package/.framework/templates/spine.config.neutral.json +7 -0
  378. package/.framework/tests/api/api-surface.test.ts +381 -0
  379. package/.framework/tests/fixtures/seed.ts +427 -0
  380. package/.framework/tests/fixtures/teardown.ts +228 -0
  381. package/.framework/tests/reporter.ts +351 -0
  382. package/.framework/tests/setup.ts +135 -0
  383. package/.framework/tests/ui/ui-sweep.ts +278 -0
  384. package/.framework/tests/unit/admin-data-logger.test.ts +310 -0
  385. package/.framework/tests/unit/agent-runner.test.ts +2389 -0
  386. package/.framework/tests/unit/ai-interactions.test.ts +81 -0
  387. package/.framework/tests/unit/app-manifest.test.ts +359 -0
  388. package/.framework/tests/unit/assembly-scripts.test.ts +172 -0
  389. package/.framework/tests/unit/cil-determinism.test.ts +85 -0
  390. package/.framework/tests/unit/core-isolation.test.ts +153 -0
  391. package/.framework/tests/unit/funnel-signals.test.ts +135 -0
  392. package/.framework/tests/unit/install-app.test.ts +1759 -0
  393. package/.framework/tests/unit/invites-security.test.ts +572 -0
  394. package/.framework/tests/unit/kb-ingest-lease.test.ts +287 -0
  395. package/.framework/tests/unit/kb-search.test.ts +119 -0
  396. package/.framework/tests/unit/migrate.test.ts +509 -0
  397. package/.framework/tests/unit/notify.test.ts +136 -0
  398. package/.framework/tests/unit/permissions.test.ts +269 -0
  399. package/.framework/tests/unit/pipeline-runner.test.ts +755 -0
  400. package/.framework/tests/unit/principal-cache.test.ts +138 -0
  401. package/.framework/tests/unit/retrieval-golden.test.ts +520 -0
  402. package/.framework/tests/unit/runtime-isolation.test.ts +642 -0
  403. package/.framework/tests/unit/schema-utils.test.ts +225 -0
  404. package/.framework/tests/unit/trigger-engine.test.ts +513 -0
  405. package/.framework/tests/unit/validate-app.test.ts +527 -0
  406. package/README.md +34 -3
  407. package/bin/spine-framework.cjs +1 -0
  408. package/config/tailwind.config.cjs +7 -0
  409. package/config/tsconfig.functions.json +42 -0
  410. package/config/tsconfig.json +37 -9
  411. package/config/vite.config.ts +31 -2
  412. package/netlify.toml +31 -3
  413. package/package.json +46 -29
  414. package/scripts/assemble-frontend.sh +127 -44
  415. package/scripts/assemble-functions.sh +127 -29
  416. package/scripts/boundary-check.sh +6 -2
  417. package/scripts/build-manifest.sh +24 -68
  418. package/scripts/checksum-manifest.mts +345 -0
  419. package/scripts/dev-clean.sh +86 -0
  420. package/scripts/dev-netlify.sh +49 -0
  421. package/scripts/netlify-dev-wrapper.sh +2 -0
  422. package/scripts/verify-install.ts +358 -0
  423. package/scripts/verify-integrity.sh +21 -57
  424. package/scripts/verify-manifest.mts +305 -0
  425. package/templates/project/gitignore +45 -0
  426. package/{config → templates/project}/package-lock.json +22335 -9366
  427. package/vitest.config.ts +46 -0
  428. package/.framework/public/spine.config.json +0 -91
  429. package/config/deno.lock +0 -108
  430. package/config/tsconfig.node.tsbuildinfo +0 -1
  431. package/config/tsconfig.tsbuildinfo +0 -1
  432. package/config/vite.config.d.ts +0 -2
  433. package/custom/.devin/AGENT.md +0 -357
  434. package/custom/.devin/skills/install-app/SKILL.md +0 -39
  435. package/custom/.devin/skills/spine-workbench-discovery/SKILL.md +0 -39
  436. package/custom/.devin/skills/spine-workbench-idea/SKILL.md +0 -36
  437. package/custom/.devin/skills/spine-workbench-implement/SKILL.md +0 -46
  438. package/custom/.devin/skills/spine-workbench-initiative/SKILL.md +0 -28
  439. package/custom/.devin/skills/spine-workbench-plan/SKILL.md +0 -38
  440. package/custom/.devin/workflows/app-install.yaml +0 -83
  441. package/custom/README.md +0 -79
  442. package/docs/README.md +0 -15
  443. package/scripts/app-install-cli.ts +0 -286
  444. package/scripts/check-core-integrity.sh +0 -82
  445. package/scripts/ingest-chunks.cjs +0 -202
  446. package/scripts/kb-chunk-parser.cjs +0 -312
  447. package/scripts/kb-chunk-parser.ts +0 -330
  448. package/scripts/kb-ingest-docs.ts +0 -203
  449. package/scripts/load-test-app-install.ts +0 -484
  450. package/scripts/test-login.js +0 -33
  451. package/spine.config.json +0 -91
@@ -1,27 +1,36 @@
1
-
2
-
3
-
4
- // CIL[BEGIN chunk_id="FieldRenderer_module_header_1783927912" type="module_header" identity="module_header" parent="none"]
5
- // CIL[DOC-MACRO purpose="Import dependencies and define field renderer component interfaces"]
6
- // CIL[DOC-RESPONSIBILITY responsibility="Manage React imports and field renderer prop types"]
7
- // CIL[DOC-CONTEXT module="field-renderer" layer="frontend-component" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/components/ui/dialog.tsx\",\".framework/src/components/ui/table-primitives.tsx\",\".framework/functions/_shared/schema-utils.ts\",\"\\\"]"]
8
- // CIL[DOC-CONTRACT inputs="none" outputs="Imported modules and interface" errors="none" side_effects="none"]
9
- // CIL[DOC-MICRO logic_summary="Imports React, field types, and defines FieldRendererProps interface" notable_decisions="[]"]
10
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
1
+ // CIL[BEGIN stable_id="~/.framework/src/components/shared/FieldRenderer.tsx:module_header:module_header" type="module_header" identity="module_header" parent="~/.framework/src/components/shared/FieldRenderer.tsx"]
2
+ // CIL[DOC-MACRO purpose="Import dependencies and types used to render schema-driven form fields"]
3
+ // CIL[DOC-RESPONSIBILITY responsibility="Declare module-level imports for React, sanitization, markdown parsing, FieldDefinition, and the RichTextEditor component"]
4
+ // CIL[DOC-CONTEXT module="components/shared" layer="ui" related_files=".framework/src/components/ui/RichTextEditor.tsx,.framework/src/types/types.ts"]
5
+ // CIL[DOC-CONTRACT inputs="none" outputs="imported symbols available to FieldRenderer, toSafeHtml, resolveRenderType, and FieldRendererProps" errors="none" side_effects="none"]
6
+ // CIL[DOC-MICRO logic_summary="Import React, DOMPurify, marked, FieldDefinition type, and RichTextEditor component" notable_decisions="[]"]
7
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
11
8
  // CIL[DOC-STABILITY stability="stable"]
12
- // CIL[DOC-AUDIENCE audience="developer"]
13
- // CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/components/ui/dialog.tsx, .framework/src/components/ui/table-primitives.tsx, .framework/functions/_shared/schema-utils.ts, \."]
14
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
15
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
16
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
17
- // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
18
- // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
9
+ // CIL[DOC-AUDIENCE audience="framework-developers,ui-developers"]
10
+
19
11
  import React from 'react'
20
12
  import DOMPurify from 'dompurify'
21
13
  import { marked } from 'marked'
22
14
  import { FieldDefinition } from '../../types/types'
23
15
  import { RichTextEditor } from '../ui/RichTextEditor'
24
16
 
17
+ // CIL[DOC-VECTOR type="context" content="purpose='Import dependencies and types used to render schema-driven form fields'; No verified external callers; imports: .framework/src/types/types.ts,.framework/src/components/ui/RichTextEditor.tsx"]
18
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
19
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
20
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
21
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
22
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
23
+ // CIL[END stable_id="~/.framework/src/components/shared/FieldRenderer.tsx:module_header:module_header"]
24
+
25
+ // CIL[BEGIN stable_id="~/.framework/src/components/shared/FieldRenderer.tsx:toSafeHtml:function" type="function" identity="toSafeHtml" parent="~/.framework/src/components/shared/FieldRenderer.tsx:module_header:module_header"]
26
+ // CIL[DOC-MACRO purpose="Sanitize raw HTML or markdown text for safe rendering as HTML"]
27
+ // CIL[DOC-RESPONSIBILITY responsibility="Convert a raw string to sanitized HTML, detecting existing HTML and falling back to markdown parsing"]
28
+ // CIL[DOC-CONTEXT module="components/shared" layer="ui" related_files=".framework/src/components/shared/FieldRenderer.tsx,.framework/src/components/ui/RichTextEditor.tsx,.framework/src/types/types.ts"]
29
+ // CIL[DOC-CONTRACT inputs="raw: string | undefined" outputs="sanitized HTML string" errors="none" side_effects="Runs DOMPurify and marked.parse"]
30
+ // CIL[DOC-MICRO logic_summary="Trim input, detect common HTML tags, parse markdown if plain, then sanitize with DOMPurify" notable_decisions="[]"]
31
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
32
+ // CIL[DOC-STABILITY stability="stable"]
33
+
25
34
  function toSafeHtml(raw: string | undefined): string {
26
35
  const source = (raw ?? '').trim()
27
36
  if (!source) return '<p class="text-slate-400 italic">—</p>'
@@ -29,6 +38,23 @@ function toSafeHtml(raw: string | undefined): string {
29
38
  const html = likelyHtml ? source : (marked.parse(source, { async: false }) as string)
30
39
  return DOMPurify.sanitize(html)
31
40
  }
41
+ // CIL[DOC-VECTOR type="context" content="purpose='Sanitize raw HTML or markdown text for safe rendering as HTML'; No verified external callers; imports: .framework/src/types/types.ts,.framework/src/components/ui/RichTextEditor.tsx"]
42
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
43
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
44
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
45
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
46
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
47
+ // CIL[END stable_id="~/.framework/src/components/shared/FieldRenderer.tsx:toSafeHtml:function"]
48
+
49
+
50
+ // CIL[BEGIN stable_id="~/.framework/src/components/shared/FieldRenderer.tsx:FieldRendererProps:interface" type="interface" identity="FieldRendererProps" parent="~/.framework/src/components/shared/FieldRenderer.tsx:module_header:module_header"]
51
+ // CIL[DOC-MACRO purpose="Define the props accepted by the FieldRenderer component"]
52
+ // CIL[DOC-RESPONSIBILITY responsibility="Type-check the field, value, change handlers, readonly flag, error, and optional display type"]
53
+ // CIL[DOC-CONTEXT module="components/shared" layer="ui" related_files=".framework/src/components/shared/FieldRenderer.tsx,.framework/src/components/ui/RichTextEditor.tsx,.framework/src/types/types.ts"]
54
+ // CIL[DOC-CONTRACT inputs="props object" outputs="typed prop contract for FieldRenderer" errors="none" side_effects="none"]
55
+ // CIL[DOC-MICRO logic_summary="Declare an interface describing the props consumed by FieldRenderer" notable_decisions="[]"]
56
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
57
+ // CIL[DOC-STABILITY stability="stable"]
32
58
 
33
59
  interface FieldRendererProps {
34
60
  field: FieldDefinition
@@ -39,23 +65,23 @@ interface FieldRendererProps {
39
65
  error?: string
40
66
  displayType?: string
41
67
  }
42
- // CIL[END chunk_id="FieldRenderer_module_header_1783927912"]
43
- // CIL[BEGIN chunk_id="FieldRenderer_resolverendertype_1783927912" type="function" identity="resolveRenderType" parent="none"]
44
- // CIL[DOC-LEARNING topic="runtime-type:generic/field_rendering" content="FieldRenderer maps field.data_type or display_type to a widget: text, textarea, email, phone, url, number, date, datetime, checkbox, select, multiselect, radio, color, file, json. display_type overrides data_type when provided."]
45
- // CIL[DOC-NOTE type="design_schema_caveat" content="Unknown data_type or display_type silently falls back to text. Select/multiselect fields must define options or the user sees an empty control."]
46
- // CIL[DOC-MACRO purpose="Resolve canonical render type from field definition and display type"]
47
- // CIL[DOC-RESPONSIBILITY responsibility="Map display types and data types to render types"]
48
- // CIL[DOC-CONTEXT module="field-renderer" layer="frontend-component" related_files="[\".framework/src/pages/admin/TypeDetailPage.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/migrations/025_retype_threads_messages.sql\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/functions/_shared/schema-utils.ts\",\"\\\"]"]
49
- // CIL[DOC-CONTRACT inputs="none" outputs="Render type string" errors="none" side_effects="none"]
50
- // CIL[DOC-MICRO logic_summary="Display type overrides data type, maps to canonical render types" 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-component. Direct callers: 1. Direct calls: 0. Related files: .framework/src/pages/admin/TypeDetailPage.tsx, custom/apps/portal/pages/ContentPage.tsx, .framework/migrations/025_retype_threads_messages.sql, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/functions/_shared/schema-utils.ts, \."]
54
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 1. Total affected: 1."]
55
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
56
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
68
+ // CIL[DOC-VECTOR type="context" content="purpose='Define the props accepted by the FieldRenderer component'; No verified external callers; imports: .framework/src/types/types.ts,.framework/src/components/ui/RichTextEditor.tsx"]
69
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
70
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
71
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
57
72
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
58
73
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
74
+ // CIL[END stable_id="~/.framework/src/components/shared/FieldRenderer.tsx:FieldRendererProps:interface"]
75
+
76
+ // CIL[BEGIN stable_id="~/.framework/src/components/shared/FieldRenderer.tsx:resolveRenderType:function" type="function" identity="resolveRenderType" parent="~/.framework/src/components/shared/FieldRenderer.tsx:module_header:module_header"]
77
+ // CIL[DOC-MACRO purpose="Map a FieldDefinition and optional display override to a concrete render type string"]
78
+ // CIL[DOC-RESPONSIBILITY responsibility="Resolve the widget type to render based on displayType override or field.data_type"]
79
+ // CIL[DOC-CONTEXT module="components/shared" layer="ui" related_files=".framework/src/components/shared/FieldRenderer.tsx,.framework/src/components/ui/RichTextEditor.tsx,.framework/src/types/types.ts"]
80
+ // CIL[DOC-CONTRACT inputs="field: FieldDefinition, displayType?: string" outputs="render type string (text, rich_text, textarea, email, phone, etc.)" errors="none" side_effects="none"]
81
+ // CIL[DOC-MICRO logic_summary="Switch on displayType if provided, otherwise map field.data_type to a canonical render type" notable_decisions="[]"]
82
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
83
+ // CIL[DOC-STABILITY stability="stable"]
84
+
59
85
  function resolveRenderType(field: FieldDefinition, displayType?: string): string {
60
86
  if (displayType) {
61
87
  switch (displayType) {
@@ -124,21 +150,23 @@ function resolveRenderType(field: FieldDefinition, displayType?: string): string
124
150
  return 'text'
125
151
  }
126
152
  }
127
- // CIL[END chunk_id="FieldRenderer_resolverendertype_1783927912"]
128
- // CIL[BEGIN chunk_id="FieldRenderer_fieldrenderer_1783927912" type="function" identity="FieldRenderer" parent="none"]
129
- // CIL[DOC-MACRO purpose="Render appropriate input widget or display element for field type"]
130
- // CIL[DOC-RESPONSIBILITY responsibility="Display field as editable input or read-only value based on type"]
131
- // CIL[DOC-CONTEXT module="field-renderer" layer="frontend-component" related_files="[\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/functions/_shared/schema-utils.ts\",\".framework/migrations/025_retype_threads_messages.sql\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\"\\\"]"]
132
- // CIL[DOC-CONTRACT inputs="none" outputs="Rendered field widget" errors="none" side_effects="Renders UI, calls onChange"]
133
- // CIL[DOC-MICRO logic_summary="Switches on render type to return appropriate input or display component" notable_decisions="[]"]
134
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
135
- // CIL[DOC-STABILITY stability="stable"]
136
- // CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/TypeDetailPage.tsx, .framework/functions/_shared/schema-utils.ts, .framework/migrations/025_retype_threads_messages.sql, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, custom/apps/portal/pages/ContentPage.tsx, \."]
137
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
138
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
139
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
153
+ // CIL[DOC-VECTOR type="context" content="purpose='Map a FieldDefinition and optional display override to a concrete render type string'; No verified external callers; imports: .framework/src/types/types.ts,.framework/src/components/ui/RichTextEditor.tsx"]
154
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
155
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
156
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
140
157
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
141
158
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
159
+ // CIL[END stable_id="~/.framework/src/components/shared/FieldRenderer.tsx:resolveRenderType:function"]
160
+
161
+ // CIL[BEGIN stable_id="~/.framework/src/components/shared/FieldRenderer.tsx:FieldRenderer:component" type="component" identity="FieldRenderer" parent="~/.framework/src/components/shared/FieldRenderer.tsx:module_header:module_header"]
162
+ // CIL[DOC-MACRO purpose="Render a schema-driven form field with the appropriate input or read-only display"]
163
+ // CIL[DOC-RESPONSIBILITY responsibility="Pick a render type and render the matching input or read-only widget, including labels, descriptions, and error messages"]
164
+ // CIL[DOC-CONTEXT module="components/shared" layer="ui" related_files=".framework/src/components/shared/FieldRenderer.tsx,.framework/src/components/ui/RichTextEditor.tsx,.framework/src/types/types.ts"]
165
+ // CIL[DOC-CONTRACT inputs="field, value, onChange, readonly, error, displayType" outputs="JSX form field with label, control, description, and error" errors="none" side_effects="Invokes onChange callback on user interaction"]
166
+ // CIL[DOC-MICRO logic_summary="Compute renderType from field and displayType, then switch on renderType to render the correct control, fallback to text input, and wrap with label/description/error" notable_decisions="[]"]
167
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
168
+ // CIL[DOC-STABILITY stability="stable"]
169
+
142
170
  export function FieldRenderer({ field, value, onChange, readonly = false, error, displayType }: FieldRendererProps) {
143
171
  const renderType = resolveRenderType(field, displayType)
144
172
 
@@ -237,37 +265,64 @@ export function FieldRenderer({ field, value, onChange, readonly = false, error,
237
265
  />
238
266
  )
239
267
 
240
- case 'date':
268
+ case 'date': {
269
+ const parsed = value ? new Date(value) : null
270
+ if (parsed && isNaN(parsed.getTime())) {
271
+ return (
272
+ <input
273
+ type="text"
274
+ value={String(value)}
275
+ readOnly
276
+ className={`input bg-slate-50 ${error ? 'border-red-500' : ''}`}
277
+ />
278
+ )
279
+ }
241
280
  return (
242
281
  <input
243
282
  type="date"
244
- value={value ? new Date(value).toISOString().split('T')[0] : ''}
283
+ value={parsed ? parsed.toISOString().split('T')[0] : ''}
245
284
  onChange={(e) => onChange?.(e.target.value || null)}
246
285
  readOnly={readonly}
247
286
  className={`input ${error ? 'border-red-500' : ''}`}
248
287
  />
249
288
  )
289
+ }
250
290
 
251
- case 'datetime':
291
+ case 'datetime': {
292
+ const parsed = value ? new Date(value) : null
293
+ if (parsed && isNaN(parsed.getTime())) {
294
+ return (
295
+ <input
296
+ type="text"
297
+ value={String(value)}
298
+ readOnly
299
+ className={`input bg-slate-50 ${error ? 'border-red-500' : ''}`}
300
+ />
301
+ )
302
+ }
252
303
  return (
253
304
  <input
254
305
  type="datetime-local"
255
- value={value ? new Date(value).toISOString().slice(0, 16) : ''}
306
+ value={parsed ? parsed.toISOString().slice(0, 16) : ''}
256
307
  onChange={(e) => onChange?.(e.target.value || null)}
257
308
  readOnly={readonly}
258
309
  className={`input ${error ? 'border-red-500' : ''}`}
259
310
  />
260
311
  )
312
+ }
261
313
 
262
314
  case 'select':
263
315
  return readonly ? (
264
316
  <div className={`text-slate-900 ${error ? 'border-red-500' : ''}`}>
265
317
  {(() => {
266
318
  if (!value) return <span className="text-slate-400 italic">—</span>
319
+
320
+
267
321
  const option = field.options?.find((opt) => {
268
322
  const optVal = typeof opt === 'string' ? opt : opt.value
269
323
  return optVal === value
270
324
  })
325
+
271
326
  return typeof option === 'string' ? option : option?.label || value
272
327
  })()}
273
328
  </div>
@@ -279,8 +334,14 @@ export function FieldRenderer({ field, value, onChange, readonly = false, error,
279
334
  >
280
335
  <option value="">Select...</option>
281
336
  {field.options?.map((option) => {
337
+
338
+
282
339
  const optVal = typeof option === 'string' ? option : option.value
340
+
341
+
342
+
283
343
  const optLabel = typeof option === 'string' ? option : option.label
344
+
284
345
  return (
285
346
  <option key={optVal} value={optVal}>
286
347
  {optLabel}
@@ -294,20 +355,35 @@ export function FieldRenderer({ field, value, onChange, readonly = false, error,
294
355
  return (
295
356
  <div className="space-y-2">
296
357
  {field.options?.map((option) => {
358
+
359
+
297
360
  const optionValue = typeof option === 'string' ? option : option.value
361
+
362
+
363
+
298
364
  const optionLabel = typeof option === 'string' ? option : option.label
365
+
299
366
  return (
300
367
  <label key={optionValue} className="flex items-center">
301
368
  <input
302
369
  type="checkbox"
303
370
  checked={Array.isArray(value) && value.includes(optionValue)}
304
371
  onChange={(e) => {
372
+
373
+
305
374
  const currentValue = Array.isArray(value) ? value : []
375
+
306
376
  if (e.target.checked) {
307
377
  onChange?.([...currentValue, optionValue])
308
378
  } else {
309
379
  onChange?.(currentValue.filter((v: string) => v !== optionValue))
310
380
  }
381
+
382
+
383
+
384
+
385
+
386
+
311
387
  }}
312
388
  disabled={readonly}
313
389
  className="mr-2"
@@ -323,8 +399,14 @@ export function FieldRenderer({ field, value, onChange, readonly = false, error,
323
399
  return (
324
400
  <div className="space-y-2">
325
401
  {field.options?.map((option) => {
402
+
403
+
326
404
  const optionValue = typeof option === 'string' ? option : option.value
405
+
406
+
407
+
327
408
  const optionLabel = typeof option === 'string' ? option : option.label
409
+
328
410
  return (
329
411
  <label key={optionValue} className="flex items-center">
330
412
  <input
@@ -373,6 +455,8 @@ export function FieldRenderer({ field, value, onChange, readonly = false, error,
373
455
  onChange?.(JSON.parse(e.target.value))
374
456
  } catch {
375
457
  }
458
+
459
+
376
460
  }}
377
461
  className={`textarea font-mono text-sm ${error ? 'border-red-500' : ''}`}
378
462
  rows={field.rows || 6}
@@ -410,7 +494,10 @@ export function FieldRenderer({ field, value, onChange, readonly = false, error,
410
494
  <input
411
495
  type="file"
412
496
  onChange={(e) => {
497
+
498
+
413
499
  const file = e.target.files?.[0]
500
+
414
501
  if (file) onChange?.(file.name)
415
502
  }}
416
503
  className={`input ${error ? 'border-red-500' : ''}`}
@@ -469,6 +556,7 @@ export function FieldRenderer({ field, value, onChange, readonly = false, error,
469
556
  />
470
557
  )
471
558
  }
559
+
472
560
  }
473
561
 
474
562
  return (
@@ -492,4 +580,10 @@ export function FieldRenderer({ field, value, onChange, readonly = false, error,
492
580
  </div>
493
581
  )
494
582
  }
495
- // CIL[END chunk_id="FieldRenderer_fieldrenderer_1783927912"]
583
+ // CIL[DOC-VECTOR type="context" content="purpose='Render a schema-driven form field with the appropriate input or read-only display'; No verified external callers; imports: .framework/src/types/types.ts,.framework/src/components/ui/RichTextEditor.tsx"]
584
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
585
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
586
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
587
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
588
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
589
+ // CIL[END stable_id="~/.framework/src/components/shared/FieldRenderer.tsx:FieldRenderer:component"]