spine-framework 0.3.145 → 0.4.1
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 +5067 -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,31 +1,226 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
1
|
+
// CIL[BEGIN stable_id="~/.framework/functions/_shared/cil.ts:module_header:module_header" type="module_header" identity="module_header" parent="~/.framework/functions/_shared/cil.ts"]
|
|
2
|
+
// CIL[DOC-AUDIENCE audience="cil-pipeline, framework-developers"]
|
|
3
|
+
// CIL[DOC-MACRO purpose="Shared CIL utilities for stable IDs, content hashing, and file tree operations"]
|
|
4
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Provide reusable helpers for the CIL pipeline across the framework"]
|
|
5
|
+
// CIL[DOC-CONTEXT module="functions/_shared/cil" layer="shared" related_files=".framework/functions/_shared/db.ts"]
|
|
6
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="module exports" errors="none" side_effects="none"]
|
|
7
|
+
// CIL[DOC-MICRO logic_summary="Imports adminDb and crypto; re-exports helper functions and types" notable_decisions="Uses Node crypto for SHA-256 content hashing"]
|
|
8
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
9
|
+
// CIL[DOC-STABILITY stable]
|
|
15
10
|
|
|
16
11
|
import { adminDb } from './db'
|
|
17
|
-
|
|
12
|
+
import * as crypto from 'crypto'
|
|
13
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Shared CIL utilities for stable IDs, content hashing, and file tree operations'; No verified external callers; imports: .framework/functions/_shared/db.ts"]
|
|
14
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
15
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
16
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
17
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
18
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
19
|
+
// CIL[END stable_id="~/.framework/functions/_shared/cil.ts:module_header:module_header"]
|
|
20
|
+
|
|
21
|
+
// CIL[BEGIN stable_id="~/.framework/functions/_shared/cil.ts:STABLE_ID_PREFIX:constant" type="constant" identity="STABLE_ID_PREFIX" parent="~/.framework/functions/_shared/cil.ts"]
|
|
22
|
+
// CIL[DOC-MACRO purpose="Define the prefix used for canonical file paths"]
|
|
23
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Hold the constant tilde prefix used by stable ID and path helpers"]
|
|
24
|
+
// CIL[DOC-STABILITY stability="internal"]
|
|
25
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
26
|
+
// CIL[DOC-CONTEXT module="functions/_shared/cil" layer="shared" related_files=".framework/functions/_shared/cil.ts,.framework/functions/_shared/db.ts"]
|
|
27
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="string constant STABLE_ID_PREFIX" errors="none" side_effects="none"]
|
|
28
|
+
// CIL[DOC-MICRO logic_summary="Exports a single string literal '~'" notable_decisions=""]
|
|
29
|
+
export const STABLE_ID_PREFIX = '~'
|
|
30
|
+
// CIL[END stable_id="~/.framework/functions/_shared/cil.ts:STABLE_ID_PREFIX:constant"]
|
|
31
|
+
|
|
32
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Define the prefix used for canonical file paths'; No verified external callers; imports: .framework/functions/_shared/db.ts"]
|
|
33
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
34
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
35
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
36
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
37
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
38
|
+
// CIL[BEGIN stable_id="~/.framework/functions/_shared/cil.ts:FileStatus:type" type="type" identity="FileStatus" parent="~/.framework/functions/_shared/cil.ts"]
|
|
39
|
+
// CIL[DOC-MACRO purpose="Enumerate the CIL processing pipeline stages for a file"]
|
|
40
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Type the ordered file lifecycle statuses"]
|
|
41
|
+
// CIL[DOC-CONTEXT module="functions/_shared/cil" layer="shared" related_files=".framework/functions/_shared/cil.ts,.framework/functions/_shared/db.ts"]
|
|
42
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="FileStatus union type" errors="none" side_effects="none"]
|
|
43
|
+
// CIL[DOC-MICRO logic_summary="String-literal union from 0-discovered to 8-published" notable_decisions=""]
|
|
44
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
45
|
+
// CIL[DOC-STABILITY stable]
|
|
18
46
|
export type FileStatus =
|
|
19
47
|
| '0-discovered'
|
|
20
48
|
| '1-selected'
|
|
21
49
|
| '2-chunked'
|
|
22
|
-
| '3-
|
|
23
|
-
| '4-
|
|
24
|
-
| '5-
|
|
25
|
-
| '6-
|
|
26
|
-
| '7-
|
|
27
|
-
| '8-
|
|
28
|
-
|
|
50
|
+
| '3-documented'
|
|
51
|
+
| '4-chunk-validated'
|
|
52
|
+
| '5-doc-validated'
|
|
53
|
+
| '6-enriched'
|
|
54
|
+
| '7-embedded-mapped'
|
|
55
|
+
| '8-published'
|
|
56
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Enumerate the CIL processing pipeline stages for a file'; No verified external callers; imports: .framework/functions/_shared/db.ts"]
|
|
57
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
58
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
59
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
60
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
61
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
62
|
+
// CIL[END stable_id="~/.framework/functions/_shared/cil.ts:FileStatus:type"]
|
|
63
|
+
|
|
64
|
+
// CIL[BEGIN stable_id="~/.framework/functions/_shared/cil.ts:PIPELINE_STATUS_RANK:constant" type="constant" identity="PIPELINE_STATUS_RANK" parent="~/.framework/functions/_shared/cil.ts"]
|
|
65
|
+
// CIL[DOC-MACRO purpose="Map each FileStatus to a numeric rank for ordering and comparison"]
|
|
66
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Provide a lookup table from status string to rank"]
|
|
67
|
+
// CIL[DOC-STABILITY stability="internal"]
|
|
68
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
69
|
+
// CIL[DOC-CONTEXT module="functions/_shared/cil" layer="shared" related_files=".framework/functions/_shared/cil.ts,.framework/functions/_shared/db.ts"]
|
|
70
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Record<string, number>" errors="none" side_effects="none"]
|
|
71
|
+
// CIL[DOC-MICRO logic_summary="Object literal mapping status strings to 0-8" notable_decisions=""]
|
|
72
|
+
export const PIPELINE_STATUS_RANK: Record<string, number> = {
|
|
73
|
+
'0-discovered': 0,
|
|
74
|
+
'1-selected': 1,
|
|
75
|
+
'2-chunked': 2,
|
|
76
|
+
'3-documented': 3,
|
|
77
|
+
'4-chunk-validated': 4,
|
|
78
|
+
'5-doc-validated': 5,
|
|
79
|
+
'6-enriched': 6,
|
|
80
|
+
'7-embedded-mapped': 7,
|
|
81
|
+
'8-published': 8,
|
|
82
|
+
}
|
|
83
|
+
// CIL[END stable_id="~/.framework/functions/_shared/cil.ts:PIPELINE_STATUS_RANK:constant"]
|
|
84
|
+
|
|
85
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Map each FileStatus to a numeric rank for ordering and comparison'; No verified external callers; imports: .framework/functions/_shared/db.ts"]
|
|
86
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
87
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
88
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
89
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
90
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
91
|
+
// CIL[DOC-STABILITY stability="internal"]
|
|
92
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
93
|
+
// CIL[DOC-CONTEXT module="unknown" layer="unknown" related_files=".framework/functions/_shared/cil.ts,.framework/functions/_shared/db.ts"]
|
|
94
|
+
// CIL[BEGIN stable_id="~/.framework/functions/_shared/cil.ts:pipelineRank:function" type="function" identity="pipelineRank" parent="~/.framework/functions/_shared/cil.ts"]
|
|
95
|
+
// CIL[DOC-MACRO purpose="Return the numeric rank for a given status string"]
|
|
96
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Convert a status into its rank, defaulting to 0"]
|
|
97
|
+
// CIL[DOC-CONTEXT module="functions/_shared/cil" layer="shared" related_files=".framework/functions/_shared/cil.ts,.framework/functions/_shared/db.ts"]
|
|
98
|
+
// CIL[DOC-CONTRACT inputs="status: string | undefined" outputs="number" errors="none" side_effects="none"]
|
|
99
|
+
// CIL[DOC-MICRO logic_summary="Returns rank if status exists and is in map, otherwise 0" notable_decisions=""]
|
|
100
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
101
|
+
// CIL[DOC-STABILITY stable]
|
|
102
|
+
export function pipelineRank(status: string | undefined): number {
|
|
103
|
+
return status ? PIPELINE_STATUS_RANK[status] || 0 : 0
|
|
104
|
+
}
|
|
105
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Return the numeric rank for a given status string'; No verified external callers; imports: .framework/functions/_shared/db.ts"]
|
|
106
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
107
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
108
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
109
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
110
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
111
|
+
// CIL[END stable_id="~/.framework/functions/_shared/cil.ts:pipelineRank:function"]
|
|
112
|
+
|
|
113
|
+
// CIL[BEGIN stable_id="~/.framework/functions/_shared/cil.ts:toCanonicalPath:function" type="function" identity="toCanonicalPath" parent="~/.framework/functions/_shared/cil.ts"]
|
|
114
|
+
// CIL[DOC-MACRO purpose="Convert an absolute file path into a canonical '~/' path"]
|
|
115
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Normalize and prefix a repository-relative path"]
|
|
116
|
+
// CIL[DOC-CONTEXT module="functions/_shared/cil" layer="shared" related_files=".framework/functions/_shared/cil.ts,.framework/functions/_shared/db.ts"]
|
|
117
|
+
// CIL[DOC-CONTRACT inputs="repoRoot: string, absolutePath: string" outputs="canonical path string" errors="none" side_effects="none"]
|
|
118
|
+
// CIL[DOC-MICRO logic_summary="Strips repo root, backslashes, leading slashes, then prefixes with '~'" notable_decisions="Handles empty relative path as '~/'"]
|
|
119
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
120
|
+
// CIL[DOC-STABILITY stable]
|
|
121
|
+
export function toCanonicalPath(repoRoot: string, absolutePath: string): string {
|
|
122
|
+
const rel = absolutePath.startsWith(repoRoot) ? absolutePath.slice(repoRoot.length) : absolutePath
|
|
123
|
+
const normalized = rel.replace(/\\/g, '/').replace(/^\/+/, '')
|
|
124
|
+
return normalized ? `${STABLE_ID_PREFIX}/${normalized}` : `${STABLE_ID_PREFIX}/`
|
|
125
|
+
}
|
|
126
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Convert an absolute file path into a canonical '~/' path'; No verified external callers; imports: .framework/functions/_shared/db.ts"]
|
|
127
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
128
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
129
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
130
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
131
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
132
|
+
// CIL[END stable_id="~/.framework/functions/_shared/cil.ts:toCanonicalPath:function"]
|
|
133
|
+
|
|
134
|
+
// CIL[BEGIN stable_id="~/.framework/functions/_shared/cil.ts:generateStableId:function" type="function" identity="generateStableId" parent="~/.framework/functions/_shared/cil.ts"]
|
|
135
|
+
// CIL[DOC-MACRO purpose="Build a stable ID from canonical path, identity and type"]
|
|
136
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Concatenate path, identity and type into a colon-delimited stable ID"]
|
|
137
|
+
// CIL[DOC-CONTEXT module="functions/_shared/cil" layer="shared" related_files=".framework/functions/_shared/cil.ts,.framework/functions/_shared/db.ts"]
|
|
138
|
+
// CIL[DOC-CONTRACT inputs="canonicalPath: string, identity: string, type: string" outputs="stable id string" errors="none" side_effects="none"]
|
|
139
|
+
// CIL[DOC-MICRO logic_summary="Returns template literal `${canonicalPath}:${identity}:${type}`" notable_decisions=""]
|
|
140
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
141
|
+
// CIL[DOC-STABILITY stable]
|
|
142
|
+
export function generateStableId(canonicalPath: string, identity: string, type: string): string {
|
|
143
|
+
return `${canonicalPath}:${identity}:${type}`
|
|
144
|
+
}
|
|
145
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Build a stable ID from canonical path, identity and type'; No verified external callers; imports: .framework/functions/_shared/db.ts"]
|
|
146
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
147
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
148
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
149
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
150
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
151
|
+
// CIL[END stable_id="~/.framework/functions/_shared/cil.ts:generateStableId:function"]
|
|
152
|
+
|
|
153
|
+
// CIL[BEGIN stable_id="~/.framework/functions/_shared/cil.ts:parseStableId:function" type="function" identity="parseStableId" parent="~/.framework/functions/_shared/cil.ts"]
|
|
154
|
+
// CIL[DOC-MACRO purpose="Split a stable ID into its path, identity and type components"]
|
|
155
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Parse colon-delimited stable IDs or return null for invalid inputs"]
|
|
156
|
+
// CIL[DOC-CONTEXT module="functions/_shared/cil" layer="shared" related_files=".framework/functions/_shared/cil.ts,.framework/functions/_shared/db.ts"]
|
|
157
|
+
// CIL[DOC-CONTRACT inputs="stableId: string" outputs="{ canonicalPath, identity, type } | null" errors="none" side_effects="none"]
|
|
158
|
+
// CIL[DOC-MICRO logic_summary="Splits on ':', pops last two parts as type and identity, joins remainder" notable_decisions=""]
|
|
159
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
160
|
+
// CIL[DOC-STABILITY stable]
|
|
161
|
+
export function parseStableId(stableId: string): { canonicalPath: string; identity: string; type: string } | null {
|
|
162
|
+
const parts = stableId.split(':')
|
|
163
|
+
if (parts.length < 3) return null
|
|
164
|
+
const type = parts.pop()!
|
|
165
|
+
const identity = parts.pop()!
|
|
166
|
+
const canonicalPath = parts.join(':')
|
|
167
|
+
return { canonicalPath, identity, type }
|
|
168
|
+
}
|
|
169
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Split a stable ID into its path, identity and type components'; No verified external callers; imports: .framework/functions/_shared/db.ts"]
|
|
170
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
171
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
172
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
173
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
174
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
175
|
+
// CIL[END stable_id="~/.framework/functions/_shared/cil.ts:parseStableId:function"]
|
|
176
|
+
|
|
177
|
+
// CIL[BEGIN stable_id="~/.framework/functions/_shared/cil.ts:computeContentHash:function" type="function" identity="computeContentHash" parent="~/.framework/functions/_shared/cil.ts"]
|
|
178
|
+
// CIL[DOC-MACRO purpose="Compute a 32-character SHA-256 hash of code content ignoring CIL markers and whitespace"]
|
|
179
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Produce a deterministic short hash for chunk content comparison"]
|
|
180
|
+
// CIL[DOC-CONTEXT module="functions/_shared/cil" layer="shared" related_files=".framework/functions/_shared/cil.ts,.framework/functions/_shared/db.ts"]
|
|
181
|
+
// CIL[DOC-CONTRACT inputs="raw: string" outputs="32-char hex string" errors="none" side_effects="none"]
|
|
182
|
+
// CIL[DOC-MICRO logic_summary="Normalises line endings, filters CIL and blank lines, collapses blanks, SHA-256 then slice(0,32)" notable_decisions="CIL marker and doc lines are excluded from hash"]
|
|
183
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
184
|
+
// CIL[DOC-STABILITY stable]
|
|
185
|
+
export function computeContentHash(raw: string): string {
|
|
186
|
+
const lines = raw.replace(/\r\n/g, '\n').split('\n')
|
|
187
|
+
const filtered = lines.filter(line => {
|
|
188
|
+
const trimmed = line.trim()
|
|
189
|
+
return !trimmed.match(/^\/\/\s*CIL\[(BEGIN|END)/) &&
|
|
190
|
+
!trimmed.match(/^\/\*\*?\s*CIL\[(BEGIN|END)/) &&
|
|
191
|
+
!trimmed.match(/^\/\/\s*CIL\[DOC-/) &&
|
|
192
|
+
!trimmed.match(/^\/\*\*?\s*CIL\[DOC-/) &&
|
|
193
|
+
!trimmed.match(/^<!--\s*CIL\[(BEGIN|END)/) &&
|
|
194
|
+
!trimmed.match(/^<!--\s*CIL\[DOC-/) &&
|
|
195
|
+
!trimmed.match(/^#\s*CIL\[(BEGIN|END|DOC-)/)
|
|
196
|
+
})
|
|
197
|
+
const collapsed: string[] = []
|
|
198
|
+
let lastBlank = false
|
|
199
|
+
for (const line of filtered) {
|
|
200
|
+
const isBlank = line.trim() === ''
|
|
201
|
+
if (isBlank && lastBlank) continue
|
|
202
|
+
collapsed.push(line)
|
|
203
|
+
lastBlank = isBlank
|
|
204
|
+
}
|
|
205
|
+
const normalised = collapsed.join('\n').trim()
|
|
206
|
+
return crypto.createHash('sha256').update(normalised).digest('hex').slice(0, 32)
|
|
207
|
+
}
|
|
208
|
+
// CIL[END stable_id="~/.framework/functions/_shared/cil.ts:computeContentHash:function"]
|
|
209
|
+
|
|
210
|
+
// CIL[BEGIN stable_id="~/.framework/functions/_shared/cil.ts:FileTreeNode:interface" type="interface" identity="FileTreeNode" parent="~/.framework/functions/_shared/cil.ts"]
|
|
211
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Compute a 32-character SHA-256 hash of code content ignoring CIL markers and whitespace'; No verified external callers; imports: .framework/functions/_shared/db.ts"]
|
|
212
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
213
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
214
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
215
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
216
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
217
|
+
// CIL[DOC-MACRO purpose="Define the recursive file tree node structure"]
|
|
218
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Type file and directory nodes with status, language and children"]
|
|
219
|
+
// CIL[DOC-CONTEXT module="functions/_shared/cil" layer="shared" related_files=".framework/functions/_shared/cil.ts,.framework/functions/_shared/db.ts"]
|
|
220
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="FileTreeNode interface" errors="none" side_effects="none"]
|
|
221
|
+
// CIL[DOC-MICRO logic_summary="Optional id, required name/path/type, optional extension, language, status, children, selected" notable_decisions=""]
|
|
222
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
223
|
+
// CIL[DOC-STABILITY stable]
|
|
29
224
|
export interface FileTreeNode {
|
|
30
225
|
id?: string | null
|
|
31
226
|
name: string
|
|
@@ -37,21 +232,22 @@ export interface FileTreeNode {
|
|
|
37
232
|
children?: FileTreeNode[]
|
|
38
233
|
selected?: boolean
|
|
39
234
|
}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
235
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Define the recursive file tree node structure'; No verified external callers; imports: .framework/functions/_shared/db.ts"]
|
|
236
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
237
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
238
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
239
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
240
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
241
|
+
// CIL[END stable_id="~/.framework/functions/_shared/cil.ts:FileTreeNode:interface"]
|
|
242
|
+
|
|
243
|
+
// CIL[BEGIN stable_id="~/.framework/functions/_shared/cil.ts:isSelectedPath:function" type="function" identity="isSelectedPath" parent="~/.framework/functions/_shared/cil.ts"]
|
|
244
|
+
// CIL[DOC-MACRO purpose="Check if a file path matches a set of selected paths"]
|
|
245
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Determine inclusion of a path under selection rules"]
|
|
246
|
+
// CIL[DOC-CONTEXT module="functions/_shared/cil" layer="shared" related_files=".framework/functions/_shared/cil.ts,.framework/functions/_shared/db.ts"]
|
|
247
|
+
// CIL[DOC-CONTRACT inputs="filePath: string, selectedPaths: string[]" outputs="boolean" errors="none" side_effects="none"]
|
|
248
|
+
// CIL[DOC-MICRO logic_summary="Empty selection means include all; matches exact path or a path prefix ending with '/'" notable_decisions=""]
|
|
249
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
250
|
+
// CIL[DOC-STABILITY stable]
|
|
55
251
|
export function isSelectedPath(filePath: string, selectedPaths: string[]): boolean {
|
|
56
252
|
if (selectedPaths.length === 0) return true
|
|
57
253
|
return selectedPaths.some(sp => {
|
|
@@ -60,39 +256,41 @@ export function isSelectedPath(filePath: string, selectedPaths: string[]): boole
|
|
|
60
256
|
return filePath.startsWith(sp + '/')
|
|
61
257
|
})
|
|
62
258
|
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
259
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Check if a file path matches a set of selected paths'; No verified external callers; imports: .framework/functions/_shared/db.ts"]
|
|
260
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
261
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
262
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
263
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
264
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
265
|
+
// CIL[END stable_id="~/.framework/functions/_shared/cil.ts:isSelectedPath:function"]
|
|
266
|
+
|
|
267
|
+
// CIL[BEGIN stable_id="~/.framework/functions/_shared/cil.ts:getFileStatus:function" type="function" identity="getFileStatus" parent="~/.framework/functions/_shared/cil.ts"]
|
|
268
|
+
// CIL[DOC-MACRO purpose="Extract the CIL status from a file item record"]
|
|
269
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Return the status stored in item.data or a default discovered value"]
|
|
270
|
+
// CIL[DOC-CONTEXT module="functions/_shared/cil" layer="shared" related_files=".framework/functions/_shared/cil.ts,.framework/functions/_shared/db.ts"]
|
|
271
|
+
// CIL[DOC-CONTRACT inputs="fileItem: any" outputs="FileStatus" errors="none" side_effects="none"]
|
|
272
|
+
// CIL[DOC-MICRO logic_summary="Returns fileItem.data?.status or '0-discovered'" notable_decisions=""]
|
|
273
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
274
|
+
// CIL[DOC-STABILITY stable]
|
|
78
275
|
export function getFileStatus(fileItem: any): FileStatus {
|
|
79
276
|
return fileItem.data?.status || '0-discovered'
|
|
80
277
|
}
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
278
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Extract the CIL status from a file item record'; No verified external callers; imports: .framework/functions/_shared/db.ts"]
|
|
279
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
280
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
281
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
282
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
283
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
284
|
+
// CIL[END stable_id="~/.framework/functions/_shared/cil.ts:getFileStatus:function"]
|
|
285
|
+
|
|
286
|
+
// CIL[BEGIN stable_id="~/.framework/functions/_shared/cil.ts:updateFileStatus:function" type="function" identity="updateFileStatus" parent="~/.framework/functions/_shared/cil.ts"]
|
|
287
|
+
// CIL[DOC-MACRO purpose="Persist an updated CIL status and extra data for a file item"]
|
|
288
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Write the new status and timestamp to the items table"]
|
|
289
|
+
// CIL[DOC-CONTEXT module="functions/_shared/cil" layer="shared" related_files=".framework/functions/_shared/cil.ts,.framework/functions/_shared/db.ts"]
|
|
290
|
+
// CIL[DOC-CONTRACT inputs="_ctx: any, fileItem: any, status: FileStatus, extraData: Record<string, any>" outputs="Promise<void>" errors="database errors" side_effects="updates items row"]
|
|
291
|
+
// CIL[DOC-MICRO logic_summary="Merges fileItem.data and extraData, sets status and last_status_at, then adminDb update by id" notable_decisions=""]
|
|
292
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
293
|
+
// CIL[DOC-STABILITY stable]
|
|
96
294
|
export async function updateFileStatus(_ctx: any, fileItem: any, status: FileStatus, extraData: Record<string, any> = {}): Promise<void> {
|
|
97
295
|
await adminDb
|
|
98
296
|
.from('items')
|
|
@@ -106,21 +304,22 @@ export async function updateFileStatus(_ctx: any, fileItem: any, status: FileSta
|
|
|
106
304
|
})
|
|
107
305
|
.eq('id', fileItem.id)
|
|
108
306
|
}
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
307
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Persist an updated CIL status and extra data for a file item'; No verified external callers; imports: .framework/functions/_shared/db.ts"]
|
|
308
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
309
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
310
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
311
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
312
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
313
|
+
// CIL[END stable_id="~/.framework/functions/_shared/cil.ts:updateFileStatus:function"]
|
|
314
|
+
|
|
315
|
+
// CIL[BEGIN stable_id="~/.framework/functions/_shared/cil.ts:buildFileTree:function" type="function" identity="buildFileTree" parent="~/.framework/functions/_shared/cil.ts"]
|
|
316
|
+
// CIL[DOC-MACRO purpose="Construct a hierarchical file tree from flat file records"]
|
|
317
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Group file records into directories and files as a tree"]
|
|
318
|
+
// CIL[DOC-CONTEXT module="functions/_shared/cil" layer="shared" related_files=".framework/functions/_shared/cil.ts,.framework/functions/_shared/db.ts"]
|
|
319
|
+
// CIL[DOC-CONTRACT inputs="fileRecords: { file_path, id?, language, status?, extension }[]" outputs="FileTreeNode" errors="none" side_effects="none"]
|
|
320
|
+
// CIL[DOC-MICRO logic_summary="Creates root, splits paths by '/', builds nested children, attaches file metadata to leaf nodes" notable_decisions=""]
|
|
321
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
322
|
+
// CIL[DOC-STABILITY stable]
|
|
124
323
|
export function buildFileTree(fileRecords: { file_path: string; id?: string; language: string; status?: FileStatus; extension: string }[]): FileTreeNode {
|
|
125
324
|
const root: FileTreeNode = { name: 'root', path: '', type: 'directory', children: [] }
|
|
126
325
|
|
|
@@ -155,21 +354,22 @@ export function buildFileTree(fileRecords: { file_path: string; id?: string; lan
|
|
|
155
354
|
|
|
156
355
|
return root
|
|
157
356
|
}
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
357
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Construct a hierarchical file tree from flat file records'; No verified external callers; imports: .framework/functions/_shared/db.ts"]
|
|
358
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
359
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
360
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
361
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
362
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
363
|
+
// CIL[END stable_id="~/.framework/functions/_shared/cil.ts:buildFileTree:function"]
|
|
364
|
+
|
|
365
|
+
// CIL[BEGIN stable_id="~/.framework/functions/_shared/cil.ts:updateTreeNodeStatus:function" type="function" identity="updateTreeNodeStatus" parent="~/.framework/functions/_shared/cil.ts"]
|
|
366
|
+
// CIL[DOC-MACRO purpose="Recursively set the status of a tree node by file id"]
|
|
367
|
+
// CIL[DOC-STABILITY stability="internal"]
|
|
368
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
369
|
+
// CIL[DOC-CONTEXT module="cil" layer="functions" related_files=".framework/functions/_shared/cil.ts,.framework/functions/_shared/db.ts"]
|
|
370
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Find a node with matching id and update its status"]
|
|
371
|
+
// CIL[DOC-CONTRACT inputs="tree: FileTreeNode, fileId: string, status: FileStatus" outputs="void" errors="none" side_effects="mutates tree.status"]
|
|
372
|
+
// CIL[DOC-MICRO logic_summary="Sets status if tree.id matches, otherwise recurses over children" notable_decisions=""]
|
|
173
373
|
export function updateTreeNodeStatus(tree: FileTreeNode, fileId: string, status: FileStatus): void {
|
|
174
374
|
if (tree.id === fileId) {
|
|
175
375
|
tree.status = status
|
|
@@ -181,21 +381,22 @@ export function updateTreeNodeStatus(tree: FileTreeNode, fileId: string, status:
|
|
|
181
381
|
}
|
|
182
382
|
}
|
|
183
383
|
}
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
384
|
+
// CIL[END stable_id="~/.framework/functions/_shared/cil.ts:updateTreeNodeStatus:function"]
|
|
385
|
+
|
|
386
|
+
// CIL[BEGIN stable_id="~/.framework/functions/_shared/cil.ts:updateTreeNodeByPath:function" type="function" identity="updateTreeNodeByPath" parent="~/.framework/functions/_shared/cil.ts"]
|
|
387
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Recursively set the status of a tree node by file id'; No verified external callers; imports: .framework/functions/_shared/db.ts"]
|
|
388
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
389
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
390
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
391
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
392
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
393
|
+
// CIL[DOC-MACRO purpose="Update id and status of a file node by its path"]
|
|
394
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Locate a file node by exact path and apply updates"]
|
|
395
|
+
// CIL[DOC-CONTEXT module="functions/_shared/cil" layer="shared" related_files=".framework/functions/_shared/cil.ts,.framework/functions/_shared/db.ts"]
|
|
396
|
+
// CIL[DOC-CONTRACT inputs="tree: FileTreeNode, filePath: string, updates: { id?, status? }" outputs="void" errors="none" side_effects="mutates matching tree node fields"]
|
|
397
|
+
// CIL[DOC-MICRO logic_summary="If file node path matches, assigns id and status from updates, then recurses children" notable_decisions=""]
|
|
398
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
399
|
+
// CIL[DOC-STABILITY stable]
|
|
199
400
|
export function updateTreeNodeByPath(tree: FileTreeNode, filePath: string, updates: { id?: string; status?: FileStatus }): void {
|
|
200
401
|
if (tree.type === 'file' && tree.path === filePath) {
|
|
201
402
|
if (updates.id !== undefined) tree.id = updates.id
|
|
@@ -208,21 +409,22 @@ export function updateTreeNodeByPath(tree: FileTreeNode, filePath: string, updat
|
|
|
208
409
|
}
|
|
209
410
|
}
|
|
210
411
|
}
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
412
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Update id and status of a file node by its path'; No verified external callers; imports: .framework/functions/_shared/db.ts"]
|
|
413
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
414
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
415
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
416
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
417
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
418
|
+
// CIL[END stable_id="~/.framework/functions/_shared/cil.ts:updateTreeNodeByPath:function"]
|
|
419
|
+
|
|
420
|
+
// CIL[BEGIN stable_id="~/.framework/functions/_shared/cil.ts:saveProjectTree:function" type="function" identity="saveProjectTree" parent="~/.framework/functions/_shared/cil.ts"]
|
|
421
|
+
// CIL[DOC-MACRO purpose="Persist the file tree for a project to the items table"]
|
|
422
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Store a file tree object and metadata inside the project item"]
|
|
423
|
+
// CIL[DOC-CONTEXT module="functions/_shared/cil" layer="shared" related_files=".framework/functions/_shared/cil.ts,.framework/functions/_shared/db.ts"]
|
|
424
|
+
// CIL[DOC-CONTRACT inputs="_ctx: any, projectId: string, tree: FileTreeNode, extraData: Record<string, any>, projectItem?: any" outputs="Promise<void>" errors="database errors" side_effects="updates items row"]
|
|
425
|
+
// CIL[DOC-MICRO logic_summary="Fetches project item if not provided, merges data, writes file_tree and last_tree_update" notable_decisions=""]
|
|
426
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
427
|
+
// CIL[DOC-STABILITY stable]
|
|
226
428
|
export async function saveProjectTree(
|
|
227
429
|
_ctx: any,
|
|
228
430
|
projectId: string,
|
|
@@ -248,3 +450,42 @@ export async function saveProjectTree(
|
|
|
248
450
|
})
|
|
249
451
|
.eq('id', projItem.id)
|
|
250
452
|
}
|
|
453
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Persist the file tree for a project to the items table'; No verified external callers; imports: .framework/functions/_shared/db.ts"]
|
|
454
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
455
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
456
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
457
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
458
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
459
|
+
// CIL[END stable_id="~/.framework/functions/_shared/cil.ts:saveProjectTree:function"]
|
|
460
|
+
|
|
461
|
+
|
|
462
|
+
// CIL[BEGIN stable_id="~/.framework/functions/_shared/cil.ts:stripCilBoilerplate:function" type="function" identity="stripCilBoilerplate" parent="~/.framework/functions/_shared/cil.ts"]
|
|
463
|
+
// CIL[DOC-MACRO purpose="Remove generated CIL placeholder phrases (e.g. 'No verified external callers') from chunk text before it is embedded or shown to the LLM."]
|
|
464
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Define CIL_BOILERPLATE_PHRASES and strip them, plus emptied 'Context:'/'Blast radius:' labels and punctuation debris, from a string."]
|
|
465
|
+
// CIL[DOC-CONTEXT module="cil" layer="functions" related_files=".framework/functions/_shared/cil.ts,.framework/functions/_shared/agent-runner.ts,.framework/functions/cil-embeddings.ts"]
|
|
466
|
+
// CIL[DOC-CONTRACT inputs="text: string" outputs="string" errors="none" side_effects="none"]
|
|
467
|
+
// CIL[DOC-MICRO logic_summary="Case-insensitive removal of each phrase, then regex cleanup of dangling labels and ';;', ';.', '..' and double spaces." notable_decisions="Placeholder metadata was being parroted by the CIL agent as a fact about code usage; stripping at both embed time and context-build time removes it from the evidence path."]
|
|
468
|
+
// CIL[DOC-CONFIDENCE pass="first" score="0.90" flags="none"]
|
|
469
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
470
|
+
export const CIL_BOILERPLATE_PHRASES = [
|
|
471
|
+
'No verified external callers',
|
|
472
|
+
'No direct caller data from CIL graph; local impact only',
|
|
473
|
+
'No environment or build configuration dependencies identified',
|
|
474
|
+
'Standard runtime; no special invariants documented',
|
|
475
|
+
]
|
|
476
|
+
|
|
477
|
+
export function stripCilBoilerplate(text: string): string {
|
|
478
|
+
if (!text) return text
|
|
479
|
+
let out = text
|
|
480
|
+
for (const phrase of CIL_BOILERPLATE_PHRASES) {
|
|
481
|
+
out = out.replace(new RegExp(phrase.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'gi'), '')
|
|
482
|
+
}
|
|
483
|
+
out = out.replace(/\b(?:Blast radius|Context):\s*(?=\.\s|$)/g, '')
|
|
484
|
+
out = out
|
|
485
|
+
.replace(/;\s*;/g, ';')
|
|
486
|
+
.replace(/;\s*\./g, '.')
|
|
487
|
+
.replace(/\.\s*\./g, '.')
|
|
488
|
+
.replace(/ {2,}/g, ' ')
|
|
489
|
+
return out
|
|
490
|
+
}
|
|
491
|
+
// CIL[END stable_id="~/.framework/functions/_shared/cil.ts:stripCilBoilerplate:function"]
|