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,77 +1,56 @@
1
-
2
-
3
-
4
-
5
-
6
-
7
-
8
-
9
-
10
-
11
-
12
-
13
-
14
-
15
-
16
-
17
-
18
- // CIL[BEGIN chunk_id="utils_imports_1783712804" type="module_header" identity="imports" parent="none"]
19
- // CIL[DOC-MACRO purpose="Import CSS class utilities"]
20
- // CIL[DOC-RESPONSIBILITY responsibility="Provide class merging dependencies"]
21
- // CIL[DOC-CONTEXT module="utils" layer="utility" related_files="[\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"\\\"]"]
22
- // CIL[DOC-CONTRACT inputs="none" outputs="clsx, twMerge" errors="none" side_effects="none"]
23
- // CIL[DOC-MICRO logic_summary="Import external CSS utility libraries" notable_decisions="[]"]
24
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
25
- // CIL[DOC-STABILITY stability="stable"]
26
- // CIL[DOC-AUDIENCE audience="developer"]
27
- // CIL[DOC-VECTOR type="context" content="Layer: utility. Direct callers: 0. Direct calls: 0. Related files: custom/apps/cortex/pages/operations/OperationsDashboard.tsx, \."]
28
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
29
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
30
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
31
- // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
32
- // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
1
+ // CIL[BEGIN stable_id="~/.framework/src/lib/utils.ts:module_header:module_header" type="module_header" identity="module_header" parent="~/.framework/src/lib/utils.ts"]
2
+ // CIL[DOC-MACRO purpose="Shared utility module for formatting, string manipulation, and common helpers used across the framework UI"]
3
+ // CIL[DOC-RESPONSIBILITY responsibility="Provide reusable, framework-wide helper functions and import the required styling dependencies"]
4
+ // CIL[DOC-CONTEXT module="utils" layer="lib" related_files=".framework/src/lib/utils.ts"]
5
+ // CIL[DOC-CONTRACT inputs="none" outputs="none" errors="none" side_effects="imports tailwind styling utilities on load"]
6
+ // CIL[DOC-MICRO logic_summary="Imports clsx and tailwind-merge for the cn helper; exports formatting and utility functions" notable_decisions="cn uses twMerge(clsx(inputs))"]
7
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
8
+ // CIL[DOC-STABILITY stable]
9
+ // CIL[DOC-AUDIENCE audience="framework components, pages, and hooks"]
33
10
  import { type ClassValue, clsx } from 'clsx'
34
11
  import { twMerge } from 'tailwind-merge'
35
- // CIL[END chunk_id="utils_imports_1783712804"]
36
- // CIL[BEGIN chunk_id="utils_cn_1783712804" type="function" identity="cn" parent="none"]
37
- // CIL[DOC-MACRO purpose="Merge CSS class names with Tailwind"]
38
- // CIL[DOC-RESPONSIBILITY responsibility="Combine and deduplicate CSS classes"]
39
- // CIL[DOC-CONTEXT module="utils" layer="utility" related_files="[\".framework/functions/_shared/schema-utils.ts\",\".framework/src/components/ui/dialog.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/src/components/ui/table-primitives.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"\\\"]"]
40
- // CIL[DOC-CONTRACT inputs="none" outputs="string" errors="none" side_effects="none"]
41
- // CIL[DOC-MICRO logic_summary="Apply clsx then twMerge for class handling" notable_decisions="[]"]
42
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
43
- // CIL[DOC-STABILITY stability="stable"]
44
- // CIL[DOC-VECTOR type="context" content="Layer: utility. Direct callers: 0. Direct calls: 0. Related files: .framework/functions/_shared/schema-utils.ts, .framework/src/components/ui/dialog.tsx, .framework/functions/_shared/principal.ts, .framework/src/components/ui/table-primitives.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, \."]
45
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
46
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
47
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
12
+ // CIL[DOC-VECTOR type="context" content="purpose='Shared utility module for formatting, string manipulation, and common helpers used across the framework UI'; No verified external callers; imports: none"]
13
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
14
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
15
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
48
16
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
49
17
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
18
+ // CIL[END stable_id="~/.framework/src/lib/utils.ts:module_header:module_header"]
19
+
20
+ // CIL[BEGIN stable_id="~/.framework/src/lib/utils.ts:cn:function" type="function" identity="cn" parent="~/.framework/src/lib/utils.ts"]
21
+ // CIL[DOC-MACRO purpose="Compose and merge Tailwind CSS classes"]
22
+ // CIL[DOC-RESPONSIBILITY responsibility="Combine multiple class values, resolving tailwind conflicts"]
23
+ // CIL[DOC-CONTEXT module="utils" layer="lib" related_files=".framework/src/lib/utils.ts"]
24
+ // CIL[DOC-CONTRACT inputs="...inputs: ClassValue[]" outputs="string merged className" errors="none" side_effects="none"]
25
+ // CIL[DOC-MICRO logic_summary="Merges the rest parameter ...inputs using twMerge(clsx(inputs))" notable_decisions="Uses clsx for conditional class joining and tailwind-merge for de-duplication"]
26
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
27
+ // CIL[DOC-STABILITY stable]
50
28
  export function cn(...inputs: ClassValue[]) {
51
29
  return twMerge(clsx(inputs))
52
30
  }
