spine-framework 0.3.144 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +20 -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,379 @@
|
|
|
1
|
+
// CIL[BEGIN stable_id="~/.framework/src/pages/admin/cil/CILSuggestionsPage.tsx:module_header:module_header" type="module_header" identity="module_header" parent="~/.framework/src/pages/admin/cil/CILSuggestionsPage.tsx"]
|
|
2
|
+
// CIL[DOC-MACRO purpose="Admin page for reviewing and managing CIL redesign suggestions"]
|
|
3
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Renders the CIL suggestions management UI and orchestrates suggestion CRUD actions"]
|
|
4
|
+
// CIL[DOC-CONTEXT module="admin/cil" layer="page" related_files=".framework/src/components/admin/PageInstructions.tsx,.framework/src/components/ui/badge.tsx,.framework/src/components/ui/button.tsx,.framework/src/components/ui/card.tsx,.framework/src/components/ui/input.tsx,.framework/src/components/ui/label.tsx,.framework/src/components/ui/native-select.tsx,.framework/src/components/ui/skeleton.tsx,.framework/src/components/ui/table.tsx,.framework/src/components/ui/textarea.tsx,.framework/src/lib/api.ts"]
|
|
5
|
+
// CIL[DOC-CONTRACT inputs="N/A" outputs="Rendered admin page for CIL suggestions" errors="Network/API failures are caught and ignored" side_effects="Fetches and mutates cil_suggestion records via /api/admin-data"]
|
|
6
|
+
// CIL[DOC-MICRO logic_summary="Imports dependencies, defines local state and handlers, renders a suggestion list and creation form" notable_decisions="[]"]
|
|
7
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
8
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
9
|
+
// CIL[DOC-AUDIENCE audience="admin"]
|
|
10
|
+
|
|
11
|
+
import { useEffect, useState } from 'react'
|
|
12
|
+
import { apiFetch } from '@core/lib/api'
|
|
13
|
+
import { Card, CardContent } from '@core/components/ui/card'
|
|
14
|
+
import { Button } from '@core/components/ui/button'
|
|
15
|
+
import { Badge } from '@core/components/ui/badge'
|
|
16
|
+
import { Skeleton } from '@core/components/ui/skeleton'
|
|
17
|
+
import { Input } from '@core/components/ui/input'
|
|
18
|
+
import { Label } from '@core/components/ui/label'
|
|
19
|
+
import { Textarea } from '@core/components/ui/textarea'
|
|
20
|
+
import { NativeSelect, NativeSelectOption } from '@core/components/ui/native-select'
|
|
21
|
+
import {
|
|
22
|
+
Table,
|
|
23
|
+
TableHeader,
|
|
24
|
+
TableBody,
|
|
25
|
+
TableRow,
|
|
26
|
+
TableHead,
|
|
27
|
+
TableCell,
|
|
28
|
+
} from '@core/components/ui/table'
|
|
29
|
+
import { Lightbulb, Plus } from 'lucide-react'
|
|
30
|
+
|
|
31
|
+
import { PageInstructions } from '../../../components/admin/PageInstructions'
|
|
32
|
+
|
|
33
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Admin page for reviewing and managing CIL redesign suggestions'; No verified external callers; imports: .framework/src/lib/api.ts,.framework/src/components/ui/card.tsx,.framework/src/components/ui/button.tsx"]
|
|
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"]
|
|
37
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
38
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
39
|
+
// CIL[END stable_id="~/.framework/src/pages/admin/cil/CILSuggestionsPage.tsx:module_header:module_header"]
|
|
40
|
+
|
|
41
|
+
// CIL[BEGIN stable_id="~/.framework/src/pages/admin/cil/CILSuggestionsPage.tsx:project_id:constant" type="constant" identity="PROJECT_ID" parent="~/.framework/src/pages/admin/cil/CILSuggestionsPage.tsx"]
|
|
42
|
+
// CIL[DOC-MACRO purpose="Project ID for the CIL redesign scope used to filter suggestions"]
|
|
43
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Provides a constant project identifier for runtime record queries"]
|
|
44
|
+
// CIL[DOC-CONTEXT module="admin/cil" layer="constant" related_files=".framework/src/components/admin/PageInstructions.tsx,.framework/src/components/ui/badge.tsx,.framework/src/components/ui/button.tsx,.framework/src/components/ui/card.tsx,.framework/src/components/ui/input.tsx,.framework/src/components/ui/label.tsx,.framework/src/components/ui/native-select.tsx,.framework/src/components/ui/skeleton.tsx,.framework/src/components/ui/table.tsx,.framework/src/components/ui/textarea.tsx,.framework/src/lib/api.ts,.framework/src/pages/admin/cil/CILSuggestionsPage.tsx"]
|
|
45
|
+
// CIL[DOC-CONTRACT inputs="N/A" outputs="PROJECT_ID string" errors="N/A" side_effects="None"]
|
|
46
|
+
// CIL[DOC-MICRO logic_summary="Declares the UUID string for the CIL redesign project" notable_decisions="[]"]
|
|
47
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
48
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
49
|
+
const PROJECT_ID = '24d2bb67-24be-4cdf-a633-108588d37f00'
|
|
50
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Project ID for the CIL redesign scope used to filter suggestions'; No verified external callers; imports: .framework/src/lib/api.ts,.framework/src/components/ui/card.tsx,.framework/src/components/ui/button.tsx"]
|
|
51
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
52
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
53
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
54
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
55
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
56
|
+
// CIL[END stable_id="~/.framework/src/pages/admin/cil/CILSuggestionsPage.tsx:project_id:constant"]
|
|
57
|
+
|
|
58
|
+
// CIL[BEGIN stable_id="~/.framework/src/pages/admin/cil/CILSuggestionsPage.tsx:suggestion_types:constant" type="constant" identity="SUGGESTION_TYPES" parent="~/.framework/src/pages/admin/cil/CILSuggestionsPage.tsx"]
|
|
59
|
+
// CIL[DOC-MACRO purpose="Allowed suggestion type values for the creation form"]
|
|
60
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Defines the selectable suggestion categories"]
|
|
61
|
+
// CIL[DOC-CONTEXT module="admin/cil" layer="constant" related_files=".framework/src/components/admin/PageInstructions.tsx,.framework/src/components/ui/badge.tsx,.framework/src/components/ui/button.tsx,.framework/src/components/ui/card.tsx,.framework/src/components/ui/input.tsx,.framework/src/components/ui/label.tsx,.framework/src/components/ui/native-select.tsx,.framework/src/components/ui/skeleton.tsx,.framework/src/components/ui/table.tsx,.framework/src/components/ui/textarea.tsx,.framework/src/lib/api.ts,.framework/src/pages/admin/cil/CILSuggestionsPage.tsx"]
|
|
62
|
+
// CIL[DOC-CONTRACT inputs="N/A" outputs="SUGGESTION_TYPES string array" errors="N/A" side_effects="N/A"]
|
|
63
|
+
// CIL[DOC-MICRO logic_summary="Lists valid suggestion types: refactor, add_doc, rename, remove, other" notable_decisions="[]"]
|
|
64
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
65
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
66
|
+
const SUGGESTION_TYPES = ['refactor', 'add_doc', 'rename', 'remove', 'other']
|
|
67
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Allowed suggestion type values for the creation form'; No verified external callers; imports: .framework/src/lib/api.ts,.framework/src/components/ui/card.tsx,.framework/src/components/ui/button.tsx"]
|
|
68
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
69
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
70
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
71
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
72
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
73
|
+
// CIL[END stable_id="~/.framework/src/pages/admin/cil/CILSuggestionsPage.tsx:suggestion_types:constant"]
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
// CIL[BEGIN stable_id="~/.framework/src/pages/admin/cil/CILSuggestionsPage.tsx:cilsuggestion:interface" type="interface" identity="CILSuggestion" parent="~/.framework/src/pages/admin/cil/CILSuggestionsPage.tsx"]
|
|
78
|
+
// CIL[DOC-MACRO purpose="TypeScript type for a CIL suggestion record returned from the API"]
|
|
79
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Describes the shape of cil_suggestion items"]
|
|
80
|
+
// CIL[DOC-CONTEXT module="admin/cil" layer="type" related_files=".framework/src/components/admin/PageInstructions.tsx,.framework/src/components/ui/badge.tsx,.framework/src/components/ui/button.tsx,.framework/src/components/ui/card.tsx,.framework/src/components/ui/input.tsx,.framework/src/components/ui/label.tsx,.framework/src/components/ui/native-select.tsx,.framework/src/components/ui/skeleton.tsx,.framework/src/components/ui/table.tsx,.framework/src/components/ui/textarea.tsx,.framework/src/lib/api.ts,.framework/src/pages/admin/cil/CILSuggestionsPage.tsx"]
|
|
81
|
+
// CIL[DOC-CONTRACT inputs="N/A" outputs="Typed CILSuggestion shape for consumers" errors="N/A" side_effects="N/A"]
|
|
82
|
+
// CIL[DOC-MICRO logic_summary="Defines id, title, nested data fields, and created_at" notable_decisions="[]"]
|
|
83
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
84
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
85
|
+
interface CILSuggestion {
|
|
86
|
+
id: string
|
|
87
|
+
title: string
|
|
88
|
+
data: {
|
|
89
|
+
project_id?: string
|
|
90
|
+
suggestion_type?: string
|
|
91
|
+
content?: string
|
|
92
|
+
target_stable_id?: string
|
|
93
|
+
status?: string
|
|
94
|
+
confidence?: number
|
|
95
|
+
proposed_by?: string
|
|
96
|
+
}
|
|
97
|
+
created_at: string
|
|
98
|
+
}
|
|
99
|
+
// CIL[DOC-VECTOR type="context" content="purpose='TypeScript type for a CIL suggestion record returned from the API'; No verified external callers; imports: .framework/src/lib/api.ts,.framework/src/components/ui/card.tsx,.framework/src/components/ui/button.tsx"]
|
|
100
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
101
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
102
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
103
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
104
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
105
|
+
// CIL[END stable_id="~/.framework/src/pages/admin/cil/CILSuggestionsPage.tsx:cilsuggestion:interface"]
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
// CIL[BEGIN stable_id="~/.framework/src/pages/admin/cil/CILSuggestionsPage.tsx:status_variant:constant" type="constant" identity="STATUS_VARIANT" parent="~/.framework/src/pages/admin/cil/CILSuggestionsPage.tsx"]
|
|
111
|
+
// CIL[DOC-MACRO purpose="Badge variant mapping for suggestion status values"]
|
|
112
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Maps suggestion status strings to shadcn Badge variants"]
|
|
113
|
+
// CIL[DOC-CONTEXT module="admin/cil" layer="constant" related_files=".framework/src/components/admin/PageInstructions.tsx,.framework/src/components/ui/badge.tsx,.framework/src/components/ui/button.tsx,.framework/src/components/ui/card.tsx,.framework/src/components/ui/input.tsx,.framework/src/components/ui/label.tsx,.framework/src/components/ui/native-select.tsx,.framework/src/components/ui/skeleton.tsx,.framework/src/components/ui/table.tsx,.framework/src/components/ui/textarea.tsx,.framework/src/lib/api.ts,.framework/src/pages/admin/cil/CILSuggestionsPage.tsx"]
|
|
114
|
+
// CIL[DOC-CONTRACT inputs="status string" outputs="Badge variant key" errors="Unknown statuses fall back to secondary" side_effects="N/A"]
|
|
115
|
+
// CIL[DOC-MICRO logic_summary="Record mapping accepted/default, proposed/secondary, rejected/destructive" notable_decisions="[]"]
|
|
116
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
117
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
118
|
+
const STATUS_VARIANT: Record<string, 'default' | 'secondary' | 'outline' | 'destructive'> = {
|
|
119
|
+
accepted: 'default',
|
|
120
|
+
proposed: 'secondary',
|
|
121
|
+
rejected: 'destructive',
|
|
122
|
+
}
|
|
123
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Badge variant mapping for suggestion status values'; No verified external callers; imports: .framework/src/lib/api.ts,.framework/src/components/ui/card.tsx,.framework/src/components/ui/button.tsx"]
|
|
124
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
125
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
126
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
127
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
128
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
129
|
+
// CIL[END stable_id="~/.framework/src/pages/admin/cil/CILSuggestionsPage.tsx:status_variant:constant"]
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
// CIL[BEGIN stable_id="~/.framework/src/pages/admin/cil/CILSuggestionsPage.tsx:cilsuggestionspage:function" type="function" identity="CILSuggestionsPage" parent="~/.framework/src/pages/admin/cil/CILSuggestionsPage.tsx"]
|
|
138
|
+
// CIL[DOC-MACRO purpose="Renders the CIL suggestions management page and handles creation/accept/reject"]
|
|
139
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Fetches, filters, displays, and updates CIL suggestions for the redesign project"]
|
|
140
|
+
// CIL[DOC-CONTEXT module="admin/cil" layer="page" related_files=".framework/src/components/admin/PageInstructions.tsx,.framework/src/components/ui/badge.tsx,.framework/src/components/ui/button.tsx,.framework/src/components/ui/card.tsx,.framework/src/components/ui/input.tsx,.framework/src/components/ui/label.tsx,.framework/src/components/ui/native-select.tsx,.framework/src/components/ui/skeleton.tsx,.framework/src/components/ui/table.tsx,.framework/src/components/ui/textarea.tsx,.framework/src/lib/api.ts,.framework/src/pages/admin/cil/CILSuggestionsPage.tsx"]
|
|
141
|
+
// CIL[DOC-CONTRACT inputs="None (route page)" outputs="JSX for CIL Suggestions admin page" errors="API call failures are swallowed and fall back to empty list" side_effects="Reads and writes cil_suggestion items via /api/admin-data; updates local React state"]
|
|
142
|
+
// CIL[DOC-MICRO logic_summary="Loads suggestions, provides form handlers, renders table with accept/reject and create form" notable_decisions="[]"]
|
|
143
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
144
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
145
|
+
export default function CILSuggestionsPage() {
|
|
146
|
+
const [suggestions, setSuggestions] = useState<CILSuggestion[]>([])
|
|
147
|
+
const [loading, setLoading] = useState(true)
|
|
148
|
+
const [acting, setActing] = useState<string | null>(null)
|
|
149
|
+
const [creating, setCreating] = useState(false)
|
|
150
|
+
const [form, setForm] = useState({
|
|
151
|
+
content: '',
|
|
152
|
+
suggestion_type: SUGGESTION_TYPES[0],
|
|
153
|
+
target_stable_id: '',
|
|
154
|
+
})
|
|
155
|
+
|
|
156
|
+
const fetchSuggestions = async () => {
|
|
157
|
+
setLoading(true)
|
|
158
|
+
try {
|
|
159
|
+
const res = await apiFetch(
|
|
160
|
+
`/api/admin-data?action=list&entity=items&type_slug=cil_suggestion&limit=500`
|
|
161
|
+
)
|
|
162
|
+
const data = await res.json().catch(() => ({}))
|
|
163
|
+
const items: CILSuggestion[] = data?.data || data?.items || []
|
|
164
|
+
setSuggestions(items.filter(s => s.data?.project_id === PROJECT_ID))
|
|
165
|
+
} catch {
|
|
166
|
+
setSuggestions([])
|
|
167
|
+
} finally {
|
|
168
|
+
setLoading(false)
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
useEffect(() => { fetchSuggestions() }, [])
|
|
173
|
+
|
|
174
|
+
const updateSuggestionStatus = async (id: string, status: string) => {
|
|
175
|
+
setActing(id)
|
|
176
|
+
try {
|
|
177
|
+
await apiFetch(`/api/admin-data?action=update&entity=items&id=${id}`, {
|
|
178
|
+
method: 'PATCH',
|
|
179
|
+
headers: { 'Content-Type': 'application/json' },
|
|
180
|
+
body: JSON.stringify({
|
|
181
|
+
entity: 'items',
|
|
182
|
+
type_slug: 'cil_suggestion',
|
|
183
|
+
data: { status },
|
|
184
|
+
}),
|
|
185
|
+
})
|
|
186
|
+
} catch {
|
|
187
|
+
// silent
|
|
188
|
+
} finally {
|
|
189
|
+
setActing(null)
|
|
190
|
+
fetchSuggestions()
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
const handleCreate = async (e: React.FormEvent) => {
|
|
195
|
+
e.preventDefault()
|
|
196
|
+
if (!form.content.trim()) return
|
|
197
|
+
setCreating(true)
|
|
198
|
+
try {
|
|
199
|
+
await apiFetch('/api/admin-data?action=create&entity=items', {
|
|
200
|
+
method: 'POST',
|
|
201
|
+
headers: { 'Content-Type': 'application/json' },
|
|
202
|
+
body: JSON.stringify({
|
|
203
|
+
entity: 'items',
|
|
204
|
+
type_slug: 'cil_suggestion',
|
|
205
|
+
title: `${form.suggestion_type}: ${form.target_stable_id || 'general'}`,
|
|
206
|
+
data: {
|
|
207
|
+
project_id: PROJECT_ID,
|
|
208
|
+
suggestion_type: form.suggestion_type,
|
|
209
|
+
content: form.content.trim(),
|
|
210
|
+
target_stable_id: form.target_stable_id.trim() || null,
|
|
211
|
+
status: 'proposed',
|
|
212
|
+
confidence: 0.5,
|
|
213
|
+
proposed_by: 'admin',
|
|
214
|
+
},
|
|
215
|
+
}),
|
|
216
|
+
})
|
|
217
|
+
setForm({ content: '', suggestion_type: SUGGESTION_TYPES[0], target_stable_id: '' })
|
|
218
|
+
fetchSuggestions()
|
|
219
|
+
} catch {
|
|
220
|
+
// silent
|
|
221
|
+
} finally {
|
|
222
|
+
setCreating(false)
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
return (
|
|
227
|
+
<div className="p-6 space-y-6">
|
|
228
|
+
<div className="flex items-center justify-between">
|
|
229
|
+
<div>
|
|
230
|
+
<h1 className="text-2xl font-bold flex items-center gap-2">
|
|
231
|
+
<Lightbulb className="h-6 w-6 text-amber-500" />
|
|
232
|
+
CIL Suggestions
|
|
233
|
+
</h1>
|
|
234
|
+
<p className="text-muted-foreground text-sm mt-1">
|
|
235
|
+
Review, accept, reject, and create suggestions for the CIL redesign project.
|
|
236
|
+
</p>
|
|
237
|
+
</div>
|
|
238
|
+
</div>
|
|
239
|
+
|
|
240
|
+
<PageInstructions
|
|
241
|
+
description="Manage AI- or manually-proposed CIL suggestions."
|
|
242
|
+
sections={[
|
|
243
|
+
{ title: 'What this page is for', content: 'Suggestions track proposed changes to CIL records. Each suggestion has a type, target stable ID, and confidence.' },
|
|
244
|
+
{ title: 'How to review', content: 'Use Accept to set the suggestion status to accepted, or Reject to set it to rejected.' },
|
|
245
|
+
{ title: 'How to create', content: 'Fill in the type, target stable ID, and content, then click Create.' },
|
|
246
|
+
]}
|
|
247
|
+
/>
|
|
248
|
+
|
|
249
|
+
<Card>
|
|
250
|
+
<CardContent className="p-4 space-y-3">
|
|
251
|
+
<form onSubmit={handleCreate} className="space-y-3">
|
|
252
|
+
<div className="grid grid-cols-1 md:grid-cols-3 gap-3">
|
|
253
|
+
<div>
|
|
254
|
+
<Label htmlFor="suggestion_type" className="text-sm">Suggestion Type</Label>
|
|
255
|
+
<NativeSelect
|
|
256
|
+
id="suggestion_type"
|
|
257
|
+
value={form.suggestion_type}
|
|
258
|
+
onChange={e => setForm({ ...form, suggestion_type: e.target.value })}
|
|
259
|
+
className="w-full"
|
|
260
|
+
>
|
|
261
|
+
{SUGGESTION_TYPES.map(t => (
|
|
262
|
+
<NativeSelectOption key={t} value={t}>{t}</NativeSelectOption>
|
|
263
|
+
))}
|
|
264
|
+
</NativeSelect>
|
|
265
|
+
</div>
|
|
266
|
+
<div>
|
|
267
|
+
<Label htmlFor="target_stable_id" className="text-sm">Target Stable ID</Label>
|
|
268
|
+
<Input
|
|
269
|
+
id="target_stable_id"
|
|
270
|
+
value={form.target_stable_id}
|
|
271
|
+
onChange={e => setForm({ ...form, target_stable_id: e.target.value })}
|
|
272
|
+
placeholder="stable_id"
|
|
273
|
+
/>
|
|
274
|
+
</div>
|
|
275
|
+
<div className="flex items-end">
|
|
276
|
+
<Button type="submit" disabled={creating || !form.content.trim()}>
|
|
277
|
+
<Plus className="h-4 w-4 mr-2" />
|
|
278
|
+
Create
|
|
279
|
+
</Button>
|
|
280
|
+
</div>
|
|
281
|
+
</div>
|
|
282
|
+
<div>
|
|
283
|
+
<Label htmlFor="content" className="text-sm">Content</Label>
|
|
284
|
+
<Textarea
|
|
285
|
+
id="content"
|
|
286
|
+
value={form.content}
|
|
287
|
+
onChange={e => setForm({ ...form, content: e.target.value })}
|
|
288
|
+
placeholder="Describe the suggestion..."
|
|
289
|
+
rows={3}
|
|
290
|
+
/>
|
|
291
|
+
</div>
|
|
292
|
+
</form>
|
|
293
|
+
</CardContent>
|
|
294
|
+
</Card>
|
|
295
|
+
|
|
296
|
+
{loading ? (
|
|
297
|
+
<div className="space-y-2">
|
|
298
|
+
<Skeleton className="h-8 w-64" />
|
|
299
|
+
<Skeleton className="h-64 w-full" />
|
|
300
|
+
</div>
|
|
301
|
+
) : suggestions.length === 0 ? (
|
|
302
|
+
<div className="text-center py-12 text-muted-foreground">
|
|
303
|
+
No suggestions found for this project.
|
|
304
|
+
</div>
|
|
305
|
+
) : (
|
|
306
|
+
<Card>
|
|
307
|
+
<CardContent className="p-0">
|
|
308
|
+
<Table>
|
|
309
|
+
<TableHeader>
|
|
310
|
+
<TableRow>
|
|
311
|
+
<TableHead>Type</TableHead>
|
|
312
|
+
<TableHead>Content</TableHead>
|
|
313
|
+
<TableHead>Target</TableHead>
|
|
314
|
+
<TableHead>Status</TableHead>
|
|
315
|
+
<TableHead>Confidence</TableHead>
|
|
316
|
+
<TableHead>Proposed By</TableHead>
|
|
317
|
+
<TableHead className="text-right">Actions</TableHead>
|
|
318
|
+
</TableRow>
|
|
319
|
+
</TableHeader>
|
|
320
|
+
<TableBody>
|
|
321
|
+
{suggestions.map(s => {
|
|
322
|
+
|
|
323
|
+
|
|
324
|
+
|
|
325
|
+
|
|
326
|
+
const status = s.data?.status || 'proposed'
|
|
327
|
+
|
|
328
|
+
return (
|
|
329
|
+
<TableRow key={s.id}>
|
|
330
|
+
<TableCell>
|
|
331
|
+
<Badge variant="outline">{s.data?.suggestion_type || '—'}</Badge>
|
|
332
|
+
</TableCell>
|
|
333
|
+
<TableCell className="max-w-xs truncate" title={s.data?.content}>
|
|
334
|
+
{s.data?.content || '—'}
|
|
335
|
+
</TableCell>
|
|
336
|
+
<TableCell className="font-mono text-xs">{s.data?.target_stable_id || '—'}</TableCell>
|
|
337
|
+
<TableCell>
|
|
338
|
+
<Badge variant={STATUS_VARIANT[status] || 'secondary'}>{status}</Badge>
|
|
339
|
+
</TableCell>
|
|
340
|
+
<TableCell>{(s.data?.confidence ?? 0).toFixed(2)}</TableCell>
|
|
341
|
+
<TableCell className="text-muted-foreground text-xs">{s.data?.proposed_by || '—'}</TableCell>
|
|
342
|
+
<TableCell className="text-right">
|
|
343
|
+
<div className="flex items-center justify-end gap-2">
|
|
344
|
+
<Button
|
|
345
|
+
size="sm"
|
|
346
|
+
variant="outline"
|
|
347
|
+
disabled={acting === s.id}
|
|
348
|
+
onClick={() => updateSuggestionStatus(s.id, 'accepted')}
|
|
349
|
+
>
|
|
350
|
+
Accept
|
|
351
|
+
</Button>
|
|
352
|
+
<Button
|
|
353
|
+
size="sm"
|
|
354
|
+
variant="ghost"
|
|
355
|
+
disabled={acting === s.id}
|
|
356
|
+
onClick={() => updateSuggestionStatus(s.id, 'rejected')}
|
|
357
|
+
>
|
|
358
|
+
Reject
|
|
359
|
+
</Button>
|
|
360
|
+
</div>
|
|
361
|
+
</TableCell>
|
|
362
|
+
</TableRow>
|
|
363
|
+
)
|
|
364
|
+
})}
|
|
365
|
+
</TableBody>
|
|
366
|
+
</Table>
|
|
367
|
+
</CardContent>
|
|
368
|
+
</Card>
|
|
369
|
+
)}
|
|
370
|
+
</div>
|
|
371
|
+
)
|
|
372
|
+
}
|
|
373
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Renders the CIL suggestions management page and handles creation/accept/reject'; No verified external callers; imports: .framework/src/lib/api.ts,.framework/src/components/ui/card.tsx,.framework/src/components/ui/button.tsx"]
|
|
374
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
375
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
376
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
377
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
378
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
379
|
+
// CIL[END stable_id="~/.framework/src/pages/admin/cil/CILSuggestionsPage.tsx:cilsuggestionspage:function"]
|