spine-framework 0.3.145 → 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.
- package/.env.example +76 -0
- package/.framework/.spine-manifest.json +19 -0
- package/.framework/cli/commands/agents.ts +61 -33
- package/.framework/cli/commands/auth.ts +60 -28
- package/.framework/cli/commands/create-app.ts +212 -80
- package/.framework/cli/commands/dev.ts +184 -68
- package/.framework/cli/commands/doctor.ts +324 -152
- package/.framework/cli/commands/generate.ts +119 -68
- package/.framework/cli/commands/init.ts +141 -242
- package/.framework/cli/commands/install-app.ts +1336 -314
- package/.framework/cli/commands/items.ts +31 -29
- package/.framework/cli/commands/migrate.ts +299 -156
- package/.framework/cli/commands/migrations.ts +62 -30
- package/.framework/cli/commands/pipelines.ts +31 -29
- package/.framework/cli/commands/status.ts +105 -45
- package/.framework/cli/commands/system.ts +47 -42
- package/.framework/cli/commands/test.ts +161 -102
- package/.framework/cli/commands/upgrade.ts +260 -0
- package/.framework/cli/commands/validate-app.ts +517 -161
- package/.framework/cli/context.ts +117 -85
- package/.framework/cli/env-loader.ts +74 -43
- package/.framework/cli/index.ts +70 -46
- package/.framework/cli/lib/project-files.ts +404 -0
- package/.framework/docs/guides/testing-guide.md +1 -1
- package/.framework/docs/runtime-types.md +72 -72
- package/.framework/functions/_shared/access.ts +84 -0
- package/.framework/functions/_shared/agent-runner.ts +5051 -1026
- package/.framework/functions/_shared/app-manifest.ts +214 -94
- package/.framework/functions/_shared/ast.ts +214 -0
- package/.framework/functions/_shared/audit.ts +91 -55
- package/.framework/functions/_shared/cil.ts +368 -127
- package/.framework/functions/_shared/db.ts +337 -68
- package/.framework/functions/_shared/funnel.ts +228 -0
- package/.framework/functions/_shared/geo.ts +105 -0
- package/.framework/functions/_shared/hash-api-key.ts +94 -17
- package/.framework/functions/_shared/index.ts +22 -224
- package/.framework/functions/_shared/kb.ts +832 -58
- package/.framework/functions/_shared/llm.ts +118 -18
- package/.framework/functions/_shared/logging.ts +317 -19
- package/.framework/functions/_shared/middleware.ts +701 -131
- package/.framework/functions/_shared/notify.ts +70 -0
- package/.framework/functions/_shared/outcomes.ts +34 -19
- package/.framework/functions/_shared/permissions.ts +501 -315
- package/.framework/functions/_shared/pipeline-runner.ts +704 -155
- package/.framework/functions/_shared/principal.ts +436 -263
- package/.framework/functions/_shared/rate-limit.ts +233 -0
- package/.framework/functions/_shared/resolve-credentials.ts +86 -19
- package/.framework/functions/_shared/resolve-ids.ts +203 -139
- package/.framework/functions/_shared/retry-deliveries.ts +51 -16
- package/.framework/functions/_shared/schema-utils.ts +602 -521
- package/.framework/functions/_shared/security.ts +345 -0
- package/.framework/functions/_shared/testing.ts +197 -172
- package/.framework/functions/_shared/tracing.ts +351 -21
- package/.framework/functions/_shared/trigger-engine.ts +425 -136
- package/.framework/functions/_shared/webhook-registration.ts +71 -70
- package/.framework/functions/_shared/webhook-registry.ts +126 -83
- package/.framework/functions/account-nodes.ts +30 -30
- package/.framework/functions/adapters/generic-webhook-inbound.ts +49 -16
- package/.framework/functions/adapters/generic-webhook-outbound.ts +17 -17
- package/.framework/functions/adapters/openai-outbound.ts +15 -16
- package/.framework/functions/admin-data.ts +596 -173
- package/.framework/functions/admin-funnel.ts +64 -60
- package/.framework/functions/admin-install-funnel.ts +84 -66
- package/.framework/functions/admin-signals.ts +69 -51
- package/.framework/functions/ai-agents.ts +431 -106
- package/.framework/functions/ai-interactions.ts +186 -112
- package/.framework/functions/api-keys.ts +107 -107
- package/.framework/functions/apps.ts +154 -136
- package/.framework/functions/auth.ts +83 -65
- package/.framework/functions/cil-agent-ingest.ts +189 -232
- package/.framework/functions/cil-agent.ts +433 -177
- package/.framework/functions/cil-callmap.ts +642 -430
- package/.framework/functions/cil-config.ts +139 -135
- package/.framework/functions/cil-context.ts +214 -127
- package/.framework/functions/cil-doc.ts +587 -458
- package/.framework/functions/cil-embeddings.ts +453 -364
- package/.framework/functions/cil-graph.ts +427 -142
- package/.framework/functions/cil-ingest.ts +1418 -1154
- package/.framework/functions/cil-pipeline.ts +276 -21
- package/.framework/functions/cil-project.ts +659 -132
- package/.framework/functions/cil-validate.ts +198 -164
- package/.framework/functions/debug-auth.ts +57 -55
- package/.framework/functions/deliveries.ts +80 -21
- package/.framework/functions/embeddings.ts +1023 -318
- package/.framework/functions/eval-harness.ts +146 -108
- package/.framework/functions/integration-outbound.ts +205 -75
- package/.framework/functions/integration-routes.ts +128 -23
- package/.framework/functions/integrations.ts +125 -100
- package/.framework/functions/invites.ts +1095 -460
- package/.framework/functions/item-progress.ts +158 -102
- package/.framework/functions/kb.ts +34 -10
- package/.framework/functions/logs.ts +133 -133
- package/.framework/functions/observability.ts +152 -122
- package/.framework/functions/pipeline-executions.ts +147 -132
- package/.framework/functions/pipelines.ts +134 -119
- package/.framework/functions/prompt-configs.ts +96 -80
- package/.framework/functions/roles.ts +112 -82
- package/.framework/functions/security.ts +450 -0
- package/.framework/functions/system-cron.ts +117 -80
- package/.framework/functions/system.ts +158 -98
- package/.framework/functions/tests.ts +29 -29
- package/.framework/functions/timers.ts +94 -95
- package/.framework/functions/trigger-scheduler.ts +10 -0
- package/.framework/functions/triggers.ts +179 -149
- package/.framework/functions/types.ts +137 -125
- package/.framework/mcp/index.ts +133 -0
- package/.framework/mcp/load-env.ts +60 -0
- package/.framework/mcp/shared/app-manifest.ts +275 -0
- package/.framework/mcp/shared/db.ts +477 -0
- package/.framework/mcp/shared/kb.ts +118 -0
- package/.framework/mcp/tools/architect.ts +431 -0
- package/.framework/mcp/tools/cil/context.ts +345 -0
- package/.framework/mcp/tools/cil/graph.ts +242 -0
- package/.framework/mcp/tools/cil/ingest.ts +1217 -0
- package/.framework/mcp/tools/cil/pipeline-orchestrator.ts +693 -0
- package/.framework/mcp/tools/cil/pipeline.ts +767 -0
- package/.framework/mcp/tools/cil/project.ts +791 -0
- package/.framework/mcp/tools/cil/retrieval.ts +336 -0
- package/.framework/mcp/tools/cil/search-core.ts +454 -0
- package/.framework/mcp/tools/cil/search.ts +97 -0
- package/.framework/mcp/tools/cil/suggest.ts +186 -0
- package/.framework/mcp/tools/cil/validate.ts +1369 -0
- package/.framework/mcp/tools/kb/delete.ts +139 -0
- package/.framework/mcp/tools/kb/index.ts +52 -0
- package/.framework/mcp/tools/kb/ingest.ts +84 -0
- package/.framework/mcp/tools/kb/list-types.ts +102 -0
- package/.framework/mcp/tools/kb/publish.ts +100 -0
- package/.framework/mcp/tools/kb/reindex.ts +86 -0
- package/.framework/mcp/tools/kb/revoke.ts +85 -0
- package/.framework/mcp/tools/kb/search.ts +101 -0
- package/.framework/mcp/tools/kb/upsert.ts +125 -0
- package/.framework/mcp/tools/observability.ts +510 -0
- package/.framework/migrations/001_core_schema.sql +15 -0
- package/.framework/migrations/002_core_rls_and_functions.sql +15 -0
- package/.framework/migrations/003_core_system_data.sql +16 -1
- package/.framework/migrations/004_core_rpc_and_broker.sql +17 -1
- package/.framework/migrations/005_core_observability.sql +17 -1
- package/.framework/migrations/006_security_hardening_rls.sql +15 -0
- package/.framework/migrations/007_kb_article_list.sql +17 -1
- package/.framework/migrations/008_items_target.sql +15 -0
- package/.framework/migrations/009_roles_slug_unique.sql +15 -0
- package/.framework/migrations/010_auth_user_trigger.sql +15 -0
- package/.framework/migrations/011_spine_system_account.sql +16 -0
- package/.framework/migrations/012_service_role_grants.sql +16 -0
- package/.framework/migrations/013_get_account_apps_role_filter.sql +15 -0
- package/.framework/migrations/014_apps_required_roles.sql +16 -0
- package/.framework/migrations/015_types_kind_slug_unique.sql +15 -0
- package/.framework/migrations/016_cil_types.sql +281 -0
- package/.framework/migrations/017_cil_stable_ids.sql +37 -0
- package/.framework/migrations/018_runtime_tables.sql +129 -0
- package/.framework/migrations/019_agent_prompt_columns.sql +56 -0
- package/.framework/migrations/020_schema_reconciliation.sql +67 -0
- package/.framework/migrations/021_kb_embedding_lifecycle.sql +31 -0
- package/.framework/migrations/032_cil_status_migration.sql +73 -0
- package/.framework/migrations/033_cil_versioning.sql +73 -0
- package/.framework/migrations/034_match_embeddings_knn.sql +115 -0
- package/.framework/migrations/035_rate_limits.sql +55 -0
- package/.framework/migrations/036_demo_record_flags.sql +72 -0
- package/.framework/migrations/037_kb_types_canonical.sql +244 -0
- package/.framework/migrations/038_drop_demo_record_flags.sql +38 -0
- package/.framework/migrations/042_registration_hierarchy.sql +309 -0
- package/.framework/migrations/043_policy_actor_cleanup.sql +39 -0
- package/.framework/migrations/044_match_embeddings_filtered_knn.sql +151 -0
- package/.framework/migrations/045_security_critical_rls.sql +139 -0
- package/.framework/migrations/046_security_missing_rls.sql +79 -0
- package/.framework/migrations/047_people_updated_by.sql +27 -0
- package/.framework/migrations/048_watcher_last_seen_at.sql +24 -0
- package/.framework/migrations/049_security_blocklist.sql +148 -0
- package/.framework/migrations/050_notifications.sql +49 -0
- package/.framework/migrations/051_message_agent_fields.sql +74 -0
- package/.framework/migrations/052_registration_security.sql +421 -0
- package/.framework/migrations/053_builtin_action_seeds.sql +66 -0
- package/.framework/migrations/054_kb_ingest_lease.sql +157 -0
- package/.framework/migrations/055_type_id_drift_reconciliation.sql +33 -0
- package/.framework/migrations/056_slug_column_reconciliation.sql +38 -0
- package/.framework/migrations/057_pipelines_slug_identity.sql +14 -0
- package/.framework/migrations/058_account_data_field_declarations.sql +53 -0
- package/.framework/migrations/059_registration_placement_fixes.sql +269 -0
- package/.framework/migrations/060_account_person_record_permissions.sql +38 -0
- package/.framework/migrations/061_fk_dedup.sql +32 -0
- package/.framework/public/spine-logo.svg +10 -3
- package/.framework/scripts/app-install-cli.ts +190 -93
- package/.framework/scripts/assemble-frontend.sh +127 -44
- package/.framework/scripts/assemble-functions.sh +128 -30
- package/.framework/scripts/boundary-check.sh +6 -2
- package/.framework/scripts/build-manifest.sh +24 -68
- package/.framework/scripts/check-core-integrity.sh +15 -76
- package/.framework/scripts/checksum-manifest.mts +343 -0
- package/.framework/scripts/cil-migrate-markers.ts +403 -0
- package/.framework/scripts/fix-cil-markers.mjs +176 -0
- package/.framework/scripts/verify-integrity.sh +21 -57
- package/.framework/scripts/verify-manifest.mts +305 -0
- package/.framework/seeds/types/funnel_signal_use.json +74 -21
- package/.framework/seeds/types/spine_instance.json +73 -21
- package/.framework/src/App.tsx +118 -72
- package/.framework/src/apps/admin/index.tsx +855 -58
- package/.framework/src/components/AppWrapper.tsx +43 -45
- package/.framework/src/components/CustomAppLoader.tsx +160 -116
- package/.framework/src/components/admin/AdminListPage.tsx +46 -44
- package/.framework/src/components/admin/AdminSidebar.tsx +57 -47
- package/.framework/src/components/admin/AdminStatsCard.tsx +46 -44
- package/.framework/src/components/admin/PageInstructions.tsx +98 -2
- package/.framework/src/components/admin/SortableTableHeader.tsx +44 -45
- package/.framework/src/components/app-shell/GenericAppShell.tsx +64 -65
- package/.framework/src/components/app-shell/GenericDetailPage.tsx +44 -47
- package/.framework/src/components/app-shell/GenericListPage.tsx +45 -49
- package/.framework/src/components/app-sidebar.tsx +42 -45
- package/.framework/src/components/auth/ProtectedRoute.tsx +48 -41
- package/.framework/src/components/auth/TurnstileWidget.tsx +27 -0
- package/.framework/src/components/kb/KBArticleEditor.tsx +231 -22
- package/.framework/src/components/kb/KBArticleList.tsx +251 -10
- package/.framework/src/components/layout/AppShell.tsx +51 -45
- package/.framework/src/components/layout/Header.tsx +42 -43
- package/.framework/src/components/layout/Layout.tsx +46 -46
- package/.framework/src/components/layout/Sidebar.tsx +196 -96
- package/.framework/src/components/runtime/DataDetailHeader.tsx +55 -30
- package/.framework/src/components/runtime/DataDetailPage.tsx +31 -269
- package/.framework/src/components/runtime/DataFilters.tsx +49 -74
- package/.framework/src/components/runtime/DataHeader.tsx +53 -32
- package/.framework/src/components/runtime/DataListPage.tsx +51 -155
- package/.framework/src/components/runtime/DataStats.tsx +66 -44
- package/.framework/src/components/runtime/DataTable.tsx +49 -149
- package/.framework/src/components/runtime/SchemaDetailForm.tsx +45 -75
- package/.framework/src/components/runtime/index.ts +119 -16
- package/.framework/src/components/search-form.tsx +46 -29
- package/.framework/src/components/shared/AgentView.tsx +65 -48
- package/.framework/src/components/shared/FieldRenderer.tsx +144 -50
- package/.framework/src/components/shared/InviteManager.tsx +207 -97
- package/.framework/src/components/shared/MemberList.tsx +97 -0
- package/.framework/src/components/shared/SchemaFields.tsx +107 -86
- package/.framework/src/components/ui/DataTable.tsx +80 -68
- package/.framework/src/components/ui/Form.tsx +157 -146
- package/.framework/src/components/ui/ItemCard.tsx +74 -67
- package/.framework/src/components/ui/ItemListView.tsx +73 -68
- package/.framework/src/components/ui/LoadingSpinner.tsx +43 -48
- package/.framework/src/components/ui/Modal.tsx +78 -68
- package/.framework/src/components/ui/RichTextEditor.tsx +89 -69
- package/.framework/src/components/ui/accordion.tsx +85 -86
- package/.framework/src/components/ui/alert-dialog.tsx +197 -184
- package/.framework/src/components/ui/alert.tsx +105 -94
- package/.framework/src/components/ui/aspect-ratio.tsx +57 -43
- package/.framework/src/components/ui/avatar.tsx +122 -107
- package/.framework/src/components/ui/badge.tsx +60 -55
- package/.framework/src/components/ui/breadcrumb.tsx +127 -128
- package/.framework/src/components/ui/button-group.tsx +86 -72
- package/.framework/src/components/ui/button.tsx +71 -50
- package/.framework/src/components/ui/calendar.tsx +72 -57
- package/.framework/src/components/ui/card.tsx +136 -129
- package/.framework/src/components/ui/carousel.tsx +226 -107
- package/.framework/src/components/ui/chart.tsx +252 -147
- package/.framework/src/components/ui/checkbox.tsx +43 -44
- package/.framework/src/components/ui/collapsible.tsx +86 -71
- package/.framework/src/components/ui/combobox.tsx +282 -249
- package/.framework/src/components/ui/command.tsx +158 -146
- package/.framework/src/components/ui/context-menu.tsx +239 -240
- package/.framework/src/components/ui/dialog.tsx +174 -157
- package/.framework/src/components/ui/direction.tsx +72 -56
- package/.framework/src/components/ui/drawer.tsx +168 -169
- package/.framework/src/components/ui/dropdown-menu.tsx +254 -223
- package/.framework/src/components/ui/empty.tsx +131 -120
- package/.framework/src/components/ui/field.tsx +205 -173
- package/.framework/src/components/ui/hover-card.tsx +71 -72
- package/.framework/src/components/ui/input-group.tsx +148 -133
- package/.framework/src/components/ui/input-otp.tsx +99 -86
- package/.framework/src/components/ui/input.tsx +43 -41
- package/.framework/src/components/ui/item.tsx +207 -185
- package/.framework/src/components/ui/kbd.tsx +57 -56
- package/.framework/src/components/ui/label.tsx +45 -41
- package/.framework/src/components/ui/menubar.tsx +268 -236
- package/.framework/src/components/ui/native-select.tsx +85 -86
- package/.framework/src/components/ui/navigation-menu.tsx +166 -156
- package/.framework/src/components/ui/pagination.tsx +131 -141
- package/.framework/src/components/ui/popover.tsx +125 -128
- package/.framework/src/components/ui/progress.tsx +47 -44
- package/.framework/src/components/ui/radio-group.tsx +60 -55
- package/.framework/src/components/ui/resizable.tsx +85 -72
- package/.framework/src/components/ui/scroll-area.tsx +57 -58
- package/.framework/src/components/ui/select.tsx +182 -169
- package/.framework/src/components/ui/separator.tsx +42 -43
- package/.framework/src/components/ui/sheet.tsx +170 -159
- package/.framework/src/components/ui/sidebar.tsx +395 -398
- package/.framework/src/components/ui/skeleton.tsx +42 -43
- package/.framework/src/components/ui/slider.tsx +61 -44
- package/.framework/src/components/ui/sonner.tsx +44 -44
- package/.framework/src/components/ui/spinner.tsx +47 -42
- package/.framework/src/components/ui/switch.tsx +56 -42
- package/.framework/src/components/ui/table-primitives.tsx +272 -132
- package/.framework/src/components/ui/table.tsx +140 -142
- package/.framework/src/components/ui/tabs.tsx +110 -93
- package/.framework/src/components/ui/textarea.tsx +43 -44
- package/.framework/src/components/ui/toggle-group.tsx +87 -71
- package/.framework/src/components/ui/toggle.tsx +56 -56
- package/.framework/src/components/ui/tooltip.tsx +99 -85
- package/.framework/src/contexts/AppContext.tsx +166 -114
- package/.framework/src/contexts/AuthContext.tsx +232 -137
- package/.framework/src/hooks/use-mobile.ts +43 -44
- package/.framework/src/hooks/useApi.ts +185 -172
- package/.framework/src/hooks/useAppPath.ts +31 -29
- package/.framework/src/hooks/useApps.ts +77 -42
- package/.framework/src/hooks/useEntityList.ts +66 -29
- package/.framework/src/hooks/useEntityRecord.ts +76 -32
- package/.framework/src/hooks/useForm.ts +62 -30
- package/.framework/src/hooks/useListSchema.ts +60 -43
- package/.framework/src/hooks/useSchemaRecord.ts +115 -95
- package/.framework/src/lib/api.ts +258 -134
- package/.framework/src/lib/registration.ts +181 -0
- package/.framework/src/lib/supabase.ts +118 -81
- package/.framework/src/lib/utils.ts +266 -266
- package/.framework/src/main.tsx +43 -44
- package/.framework/src/pages/DashboardPage.tsx +44 -43
- package/.framework/src/pages/NoAppPage.tsx +50 -0
- package/.framework/src/pages/NotFoundPage.tsx +32 -29
- package/.framework/src/pages/SetupPage.tsx +34 -33
- package/.framework/src/pages/admin/AIAgentDetailPage.tsx +69 -58
- package/.framework/src/pages/admin/AIAgentsPage.tsx +43 -40
- package/.framework/src/pages/admin/APIKeyDetailPage.tsx +63 -55
- package/.framework/src/pages/admin/APIKeysPage.tsx +44 -42
- package/.framework/src/pages/admin/AlertsConfigPage.tsx +117 -94
- package/.framework/src/pages/admin/AppDetailPage.tsx +48 -42
- package/.framework/src/pages/admin/AppsPage.tsx +45 -42
- package/.framework/src/pages/admin/DeliveriesPage.tsx +49 -17
- package/.framework/src/pages/admin/DesignedPage.tsx +31 -30
- package/.framework/src/pages/admin/EmbeddingDetailPage.tsx +58 -0
- package/.framework/src/pages/admin/EmbeddingsPage.tsx +49 -0
- package/.framework/src/pages/admin/ExtendedShadcnTestPage.tsx +31 -29
- package/.framework/src/pages/admin/IncrementalShadcnTestPage.tsx +46 -29
- package/.framework/src/pages/admin/IntegratedDashboard.tsx +32 -29
- package/.framework/src/pages/admin/IntegrationDetailPage.tsx +68 -55
- package/.framework/src/pages/admin/IntegrationsPage.tsx +45 -42
- package/.framework/src/pages/admin/InvitesPage.tsx +60 -44
- package/.framework/src/pages/admin/LogsPage.tsx +87 -137
- package/.framework/src/pages/admin/MinimalShadcnTestPage.tsx +31 -29
- package/.framework/src/pages/admin/ObservabilityDashboard.tsx +150 -89
- package/.framework/src/pages/admin/PipelineDetailPage.tsx +77 -104
- package/.framework/src/pages/admin/PipelineExecutionsPage.tsx +44 -43
- package/.framework/src/pages/admin/PipelinesPage.tsx +59 -145
- package/.framework/src/pages/admin/PromptConfigDetailPage.tsx +53 -42
- package/.framework/src/pages/admin/PromptConfigsPage.tsx +47 -117
- package/.framework/src/pages/admin/ProperlyDesignedPage.tsx +31 -44
- package/.framework/src/pages/admin/RoleDetailPage.tsx +49 -92
- package/.framework/src/pages/admin/RolesPage.tsx +47 -164
- package/.framework/src/pages/admin/SecurityPage.tsx +310 -0
- package/.framework/src/pages/admin/SelectTestPage.tsx +30 -32
- package/.framework/src/pages/admin/ShadcnTestPage.tsx +37 -44
- package/.framework/src/pages/admin/SimpleDashboard.tsx +32 -44
- package/.framework/src/pages/admin/TestRunDetailPage.tsx +97 -44
- package/.framework/src/pages/admin/TestingDashboard.tsx +126 -71
- package/.framework/src/pages/admin/TimerDetailPage.tsx +67 -55
- package/.framework/src/pages/admin/TimersPage.tsx +44 -42
- package/.framework/src/pages/admin/TriggerDetailPage.tsx +47 -42
- package/.framework/src/pages/admin/TriggersPage.tsx +58 -57
- package/.framework/src/pages/admin/TypeDetailPage.tsx +91 -55
- package/.framework/src/pages/admin/TypesPage.tsx +45 -42
- package/.framework/src/pages/admin/cil/CILAgentPage.tsx +258 -128
- package/.framework/src/pages/admin/cil/CILChunkDetailPage.tsx +127 -123
- package/.framework/src/pages/admin/cil/CILDashboardPage.tsx +308 -235
- package/.framework/src/pages/admin/cil/CILFileListPage.tsx +159 -110
- package/.framework/src/pages/admin/cil/CILFileSelectPage.tsx +432 -0
- package/.framework/src/pages/admin/cil/CILGraphPage.tsx +200 -178
- package/.framework/src/pages/admin/cil/CILIngestionPage.tsx +286 -239
- package/.framework/src/pages/admin/cil/CILProjectsPage.tsx +211 -90
- package/.framework/src/pages/admin/cil/CILSearchPage.tsx +156 -143
- package/.framework/src/pages/admin/cil/CILSuggestionsPage.tsx +379 -0
- package/.framework/src/pages/admin/cil/CILVersionsPage.tsx +337 -0
- package/.framework/src/pages/admin/cil/FlexiblePipelinePage.tsx +219 -214
- package/.framework/src/pages/admin/kb/KBAdminPage.tsx +64 -0
- package/.framework/src/pages/auth/AuthConfirmPage.tsx +135 -65
- package/.framework/src/pages/auth/ForgotPasswordPage.tsx +39 -31
- package/.framework/src/pages/auth/LoginPage.tsx +38 -32
- package/.framework/src/pages/auth/PendingApprovalPage.tsx +31 -28
- package/.framework/src/pages/auth/RegisterPage.tsx +429 -155
- package/.framework/src/pages/spine-framework/APIPage.tsx +33 -30
- package/.framework/src/pages/spine-framework/CLIPage.tsx +32 -30
- package/.framework/src/types/auth.ts +101 -93
- package/.framework/src/types/types.ts +283 -262
- package/.framework/templates/project.json +87 -0
- package/.framework/templates/spine.config.neutral.json +7 -0
- package/.framework/tests/api/api-surface.test.ts +381 -0
- package/.framework/tests/fixtures/seed.ts +427 -0
- package/.framework/tests/fixtures/teardown.ts +228 -0
- package/.framework/tests/reporter.ts +351 -0
- package/.framework/tests/setup.ts +135 -0
- package/.framework/tests/ui/ui-sweep.ts +278 -0
- package/.framework/tests/unit/admin-data-logger.test.ts +310 -0
- package/.framework/tests/unit/agent-runner.test.ts +2389 -0
- package/.framework/tests/unit/ai-interactions.test.ts +81 -0
- package/.framework/tests/unit/app-manifest.test.ts +359 -0
- package/.framework/tests/unit/assembly-scripts.test.ts +172 -0
- package/.framework/tests/unit/cil-determinism.test.ts +85 -0
- package/.framework/tests/unit/core-isolation.test.ts +153 -0
- package/.framework/tests/unit/funnel-signals.test.ts +135 -0
- package/.framework/tests/unit/install-app.test.ts +1759 -0
- package/.framework/tests/unit/invites-security.test.ts +572 -0
- package/.framework/tests/unit/kb-ingest-lease.test.ts +287 -0
- package/.framework/tests/unit/kb-search.test.ts +119 -0
- package/.framework/tests/unit/migrate.test.ts +509 -0
- package/.framework/tests/unit/notify.test.ts +136 -0
- package/.framework/tests/unit/permissions.test.ts +269 -0
- package/.framework/tests/unit/pipeline-runner.test.ts +755 -0
- package/.framework/tests/unit/principal-cache.test.ts +138 -0
- package/.framework/tests/unit/retrieval-golden.test.ts +520 -0
- package/.framework/tests/unit/runtime-isolation.test.ts +642 -0
- package/.framework/tests/unit/schema-utils.test.ts +225 -0
- package/.framework/tests/unit/trigger-engine.test.ts +513 -0
- package/.framework/tests/unit/validate-app.test.ts +527 -0
- package/README.md +34 -3
- package/bin/spine-framework.cjs +1 -0
- package/config/tailwind.config.cjs +7 -0
- package/config/tsconfig.functions.json +42 -0
- package/config/tsconfig.json +37 -9
- package/config/vite.config.ts +31 -2
- package/netlify.toml +31 -3
- package/package.json +46 -29
- package/scripts/assemble-frontend.sh +127 -44
- package/scripts/assemble-functions.sh +127 -29
- package/scripts/boundary-check.sh +6 -2
- package/scripts/build-manifest.sh +24 -68
- package/scripts/checksum-manifest.mts +345 -0
- package/scripts/dev-clean.sh +86 -0
- package/scripts/dev-netlify.sh +49 -0
- package/scripts/netlify-dev-wrapper.sh +2 -0
- package/scripts/verify-install.ts +358 -0
- package/scripts/verify-integrity.sh +21 -57
- package/scripts/verify-manifest.mts +305 -0
- package/templates/project/gitignore +45 -0
- package/{config → templates/project}/package-lock.json +22335 -9366
- package/vitest.config.ts +46 -0
- package/.framework/public/spine.config.json +0 -91
- package/config/deno.lock +0 -108
- package/config/tsconfig.node.tsbuildinfo +0 -1
- package/config/tsconfig.tsbuildinfo +0 -1
- package/config/vite.config.d.ts +0 -2
- package/custom/.devin/AGENT.md +0 -357
- package/custom/.devin/skills/install-app/SKILL.md +0 -39
- package/custom/.devin/skills/spine-workbench-discovery/SKILL.md +0 -39
- package/custom/.devin/skills/spine-workbench-idea/SKILL.md +0 -36
- package/custom/.devin/skills/spine-workbench-implement/SKILL.md +0 -46
- package/custom/.devin/skills/spine-workbench-initiative/SKILL.md +0 -28
- package/custom/.devin/skills/spine-workbench-plan/SKILL.md +0 -38
- package/custom/.devin/workflows/app-install.yaml +0 -83
- package/custom/README.md +0 -79
- package/docs/README.md +0 -15
- package/scripts/app-install-cli.ts +0 -286
- package/scripts/check-core-integrity.sh +0 -82
- package/scripts/ingest-chunks.cjs +0 -202
- package/scripts/kb-chunk-parser.cjs +0 -312
- package/scripts/kb-chunk-parser.ts +0 -330
- package/scripts/kb-ingest-docs.ts +0 -203
- package/scripts/load-test-app-install.ts +0 -484
- package/scripts/test-login.js +0 -33
- 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[
|
|
36
|
-
// CIL[
|
|
37
|
-
// CIL[DOC-
|
|
38
|
-
// CIL[DOC-
|
|
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[
|
|
54
|
-
// CIL[
|
|
55
|
-
// CIL[DOC-
|
|
56
|
-
// CIL[DOC-
|
|
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[
|
|
83
|
-
// CIL[
|
|
84
|
-
// CIL[DOC-
|
|
85
|
-
// CIL[DOC-
|
|
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[
|
|
111
|
-
// CIL[
|
|
112
|
-
// CIL[DOC-
|
|
113
|
-
// CIL[DOC-
|
|
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[
|
|
142
|
-
// CIL[
|
|
143
|
-
// CIL[DOC-
|
|
144
|
-
// CIL[DOC-
|
|
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[
|
|
183
|
-
// CIL[
|
|
184
|
-
// CIL[DOC-
|
|
185
|
-
// CIL[DOC-
|
|
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[
|
|
209
|
-
// CIL[
|
|
210
|
-
// CIL[DOC-
|
|
211
|
-
// CIL[DOC-
|
|
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[
|
|
230
|
-
// CIL[
|
|
231
|
-
// CIL[DOC-
|
|
232
|
-
// CIL[DOC-
|
|
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[
|
|
248
|
-
// CIL[
|
|
249
|
-
// CIL[DOC-
|
|
250
|
-
// CIL[DOC-
|
|
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[
|
|
267
|
-
// CIL[
|
|
268
|
-
// CIL[DOC-
|
|
269
|
-
// CIL[DOC-
|
|
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[
|
|
289
|
-
// CIL[
|
|
290
|
-
// CIL[DOC-
|
|
291
|
-
// CIL[DOC-
|
|
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[
|
|
307
|
-
// CIL[
|
|
308
|
-
// CIL[DOC-
|
|
309
|
-
// CIL[DOC-
|
|
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[
|
|
332
|
-
// CIL[
|
|
333
|
-
// CIL[DOC-
|
|
334
|
-
// CIL[DOC-
|
|
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[
|
|
360
|
-
// CIL[
|
|
361
|
-
// CIL[DOC-
|
|
362
|
-
// CIL[DOC-
|
|
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[
|
|
383
|
-
// CIL[
|
|
384
|
-
// CIL[DOC-
|
|
385
|
-
// CIL[DOC-
|
|
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[
|
|
401
|
-
// CIL[
|
|
402
|
-
// CIL[DOC-
|
|
403
|
-
// CIL[DOC-
|
|
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[
|
|
424
|
-
// CIL[
|
|
425
|
-
// CIL[DOC-
|
|
426
|
-
// CIL[DOC-
|
|
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[
|
|
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"]
|