spine-framework 0.3.145 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +76 -0
- package/.framework/.spine-manifest.json +19 -0
- package/.framework/cli/commands/agents.ts +61 -33
- package/.framework/cli/commands/auth.ts +60 -28
- package/.framework/cli/commands/create-app.ts +212 -80
- package/.framework/cli/commands/dev.ts +184 -68
- package/.framework/cli/commands/doctor.ts +324 -152
- package/.framework/cli/commands/generate.ts +119 -68
- package/.framework/cli/commands/init.ts +141 -242
- package/.framework/cli/commands/install-app.ts +1336 -314
- package/.framework/cli/commands/items.ts +31 -29
- package/.framework/cli/commands/migrate.ts +299 -156
- package/.framework/cli/commands/migrations.ts +62 -30
- package/.framework/cli/commands/pipelines.ts +31 -29
- package/.framework/cli/commands/status.ts +105 -45
- package/.framework/cli/commands/system.ts +47 -42
- package/.framework/cli/commands/test.ts +161 -102
- package/.framework/cli/commands/upgrade.ts +260 -0
- package/.framework/cli/commands/validate-app.ts +517 -161
- package/.framework/cli/context.ts +117 -85
- package/.framework/cli/env-loader.ts +74 -43
- package/.framework/cli/index.ts +70 -46
- package/.framework/cli/lib/project-files.ts +404 -0
- package/.framework/docs/guides/testing-guide.md +1 -1
- package/.framework/docs/runtime-types.md +72 -72
- package/.framework/functions/_shared/access.ts +84 -0
- package/.framework/functions/_shared/agent-runner.ts +5051 -1026
- package/.framework/functions/_shared/app-manifest.ts +214 -94
- package/.framework/functions/_shared/ast.ts +214 -0
- package/.framework/functions/_shared/audit.ts +91 -55
- package/.framework/functions/_shared/cil.ts +368 -127
- package/.framework/functions/_shared/db.ts +337 -68
- package/.framework/functions/_shared/funnel.ts +228 -0
- package/.framework/functions/_shared/geo.ts +105 -0
- package/.framework/functions/_shared/hash-api-key.ts +94 -17
- package/.framework/functions/_shared/index.ts +22 -224
- package/.framework/functions/_shared/kb.ts +832 -58
- package/.framework/functions/_shared/llm.ts +118 -18
- package/.framework/functions/_shared/logging.ts +317 -19
- package/.framework/functions/_shared/middleware.ts +701 -131
- package/.framework/functions/_shared/notify.ts +70 -0
- package/.framework/functions/_shared/outcomes.ts +34 -19
- package/.framework/functions/_shared/permissions.ts +501 -315
- package/.framework/functions/_shared/pipeline-runner.ts +704 -155
- package/.framework/functions/_shared/principal.ts +436 -263
- package/.framework/functions/_shared/rate-limit.ts +233 -0
- package/.framework/functions/_shared/resolve-credentials.ts +86 -19
- package/.framework/functions/_shared/resolve-ids.ts +203 -139
- package/.framework/functions/_shared/retry-deliveries.ts +51 -16
- package/.framework/functions/_shared/schema-utils.ts +602 -521
- package/.framework/functions/_shared/security.ts +345 -0
- package/.framework/functions/_shared/testing.ts +197 -172
- package/.framework/functions/_shared/tracing.ts +351 -21
- package/.framework/functions/_shared/trigger-engine.ts +425 -136
- package/.framework/functions/_shared/webhook-registration.ts +71 -70
- package/.framework/functions/_shared/webhook-registry.ts +126 -83
- package/.framework/functions/account-nodes.ts +30 -30
- package/.framework/functions/adapters/generic-webhook-inbound.ts +49 -16
- package/.framework/functions/adapters/generic-webhook-outbound.ts +17 -17
- package/.framework/functions/adapters/openai-outbound.ts +15 -16
- package/.framework/functions/admin-data.ts +596 -173
- package/.framework/functions/admin-funnel.ts +64 -60
- package/.framework/functions/admin-install-funnel.ts +84 -66
- package/.framework/functions/admin-signals.ts +69 -51
- package/.framework/functions/ai-agents.ts +431 -106
- package/.framework/functions/ai-interactions.ts +186 -112
- package/.framework/functions/api-keys.ts +107 -107
- package/.framework/functions/apps.ts +154 -136
- package/.framework/functions/auth.ts +83 -65
- package/.framework/functions/cil-agent-ingest.ts +189 -232
- package/.framework/functions/cil-agent.ts +433 -177
- package/.framework/functions/cil-callmap.ts +642 -430
- package/.framework/functions/cil-config.ts +139 -135
- package/.framework/functions/cil-context.ts +214 -127
- package/.framework/functions/cil-doc.ts +587 -458
- package/.framework/functions/cil-embeddings.ts +453 -364
- package/.framework/functions/cil-graph.ts +427 -142
- package/.framework/functions/cil-ingest.ts +1418 -1154
- package/.framework/functions/cil-pipeline.ts +276 -21
- package/.framework/functions/cil-project.ts +659 -132
- package/.framework/functions/cil-validate.ts +198 -164
- package/.framework/functions/debug-auth.ts +57 -55
- package/.framework/functions/deliveries.ts +80 -21
- package/.framework/functions/embeddings.ts +1023 -318
- package/.framework/functions/eval-harness.ts +146 -108
- package/.framework/functions/integration-outbound.ts +205 -75
- package/.framework/functions/integration-routes.ts +128 -23
- package/.framework/functions/integrations.ts +125 -100
- package/.framework/functions/invites.ts +1095 -460
- package/.framework/functions/item-progress.ts +158 -102
- package/.framework/functions/kb.ts +34 -10
- package/.framework/functions/logs.ts +133 -133
- package/.framework/functions/observability.ts +152 -122
- package/.framework/functions/pipeline-executions.ts +147 -132
- package/.framework/functions/pipelines.ts +134 -119
- package/.framework/functions/prompt-configs.ts +96 -80
- package/.framework/functions/roles.ts +112 -82
- package/.framework/functions/security.ts +450 -0
- package/.framework/functions/system-cron.ts +117 -80
- package/.framework/functions/system.ts +158 -98
- package/.framework/functions/tests.ts +29 -29
- package/.framework/functions/timers.ts +94 -95
- package/.framework/functions/trigger-scheduler.ts +10 -0
- package/.framework/functions/triggers.ts +179 -149
- package/.framework/functions/types.ts +137 -125
- package/.framework/mcp/index.ts +133 -0
- package/.framework/mcp/load-env.ts +60 -0
- package/.framework/mcp/shared/app-manifest.ts +275 -0
- package/.framework/mcp/shared/db.ts +477 -0
- package/.framework/mcp/shared/kb.ts +118 -0
- package/.framework/mcp/tools/architect.ts +431 -0
- package/.framework/mcp/tools/cil/context.ts +345 -0
- package/.framework/mcp/tools/cil/graph.ts +242 -0
- package/.framework/mcp/tools/cil/ingest.ts +1217 -0
- package/.framework/mcp/tools/cil/pipeline-orchestrator.ts +693 -0
- package/.framework/mcp/tools/cil/pipeline.ts +767 -0
- package/.framework/mcp/tools/cil/project.ts +791 -0
- package/.framework/mcp/tools/cil/retrieval.ts +336 -0
- package/.framework/mcp/tools/cil/search-core.ts +454 -0
- package/.framework/mcp/tools/cil/search.ts +97 -0
- package/.framework/mcp/tools/cil/suggest.ts +186 -0
- package/.framework/mcp/tools/cil/validate.ts +1369 -0
- package/.framework/mcp/tools/kb/delete.ts +139 -0
- package/.framework/mcp/tools/kb/index.ts +52 -0
- package/.framework/mcp/tools/kb/ingest.ts +84 -0
- package/.framework/mcp/tools/kb/list-types.ts +102 -0
- package/.framework/mcp/tools/kb/publish.ts +100 -0
- package/.framework/mcp/tools/kb/reindex.ts +86 -0
- package/.framework/mcp/tools/kb/revoke.ts +85 -0
- package/.framework/mcp/tools/kb/search.ts +101 -0
- package/.framework/mcp/tools/kb/upsert.ts +125 -0
- package/.framework/mcp/tools/observability.ts +510 -0
- package/.framework/migrations/001_core_schema.sql +15 -0
- package/.framework/migrations/002_core_rls_and_functions.sql +15 -0
- package/.framework/migrations/003_core_system_data.sql +16 -1
- package/.framework/migrations/004_core_rpc_and_broker.sql +17 -1
- package/.framework/migrations/005_core_observability.sql +17 -1
- package/.framework/migrations/006_security_hardening_rls.sql +15 -0
- package/.framework/migrations/007_kb_article_list.sql +17 -1
- package/.framework/migrations/008_items_target.sql +15 -0
- package/.framework/migrations/009_roles_slug_unique.sql +15 -0
- package/.framework/migrations/010_auth_user_trigger.sql +15 -0
- package/.framework/migrations/011_spine_system_account.sql +16 -0
- package/.framework/migrations/012_service_role_grants.sql +16 -0
- package/.framework/migrations/013_get_account_apps_role_filter.sql +15 -0
- package/.framework/migrations/014_apps_required_roles.sql +16 -0
- package/.framework/migrations/015_types_kind_slug_unique.sql +15 -0
- package/.framework/migrations/016_cil_types.sql +281 -0
- package/.framework/migrations/017_cil_stable_ids.sql +37 -0
- package/.framework/migrations/018_runtime_tables.sql +129 -0
- package/.framework/migrations/019_agent_prompt_columns.sql +56 -0
- package/.framework/migrations/020_schema_reconciliation.sql +67 -0
- package/.framework/migrations/021_kb_embedding_lifecycle.sql +31 -0
- package/.framework/migrations/032_cil_status_migration.sql +73 -0
- package/.framework/migrations/033_cil_versioning.sql +73 -0
- package/.framework/migrations/034_match_embeddings_knn.sql +115 -0
- package/.framework/migrations/035_rate_limits.sql +55 -0
- package/.framework/migrations/036_demo_record_flags.sql +72 -0
- package/.framework/migrations/037_kb_types_canonical.sql +244 -0
- package/.framework/migrations/038_drop_demo_record_flags.sql +38 -0
- package/.framework/migrations/042_registration_hierarchy.sql +309 -0
- package/.framework/migrations/043_policy_actor_cleanup.sql +39 -0
- package/.framework/migrations/044_match_embeddings_filtered_knn.sql +151 -0
- package/.framework/migrations/045_security_critical_rls.sql +139 -0
- package/.framework/migrations/046_security_missing_rls.sql +79 -0
- package/.framework/migrations/047_people_updated_by.sql +27 -0
- package/.framework/migrations/048_watcher_last_seen_at.sql +24 -0
- package/.framework/migrations/049_security_blocklist.sql +148 -0
- package/.framework/migrations/050_notifications.sql +49 -0
- package/.framework/migrations/051_message_agent_fields.sql +74 -0
- package/.framework/migrations/052_registration_security.sql +421 -0
- package/.framework/migrations/053_builtin_action_seeds.sql +66 -0
- package/.framework/migrations/054_kb_ingest_lease.sql +157 -0
- package/.framework/migrations/055_type_id_drift_reconciliation.sql +33 -0
- package/.framework/migrations/056_slug_column_reconciliation.sql +38 -0
- package/.framework/migrations/057_pipelines_slug_identity.sql +14 -0
- package/.framework/migrations/058_account_data_field_declarations.sql +53 -0
- package/.framework/migrations/059_registration_placement_fixes.sql +269 -0
- package/.framework/migrations/060_account_person_record_permissions.sql +38 -0
- package/.framework/migrations/061_fk_dedup.sql +32 -0
- package/.framework/public/spine-logo.svg +10 -3
- package/.framework/scripts/app-install-cli.ts +190 -93
- package/.framework/scripts/assemble-frontend.sh +127 -44
- package/.framework/scripts/assemble-functions.sh +128 -30
- package/.framework/scripts/boundary-check.sh +6 -2
- package/.framework/scripts/build-manifest.sh +24 -68
- package/.framework/scripts/check-core-integrity.sh +15 -76
- package/.framework/scripts/checksum-manifest.mts +343 -0
- package/.framework/scripts/cil-migrate-markers.ts +403 -0
- package/.framework/scripts/fix-cil-markers.mjs +176 -0
- package/.framework/scripts/verify-integrity.sh +21 -57
- package/.framework/scripts/verify-manifest.mts +305 -0
- package/.framework/seeds/types/funnel_signal_use.json +74 -21
- package/.framework/seeds/types/spine_instance.json +73 -21
- package/.framework/src/App.tsx +118 -72
- package/.framework/src/apps/admin/index.tsx +855 -58
- package/.framework/src/components/AppWrapper.tsx +43 -45
- package/.framework/src/components/CustomAppLoader.tsx +160 -116
- package/.framework/src/components/admin/AdminListPage.tsx +46 -44
- package/.framework/src/components/admin/AdminSidebar.tsx +57 -47
- package/.framework/src/components/admin/AdminStatsCard.tsx +46 -44
- package/.framework/src/components/admin/PageInstructions.tsx +98 -2
- package/.framework/src/components/admin/SortableTableHeader.tsx +44 -45
- package/.framework/src/components/app-shell/GenericAppShell.tsx +64 -65
- package/.framework/src/components/app-shell/GenericDetailPage.tsx +44 -47
- package/.framework/src/components/app-shell/GenericListPage.tsx +45 -49
- package/.framework/src/components/app-sidebar.tsx +42 -45
- package/.framework/src/components/auth/ProtectedRoute.tsx +48 -41
- package/.framework/src/components/auth/TurnstileWidget.tsx +27 -0
- package/.framework/src/components/kb/KBArticleEditor.tsx +231 -22
- package/.framework/src/components/kb/KBArticleList.tsx +251 -10
- package/.framework/src/components/layout/AppShell.tsx +51 -45
- package/.framework/src/components/layout/Header.tsx +42 -43
- package/.framework/src/components/layout/Layout.tsx +46 -46
- package/.framework/src/components/layout/Sidebar.tsx +196 -96
- package/.framework/src/components/runtime/DataDetailHeader.tsx +55 -30
- package/.framework/src/components/runtime/DataDetailPage.tsx +31 -269
- package/.framework/src/components/runtime/DataFilters.tsx +49 -74
- package/.framework/src/components/runtime/DataHeader.tsx +53 -32
- package/.framework/src/components/runtime/DataListPage.tsx +51 -155
- package/.framework/src/components/runtime/DataStats.tsx +66 -44
- package/.framework/src/components/runtime/DataTable.tsx +49 -149
- package/.framework/src/components/runtime/SchemaDetailForm.tsx +45 -75
- package/.framework/src/components/runtime/index.ts +119 -16
- package/.framework/src/components/search-form.tsx +46 -29
- package/.framework/src/components/shared/AgentView.tsx +65 -48
- package/.framework/src/components/shared/FieldRenderer.tsx +144 -50
- package/.framework/src/components/shared/InviteManager.tsx +207 -97
- package/.framework/src/components/shared/MemberList.tsx +97 -0
- package/.framework/src/components/shared/SchemaFields.tsx +107 -86
- package/.framework/src/components/ui/DataTable.tsx +80 -68
- package/.framework/src/components/ui/Form.tsx +157 -146
- package/.framework/src/components/ui/ItemCard.tsx +74 -67
- package/.framework/src/components/ui/ItemListView.tsx +73 -68
- package/.framework/src/components/ui/LoadingSpinner.tsx +43 -48
- package/.framework/src/components/ui/Modal.tsx +78 -68
- package/.framework/src/components/ui/RichTextEditor.tsx +89 -69
- package/.framework/src/components/ui/accordion.tsx +85 -86
- package/.framework/src/components/ui/alert-dialog.tsx +197 -184
- package/.framework/src/components/ui/alert.tsx +105 -94
- package/.framework/src/components/ui/aspect-ratio.tsx +57 -43
- package/.framework/src/components/ui/avatar.tsx +122 -107
- package/.framework/src/components/ui/badge.tsx +60 -55
- package/.framework/src/components/ui/breadcrumb.tsx +127 -128
- package/.framework/src/components/ui/button-group.tsx +86 -72
- package/.framework/src/components/ui/button.tsx +71 -50
- package/.framework/src/components/ui/calendar.tsx +72 -57
- package/.framework/src/components/ui/card.tsx +136 -129
- package/.framework/src/components/ui/carousel.tsx +226 -107
- package/.framework/src/components/ui/chart.tsx +252 -147
- package/.framework/src/components/ui/checkbox.tsx +43 -44
- package/.framework/src/components/ui/collapsible.tsx +86 -71
- package/.framework/src/components/ui/combobox.tsx +282 -249
- package/.framework/src/components/ui/command.tsx +158 -146
- package/.framework/src/components/ui/context-menu.tsx +239 -240
- package/.framework/src/components/ui/dialog.tsx +174 -157
- package/.framework/src/components/ui/direction.tsx +72 -56
- package/.framework/src/components/ui/drawer.tsx +168 -169
- package/.framework/src/components/ui/dropdown-menu.tsx +254 -223
- package/.framework/src/components/ui/empty.tsx +131 -120
- package/.framework/src/components/ui/field.tsx +205 -173
- package/.framework/src/components/ui/hover-card.tsx +71 -72
- package/.framework/src/components/ui/input-group.tsx +148 -133
- package/.framework/src/components/ui/input-otp.tsx +99 -86
- package/.framework/src/components/ui/input.tsx +43 -41
- package/.framework/src/components/ui/item.tsx +207 -185
- package/.framework/src/components/ui/kbd.tsx +57 -56
- package/.framework/src/components/ui/label.tsx +45 -41
- package/.framework/src/components/ui/menubar.tsx +268 -236
- package/.framework/src/components/ui/native-select.tsx +85 -86
- package/.framework/src/components/ui/navigation-menu.tsx +166 -156
- package/.framework/src/components/ui/pagination.tsx +131 -141
- package/.framework/src/components/ui/popover.tsx +125 -128
- package/.framework/src/components/ui/progress.tsx +47 -44
- package/.framework/src/components/ui/radio-group.tsx +60 -55
- package/.framework/src/components/ui/resizable.tsx +85 -72
- package/.framework/src/components/ui/scroll-area.tsx +57 -58
- package/.framework/src/components/ui/select.tsx +182 -169
- package/.framework/src/components/ui/separator.tsx +42 -43
- package/.framework/src/components/ui/sheet.tsx +170 -159
- package/.framework/src/components/ui/sidebar.tsx +395 -398
- package/.framework/src/components/ui/skeleton.tsx +42 -43
- package/.framework/src/components/ui/slider.tsx +61 -44
- package/.framework/src/components/ui/sonner.tsx +44 -44
- package/.framework/src/components/ui/spinner.tsx +47 -42
- package/.framework/src/components/ui/switch.tsx +56 -42
- package/.framework/src/components/ui/table-primitives.tsx +272 -132
- package/.framework/src/components/ui/table.tsx +140 -142
- package/.framework/src/components/ui/tabs.tsx +110 -93
- package/.framework/src/components/ui/textarea.tsx +43 -44
- package/.framework/src/components/ui/toggle-group.tsx +87 -71
- package/.framework/src/components/ui/toggle.tsx +56 -56
- package/.framework/src/components/ui/tooltip.tsx +99 -85
- package/.framework/src/contexts/AppContext.tsx +166 -114
- package/.framework/src/contexts/AuthContext.tsx +232 -137
- package/.framework/src/hooks/use-mobile.ts +43 -44
- package/.framework/src/hooks/useApi.ts +185 -172
- package/.framework/src/hooks/useAppPath.ts +31 -29
- package/.framework/src/hooks/useApps.ts +77 -42
- package/.framework/src/hooks/useEntityList.ts +66 -29
- package/.framework/src/hooks/useEntityRecord.ts +76 -32
- package/.framework/src/hooks/useForm.ts +62 -30
- package/.framework/src/hooks/useListSchema.ts +60 -43
- package/.framework/src/hooks/useSchemaRecord.ts +115 -95
- package/.framework/src/lib/api.ts +258 -134
- package/.framework/src/lib/registration.ts +181 -0
- package/.framework/src/lib/supabase.ts +118 -81
- package/.framework/src/lib/utils.ts +266 -266
- package/.framework/src/main.tsx +43 -44
- package/.framework/src/pages/DashboardPage.tsx +44 -43
- package/.framework/src/pages/NoAppPage.tsx +50 -0
- package/.framework/src/pages/NotFoundPage.tsx +32 -29
- package/.framework/src/pages/SetupPage.tsx +34 -33
- package/.framework/src/pages/admin/AIAgentDetailPage.tsx +69 -58
- package/.framework/src/pages/admin/AIAgentsPage.tsx +43 -40
- package/.framework/src/pages/admin/APIKeyDetailPage.tsx +63 -55
- package/.framework/src/pages/admin/APIKeysPage.tsx +44 -42
- package/.framework/src/pages/admin/AlertsConfigPage.tsx +117 -94
- package/.framework/src/pages/admin/AppDetailPage.tsx +48 -42
- package/.framework/src/pages/admin/AppsPage.tsx +45 -42
- package/.framework/src/pages/admin/DeliveriesPage.tsx +49 -17
- package/.framework/src/pages/admin/DesignedPage.tsx +31 -30
- package/.framework/src/pages/admin/EmbeddingDetailPage.tsx +58 -0
- package/.framework/src/pages/admin/EmbeddingsPage.tsx +49 -0
- package/.framework/src/pages/admin/ExtendedShadcnTestPage.tsx +31 -29
- package/.framework/src/pages/admin/IncrementalShadcnTestPage.tsx +46 -29
- package/.framework/src/pages/admin/IntegratedDashboard.tsx +32 -29
- package/.framework/src/pages/admin/IntegrationDetailPage.tsx +68 -55
- package/.framework/src/pages/admin/IntegrationsPage.tsx +45 -42
- package/.framework/src/pages/admin/InvitesPage.tsx +60 -44
- package/.framework/src/pages/admin/LogsPage.tsx +87 -137
- package/.framework/src/pages/admin/MinimalShadcnTestPage.tsx +31 -29
- package/.framework/src/pages/admin/ObservabilityDashboard.tsx +150 -89
- package/.framework/src/pages/admin/PipelineDetailPage.tsx +77 -104
- package/.framework/src/pages/admin/PipelineExecutionsPage.tsx +44 -43
- package/.framework/src/pages/admin/PipelinesPage.tsx +59 -145
- package/.framework/src/pages/admin/PromptConfigDetailPage.tsx +53 -42
- package/.framework/src/pages/admin/PromptConfigsPage.tsx +47 -117
- package/.framework/src/pages/admin/ProperlyDesignedPage.tsx +31 -44
- package/.framework/src/pages/admin/RoleDetailPage.tsx +49 -92
- package/.framework/src/pages/admin/RolesPage.tsx +47 -164
- package/.framework/src/pages/admin/SecurityPage.tsx +310 -0
- package/.framework/src/pages/admin/SelectTestPage.tsx +30 -32
- package/.framework/src/pages/admin/ShadcnTestPage.tsx +37 -44
- package/.framework/src/pages/admin/SimpleDashboard.tsx +32 -44
- package/.framework/src/pages/admin/TestRunDetailPage.tsx +97 -44
- package/.framework/src/pages/admin/TestingDashboard.tsx +126 -71
- package/.framework/src/pages/admin/TimerDetailPage.tsx +67 -55
- package/.framework/src/pages/admin/TimersPage.tsx +44 -42
- package/.framework/src/pages/admin/TriggerDetailPage.tsx +47 -42
- package/.framework/src/pages/admin/TriggersPage.tsx +58 -57
- package/.framework/src/pages/admin/TypeDetailPage.tsx +91 -55
- package/.framework/src/pages/admin/TypesPage.tsx +45 -42
- package/.framework/src/pages/admin/cil/CILAgentPage.tsx +258 -128
- package/.framework/src/pages/admin/cil/CILChunkDetailPage.tsx +127 -123
- package/.framework/src/pages/admin/cil/CILDashboardPage.tsx +308 -235
- package/.framework/src/pages/admin/cil/CILFileListPage.tsx +159 -110
- package/.framework/src/pages/admin/cil/CILFileSelectPage.tsx +432 -0
- package/.framework/src/pages/admin/cil/CILGraphPage.tsx +200 -178
- package/.framework/src/pages/admin/cil/CILIngestionPage.tsx +286 -239
- package/.framework/src/pages/admin/cil/CILProjectsPage.tsx +211 -90
- package/.framework/src/pages/admin/cil/CILSearchPage.tsx +156 -143
- package/.framework/src/pages/admin/cil/CILSuggestionsPage.tsx +379 -0
- package/.framework/src/pages/admin/cil/CILVersionsPage.tsx +337 -0
- package/.framework/src/pages/admin/cil/FlexiblePipelinePage.tsx +219 -214
- package/.framework/src/pages/admin/kb/KBAdminPage.tsx +64 -0
- package/.framework/src/pages/auth/AuthConfirmPage.tsx +135 -65
- package/.framework/src/pages/auth/ForgotPasswordPage.tsx +39 -31
- package/.framework/src/pages/auth/LoginPage.tsx +38 -32
- package/.framework/src/pages/auth/PendingApprovalPage.tsx +31 -28
- package/.framework/src/pages/auth/RegisterPage.tsx +429 -155
- package/.framework/src/pages/spine-framework/APIPage.tsx +33 -30
- package/.framework/src/pages/spine-framework/CLIPage.tsx +32 -30
- package/.framework/src/types/auth.ts +101 -93
- package/.framework/src/types/types.ts +283 -262
- package/.framework/templates/project.json +87 -0
- package/.framework/templates/spine.config.neutral.json +7 -0
- package/.framework/tests/api/api-surface.test.ts +381 -0
- package/.framework/tests/fixtures/seed.ts +427 -0
- package/.framework/tests/fixtures/teardown.ts +228 -0
- package/.framework/tests/reporter.ts +351 -0
- package/.framework/tests/setup.ts +135 -0
- package/.framework/tests/ui/ui-sweep.ts +278 -0
- package/.framework/tests/unit/admin-data-logger.test.ts +310 -0
- package/.framework/tests/unit/agent-runner.test.ts +2389 -0
- package/.framework/tests/unit/ai-interactions.test.ts +81 -0
- package/.framework/tests/unit/app-manifest.test.ts +359 -0
- package/.framework/tests/unit/assembly-scripts.test.ts +172 -0
- package/.framework/tests/unit/cil-determinism.test.ts +85 -0
- package/.framework/tests/unit/core-isolation.test.ts +153 -0
- package/.framework/tests/unit/funnel-signals.test.ts +135 -0
- package/.framework/tests/unit/install-app.test.ts +1759 -0
- package/.framework/tests/unit/invites-security.test.ts +572 -0
- package/.framework/tests/unit/kb-ingest-lease.test.ts +287 -0
- package/.framework/tests/unit/kb-search.test.ts +119 -0
- package/.framework/tests/unit/migrate.test.ts +509 -0
- package/.framework/tests/unit/notify.test.ts +136 -0
- package/.framework/tests/unit/permissions.test.ts +269 -0
- package/.framework/tests/unit/pipeline-runner.test.ts +755 -0
- package/.framework/tests/unit/principal-cache.test.ts +138 -0
- package/.framework/tests/unit/retrieval-golden.test.ts +520 -0
- package/.framework/tests/unit/runtime-isolation.test.ts +642 -0
- package/.framework/tests/unit/schema-utils.test.ts +225 -0
- package/.framework/tests/unit/trigger-engine.test.ts +513 -0
- package/.framework/tests/unit/validate-app.test.ts +527 -0
- package/README.md +34 -3
- package/bin/spine-framework.cjs +1 -0
- package/config/tailwind.config.cjs +7 -0
- package/config/tsconfig.functions.json +42 -0
- package/config/tsconfig.json +37 -9
- package/config/vite.config.ts +31 -2
- package/netlify.toml +31 -3
- package/package.json +46 -29
- package/scripts/assemble-frontend.sh +127 -44
- package/scripts/assemble-functions.sh +127 -29
- package/scripts/boundary-check.sh +6 -2
- package/scripts/build-manifest.sh +24 -68
- package/scripts/checksum-manifest.mts +345 -0
- package/scripts/dev-clean.sh +86 -0
- package/scripts/dev-netlify.sh +49 -0
- package/scripts/netlify-dev-wrapper.sh +2 -0
- package/scripts/verify-install.ts +358 -0
- package/scripts/verify-integrity.sh +21 -57
- package/scripts/verify-manifest.mts +305 -0
- package/templates/project/gitignore +45 -0
- package/{config → templates/project}/package-lock.json +22335 -9366
- package/vitest.config.ts +46 -0
- package/.framework/public/spine.config.json +0 -91
- package/config/deno.lock +0 -108
- package/config/tsconfig.node.tsbuildinfo +0 -1
- package/config/tsconfig.tsbuildinfo +0 -1
- package/config/vite.config.d.ts +0 -2
- package/custom/.devin/AGENT.md +0 -357
- package/custom/.devin/skills/install-app/SKILL.md +0 -39
- package/custom/.devin/skills/spine-workbench-discovery/SKILL.md +0 -39
- package/custom/.devin/skills/spine-workbench-idea/SKILL.md +0 -36
- package/custom/.devin/skills/spine-workbench-implement/SKILL.md +0 -46
- package/custom/.devin/skills/spine-workbench-initiative/SKILL.md +0 -28
- package/custom/.devin/skills/spine-workbench-plan/SKILL.md +0 -38
- package/custom/.devin/workflows/app-install.yaml +0 -83
- package/custom/README.md +0 -79
- package/docs/README.md +0 -15
- package/scripts/app-install-cli.ts +0 -286
- package/scripts/check-core-integrity.sh +0 -82
- package/scripts/ingest-chunks.cjs +0 -202
- package/scripts/kb-chunk-parser.cjs +0 -312
- package/scripts/kb-chunk-parser.ts +0 -330
- package/scripts/kb-ingest-docs.ts +0 -203
- package/scripts/load-test-app-install.ts +0 -484
- package/scripts/test-login.js +0 -33
- package/spine.config.json +0 -91
|
@@ -1,34 +1,74 @@
|
|
|
1
|
+
// CIL[BEGIN stable_id="~/.framework/src/components/shared/InviteManager.tsx:module_header:module_header" type="module_header" identity="module_header" parent="~/.framework/src/components/shared/InviteManager.tsx"]
|
|
2
|
+
// CIL[DOC-MACRO purpose="Provide shared InviteManager React component and related type definitions"]
|
|
3
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Import React hooks, utility API client, and declare exported types for invite management"]
|
|
4
|
+
// CIL[DOC-CONTEXT module="components/shared" layer="ui" related_files=".framework/src/lib/api.ts"]
|
|
5
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="InviteManager component, InviteScope, AllowedRole, InviteManagerProps, InviteRow, and helper functions" errors="none" side_effects="none"]
|
|
6
|
+
// CIL[DOC-MICRO logic_summary="Import React hooks and apiFetch, then define types and the InviteManager component" notable_decisions="[]"]
|
|
7
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
8
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
9
|
+
// CIL[DOC-AUDIENCE audience="framework-developers,ui-developers"]
|
|
1
10
|
|
|
2
11
|
|
|
12
|
+
import React, { useState, useEffect, useCallback, useMemo } from 'react'
|
|
13
|
+
import { apiFetch } from '../../lib/api'
|
|
14
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Provide shared InviteManager React component and related type definitions'; No verified external callers; imports: .framework/src/lib/api.ts"]
|
|
15
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
16
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
17
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
18
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
19
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
20
|
+
// CIL[END stable_id="~/.framework/src/components/shared/InviteManager.tsx:module_header:module_header"]
|
|
3
21
|
|
|
4
22
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
// CIL[
|
|
9
|
-
// CIL[DOC-
|
|
10
|
-
// CIL[DOC-
|
|
11
|
-
// CIL[DOC-
|
|
12
|
-
// CIL[DOC-CONTRACT inputs="none" outputs="Imported modules and interfaces" errors="none" side_effects="none"]
|
|
13
|
-
// CIL[DOC-MICRO logic_summary="Imports React hooks and API, defines invite-related types and interfaces" notable_decisions="[]"]
|
|
14
|
-
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
23
|
+
// CIL[BEGIN stable_id="~/.framework/src/components/shared/InviteManager.tsx:invitescope:type" type="type" identity="invitescope" parent="~/.framework/src/components/shared/InviteManager.tsx:module_header:module_header"]
|
|
24
|
+
// CIL[DOC-MACRO purpose="Define the possible scopes for an invite"]
|
|
25
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Constrain invite scope to account or system"]
|
|
26
|
+
// CIL[DOC-CONTEXT module="components/shared" layer="ui" related_files=".framework/src/components/shared/InviteManager.tsx,.framework/src/lib/api.ts"]
|
|
27
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="InviteScope union type" errors="none" side_effects="none"]
|
|
28
|
+
// CIL[DOC-MICRO logic_summary="Export a string-literal union for invite scope values" notable_decisions="[]"]
|
|
29
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
15
30
|
// CIL[DOC-STABILITY stability="stable"]
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
// CIL[DOC-VECTOR type="
|
|
19
|
-
// CIL[DOC-VECTOR type="
|
|
20
|
-
// CIL[DOC-VECTOR type="
|
|
31
|
+
|
|
32
|
+
export type InviteScope = 'account' | 'system'
|
|
33
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Define the possible scopes for an invite'; No verified external callers; imports: .framework/src/lib/api.ts"]
|
|
34
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
35
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
36
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
21
37
|
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
22
38
|
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
23
|
-
|
|
24
|
-
import { apiFetch } from '../../lib/api'
|
|
39
|
+
// CIL[END stable_id="~/.framework/src/components/shared/InviteManager.tsx:invitescope:type"]
|
|
25
40
|
|
|
26
|
-
|
|
41
|
+
|
|
42
|
+
// CIL[BEGIN stable_id="~/.framework/src/components/shared/InviteManager.tsx:allowedrole:interface" type="interface" identity="allowedrole" parent="~/.framework/src/components/shared/InviteManager.tsx:module_header:module_header"]
|
|
43
|
+
// CIL[DOC-MACRO purpose="Describe an allowed role selection entry"]
|
|
44
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Define the slug and display name of a role that can be assigned in an invite"]
|
|
45
|
+
// CIL[DOC-CONTEXT module="components/shared" layer="ui" related_files=".framework/src/components/shared/InviteManager.tsx,.framework/src/lib/api.ts"]
|
|
46
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="AllowedRole interface" errors="none" side_effects="none"]
|
|
47
|
+
// CIL[DOC-MICRO logic_summary="Declare an object with role slug and human-readable name" notable_decisions="[]"]
|
|
48
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
49
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
27
50
|
|
|
28
51
|
export interface AllowedRole {
|
|
29
52
|
slug: string
|
|
30
53
|
name: string
|
|
31
54
|
}
|
|
55
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Describe an allowed role selection entry'; No verified external callers; imports: .framework/src/lib/api.ts"]
|
|
56
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
57
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
58
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
59
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
60
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
61
|
+
// CIL[END stable_id="~/.framework/src/components/shared/InviteManager.tsx:allowedrole:interface"]
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
// CIL[BEGIN stable_id="~/.framework/src/components/shared/InviteManager.tsx:InviteManagerProps:interface" type="interface" identity="InviteManagerProps" parent="~/.framework/src/components/shared/InviteManager.tsx:module_header:module_header"]
|
|
65
|
+
// CIL[DOC-MACRO purpose="Define props consumed by the InviteManager component"]
|
|
66
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Type check the account id, allowed roles, optional role filter, and scope passed to InviteManager"]
|
|
67
|
+
// CIL[DOC-CONTEXT module="components/shared" layer="ui" related_files=".framework/src/components/shared/InviteManager.tsx,.framework/src/lib/api.ts"]
|
|
68
|
+
// CIL[DOC-CONTRACT inputs="props object" outputs="InviteManagerProps interface" errors="none" side_effects="none"]
|
|
69
|
+
// CIL[DOC-MICRO logic_summary="Declare optional accountId, allowedRoles array, optional roleSlugsFilter, and scope" notable_decisions="[]"]
|
|
70
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
71
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
32
72
|
|
|
33
73
|
export interface InviteManagerProps {
|
|
34
74
|
accountId?: string
|
|
@@ -36,6 +76,23 @@ export interface InviteManagerProps {
|
|
|
36
76
|
roleSlugsFilter?: string
|
|
37
77
|
scope: InviteScope
|
|
38
78
|
}
|
|
79
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Define props consumed by the InviteManager component'; No verified external callers; imports: .framework/src/lib/api.ts"]
|
|
80
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
81
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
82
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
83
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
84
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
85
|
+
// CIL[END stable_id="~/.framework/src/components/shared/InviteManager.tsx:InviteManagerProps:interface"]
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
// CIL[BEGIN stable_id="~/.framework/src/components/shared/InviteManager.tsx:InviteRow:interface" type="interface" identity="InviteRow" parent="~/.framework/src/components/shared/InviteManager.tsx:module_header:module_header"]
|
|
89
|
+
// CIL[DOC-MACRO purpose="Describe the shape of an invite or access request record"]
|
|
90
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Define the fields returned from the invites API including status, expiration, blocking, and related account and role"]
|
|
91
|
+
// CIL[DOC-CONTEXT module="components/shared" layer="ui" related_files=".framework/src/components/shared/InviteManager.tsx,.framework/src/lib/api.ts"]
|
|
92
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="InviteRow interface" errors="none" side_effects="none"]
|
|
93
|
+
// CIL[DOC-MICRO logic_summary="Declare all fields for a single invite row with their statuses and timestamps" notable_decisions="[]"]
|
|
94
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
95
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
39
96
|
|
|
40
97
|
interface InviteRow {
|
|
41
98
|
id: string
|
|
@@ -49,21 +106,23 @@ interface InviteRow {
|
|
|
49
106
|
account: { id: string; slug: string; display_name: string } | null
|
|
50
107
|
role: { id: string; slug: string; name: string } | null
|
|
51
108
|
}
|
|
52
|
-
// CIL[
|
|
53
|
-
// CIL[
|
|
54
|
-
// CIL[DOC-
|
|
55
|
-
// CIL[DOC-
|
|
56
|
-
// CIL[DOC-CONTEXT module="invite-manager" layer="frontend-component" related_files="[\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\".framework/src/pages/admin/RolesPage.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/components/ui/table-primitives.tsx\",\"\\\"]"]
|
|
57
|
-
// CIL[DOC-CONTRACT inputs="none" outputs="API response JSON" errors="API errors" side_effects="Network requests"]
|
|
58
|
-
// CIL[DOC-MICRO logic_summary="Builds query strings for GET, sends JSON for POST to invites endpoint" notable_decisions="[]"]
|
|
59
|
-
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
60
|
-
// CIL[DOC-STABILITY stability="stable"]
|
|
61
|
-
// CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 1. Direct calls: 0. Related files: custom/apps/cortex/functions/custom_cil-embeddings.ts, .framework/src/pages/admin/RolesPage.tsx, custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/components/ui/table-primitives.tsx, \."]
|
|
62
|
-
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 1. Total affected: 1."]
|
|
63
|
-
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
64
|
-
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
109
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Describe the shape of an invite or access request record'; No verified external callers; imports: .framework/src/lib/api.ts"]
|
|
110
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
111
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
112
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
65
113
|
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
66
114
|
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
115
|
+
// CIL[END stable_id="~/.framework/src/components/shared/InviteManager.tsx:InviteRow:interface"]
|
|
116
|
+
|
|
117
|
+
// CIL[BEGIN stable_id="~/.framework/src/components/shared/InviteManager.tsx:callInvitesApi:function" type="function" identity="callInvitesApi" parent="~/.framework/src/components/shared/InviteManager.tsx:module_header:module_header"]
|
|
118
|
+
// CIL[DOC-MACRO purpose="Call the Netlify invites function endpoint"]
|
|
119
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Build GET or POST requests to the /.netlify/functions/invites endpoint and return JSON"]
|
|
120
|
+
// CIL[DOC-CONTEXT module="components/shared" layer="ui" related_files=".framework/src/components/shared/InviteManager.tsx,.framework/src/lib/api.ts"]
|
|
121
|
+
// CIL[DOC-CONTRACT inputs="action: string, params: Record<string, any>, method: GET | POST" outputs="JSON response body from apiFetch" errors="throws if fetch fails" side_effects="makes HTTP request to invites function"]
|
|
122
|
+
// CIL[DOC-MICRO logic_summary="Serialize parameters to query string for GET or JSON body for POST and await apiFetch" notable_decisions="[]"]
|
|
123
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
124
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
125
|
+
|
|
67
126
|
async function callInvitesApi(action: string, params: Record<string, any> = {}, method: 'GET' | 'POST' = 'GET') {
|
|
68
127
|
const base = '/.netlify/functions/invites'
|
|
69
128
|
if (method === 'GET') {
|
|
@@ -78,21 +137,23 @@ async function callInvitesApi(action: string, params: Record<string, any> = {},
|
|
|
78
137
|
})
|
|
79
138
|
return res.json()
|
|
80
139
|
}
|
|
81
|
-
// CIL[
|
|
82
|
-
// CIL[
|
|
83
|
-
// CIL[DOC-
|
|
84
|
-
// CIL[DOC-
|
|
85
|
-
// CIL[DOC-CONTEXT module="invite-manager" layer="frontend-component" related_files="[\".framework/src/pages/admin/RolesPage.tsx\",\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\".framework/functions/_shared/schema-utils.ts\",\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"\\\"]"]
|
|
86
|
-
// CIL[DOC-CONTRACT inputs="none" outputs="Display status string" errors="none" side_effects="none"]
|
|
87
|
-
// CIL[DOC-MICRO logic_summary="Handles special cases like expiration, blocking, and invite vs access request" notable_decisions="[]"]
|
|
88
|
-
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
89
|
-
// CIL[DOC-STABILITY stability="stable"]
|
|
90
|
-
// CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 1. Direct calls: 0. Related files: .framework/src/pages/admin/RolesPage.tsx, custom/apps/cortex/functions/custom_cil-embeddings.ts, .framework/functions/_shared/schema-utils.ts, custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, \."]
|
|
91
|
-
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 1. Total affected: 1."]
|
|
92
|
-
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
93
|
-
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
140
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Call the Netlify invites function endpoint'; No verified external callers; imports: .framework/src/lib/api.ts"]
|
|
141
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
142
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
143
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
94
144
|
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
95
145
|
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
146
|
+
// CIL[END stable_id="~/.framework/src/components/shared/InviteManager.tsx:callInvitesApi:function"]
|
|
147
|
+
|
|
148
|
+
// CIL[BEGIN stable_id="~/.framework/src/components/shared/InviteManager.tsx:deriveDisplayStatus:function" type="function" identity="deriveDisplayStatus" parent="~/.framework/src/components/shared/InviteManager.tsx:module_header:module_header"]
|
|
149
|
+
// CIL[DOC-MACRO purpose="Map an InviteRow status to a human-readable display status"]
|
|
150
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Interpret blocked, inactive, active, pending, and invited states to produce a UI label"]
|
|
151
|
+
// CIL[DOC-CONTEXT module="components/shared" layer="ui" related_files=".framework/src/components/shared/InviteManager.tsx,.framework/src/lib/api.ts"]
|
|
152
|
+
// CIL[DOC-CONTRACT inputs="row: InviteRow" outputs="human-readable status string" errors="none" side_effects="none"]
|
|
153
|
+
// CIL[DOC-MICRO logic_summary="Check blocked_at first, then status and kind, then expiration for invited rows" notable_decisions="[]"]
|
|
154
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
155
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
156
|
+
|
|
96
157
|
function deriveDisplayStatus(row: InviteRow): string {
|
|
97
158
|
if (row.blocked_at) return 'blocked'
|
|
98
159
|
if (row.status === 'inactive') return 'revoked'
|
|
@@ -105,21 +166,24 @@ function deriveDisplayStatus(row: InviteRow): string {
|
|
|
105
166
|
}
|
|
106
167
|
return row.status
|
|
107
168
|
}
|
|
108
|
-
// CIL[
|
|
109
|
-
// CIL[
|
|
110
|
-
// CIL[DOC-
|
|
111
|
-
// CIL[DOC-
|
|
112
|
-
// CIL[DOC-CONTEXT module="invite-manager" layer="frontend-component" related_files="[\".framework/src/pages/admin/RolesPage.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\".framework/functions/_shared/schema-utils.ts\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"\\\"]"]
|
|
113
|
-
// CIL[DOC-CONTRACT inputs="none" outputs="CSS class mapping object" errors="none" side_effects="none"]
|
|
114
|
-
// CIL[DOC-MICRO logic_summary="Maps status strings to Tailwind color classes for consistent styling" notable_decisions="[]"]
|
|
115
|
-
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
116
|
-
// CIL[DOC-STABILITY stability="stable"]
|
|
117
|
-
// CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/RolesPage.tsx, .framework/functions/_shared/principal.ts, .framework/src/pages/admin/IntegrationsPage.tsx, .framework/functions/_shared/schema-utils.ts, .framework/src/pages/admin/TypeDetailPage.tsx, \."]
|
|
118
|
-
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
119
|
-
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
120
|
-
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
169
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Map an InviteRow status to a human-readable display status'; No verified external callers; imports: .framework/src/lib/api.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"]
|
|
121
173
|
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
122
174
|
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
175
|
+
// CIL[END stable_id="~/.framework/src/components/shared/InviteManager.tsx:deriveDisplayStatus:function"]
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
// CIL[BEGIN stable_id="~/.framework/src/components/shared/InviteManager.tsx:status_classes:constant" type="constant" identity="status_classes" parent="~/.framework/src/components/shared/InviteManager.tsx:module_header:module_header"]
|
|
179
|
+
// CIL[DOC-MACRO purpose="Provide Tailwind color classes for display status badges"]
|
|
180
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Map each display status label to a background and text color class string"]
|
|
181
|
+
// CIL[DOC-CONTEXT module="components/shared" layer="ui" related_files=".framework/src/components/shared/InviteManager.tsx,.framework/src/lib/api.ts"]
|
|
182
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="STATUS_CLASSES record" errors="none" side_effects="none"]
|
|
183
|
+
// CIL[DOC-MICRO logic_summary="Define a Record from display status strings to Tailwind utility classes" notable_decisions="[]"]
|
|
184
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
185
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
186
|
+
|
|
123
187
|
const STATUS_CLASSES: Record<string, string> = {
|
|
124
188
|
pending: 'bg-yellow-100 text-yellow-800',
|
|
125
189
|
'pending approval': 'bg-blue-100 text-blue-800',
|
|
@@ -129,21 +193,25 @@ const STATUS_CLASSES: Record<string, string> = {
|
|
|
129
193
|
blocked: 'bg-red-100 text-red-800',
|
|
130
194
|
revoked: 'bg-slate-100 text-slate-500',
|
|
131
195
|
}
|
|
132
|
-
// CIL[
|
|
133
|
-
// CIL[
|
|
134
|
-
// CIL[DOC-
|
|
135
|
-
// CIL[DOC-
|
|
136
|
-
// CIL[DOC-CONTEXT module="invite-manager" layer="frontend-component" related_files="[\".framework/functions/_shared/schema-utils.ts\",\"\\\"]"]
|
|
137
|
-
// CIL[DOC-CONTRACT inputs="none" outputs="Time remaining string" errors="none" side_effects="none"]
|
|
138
|
-
// CIL[DOC-MICRO logic_summary="Computes time difference, returns days/hours or 'expired' if past" notable_decisions="[]"]
|
|
139
|
-
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
140
|
-
// CIL[DOC-STABILITY stability="stable"]
|
|
141
|
-
// CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 1. Direct calls: 0. Related files: .framework/functions/_shared/schema-utils.ts, \."]
|
|
142
|
-
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 1. Total affected: 1."]
|
|
143
|
-
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
144
|
-
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
196
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Provide Tailwind color classes for display status badges'; No verified external callers; imports: .framework/src/lib/api.ts"]
|
|
197
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
198
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
199
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
145
200
|
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
146
201
|
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
202
|
+
// CIL[END stable_id="~/.framework/src/components/shared/InviteManager.tsx:status_classes:constant"]
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
// CIL[BEGIN stable_id="~/.framework/src/components/shared/InviteManager.tsx:timeUntil:function" type="function" identity="timeUntil" parent="~/.framework/src/components/shared/InviteManager.tsx:module_header:module_header"]
|
|
207
|
+
// CIL[DOC-MACRO purpose="Format the remaining time until an ISO expiration"]
|
|
208
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Convert an ISO timestamp into days or hours remaining, or a dash if missing"]
|
|
209
|
+
// CIL[DOC-CONTEXT module="components/shared" layer="ui" related_files=".framework/src/components/shared/InviteManager.tsx,.framework/src/lib/api.ts"]
|
|
210
|
+
// CIL[DOC-CONTRACT inputs="iso: string | null" outputs="formatted remaining time string" errors="none" side_effects="none"]
|
|
211
|
+
// CIL[DOC-MICRO logic_summary="Compute difference between target and now, returning days, hours, expired, or em dash" notable_decisions="[]"]
|
|
212
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
213
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
214
|
+
|
|
147
215
|
function timeUntil(iso: string | null): string {
|
|
148
216
|
if (!iso) return '—'
|
|
149
217
|
const diff = new Date(iso).getTime() - Date.now()
|
|
@@ -153,21 +221,23 @@ function timeUntil(iso: string | null): string {
|
|
|
153
221
|
if (days > 0) return `${days}d`
|
|
154
222
|
return `${hours}h`
|
|
155
223
|
}
|
|
156
|
-
// CIL[
|
|
157
|
-
// CIL[
|
|
158
|
-
// CIL[DOC-
|
|
159
|
-
// CIL[DOC-
|
|
160
|
-
// CIL[DOC-CONTEXT module="invite-manager" layer="frontend-component" related_files="[]"]
|
|
161
|
-
// CIL[DOC-CONTRACT inputs="none" outputs="Invite management UI" errors="API errors" side_effects="Renders UI, API calls"]
|
|
162
|
-
// CIL[DOC-MICRO logic_summary="Handles invite generation, listing, searching, sorting, and bulk actions" notable_decisions="[]"]
|
|
163
|
-
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
164
|
-
// CIL[DOC-STABILITY stability="stable"]
|
|
165
|
-
// CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 0. Direct calls: 0. Related files: none."]
|
|
166
|
-
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
167
|
-
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
168
|
-
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
224
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Format the remaining time until an ISO expiration'; No verified external callers; imports: .framework/src/lib/api.ts"]
|
|
225
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
226
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
227
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
169
228
|
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
170
229
|
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
230
|
+
// CIL[END stable_id="~/.framework/src/components/shared/InviteManager.tsx:timeUntil:function"]
|
|
231
|
+
|
|
232
|
+
// CIL[BEGIN stable_id="~/.framework/src/components/shared/InviteManager.tsx:InviteManager:component" type="component" identity="InviteManager" parent="~/.framework/src/components/shared/InviteManager.tsx:module_header:module_header"]
|
|
233
|
+
// CIL[DOC-MACRO purpose="Render an invite management UI for generating and administering invites"]
|
|
234
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Load, search, sort, generate, reinvite, and approve or deny invites in account or system scope"]
|
|
235
|
+
// CIL[DOC-CONTEXT module="components/shared" layer="ui" related_files=".framework/src/components/shared/InviteManager.tsx,.framework/src/lib/api.ts"]
|
|
236
|
+
// CIL[DOC-CONTRACT inputs="accountId, allowedRoles, roleSlugsFilter, scope" outputs="JSX invite list and generation form" errors="sets error state on API failures" side_effects="calls invites API, reads clipboard, updates local state and reloads list"]
|
|
237
|
+
// CIL[DOC-MICRO logic_summary="Maintain invite list, form state, search and sort, handle create, reinvite, approve and deny actions, and render a table of rows with status badges and action buttons" notable_decisions="[]"]
|
|
238
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
239
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
240
|
+
|
|
171
241
|
export function InviteManager({ accountId, allowedRoles, roleSlugsFilter, scope }: InviteManagerProps) {
|
|
172
242
|
const [invites, setInvites] = useState<InviteRow[]>([])
|
|
173
243
|
const [loading, setLoading] = useState(true)
|
|
@@ -428,15 +498,39 @@ export function InviteManager({ accountId, allowedRoles, roleSlugsFilter, scope
|
|
|
428
498
|
</thead>
|
|
429
499
|
<tbody className="divide-y divide-slate-100">
|
|
430
500
|
{filteredInvites.map(row => {
|
|
501
|
+
|
|
502
|
+
|
|
431
503
|
const displayStatus = deriveDisplayStatus(row)
|
|
504
|
+
|
|
505
|
+
|
|
506
|
+
|
|
432
507
|
const isPending = row.status === 'invited' && !row.blocked_at && !(row.expires_at && new Date(row.expires_at) < new Date())
|
|
508
|
+
|
|
509
|
+
|
|
510
|
+
|
|
433
511
|
const isExpired = displayStatus === 'expired'
|
|
512
|
+
|
|
513
|
+
|
|
514
|
+
|
|
434
515
|
const isBlocked = displayStatus === 'blocked'
|
|
516
|
+
|
|
517
|
+
|
|
518
|
+
|
|
435
519
|
const isRevoked = displayStatus === 'revoked'
|
|
520
|
+
|
|
521
|
+
|
|
522
|
+
|
|
436
523
|
const isClaimed = displayStatus === 'claimed'
|
|
524
|
+
|
|
525
|
+
|
|
526
|
+
|
|
437
527
|
const isApproved = displayStatus === 'approved'
|
|
528
|
+
|
|
529
|
+
|
|
530
|
+
|
|
438
531
|
const isAccessReq = row.status === 'pending' && row.kind === 'access_request'
|
|
439
532
|
|
|
533
|
+
|
|
440
534
|
return (
|
|
441
535
|
<tr key={row.id} className="hover:bg-slate-50">
|
|
442
536
|
<td className="px-4 py-3 text-sm text-slate-900">{row.full_name || '—'}</td>
|
|
@@ -556,21 +650,31 @@ export function InviteManager({ accountId, allowedRoles, roleSlugsFilter, scope
|
|
|
556
650
|
</div>
|
|
557
651
|
)
|
|
558
652
|
}
|
|
559
|
-
// CIL[
|
|
560
|
-
// CIL[
|
|
561
|
-
// CIL[DOC-
|
|
562
|
-
// CIL[DOC-
|
|
563
|
-
// CIL[DOC-CONTEXT module="invite-manager" layer="frontend-component" related_files="[]"]
|
|
564
|
-
// CIL[DOC-CONTRACT inputs="none" outputs="Table header element" errors="none" side_effects="Renders UI, calls onSort"]
|
|
565
|
-
// CIL[DOC-MICRO logic_summary="Shows sort arrows and handles click events for column sorting" notable_decisions="[]"]
|
|
566
|
-
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
567
|
-
// CIL[DOC-STABILITY stability="stable"]
|
|
568
|
-
// CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 0. Direct calls: 0. Related files: none."]
|
|
569
|
-
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
570
|
-
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
571
|
-
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
653
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Render an invite management UI for generating and administering invites'; No verified external callers; imports: .framework/src/lib/api.ts"]
|
|
654
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
655
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
656
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
572
657
|
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
573
658
|
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
659
|
+
// CIL[END stable_id="~/.framework/src/components/shared/InviteManager.tsx:InviteManager:component"]
|
|
660
|
+
|
|
661
|
+
|
|
662
|
+
|
|
663
|
+
|
|
664
|
+
|
|
665
|
+
|
|
666
|
+
|
|
667
|
+
|
|
668
|
+
|
|
669
|
+
// CIL[BEGIN stable_id="~/.framework/src/components/shared/InviteManager.tsx:SortTh:component" type="component" identity="SortTh" parent="~/.framework/src/components/shared/InviteManager.tsx:module_header:module_header"]
|
|
670
|
+
// CIL[DOC-MACRO purpose="Render a clickable table header for sorting"]
|
|
671
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Display a column label with ascending, descending, or both indicator and trigger sort callback on click"]
|
|
672
|
+
// CIL[DOC-CONTEXT module="components/shared" layer="ui" related_files=".framework/src/components/shared/InviteManager.tsx,.framework/src/lib/api.ts"]
|
|
673
|
+
// CIL[DOC-CONTRACT inputs="label, col, current, dir, onSort" outputs="th element with sort arrow" errors="none" side_effects="calls onSort with the selected column"]
|
|
674
|
+
// CIL[DOC-MICRO logic_summary="Show an up, down, or bidirectional arrow based on active state and direction" notable_decisions="[]"]
|
|
675
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
676
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
677
|
+
|
|
574
678
|
function SortTh({
|
|
575
679
|
label, col, current, dir, onSort
|
|
576
680
|
}: {
|
|
@@ -591,4 +695,10 @@ function SortTh({
|
|
|
591
695
|
</th>
|
|
592
696
|
)
|
|
593
697
|
}
|
|
594
|
-
// CIL[
|
|
698
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Render a clickable table header for sorting'; No verified external callers; imports: .framework/src/lib/api.ts"]
|
|
699
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
700
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
701
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
702
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
703
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
704
|
+
// CIL[END stable_id="~/.framework/src/components/shared/InviteManager.tsx:SortTh:component"]
|
|
@@ -1,11 +1,53 @@
|
|
|
1
|
+
// CIL[BEGIN stable_id="~/.framework/src/components/shared/MemberList.tsx:module_header:module_header" type="module_header" identity="module_header" parent="~/.framework/src/components/shared/MemberList.tsx"]
|
|
2
|
+
// CIL[DOC-MACRO purpose="MemberList shared component module"]
|
|
3
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Imports React hooks and the shared apiFetch client for the MemberList component."]
|
|
4
|
+
// CIL[DOC-CONTEXT module="shared" layer="ui" related_files=".framework/src/lib/api.ts"]
|
|
5
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="none" errors="none" side_effects="none"]
|
|
6
|
+
// CIL[DOC-MICRO logic_summary="Sets up the MemberList module by importing React hooks and the shared apiFetch utility." notable_decisions="[]"]
|
|
7
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
8
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
9
|
+
// CIL[DOC-AUDIENCE audience="shared-ui"]
|
|
10
|
+
|
|
1
11
|
import React, { useState, useEffect, useCallback, useMemo } from 'react'
|
|
2
12
|
import { apiFetch } from '../../lib/api'
|
|
3
13
|
|
|
14
|
+
// CIL[DOC-VECTOR type="context" content="purpose='MemberList shared component module'; No verified external callers; imports: .framework/src/lib/api.ts"]
|
|
15
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
16
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
17
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
18
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
19
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
20
|
+
// CIL[END stable_id="~/.framework/src/components/shared/MemberList.tsx:module_header:module_header"]
|
|
21
|
+
|
|
22
|
+
// CIL[BEGIN stable_id="~/.framework/src/components/shared/MemberList.tsx:allowedrole:interface" type="interface" identity="allowedrole" parent="~/.framework/src/components/shared/MemberList.tsx"]
|
|
23
|
+
// CIL[DOC-MACRO purpose="AllowedRole interface definition"]
|
|
24
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Defines the shape of a selectable role for members."]
|
|
25
|
+
// CIL[DOC-CONTEXT module="shared" layer="ui" related_files=".framework/src/components/shared/MemberList.tsx,.framework/src/lib/api.ts"]
|
|
26
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="AllowedRole object" errors="none" side_effects="none"]
|
|
27
|
+
// CIL[DOC-MICRO logic_summary="Declares slug and name properties for an allowed role." notable_decisions="[]"]
|
|
28
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
29
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
4
30
|
export interface AllowedRole {
|
|
5
31
|
slug: string
|
|
6
32
|
name: string
|
|
7
33
|
}
|
|
34
|
+
// CIL[DOC-VECTOR type="context" content="purpose='AllowedRole interface definition'; No verified external callers; imports: .framework/src/lib/api.ts"]
|
|
35
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
36
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
37
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
38
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
39
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
40
|
+
// CIL[END stable_id="~/.framework/src/components/shared/MemberList.tsx:allowedrole:interface"]
|
|
41
|
+
|
|
8
42
|
|
|
43
|
+
// CIL[BEGIN stable_id="~/.framework/src/components/shared/MemberList.tsx:member:interface" type="interface" identity="member" parent="~/.framework/src/components/shared/MemberList.tsx"]
|
|
44
|
+
// CIL[DOC-MACRO purpose="Member interface definition"]
|
|
45
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Defines the shape of a member row returned by the invites API."]
|
|
46
|
+
// CIL[DOC-CONTEXT module="shared" layer="ui" related_files=".framework/src/components/shared/MemberList.tsx,.framework/src/lib/api.ts"]
|
|
47
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Member object" errors="none" side_effects="none"]
|
|
48
|
+
// CIL[DOC-MICRO logic_summary="Declares id, full_name, email, status, nested role, and is_active fields for a member." notable_decisions="[]"]
|
|
49
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
50
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
9
51
|
interface Member {
|
|
10
52
|
id: string
|
|
11
53
|
full_name: string | null
|
|
@@ -14,7 +56,23 @@ interface Member {
|
|
|
14
56
|
role: { id: string; slug: string; name: string } | null
|
|
15
57
|
is_active: boolean
|
|
16
58
|
}
|
|
59
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Member interface definition'; No verified external callers; imports: .framework/src/lib/api.ts"]
|
|
60
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
61
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
62
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
63
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
64
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
65
|
+
// CIL[END stable_id="~/.framework/src/components/shared/MemberList.tsx:member:interface"]
|
|
17
66
|
|
|
67
|
+
|
|
68
|
+
// CIL[BEGIN stable_id="~/.framework/src/components/shared/MemberList.tsx:callinvitesapi:function" type="function" identity="callinvitesapi" parent="~/.framework/src/components/shared/MemberList.tsx"]
|
|
69
|
+
// CIL[DOC-MACRO purpose="Call invites API helper"]
|
|
70
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Sends GET or POST requests to the Netlify invites function endpoint."]
|
|
71
|
+
// CIL[DOC-CONTEXT module="shared" layer="ui" related_files=".framework/src/components/shared/MemberList.tsx,.framework/src/lib/api.ts"]
|
|
72
|
+
// CIL[DOC-CONTRACT inputs="action: string, params: Record<string, any>, method: 'GET' | 'POST'" outputs="JSON response" errors="throws on network or invalid response" side_effects="none"]
|
|
73
|
+
// CIL[DOC-MICRO logic_summary="Builds a query string for GET requests and a JSON body for POST requests, then fetches via apiFetch." notable_decisions="[]"]
|
|
74
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
75
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
18
76
|
async function callInvitesApi(action: string, params: Record<string, any> = {}, method: 'GET' | 'POST' = 'GET') {
|
|
19
77
|
const base = '/.netlify/functions/invites'
|
|
20
78
|
if (method === 'GET') {
|
|
@@ -29,12 +87,44 @@ async function callInvitesApi(action: string, params: Record<string, any> = {},
|
|
|
29
87
|
})
|
|
30
88
|
return res.json()
|
|
31
89
|
}
|
|
90
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Call invites API helper'; No verified external callers; imports: .framework/src/lib/api.ts"]
|
|
91
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
92
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
93
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
94
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
95
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
96
|
+
// CIL[END stable_id="~/.framework/src/components/shared/MemberList.tsx:callinvitesapi:function"]
|
|
97
|
+
|
|
32
98
|
|
|
99
|
+
// CIL[BEGIN stable_id="~/.framework/src/components/shared/MemberList.tsx:memberlistprops:interface" type="interface" identity="memberlistprops" parent="~/.framework/src/components/shared/MemberList.tsx"]
|
|
100
|
+
// CIL[DOC-MACRO purpose="MemberListProps interface definition"]
|
|
101
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Defines the props accepted by the MemberList component."]
|
|
102
|
+
// CIL[DOC-CONTEXT module="shared" layer="ui" related_files=".framework/src/components/shared/MemberList.tsx,.framework/src/lib/api.ts"]
|
|
103
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="MemberListProps object" errors="none" side_effects="none"]
|
|
104
|
+
// CIL[DOC-MICRO logic_summary="Declares optional accountId and required allowedRoles props for MemberList." notable_decisions="[]"]
|
|
105
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
106
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
33
107
|
export interface MemberListProps {
|
|
34
108
|
accountId?: string
|
|
35
109
|
allowedRoles: AllowedRole[]
|
|
36
110
|
}
|
|
111
|
+
// CIL[DOC-VECTOR type="context" content="purpose='MemberListProps interface definition'; No verified external callers; imports: .framework/src/lib/api.ts"]
|
|
112
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
113
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
114
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
115
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
116
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
117
|
+
// CIL[END stable_id="~/.framework/src/components/shared/MemberList.tsx:memberlistprops:interface"]
|
|
118
|
+
|
|
37
119
|
|
|
120
|
+
// CIL[BEGIN stable_id="~/.framework/src/components/shared/MemberList.tsx:memberlist:function" type="function" identity="memberlist" parent="~/.framework/src/components/shared/MemberList.tsx"]
|
|
121
|
+
// CIL[DOC-MACRO purpose="MemberList React component"]
|
|
122
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Renders a searchable, role-editable table of active account members."]
|
|
123
|
+
// CIL[DOC-CONTEXT module="shared" layer="ui" related_files=".framework/src/components/shared/MemberList.tsx,.framework/src/lib/api.ts"]
|
|
124
|
+
// CIL[DOC-CONTRACT inputs="accountId: string | undefined, allowedRoles: AllowedRole[]" outputs="JSX table of active members" errors="displays API errors inline" side_effects="calls invites API on load and role/deactivate actions"]
|
|
125
|
+
// CIL[DOC-MICRO logic_summary="Loads active members, filters by search string, renders role selects and action buttons, and supports updating or deactivating members." notable_decisions="[]"]
|
|
126
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
127
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
38
128
|
export function MemberList({ accountId, allowedRoles }: MemberListProps) {
|
|
39
129
|
const [members, setMembers] = useState<Member[]>([])
|
|
40
130
|
const [loading, setLoading] = useState(true)
|
|
@@ -180,3 +270,10 @@ export function MemberList({ accountId, allowedRoles }: MemberListProps) {
|
|
|
180
270
|
</div>
|
|
181
271
|
)
|
|
182
272
|
}
|
|
273
|
+
// CIL[DOC-VECTOR type="context" content="purpose='MemberList React component'; No verified external callers; imports: .framework/src/lib/api.ts"]
|
|
274
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
275
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
276
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
277
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
278
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
279
|
+
// CIL[END stable_id="~/.framework/src/components/shared/MemberList.tsx:memberlist:function"]
|