53
- // CIL[END chunk_id="utils_cn_1783712804"]
54
- // CIL[BEGIN chunk_id="utils_formatdate_1783712804" type="function" identity="formatDate" parent="none"]
55
- // CIL[DOC-MACRO purpose="Format date to readable string"]
56
- // CIL[DOC-RESPONSIBILITY responsibility="Convert date to localized format"]
57
- // CIL[DOC-CONTEXT module="utils" layer="utility" related_files="[\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\".framework/src/components/ui/table-primitives.tsx\",\"\\\"]"]
58
- // CIL[DOC-CONTRACT inputs="none" outputs="string" errors="none" side_effects="none"]
59
- // CIL[DOC-MICRO logic_summary="Handle null/invalid dates, format with options" notable_decisions="[]"]
60
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
61
- // CIL[DOC-STABILITY stability="stable"]
62
- // CIL[DOC-VECTOR type="context" content="Layer: utility. Direct callers: 3. Direct calls: 0. Related files: custom/apps/cortex/functions/custom_cil-embeddings.ts, custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/RolesPage.tsx, .framework/src/components/ui/table-primitives.tsx, \."]
63
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 3. Total affected: 3."]
64
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
65
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
31
+ // CIL[DOC-VECTOR type="context" content="purpose='Compose and merge Tailwind CSS classes'; No verified external callers; imports: none"]
32
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
33
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
34
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
66
35
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
67
36
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
37
+ // CIL[END stable_id="~/.framework/src/lib/utils.ts:cn:function"]
38
+
39
+ // CIL[BEGIN stable_id="~/.framework/src/lib/utils.ts:formatDate:function" type="function" identity="formatDate" parent="~/.framework/src/lib/utils.ts"]
40
+ // CIL[DOC-MACRO purpose="Format a date value as a readable date string"]
41
+ // CIL[DOC-RESPONSIBILITY responsibility="Convert an optional date string or Date to a formatted en-US date or a placeholder"]
42
+ // CIL[DOC-CONTEXT module="utils" layer="lib" related_files=".framework/src/lib/utils.ts"]
43
+ // CIL[DOC-CONTRACT inputs="date: string | Date | null | undefined, options?: Intl.DateTimeFormatOptions" outputs="string (formatted date, 'N/A', or 'Invalid Date')" errors="Unparseable dates return 'Invalid Date'" side_effects="none"]
44
+ // CIL[DOC-MICRO logic_summary="Parses strings to Date, validates the timestamp, and formats to en-US" notable_decisions="Returns 'N/A' for missing values and 'Invalid Date' for unparseable values"]
45
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
46
+ // CIL[DOC-STABILITY stable]
68
47
  export function formatDate(date: string | Date | null | undefined, options?: Intl.DateTimeFormatOptions) {
69
48
  if (!date) return 'N/A'
70
-
49
+
71
50
  const dateObj = typeof date === 'string' ? new Date(date) : date
72
-
51
+
73
52
  if (!dateObj || isNaN(dateObj.getTime())) return 'Invalid Date'
74
-
53
+
75
54
  return dateObj.toLocaleDateString('en-US', {
76
55
  year: 'numeric',
77
56
  month: 'short',
@@ -79,56 +58,58 @@ export function formatDate(date: string | Date | null | undefined, options?: Int
79
58
  ...options,
80
59
  })
81
60
  }
82
- // CIL[END chunk_id="utils_formatdate_1783712804"]
83
- // CIL[BEGIN chunk_id="utils_formattime_1783712804" type="function" identity="formatTime" parent="none"]
84
- // CIL[DOC-MACRO purpose="Format time to readable string"]
85
- // CIL[DOC-RESPONSIBILITY responsibility="Convert time to localized format"]
86
- // CIL[DOC-CONTEXT module="utils" layer="utility" related_files="[\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\".framework/src/components/ui/table-primitives.tsx\",\"\\\"]"]
87
- // CIL[DOC-CONTRACT inputs="none" outputs="string" errors="none" side_effects="none"]
88
- // CIL[DOC-MICRO logic_summary="Handle null/invalid dates, format time with options" notable_decisions="[]"]
89
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
90
- // CIL[DOC-STABILITY stability="stable"]
91
- // CIL[DOC-VECTOR type="context" content="Layer: utility. Direct callers: 0. Direct calls: 0. Related files: custom/apps/cortex/functions/custom_cil-embeddings.ts, custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/RolesPage.tsx, .framework/src/components/ui/table-primitives.tsx, \."]
92
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
93
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
94
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
61
+ // CIL[DOC-VECTOR type="context" content="purpose='Format a date value as a readable date string'; No verified external callers; imports: none"]
62
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
63
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
64
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
95
65
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
96
66
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
67
+ // CIL[END stable_id="~/.framework/src/lib/utils.ts:formatDate:function"]
68
+
69
+ // CIL[BEGIN stable_id="~/.framework/src/lib/utils.ts:formatTime:function" type="function" identity="formatTime" parent="~/.framework/src/lib/utils.ts"]
70
+ // CIL[DOC-MACRO purpose="Format a date value as a readable time string"]
71
+ // CIL[DOC-RESPONSIBILITY responsibility="Convert an optional date string or Date to a formatted en-US time or a placeholder"]
72
+ // CIL[DOC-CONTEXT module="utils" layer="lib" related_files=".framework/src/lib/utils.ts"]
73
+ // CIL[DOC-CONTRACT inputs="date: string | Date | null | undefined, options?: Intl.DateTimeFormatOptions" outputs="string (formatted time, 'N/A', or 'Invalid Date')" errors="Unparseable dates return 'Invalid Date'" side_effects="none"]
74
+ // CIL[DOC-MICRO logic_summary="Parses strings to Date, validates the timestamp, and formats the time portion to en-US" notable_decisions="Returns 'N/A' for missing values and 'Invalid Date' for unparseable values"]
75
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
76
+ // CIL[DOC-STABILITY stable]
97
77
  export function formatTime(date: string | Date | null | undefined, options?: Intl.DateTimeFormatOptions) {
98
78
  if (!date) return 'N/A'
99
-
79
+
100
80
  const dateObj = typeof date === 'string' ? new Date(date) : date
101
-
81
+
102
82
  if (!dateObj || isNaN(dateObj.getTime())) return 'Invalid Date'
103
-
83
+
104
84
  return dateObj.toLocaleTimeString('en-US', {
105
85
  hour: '2-digit',
106
86
  minute: '2-digit',
107
87
  ...options,
108
88
  })
109
89
  }
110
- // CIL[END chunk_id="utils_formattime_1783712804"]
111
- // CIL[BEGIN chunk_id="utils_formatdatetime_1783712804" type="function" identity="formatDateTime" parent="none"]
112
- // CIL[DOC-MACRO purpose="Format date and time to readable string"]
113
- // CIL[DOC-RESPONSIBILITY responsibility="Convert datetime to localized format"]
114
- // CIL[DOC-CONTEXT module="utils" layer="utility" related_files="[]"]
115
- // CIL[DOC-CONTRACT inputs="none" outputs="string" errors="none" side_effects="none"]
116
- // CIL[DOC-MICRO logic_summary="Handle null/invalid dates, format datetime with options" notable_decisions="[]"]
117
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
118
- // CIL[DOC-STABILITY stability="stable"]
119
- // CIL[DOC-VECTOR type="context" content="Layer: utility. Direct callers: 0. Direct calls: 0. Related files: none."]
120
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
121
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
122
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
90
+ // CIL[DOC-VECTOR type="context" content="purpose='Format a date value as a readable time string'; No verified external callers; imports: none"]
91
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
92
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
93
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
123
94
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
124
95
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
96
+ // CIL[END stable_id="~/.framework/src/lib/utils.ts:formatTime:function"]
97
+
98
+ // CIL[BEGIN stable_id="~/.framework/src/lib/utils.ts:formatDateTime:function" type="function" identity="formatDateTime" parent="~/.framework/src/lib/utils.ts"]
99
+ // CIL[DOC-MACRO purpose="Format a date value as a combined date and time string"]
100
+ // CIL[DOC-RESPONSIBILITY responsibility="Convert an optional date string or Date to a formatted en-US date-time or a placeholder"]
101
+ // CIL[DOC-CONTEXT module="utils" layer="lib" related_files=".framework/src/lib/utils.ts"]
102
+ // CIL[DOC-CONTRACT inputs="date: string | Date | null | undefined, options?: Intl.DateTimeFormatOptions" outputs="string (formatted date-time, 'N/A', or 'Invalid Date')" errors="Unparseable dates return 'Invalid Date'" side_effects="none"]
103
+ // CIL[DOC-MICRO logic_summary="Parses strings to Date, validates the timestamp, and formats both date and time to en-US" notable_decisions="Returns 'N/A' for missing values and 'Invalid Date' for unparseable values"]
104
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
105
+ // CIL[DOC-STABILITY stable]
125
106
  export function formatDateTime(date: string | Date | null | undefined, options?: Intl.DateTimeFormatOptions) {
126
107
  if (!date) return 'N/A'
127
-
108
+
128
109
  const dateObj = typeof date === 'string' ? new Date(date) : date
129
-
110
+
130
111
  if (!dateObj || isNaN(dateObj.getTime())) return 'Invalid Date'
131
-
112
+
132
113
  return dateObj.toLocaleString('en-US', {
133
114
  year: 'numeric',
134
115
  month: 'short',
@@ -138,28 +119,29 @@ export function formatDateTime(date: string | Date | null | undefined, options?:
138
119
  ...options,
139
120
  })
140
121
  }
141
- // CIL[END chunk_id="utils_formatdatetime_1783712804"]
142
- // CIL[BEGIN chunk_id="utils_formatrelativetime_1783712804" type="function" identity="formatRelativeTime" parent="none"]
143
- // CIL[DOC-MACRO purpose="Format relative time from now"]
144
- // CIL[DOC-RESPONSIBILITY responsibility="Convert date to human-readable relative time"]
145
- // CIL[DOC-CONTEXT module="utils" layer="utility" related_files="[]"]
146
- // CIL[DOC-CONTRACT inputs="none" outputs="string" errors="none" side_effects="none"]
147
- // CIL[DOC-MICRO logic_summary="Calculate time differences and format with units" notable_decisions="[]"]
148
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
149
- // CIL[DOC-STABILITY stability="stable"]
150
- // CIL[DOC-VECTOR type="context" content="Layer: utility. Direct callers: 0. Direct calls: 0. Related files: none."]
151
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
152
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
153
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
122
+ // CIL[DOC-VECTOR type="context" content="purpose='Format a date value as a combined date and time string'; No verified external callers; imports: none"]
123
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
124
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
125
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
154
126
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
155
127
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
128
+ // CIL[END stable_id="~/.framework/src/lib/utils.ts:formatDateTime:function"]
129
+
130
+ // CIL[BEGIN stable_id="~/.framework/src/lib/utils.ts:formatRelativeTime:function" type="function" identity="formatRelativeTime" parent="~/.framework/src/lib/utils.ts"]
131
+ // CIL[DOC-MACRO purpose="Return a human-friendly relative time description"]
132
+ // CIL[DOC-RESPONSIBILITY responsibility="Convert an optional date string or Date to a relative phrase like 'just now' or 'X days ago'"]
133
+ // CIL[DOC-CONTEXT module="utils" layer="lib" related_files=".framework/src/lib/utils.ts"]
134
+ // CIL[DOC-CONTRACT inputs="date: string | Date | null | undefined" outputs="string (relative time, 'N/A', or 'Invalid Date')" errors="Unparseable dates return 'Invalid Date'" side_effects="none"]
135
+ // CIL[DOC-MICRO logic_summary="Computes the difference from now and selects a human-readable bucket" notable_decisions="Falls back to formatDate for anything older than one week"]
136
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
137
+ // CIL[DOC-STABILITY stable]
156
138
  export function formatRelativeTime(date: string | Date | null | undefined) {
157
139
  if (!date) return 'N/A'
158
-
140
+
159
141
  const dateObj = typeof date === 'string' ? new Date(date) : date
160
-
142
+
161
143
  if (isNaN(dateObj.getTime())) return 'Invalid Date'
162
-
144
+
163
145
  const now = new Date()
164
146
  const diffMs = now.getTime() - dateObj.getTime()
165
147
  const diffSecs = Math.floor(diffMs / 1000)
@@ -179,21 +161,22 @@ export function formatRelativeTime(date: string | Date | null | undefined) {
179
161
  return formatDate(dateObj)
180
162
  }
181
163
  }
182
- // CIL[END chunk_id="utils_formatrelativetime_1783712804"]
183
- // CIL[BEGIN chunk_id="utils_formatfilesize_1783712804" type="function" identity="formatFileSize" parent="none"]
184
- // CIL[DOC-MACRO purpose="Format file size with appropriate units"]
185
- // CIL[DOC-RESPONSIBILITY responsibility="Convert bytes to human-readable size"]
186
- // CIL[DOC-CONTEXT module="utils" layer="utility" related_files="[\".framework/functions/_shared/schema-utils.ts\",\".framework/src/components/ui/dialog.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/src/components/ui/table-primitives.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"\\\"]"]
187
- // CIL[DOC-CONTRACT inputs="none" outputs="string" errors="none" side_effects="none"]
188
- // CIL[DOC-MICRO logic_summary="Calculate appropriate unit and format with decimals" notable_decisions="[]"]
189
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
190
- // CIL[DOC-STABILITY stability="stable"]
191
- // CIL[DOC-VECTOR type="context" content="Layer: utility. Direct callers: 0. Direct calls: 0. Related files: .framework/functions/_shared/schema-utils.ts, .framework/src/components/ui/dialog.tsx, .framework/functions/_shared/principal.ts, .framework/src/components/ui/table-primitives.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, \."]
192
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
193
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
194
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
164
+ // CIL[DOC-VECTOR type="context" content="purpose='Return a human-friendly relative time description'; No verified external callers; imports: none"]
165
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
166
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
167
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
195
168
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
196
169
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
170
+ // CIL[END stable_id="~/.framework/src/lib/utils.ts:formatRelativeTime:function"]
171
+
172
+ // CIL[BEGIN stable_id="~/.framework/src/lib/utils.ts:formatFileSize:function" type="function" identity="formatFileSize" parent="~/.framework/src/lib/utils.ts"]
173
+ // CIL[DOC-MACRO purpose="Convert a byte count to a human-readable file size"]
174
+ // CIL[DOC-RESPONSIBILITY responsibility="Compute the largest unit that fits the byte value and format it with fixed decimals"]
175
+ // CIL[DOC-CONTEXT module="utils" layer="lib" related_files=".framework/src/lib/utils.ts"]
176
+ // CIL[DOC-CONTRACT inputs="bytes: number, decimals: number = 2" outputs="string with value and unit" errors="none" side_effects="none"]
177
+ // CIL[DOC-MICRO logic_summary="Determines the appropriate binary unit and formats to fixed decimal places" notable_decisions="Uses 1024 base and returns '0 Bytes' for zero"]
178
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
179
+ // CIL[DOC-STABILITY stable]
197
180
  export function formatFileSize(bytes: number, decimals = 2) {
198
181
  if (bytes === 0) return '0 Bytes'
199
182
 
@@ -205,79 +188,83 @@ export function formatFileSize(bytes: number, decimals = 2) {
205
188
 
206
189
  return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i]
207
190
  }
208
- // CIL[END chunk_id="utils_formatfilesize_1783712804"]
209
- // CIL[BEGIN chunk_id="utils_formatcurrency_1783712804" type="function" identity="formatCurrency" parent="none"]
210
- // CIL[DOC-MACRO purpose="Format number as currency"]
211
- // CIL[DOC-RESPONSIBILITY responsibility="Convert amount to localized currency format"]
212
- // CIL[DOC-CONTEXT module="utils" layer="utility" related_files="[\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\"\\\"]"]
213
- // CIL[DOC-CONTRACT inputs="none" outputs="string" errors="none" side_effects="none"]
214
- // CIL[DOC-MICRO logic_summary="Use Intl.NumberFormat for currency formatting" notable_decisions="[]"]
215
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
216
- // CIL[DOC-STABILITY stability="stable"]
217
- // CIL[DOC-VECTOR type="context" content="Layer: utility. Direct callers: 0. Direct calls: 0. Related files: custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/RolesPage.tsx, \."]
218
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
219
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
220
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
191
+ // CIL[DOC-VECTOR type="context" content="purpose='Convert a byte count to a human-readable file size'; No verified external callers; imports: none"]
192
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
193
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
194
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
221
195
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
222
196
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
197
+ // CIL[END stable_id="~/.framework/src/lib/utils.ts:formatFileSize:function"]
198
+
199
+ // CIL[BEGIN stable_id="~/.framework/src/lib/utils.ts:formatCurrency:function" type="function" identity="formatCurrency" parent="~/.framework/src/lib/utils.ts"]
200
+ // CIL[DOC-MACRO purpose="Format a numeric amount as a localized currency string"]
201
+ // CIL[DOC-RESPONSIBILITY responsibility="Use Intl.NumberFormat to render a value with a currency code and locale"]
202
+ // CIL[DOC-CONTEXT module="utils" layer="lib" related_files=".framework/src/lib/utils.ts"]
203
+ // CIL[DOC-CONTRACT inputs="amount: number, currency: string = 'USD', locale: string = 'en-US'" outputs="formatted currency string" errors="none" side_effects="none"]
204
+ // CIL[DOC-MICRO logic_summary="Constructs an Intl.NumberFormat with currency style and formats the amount" notable_decisions="Defaults to USD and en-US"]
205
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
206
+ // CIL[DOC-STABILITY stable]
223
207
  export function formatCurrency(amount: number, currency = 'USD', locale = 'en-US') {
224
208
  return new Intl.NumberFormat(locale, {
225
209
  style: 'currency',
226
210
  currency,
227
211
  }).format(amount)
228
212
  }
229
- // CIL[END chunk_id="utils_formatcurrency_1783712804"]
230
- // CIL[BEGIN chunk_id="utils_formatnumber_1783712804" type="function" identity="formatNumber" parent="none"]
231
- // CIL[DOC-MACRO purpose="Format number with localization"]
232
- // CIL[DOC-RESPONSIBILITY responsibility="Convert number to localized format"]
233
- // CIL[DOC-CONTEXT module="utils" layer="utility" related_files="[\".framework/functions/_shared/schema-utils.ts\",\".framework/src/components/ui/dialog.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/src/components/ui/table-primitives.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"\\\"]"]
234
- // CIL[DOC-CONTRACT inputs="none" outputs="string" errors="none" side_effects="none"]
235
- // CIL[DOC-MICRO logic_summary="Use Intl.NumberFormat for number formatting" notable_decisions="[]"]
236
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
237
- // CIL[DOC-STABILITY stability="stable"]
238
- // CIL[DOC-VECTOR type="context" content="Layer: utility. Direct callers: 0. Direct calls: 0. Related files: .framework/functions/_shared/schema-utils.ts, .framework/src/components/ui/dialog.tsx, .framework/functions/_shared/principal.ts, .framework/src/components/ui/table-primitives.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, \."]
239
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
240
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
241
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
213
+ // CIL[DOC-VECTOR type="context" content="purpose='Format a numeric amount as a localized currency string'; No verified external callers; imports: none"]
214
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
215
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
216
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
242
217
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
243
218
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
219
+ // CIL[END stable_id="~/.framework/src/lib/utils.ts:formatCurrency:function"]
220
+
221
+ // CIL[BEGIN stable_id="~/.framework/src/lib/utils.ts:formatNumber:function" type="function" identity="formatNumber" parent="~/.framework/src/lib/utils.ts"]
222
+ // CIL[DOC-MACRO purpose="Format a number using locale-aware formatting rules"]
223
+ // CIL[DOC-RESPONSIBILITY responsibility="Apply en-US number formatting with optional Intl.NumberFormat options"]
224
+ // CIL[DOC-CONTEXT module="utils" layer="lib" related_files=".framework/src/lib/utils.ts"]
225
+ // CIL[DOC-CONTRACT inputs="num: number, options?: Intl.NumberFormatOptions" outputs="formatted number string" errors="none" side_effects="none"]
226
+ // CIL[DOC-MICRO logic_summary="Calls Intl.NumberFormat with the provided options" notable_decisions="Defaults to en-US"]
227
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
228
+ // CIL[DOC-STABILITY stable]
244
229
  export function formatNumber(num: number, options?: Intl.NumberFormatOptions) {
245
230
  return new Intl.NumberFormat('en-US', options).format(num)
246
231
  }
247
- // CIL[END chunk_id="utils_formatnumber_1783712804"]
248
- // CIL[BEGIN chunk_id="utils_truncatetext_1783712804" type="function" identity="truncateText" parent="none"]
249
- // CIL[DOC-MACRO purpose="Truncate text to maximum length"]
250
- // CIL[DOC-RESPONSIBILITY responsibility="Limit text length with ellipsis"]
251
- // CIL[DOC-CONTEXT module="utils" layer="utility" related_files="[]"]
252
- // CIL[DOC-CONTRACT inputs="none" outputs="string" errors="none" side_effects="none"]
253
- // CIL[DOC-MICRO logic_summary="Check length, slice if needed, add ellipsis" notable_decisions="[]"]
254
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
255
- // CIL[DOC-STABILITY stability="stable"]
256
- // CIL[DOC-VECTOR type="context" content="Layer: utility. Direct callers: 0. Direct calls: 0. Related files: none."]
257
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
258
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
259
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
232
+ // CIL[DOC-VECTOR type="context" content="purpose='Format a number using locale-aware formatting rules'; No verified external callers; imports: none"]
233
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
234
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
235
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
260
236
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
261
237
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
238
+ // CIL[END stable_id="~/.framework/src/lib/utils.ts:formatNumber:function"]
239
+
240
+ // CIL[BEGIN stable_id="~/.framework/src/lib/utils.ts:truncateText:function" type="function" identity="truncateText" parent="~/.framework/src/lib/utils.ts"]
241
+ // CIL[DOC-MACRO purpose="Shorten a string to a maximum length with an ellipsis"]
242
+ // CIL[DOC-RESPONSIBILITY responsibility="Return the original string if it fits, otherwise truncate and append '...'"]
243
+ // CIL[DOC-CONTEXT module="utils" layer="lib" related_files=".framework/src/lib/utils.ts"]
244
+ // CIL[DOC-CONTRACT inputs="text: string, maxLength: number" outputs="possibly truncated string" errors="none" side_effects="none"]
245
+ // CIL[DOC-MICRO logic_summary="Checks length and slices text when it exceeds maxLength" notable_decisions="Does not account for grapheme clusters"]
246
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
247
+ // CIL[DOC-STABILITY stable]
262
248
  export function truncateText(text: string, maxLength: number) {
263
249
  if (text.length <= maxLength) return text
264
250
  return text.slice(0, maxLength) + '...'
265
251
  }
266
- // CIL[END chunk_id="utils_truncatetext_1783712804"]
267
- // CIL[BEGIN chunk_id="utils_generateslug_1783712804" type="function" identity="generateSlug" parent="none"]
268
- // CIL[DOC-MACRO purpose="Convert text to URL-friendly slug"]
269
- // CIL[DOC-RESPONSIBILITY responsibility="Create slug from text string"]
270
- // CIL[DOC-CONTEXT module="utils" layer="utility" related_files="[\".framework/functions/_shared/schema-utils.ts\",\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/components/ui/table-primitives.tsx\"]"]
271
- // CIL[DOC-CONTRACT inputs="none" outputs="string" errors="none" side_effects="none"]
272
- // CIL[DOC-MICRO logic_summary="Lowercase, remove special chars, replace spaces, trim" notable_decisions="[]"]
273
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
274
- // CIL[DOC-STABILITY stability="stable"]
275
- // CIL[DOC-VECTOR type="context" content="Layer: utility. Direct callers: 0. Direct calls: 0. Related files: .framework/functions/_shared/schema-utils.ts, custom/apps/cortex/functions/custom_cil-embeddings.ts, custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/components/ui/table-primitives.tsx."]
276
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
277
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
278
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
252
+ // CIL[DOC-VECTOR type="context" content="purpose='Shorten a string to a maximum length with an ellipsis'; No verified external callers; imports: none"]
253
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
254
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
255
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
279
256
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
280
257
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
258
+ // CIL[END stable_id="~/.framework/src/lib/utils.ts:truncateText:function"]
259
+
260
+ // CIL[BEGIN stable_id="~/.framework/src/lib/utils.ts:generateSlug:function" type="function" identity="generateSlug" parent="~/.framework/src/lib/utils.ts"]
261
+ // CIL[DOC-MACRO purpose="Generate a URL-friendly slug from a string"]
262
+ // CIL[DOC-RESPONSIBILITY responsibility="Lowercase, remove special characters, and replace separators with hyphens"]
263
+ // CIL[DOC-CONTEXT module="utils" layer="lib" related_files=".framework/src/lib/utils.ts"]
264
+ // CIL[DOC-CONTRACT inputs="text: string" outputs="lowercase hyphenated slug with trimmed edges" errors="none" side_effects="none"]
265
+ // CIL[DOC-MICRO logic_summary="Applies toLowerCase, strips non-word chars, collapses separators, and trims leading or trailing hyphens" notable_decisions="Allows underscores and hyphens as word separators"]
266
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
267
+ // CIL[DOC-STABILITY stable]
281
268
  export function generateSlug(text: string) {
282
269
  return text
283
270
  .toLowerCase()
@@ -285,39 +272,41 @@ export function generateSlug(text: string) {
285
272
  .replace(/[\s_-]+/g, '-')
286
273
  .replace(/^-+|-+$/g, '')
287
274
  }
288
- // CIL[END chunk_id="utils_generateslug_1783712804"]
289
- // CIL[BEGIN chunk_id="utils_capitalize_1783712804" type="function" identity="capitalize" parent="none"]
290
- // CIL[DOC-MACRO purpose="Capitalize first letter of text"]
291
- // CIL[DOC-RESPONSIBILITY responsibility="Format text with proper capitalization"]
292
- // CIL[DOC-CONTEXT module="utils" layer="utility" related_files="[\".framework/functions/_shared/schema-utils.ts\",\".framework/src/components/ui/table-primitives.tsx\"]"]
293
- // CIL[DOC-CONTRACT inputs="none" outputs="string" errors="none" side_effects="none"]
294
- // CIL[DOC-MICRO logic_summary="Get first char, uppercase, concat with rest" notable_decisions="[]"]
295
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
296
- // CIL[DOC-STABILITY stability="stable"]
297
- // CIL[DOC-VECTOR type="context" content="Layer: utility. Direct callers: 0. Direct calls: 0. Related files: .framework/functions/_shared/schema-utils.ts, .framework/src/components/ui/table-primitives.tsx."]
298
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
299
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
300
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
275
+ // CIL[DOC-VECTOR type="context" content="purpose='Generate a URL-friendly slug from a string'; No verified external callers; imports: none"]
276
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
277
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
278
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
301
279
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
302
280
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
281
+ // CIL[END stable_id="~/.framework/src/lib/utils.ts:generateSlug:function"]
282
+
283
+ // CIL[BEGIN stable_id="~/.framework/src/lib/utils.ts:capitalize:function" type="function" identity="capitalize" parent="~/.framework/src/lib/utils.ts"]
284
+ // CIL[DOC-MACRO purpose="Capitalize the first character of a string"]
285
+ // CIL[DOC-RESPONSIBILITY responsibility="Uppercase the first code unit and preserve the remainder"]
286
+ // CIL[DOC-CONTEXT module="utils" layer="lib" related_files=".framework/src/lib/utils.ts"]
287
+ // CIL[DOC-CONTRACT inputs="text: string" outputs="string with first character uppercased" errors="none" side_effects="none"]
288
+ // CIL[DOC-MICRO logic_summary="Uses charAt(0).toUpperCase and concatenates the rest of the string" notable_decisions="Only transforms the first character"]
289
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
290
+ // CIL[DOC-STABILITY stable]
303
291
  export function capitalize(text: string) {
304
292
  return text.charAt(0).toUpperCase() + text.slice(1)
305
293
  }
306
- // CIL[END chunk_id="utils_capitalize_1783712804"]
307
- // CIL[BEGIN chunk_id="utils_debounce_1783712804" type="function" identity="debounce" parent="none"]
308
- // CIL[DOC-MACRO purpose="Debounce function calls"]
309
- // CIL[DOC-RESPONSIBILITY responsibility="Delay function execution until wait period ends"]
310
- // CIL[DOC-CONTEXT module="utils" layer="utility" related_files="[\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\".framework/functions/_shared/principal.ts\",\".framework/functions/_shared/schema-utils.ts\",\"\\\"]"]
311
- // CIL[DOC-CONTRACT inputs="none" outputs="(...args: Parameters<T>) => void" errors="none" side_effects="timer_management"]
312
- // CIL[DOC-MICRO logic_summary="Clear previous timeout, set new timeout for function" notable_decisions="[]"]
313
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
314
- // CIL[DOC-STABILITY stability="stable"]
315
- // CIL[DOC-VECTOR type="context" content="Layer: utility. Direct callers: 0. Direct calls: 0. Related files: custom/apps/cortex/functions/custom_cil-embeddings.ts, .framework/functions/_shared/principal.ts, .framework/functions/_shared/schema-utils.ts, \."]
316
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
317
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
318
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
294
+ // CIL[DOC-VECTOR type="context" content="purpose='Capitalize the first character of a string'; No verified external callers; imports: none"]
295
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
296
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
297
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
319
298
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
320
299
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
300
+ // CIL[END stable_id="~/.framework/src/lib/utils.ts:capitalize:function"]
301
+
302
+ // CIL[BEGIN stable_id="~/.framework/src/lib/utils.ts:debounce:function" type="function" identity="debounce" parent="~/.framework/src/lib/utils.ts"]
303
+ // CIL[DOC-MACRO purpose="Create a debounced wrapper for a function"]
304
+ // CIL[DOC-RESPONSIBILITY responsibility="Delay invocation until a quiet period of the specified wait time"]
305
+ // CIL[DOC-CONTEXT module="utils" layer="lib" related_files=".framework/src/lib/utils.ts"]
306
+ // CIL[DOC-CONTRACT inputs="func: T, wait: number" outputs="debounced function with same argument types" errors="none" side_effects="schedules and clears setTimeout timers"]
307
+ // CIL[DOC-MICRO logic_summary="Clears the pending timeout on each call and schedules the wrapped call" notable_decisions="Returns a function with the original parameter types"]
308
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
309
+ // CIL[DOC-STABILITY stable]
321
310
  export function debounce<T extends (...args: any[]) => any>(
322
311
  func: T,
323
312
  wait: number
@@ -328,21 +317,22 @@ export function debounce<T extends (...args: any[]) => any>(
328
317
  timeout = setTimeout(() => func(...args), wait)
329
318
  }
330
319
  }
331
- // CIL[END chunk_id="utils_debounce_1783712804"]
332
- // CIL[BEGIN chunk_id="utils_throttle_1783712804" type="function" identity="throttle" parent="none"]
333
- // CIL[DOC-MACRO purpose="Throttle function calls"]
334
- // CIL[DOC-RESPONSIBILITY responsibility="Limit function execution frequency"]
335
- // CIL[DOC-CONTEXT module="utils" layer="utility" related_files="[\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\".framework/functions/_shared/principal.ts\",\".framework/functions/_shared/schema-utils.ts\",\"\\\"]"]
336
- // CIL[DOC-CONTRACT inputs="none" outputs="(...args: Parameters<T>) => void" errors="none" side_effects="timer_management"]
337
- // CIL[DOC-MICRO logic_summary="Execute immediately, then ignore until limit expires" notable_decisions="[]"]
338
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
339
- // CIL[DOC-STABILITY stability="stable"]
340
- // CIL[DOC-VECTOR type="context" content="Layer: utility. Direct callers: 0. Direct calls: 0. Related files: custom/apps/cortex/functions/custom_cil-embeddings.ts, .framework/functions/_shared/principal.ts, .framework/functions/_shared/schema-utils.ts, \."]
341
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
342
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
343
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
320
+ // CIL[DOC-VECTOR type="context" content="purpose='Create a debounced wrapper for a function'; No verified external callers; imports: none"]
321
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
322
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
323
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
344
324
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
345
325
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
326
+ // CIL[END stable_id="~/.framework/src/lib/utils.ts:debounce:function"]
327
+
328
+ // CIL[BEGIN stable_id="~/.framework/src/lib/utils.ts:throttle:function" type="function" identity="throttle" parent="~/.framework/src/lib/utils.ts"]
329
+ // CIL[DOC-MACRO purpose="Create a throttled wrapper for a function"]
330
+ // CIL[DOC-RESPONSIBILITY responsibility="Limit execution to once per limit window"]
331
+ // CIL[DOC-CONTEXT module="utils" layer="lib" related_files=".framework/src/lib/utils.ts"]
332
+ // CIL[DOC-CONTRACT inputs="func: T, limit: number" outputs="throttled function with same argument types" errors="none" side_effects="schedules setTimeout to reset throttle state"]
333
+ // CIL[DOC-MICRO logic_summary="Skips calls when inThrottle and resets the flag after the limit" notable_decisions="Only the first call in each window runs"]
334
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
335
+ // CIL[DOC-STABILITY stable]
346
336
  export function throttle<T extends (...args: any[]) => any>(
347
337
  func: T,
348
338
  limit: number
@@ -356,21 +346,22 @@ export function throttle<T extends (...args: any[]) => any>(
356
346
  }
357
347
  }
358
348
  }
359
- // CIL[END chunk_id="utils_throttle_1783712804"]
360
- // CIL[BEGIN chunk_id="utils_isvalidurl_1783712804" type="function" identity="isValidUrl" parent="none"]
361
- // CIL[DOC-MACRO purpose="Validate URL string format"]
362
- // CIL[DOC-RESPONSIBILITY responsibility="Check if string is valid URL"]
363
- // CIL[DOC-CONTEXT module="utils" layer="utility" related_files="[\".framework/functions/_shared/schema-utils.ts\",\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\".framework/src/pages/admin/RolesPage.tsx\"]"]
364
- // CIL[DOC-CONTRACT inputs="none" outputs="boolean" errors="none" side_effects="none"]
365
- // CIL[DOC-MICRO logic_summary="Try URL constructor, return true/false based on success" notable_decisions="[]"]
366
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
367
- // CIL[DOC-STABILITY stability="stable"]
368
- // CIL[DOC-VECTOR type="context" content="Layer: utility. Direct callers: 0. Direct calls: 0. Related files: .framework/functions/_shared/schema-utils.ts, custom/apps/cortex/functions/custom_cil-embeddings.ts, .framework/src/pages/admin/RolesPage.tsx."]
369
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
370
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
371
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
349
+ // CIL[DOC-VECTOR type="context" content="purpose='Create a throttled wrapper for a function'; No verified external callers; imports: none"]
350
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
351
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
352
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
372
353
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
373
354
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
355
+ // CIL[END stable_id="~/.framework/src/lib/utils.ts:throttle:function"]
356
+
357
+ // CIL[BEGIN stable_id="~/.framework/src/lib/utils.ts:isValidUrl:function" type="function" identity="isValidUrl" parent="~/.framework/src/lib/utils.ts"]
358
+ // CIL[DOC-MACRO purpose="Check whether a string is a valid URL"]
359
+ // CIL[DOC-RESPONSIBILITY responsibility="Attempt to construct a URL object and return the success or failure"]
360
+ // CIL[DOC-CONTEXT module="utils" layer="lib" related_files=".framework/src/lib/utils.ts"]
361
+ // CIL[DOC-CONTRACT inputs="url: string" outputs="boolean indicating URL validity" errors="returns false for invalid URLs" side_effects="none"]
362
+ // CIL[DOC-MICRO logic_summary="Tries new URL(url) and catches failures" notable_decisions="Returns false instead of throwing"]
363
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
364
+ // CIL[DOC-STABILITY stable]
374
365
  export function isValidUrl(url: string) {
375
366
  try {
376
367
  new URL(url)
@@ -379,39 +370,41 @@ export function isValidUrl(url: string) {
379
370
  return false
380
371
  }
381
372
  }
382
- // CIL[END chunk_id="utils_isvalidurl_1783712804"]
383
- // CIL[BEGIN chunk_id="utils_getfileextension_1783712804" type="function" identity="getFileExtension" parent="none"]
384
- // CIL[DOC-MACRO purpose="Extract file extension from filename"]
385
- // CIL[DOC-RESPONSIBILITY responsibility="Parse filename to get extension"]
386
- // CIL[DOC-CONTEXT module="utils" layer="utility" related_files="[\"\\\"]"]
387
- // CIL[DOC-CONTRACT inputs="none" outputs="string" errors="none" side_effects="none"]
388
- // CIL[DOC-MICRO logic_summary="Use lastIndexOf and bit tricks for extraction" notable_decisions="[]"]
389
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
390
- // CIL[DOC-STABILITY stability="stable"]
391
- // CIL[DOC-VECTOR type="context" content="Layer: utility. Direct callers: 0. Direct calls: 0. Related files: \."]
392
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
393
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
394
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
373
+ // CIL[DOC-VECTOR type="context" content="purpose='Check whether a string is a valid URL'; No verified external callers; imports: none"]
374
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
375
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
376
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
395
377
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
396
378
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
379
+ // CIL[END stable_id="~/.framework/src/lib/utils.ts:isValidUrl:function"]
380
+
381
+ // CIL[BEGIN stable_id="~/.framework/src/lib/utils.ts:getFileExtension:function" type="function" identity="getFileExtension" parent="~/.framework/src/lib/utils.ts"]
382
+ // CIL[DOC-MACRO purpose="Extract the file extension from a filename"]
383
+ // CIL[DOC-RESPONSIBILITY responsibility="Return the substring after the last dot or an empty string"]
384
+ // CIL[DOC-CONTEXT module="utils" layer="lib" related_files=".framework/src/lib/utils.ts"]
385
+ // CIL[DOC-CONTRACT inputs="filename: string" outputs="string file extension without the dot" errors="none" side_effects="none"]
386
+ // CIL[DOC-MICRO logic_summary="Uses lastIndexOf and an unsigned right shift to handle edge cases" notable_decisions="Returns empty for filenames without a dot"]
387
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
388
+ // CIL[DOC-STABILITY stable]
397
389
  export function getFileExtension(filename: string) {
398
390
  return filename.slice((filename.lastIndexOf('.') - 1 >>> 0) + 2)
399
391
  }
400
- // CIL[END chunk_id="utils_getfileextension_1783712804"]
401
- // CIL[BEGIN chunk_id="utils_generateid_1783712804" type="function" identity="generateId" parent="none"]
402
- // CIL[DOC-MACRO purpose="Generate random alphanumeric ID"]
403
- // CIL[DOC-RESPONSIBILITY responsibility="Create unique identifier string"]
404
- // CIL[DOC-CONTEXT module="utils" layer="utility" related_files="[\".framework/functions/_shared/schema-utils.ts\",\".framework/src/pages/admin/RolesPage.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"custom/apps/cortex/functions/custom_cil-embeddings.ts\"]"]
405
- // CIL[DOC-CONTRACT inputs="none" outputs="string" errors="none" side_effects="none"]
406
- // CIL[DOC-MICRO logic_summary="Loop and append random chars from charset" notable_decisions="[]"]
407
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
408
- // CIL[DOC-STABILITY stability="stable"]
409
- // CIL[DOC-VECTOR type="context" content="Layer: utility. Direct callers: 0. Direct calls: 0. Related files: .framework/functions/_shared/schema-utils.ts, .framework/src/pages/admin/RolesPage.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, custom/apps/cortex/functions/custom_cil-embeddings.ts."]
410
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
411
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
412
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
392
+ // CIL[DOC-VECTOR type="context" content="purpose='Extract the file extension from a filename'; No verified external callers; imports: none"]
393
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
394
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
395
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
413
396
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
414
397
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
398
+ // CIL[END stable_id="~/.framework/src/lib/utils.ts:getFileExtension:function"]
399
+
400
+ // CIL[BEGIN stable_id="~/.framework/src/lib/utils.ts:generateId:function" type="function" identity="generateId" parent="~/.framework/src/lib/utils.ts"]
401
+ // CIL[DOC-MACRO purpose="Generate a random alphanumeric id of a given length"]
402
+ // CIL[DOC-RESPONSIBILITY responsibility="Produce a pseudo-random string using alphanumeric characters"]
403
+ // CIL[DOC-CONTEXT module="utils" layer="lib" related_files=".framework/src/lib/utils.ts"]
404
+ // CIL[DOC-CONTRACT inputs="length: number = 8" outputs="random alphanumeric string" errors="none" side_effects="none"]
405
+ // CIL[DOC-MICRO logic_summary="Builds a string by picking random characters from a fixed alphabet" notable_decisions="Uses Math.random for basic randomness"]
406
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
407
+ // CIL[DOC-STABILITY stable]
415
408
  export function generateId(length = 8) {
416
409
  const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
417
410
  let result = ''
@@ -420,21 +413,22 @@ export function generateId(length = 8) {
420
413
  }
421
414
  return result
422
415
  }
423
- // CIL[END chunk_id="utils_generateid_1783712804"]
424
- // CIL[BEGIN chunk_id="utils_deepclone_1783712804" type="function" identity="deepClone" parent="none"]
425
- // CIL[DOC-MACRO purpose="Deep clone object recursively"]
426
- // CIL[DOC-RESPONSIBILITY responsibility="Create independent copy of complex objects"]
427
- // CIL[DOC-CONTEXT module="utils" layer="utility" related_files="[]"]
428
- // CIL[DOC-CONTRACT inputs="none" outputs="T" errors="none" side_effects="none"]
429
- // CIL[DOC-MICRO logic_summary="Handle primitives, dates, arrays, objects recursively" notable_decisions="[]"]
430
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
431
- // CIL[DOC-STABILITY stability="stable"]
432
- // CIL[DOC-VECTOR type="context" content="Layer: utility. Direct callers: 0. Direct calls: 0. Related files: none."]
433
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
434
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
435
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
416
+ // CIL[DOC-VECTOR type="context" content="purpose='Generate a random alphanumeric id of a given length'; No verified external callers; imports: none"]
417
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
418
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
419
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
436
420
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
437
421
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
422
+ // CIL[END stable_id="~/.framework/src/lib/utils.ts:generateId:function"]
423
+
424
+ // CIL[BEGIN stable_id="~/.framework/src/lib/utils.ts:deepClone:function" type="function" identity="deepClone" parent="~/.framework/src/lib/utils.ts"]
425
+ // CIL[DOC-MACRO purpose="Recursively clone a value of an unknown shape"]
426
+ // CIL[DOC-RESPONSIBILITY responsibility="Create a deep copy of primitives, Dates, arrays, and plain objects"]
427
+ // CIL[DOC-CONTEXT module="utils" layer="lib" related_files=".framework/src/lib/utils.ts"]
428
+ // CIL[DOC-CONTRACT inputs="obj: T" outputs="deep copy of the input with the same type" errors="none" side_effects="none"]
429
+ // CIL[DOC-MICRO logic_summary="Recursively copies arrays and plain objects, preserving Date instances" notable_decisions="Falls through for non-object values and uses own enumerable keys"]
430
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
431
+ // CIL[DOC-STABILITY stable]
438
432
  export function deepClone<T>(obj: T): T {
439
433
  if (obj === null || typeof obj !== 'object') return obj
440
434
  if (obj instanceof Date) return new Date(obj.getTime()) as unknown as T
@@ -450,4 +444,10 @@ export function deepClone<T>(obj: T): T {
450
444
  }
451
445
  return obj
452
446
  }
453
- // CIL[END chunk_id="utils_deepclone_1783712804"]
447
+ // CIL[DOC-VECTOR type="context" content="purpose='Recursively clone a value of an unknown shape'; No verified external callers; imports: none"]
448
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
449
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
450
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
451
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
452
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
453
+ // CIL[END stable_id="~/.framework/src/lib/utils.ts:deepClone:function"]