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
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
// CIL[BEGIN stable_id="~/.framework/tests/unit/permissions.test.ts:module_header:module_header" type="module_header" identity="module_header" parent="none"]
|
|
2
|
+
// CIL[DOC-MACRO purpose="Test setup and imports for permission tests"]
|
|
3
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Configure test environment and mock dependencies"]
|
|
4
|
+
// CIL[DOC-CONTEXT module="tests/unit/permissions" layer="test-unit" related_files=".framework/functions/_shared/principal.ts"]
|
|
5
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="configured test mocks" errors="none" side_effects="Mocks database and middleware modules"]
|
|
6
|
+
// CIL[DOC-MICRO logic_summary="Imports vitest, mocks db and middleware, imports Principal type" notable_decisions="[]"]
|
|
7
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
8
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
9
|
+
// CIL[DOC-AUDIENCE audience="test-engineers"]
|
|
10
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest'
|
|
11
|
+
|
|
12
|
+
vi.mock('../../functions/_shared/db.ts', () => ({
|
|
13
|
+
adminDb: {
|
|
14
|
+
from: vi.fn().mockReturnThis(),
|
|
15
|
+
select: vi.fn().mockReturnThis(),
|
|
16
|
+
eq: vi.fn().mockReturnThis(),
|
|
17
|
+
single: vi.fn()
|
|
18
|
+
}
|
|
19
|
+
}))
|
|
20
|
+
|
|
21
|
+
vi.mock('../../functions/_shared/middleware.ts', async (importOriginal) => {
|
|
22
|
+
const actual = await importOriginal<typeof import('../../functions/_shared/middleware.ts')>()
|
|
23
|
+
return { ...actual }
|
|
24
|
+
})
|
|
25
|
+
|
|
26
|
+
import type { Principal } from '../../functions/_shared/principal.ts'
|
|
27
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Test setup and imports for permission tests'; No verified external callers; imports: .framework/functions/_shared/principal.ts"]
|
|
28
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
29
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
30
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
31
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
32
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
33
|
+
// CIL[END stable_id="~/.framework/tests/unit/permissions.test.ts:module_header:module_header"]
|
|
34
|
+
|
|
35
|
+
// CIL[BEGIN stable_id="~/.framework/tests/unit/permissions.test.ts:makePrincipal:function" type="function" identity="makePrincipal" parent="none"]
|
|
36
|
+
// CIL[DOC-MACRO purpose="Create test principal with default values"]
|
|
37
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Generate test principal objects"]
|
|
38
|
+
// CIL[DOC-CONTEXT module="tests/unit/permissions" layer="test-unit" related_files=".framework/functions/_shared/principal.ts,.framework/tests/unit/permissions.test.ts"]
|
|
39
|
+
// CIL[DOC-CONTRACT inputs="overrides: Partial<Principal>" outputs="Principal object" errors="none" side_effects="none"]
|
|
40
|
+
// CIL[DOC-MICRO logic_summary="Returns default human principal with overrides applied" notable_decisions="[]"]
|
|
41
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
42
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
43
|
+
function makePrincipal(overrides: Partial<Principal> = {}): Principal {
|
|
44
|
+
return {
|
|
45
|
+
id: 'user-123',
|
|
46
|
+
type: 'human',
|
|
47
|
+
accountId: 'account-123',
|
|
48
|
+
roles: ['member'],
|
|
49
|
+
provenance: {
|
|
50
|
+
sourceType: 'jwt',
|
|
51
|
+
createdBy: 'user-123',
|
|
52
|
+
invokedAt: new Date().toISOString()
|
|
53
|
+
},
|
|
54
|
+
...overrides
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Create test principal with default values'; No verified external callers; imports: .framework/functions/_shared/principal.ts"]
|
|
58
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
59
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
60
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
61
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
62
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
63
|
+
// CIL[END stable_id="~/.framework/tests/unit/permissions.test.ts:makePrincipal:function"]
|
|
64
|
+
|
|
65
|
+
// CIL[BEGIN stable_id="~/.framework/tests/unit/permissions.test.ts:makeCtx:function" type="function" identity="makeCtx" parent="none"]
|
|
66
|
+
// CIL[DOC-MACRO purpose="Create test context from principal"]
|
|
67
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Generate test context objects"]
|
|
68
|
+
// CIL[DOC-CONTEXT module="tests/unit/permissions" layer="test-unit" related_files=".framework/functions/_shared/principal.ts,.framework/tests/unit/permissions.test.ts"]
|
|
69
|
+
// CIL[DOC-CONTRACT inputs="principal: Principal" outputs="CoreContext object" errors="none" side_effects="none"]
|
|
70
|
+
// CIL[DOC-MICRO logic_summary="Creates context with principal, accountId, empty db, and requestId" notable_decisions="[]"]
|
|
71
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
72
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
73
|
+
function makeCtx(principal: Principal) {
|
|
74
|
+
return {
|
|
75
|
+
principal,
|
|
76
|
+
accountId: principal.accountId,
|
|
77
|
+
db: {},
|
|
78
|
+
requestId: 'test-req-id'
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Create test context from principal'; No verified external callers; imports: .framework/functions/_shared/principal.ts"]
|
|
82
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
83
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
84
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
85
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
86
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
87
|
+
// CIL[END stable_id="~/.framework/tests/unit/permissions.test.ts:makeCtx:function"]
|
|
88
|
+
|
|
89
|
+
// CIL[BEGIN stable_id="~/.framework/tests/unit/permissions.test.ts:describe_isSystemAdmin:block" type="block" identity="describe_isSystemAdmin" parent="none"]
|
|
90
|
+
// CIL[DOC-MACRO purpose="Test isSystemAdmin permission function"]
|
|
91
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Verify system admin role detection"]
|
|
92
|
+
// CIL[DOC-CONTEXT module="tests/unit/permissions" layer="test-unit" related_files=".framework/functions/_shared/principal.ts,.framework/tests/unit/permissions.test.ts"]
|
|
93
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="test assertions" errors="none" side_effects="Tests principal.ts module"]
|
|
94
|
+
// CIL[DOC-MICRO logic_summary="Tests system_admin role detection for humans and machines" notable_decisions="[]"]
|
|
95
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
96
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
97
|
+
describe('isSystemAdmin', () => {
|
|
98
|
+
it('returns true for system_admin role', async () => {
|
|
99
|
+
const { isSystemAdmin } = await import('../../functions/_shared/principal.ts')
|
|
100
|
+
const principal = makePrincipal({ roles: ['admin', 'system_admin'] })
|
|
101
|
+
expect(isSystemAdmin(principal)).toBe(true)
|
|
102
|
+
})
|
|
103
|
+
|
|
104
|
+
it('returns false for non-admin roles', async () => {
|
|
105
|
+
const { isSystemAdmin } = await import('../../functions/_shared/principal.ts')
|
|
106
|
+
const principal = makePrincipal({ roles: ['admin', 'member'] })
|
|
107
|
+
expect(isSystemAdmin(principal)).toBe(false)
|
|
108
|
+
})
|
|
109
|
+
|
|
110
|
+
it('returns false for machine principals', async () => {
|
|
111
|
+
const { isSystemAdmin } = await import('../../functions/_shared/principal.ts')
|
|
112
|
+
const principal = makePrincipal({
|
|
113
|
+
type: 'machine',
|
|
114
|
+
roles: undefined,
|
|
115
|
+
scopes: ['*:*']
|
|
116
|
+
})
|
|
117
|
+
expect(isSystemAdmin(principal)).toBe(false)
|
|
118
|
+
})
|
|
119
|
+
})
|
|
120
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Test isSystemAdmin permission function'; No verified external callers; imports: .framework/functions/_shared/principal.ts"]
|
|
121
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
122
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
123
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
124
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
125
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
126
|
+
// CIL[END stable_id="~/.framework/tests/unit/permissions.test.ts:describe_isSystemAdmin:block"]
|
|
127
|
+
|
|
128
|
+
// CIL[BEGIN stable_id="~/.framework/tests/unit/permissions.test.ts:describe_machineHasScope:block" type="block" identity="describe_machineHasScope" parent="none"]
|
|
129
|
+
// CIL[DOC-MACRO purpose="Test machineHasScope permission function"]
|
|
130
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Verify machine principal scope matching"]
|
|
131
|
+
// CIL[DOC-CONTEXT module="tests/unit/permissions" layer="test-unit" related_files=".framework/functions/_shared/principal.ts,.framework/tests/unit/permissions.test.ts"]
|
|
132
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="test assertions" errors="none" side_effects="Tests principal.ts module"]
|
|
133
|
+
// CIL[DOC-MICRO logic_summary="Tests exact, wildcard, and global scope matching for machines" notable_decisions="[]"]
|
|
134
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
135
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
136
|
+
describe('machineHasScope', () => {
|
|
137
|
+
it('matches exact scope', async () => {
|
|
138
|
+
const { machineHasScope } = await import('../../functions/_shared/principal.ts')
|
|
139
|
+
const principal = makePrincipal({ type: 'machine', scopes: ['items:read', 'people:write'] })
|
|
140
|
+
expect(machineHasScope(principal, 'items:read')).toBe(true)
|
|
141
|
+
expect(machineHasScope(principal, 'items:write')).toBe(false)
|
|
142
|
+
})
|
|
143
|
+
|
|
144
|
+
it('matches wildcard resource scope', async () => {
|
|
145
|
+
const { machineHasScope } = await import('../../functions/_shared/principal.ts')
|
|
146
|
+
const principal = makePrincipal({ type: 'machine', scopes: ['items:*'] })
|
|
147
|
+
expect(machineHasScope(principal, 'items:read')).toBe(true)
|
|
148
|
+
expect(machineHasScope(principal, 'items:write')).toBe(true)
|
|
149
|
+
expect(machineHasScope(principal, 'people:read')).toBe(false)
|
|
150
|
+
})
|
|
151
|
+
|
|
152
|
+
it('matches global wildcard *:*', async () => {
|
|
153
|
+
const { machineHasScope } = await import('../../functions/_shared/principal.ts')
|
|
154
|
+
const principal = makePrincipal({ type: 'machine', scopes: ['*:*'] })
|
|
155
|
+
expect(machineHasScope(principal, 'items:read')).toBe(true)
|
|
156
|
+
expect(machineHasScope(principal, 'anything:anything')).toBe(true)
|
|
157
|
+
})
|
|
158
|
+
|
|
159
|
+
it('returns false for human principals', async () => {
|
|
160
|
+
const { machineHasScope } = await import('../../functions/_shared/principal.ts')
|
|
161
|
+
const principal = makePrincipal({ type: 'human', scopes: ['items:read'] })
|
|
162
|
+
expect(machineHasScope(principal, 'items:read')).toBe(false)
|
|
163
|
+
})
|
|
164
|
+
|
|
165
|
+
it('returns false when no scopes assigned', async () => {
|
|
166
|
+
const { machineHasScope } = await import('../../functions/_shared/principal.ts')
|
|
167
|
+
const principal = makePrincipal({ type: 'machine', scopes: [] })
|
|
168
|
+
expect(machineHasScope(principal, 'items:read')).toBe(false)
|
|
169
|
+
})
|
|
170
|
+
})
|
|
171
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Test machineHasScope permission function'; No verified external callers; imports: .framework/functions/_shared/principal.ts"]
|
|
172
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
173
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
174
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
175
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
176
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
177
|
+
// CIL[END stable_id="~/.framework/tests/unit/permissions.test.ts:describe_machineHasScope:block"]
|
|
178
|
+
|
|
179
|
+
// CIL[BEGIN stable_id="~/.framework/tests/unit/permissions.test.ts:describe_humanHasRole:block" type="block" identity="describe_humanHasRole" parent="none"]
|
|
180
|
+
// CIL[DOC-MACRO purpose="Test humanHasRole permission function"]
|
|
181
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Verify human principal role checking"]
|
|
182
|
+
// CIL[DOC-CONTEXT module="tests/unit/permissions" layer="test-unit" related_files=".framework/functions/_shared/principal.ts,.framework/tests/unit/permissions.test.ts"]
|
|
183
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="test assertions" errors="none" side_effects="Tests principal.ts module"]
|
|
184
|
+
// CIL[DOC-MICRO logic_summary="Tests role presence checking for human principals" notable_decisions="[]"]
|
|
185
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
186
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
187
|
+
describe('humanHasRole', () => {
|
|
188
|
+
it('returns true when role is present', async () => {
|
|
189
|
+
const { humanHasRole } = await import('../../functions/_shared/principal.ts')
|
|
190
|
+
const principal = makePrincipal({ roles: ['admin', 'member'] })
|
|
191
|
+
expect(humanHasRole(principal, 'admin')).toBe(true)
|
|
192
|
+
})
|
|
193
|
+
|
|
194
|
+
it('returns false when role is absent', async () => {
|
|
195
|
+
const { humanHasRole } = await import('../../functions/_shared/principal.ts')
|
|
196
|
+
const principal = makePrincipal({ roles: ['member'] })
|
|
197
|
+
expect(humanHasRole(principal, 'admin')).toBe(false)
|
|
198
|
+
})
|
|
199
|
+
|
|
200
|
+
it('returns false for machine principals', async () => {
|
|
201
|
+
const { humanHasRole } = await import('../../functions/_shared/principal.ts')
|
|
202
|
+
const principal = makePrincipal({ type: 'machine' })
|
|
203
|
+
expect(humanHasRole(principal, 'admin')).toBe(false)
|
|
204
|
+
})
|
|
205
|
+
})
|
|
206
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Test humanHasRole permission function'; No verified external callers; imports: .framework/functions/_shared/principal.ts"]
|
|
207
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
208
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
209
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
210
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
211
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
212
|
+
// CIL[END stable_id="~/.framework/tests/unit/permissions.test.ts:describe_humanHasRole:block"]
|
|
213
|
+
|
|
214
|
+
// CIL[BEGIN stable_id="~/.framework/tests/unit/permissions.test.ts:describe_sanitizeRecordData:block" type="block" identity="describe_sanitizeRecordData" parent="none"]
|
|
215
|
+
// CIL[DOC-MACRO purpose="Test sanitizeRecordData permission function"]
|
|
216
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Verify record data sanitization by role"]
|
|
217
|
+
// CIL[DOC-CONTEXT module="tests/unit/permissions" layer="test-unit" related_files=".framework/functions/_shared/principal.ts,.framework/tests/unit/permissions.test.ts"]
|
|
218
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="test assertions" errors="none" side_effects="Tests permissions.ts module"]
|
|
219
|
+
// CIL[DOC-MICRO logic_summary="Tests config record sanitization for different user types" notable_decisions="[]"]
|
|
220
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
221
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
222
|
+
describe('sanitizeRecordData — second surface (config objects)', () => {
|
|
223
|
+
const configRecord = {
|
|
224
|
+
id: 'cfg-1',
|
|
225
|
+
slug: 'my-type',
|
|
226
|
+
name: 'My Type',
|
|
227
|
+
kind: 'item',
|
|
228
|
+
created_at: '2024-01-01T00:00:00Z',
|
|
229
|
+
updated_at: '2024-01-01T00:00:00Z',
|
|
230
|
+
_table: 'types'
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
it('system_admin receives full config record', async () => {
|
|
234
|
+
const { sanitizeRecordData } = await import('../../functions/_shared/permissions.ts')
|
|
235
|
+
const principal = makePrincipal({ roles: ['system_admin'] })
|
|
236
|
+
const ctx = makeCtx(principal)
|
|
237
|
+
const result = await sanitizeRecordData(ctx, configRecord, 'types')
|
|
238
|
+
expect(result).toHaveProperty('slug')
|
|
239
|
+
expect(result).toHaveProperty('name')
|
|
240
|
+
expect(result).toHaveProperty('kind')
|
|
241
|
+
})
|
|
242
|
+
|
|
243
|
+
it('machine principal with *:* receives full config record', async () => {
|
|
244
|
+
const { sanitizeRecordData } = await import('../../functions/_shared/permissions.ts')
|
|
245
|
+
const principal = makePrincipal({ type: 'machine', scopes: ['*:*'] })
|
|
246
|
+
const ctx = makeCtx(principal)
|
|
247
|
+
const result = await sanitizeRecordData(ctx, configRecord, 'types')
|
|
248
|
+
expect(result).toHaveProperty('id')
|
|
249
|
+
expect(result).toHaveProperty('slug')
|
|
250
|
+
})
|
|
251
|
+
|
|
252
|
+
it('non-admin human receives minimal stub from config record', async () => {
|
|
253
|
+
const { sanitizeRecordData } = await import('../../functions/_shared/permissions.ts')
|
|
254
|
+
const principal = makePrincipal({ roles: ['member'] })
|
|
255
|
+
const ctx = makeCtx(principal)
|
|
256
|
+
const result = await sanitizeRecordData(ctx, configRecord, 'types')
|
|
257
|
+
expect(result).toHaveProperty('id')
|
|
258
|
+
expect(result).toHaveProperty('created_at')
|
|
259
|
+
expect(result).not.toHaveProperty('kind')
|
|
260
|
+
expect(result).not.toHaveProperty('slug')
|
|
261
|
+
})
|
|
262
|
+
})
|
|
263
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Test sanitizeRecordData permission function'; No verified external callers; imports: .framework/functions/_shared/principal.ts"]
|
|
264
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
265
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
266
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
267
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
268
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
269
|
+
// CIL[END stable_id="~/.framework/tests/unit/permissions.test.ts:describe_sanitizeRecordData:block"]
|