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
|
@@ -1,45 +1,54 @@
|
|
|
1
|
+
// CIL[BEGIN stable_id="~/.framework/functions/ai-interactions.ts:module_header:module_header" type="module_header" identity="module_header" parent="~/.framework/functions/ai-interactions.ts"]
|
|
2
|
+
// CIL[DOC-MACRO purpose="Defines the ai-interactions Netlify function handlers for AI feedback and CIL learning proposals."]
|
|
3
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Initialize the module, register handler exports, and provide shared imports for the AI interaction function."]
|
|
4
|
+
// CIL[DOC-CONTEXT module="ai-interactions" layer="functions" related_files=".framework/functions/_shared/audit.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/funnel.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/resolve-ids.ts,.framework/functions/admin-data.ts"]
|
|
5
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="none" errors="none" side_effects="none"]
|
|
6
|
+
// CIL[DOC-MICRO logic_summary="Imports shared middleware, database, ID resolution, admin-data helpers, audit logging, and typed signal emission." notable_decisions="[]"]
|
|
7
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
8
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
9
|
+
// CIL[DOC-AUDIENCE audience="internal"]
|
|
1
10
|
|
|
2
11
|
|
|
3
12
|
|
|
4
13
|
|
|
5
14
|
|
|
6
|
-
// CIL[BEGIN chunk_id="ai-interactions_module_header_1784019432" type="module_header" identity="imports" parent="none"]
|
|
7
|
-
// CIL[DOC-MACRO purpose="Import dependencies for AI interaction management"]
|
|
8
|
-
// CIL[DOC-RESPONSIBILITY responsibility="Provide middleware, database, type resolution, CRUD, and audit logging"]
|
|
9
|
-
// CIL[DOC-CONTEXT module="ai-interactions" layer="api-handler" related_files="[\".framework/src/pages/admin/TypeDetailPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/functions/_shared/schema-utils.ts\",\".framework/functions/_shared/principal.ts\",\"custom/apps/portal/pages/ContentPage.tsx\",\"\\\"]"]
|
|
10
|
-
// CIL[DOC-CONTRACT inputs="none" outputs="imported_modules" errors="none" side_effects="none"]
|
|
11
|
-
// CIL[DOC-MICRO logic_summary="Imports required modules for AI feedback and interaction tracking" notable_decisions="[]"]
|
|
12
|
-
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
13
|
-
// CIL[DOC-STABILITY stability="stable"]
|
|
14
|
-
// CIL[DOC-AUDIENCE audience="developer"]
|
|
15
|
-
// CIL[DOC-VECTOR type="context" content="Layer: api-handler. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/TypeDetailPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/functions/_shared/schema-utils.ts, .framework/functions/_shared/principal.ts, custom/apps/portal/pages/ContentPage.tsx, \."]
|
|
16
|
-
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
17
|
-
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
18
|
-
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
19
|
-
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
20
|
-
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
21
15
|
import { createHandler } from './_shared/middleware'
|
|
22
16
|
import { adminDb } from './_shared/db'
|
|
23
17
|
import { resolveTypeId } from './_shared/resolve-ids'
|
|
24
18
|
import { create, update } from './admin-data'
|
|
25
19
|
import { emitLog } from './_shared/audit'
|
|
26
|
-
|
|
27
|
-
// CIL[
|
|
28
|
-
// CIL[DOC-
|
|
29
|
-
// CIL[DOC-
|
|
30
|
-
// CIL[DOC-
|
|
31
|
-
// CIL[DOC-CONTRACT inputs="none" outputs="feedback_confirmation" errors="message_id_required,ticket_id_required,invalid_feedback" side_effects="database_updates,ticket_escalation,audit_logging"]
|
|
32
|
-
// CIL[DOC-MICRO logic_summary="Stamps feedback on message, escalates not_helpful to human, updates interaction record" notable_decisions="[]"]
|
|
33
|
-
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
34
|
-
// CIL[DOC-STABILITY stability="stable"]
|
|
35
|
-
// CIL[DOC-VECTOR type="context" content="Layer: api-handler. Direct callers: 0. Direct calls: 0. Related files: .framework/functions/_shared/schema-utils.ts, .framework/src/components/ui/dialog.tsx, custom/apps/portal/pages/ContentPage.tsx, .framework/functions/_shared/principal.ts, .framework/migrations/015_simplify_apps_table.sql, \."]
|
|
36
|
-
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
37
|
-
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
38
|
-
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
20
|
+
import { emitSignal } from './_shared/funnel'
|
|
21
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Defines the ai-interactions Netlify function handlers for AI feedback and CIL learning proposals.'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/resolve-ids.ts"]
|
|
22
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
23
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
24
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
39
25
|
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
40
26
|
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
27
|
+
// CIL[END stable_id="~/.framework/functions/ai-interactions.ts:module_header:module_header"]
|
|
28
|
+
// CIL[BEGIN stable_id="~/.framework/functions/ai-interactions.ts:submitFeedback:constant" type="constant" identity="submitFeedback" parent="~/.framework/functions/ai-interactions.ts"]
|
|
29
|
+
// CIL[DOC-MACRO purpose="Record customer thumbs-up/thumbs-down feedback for an AI message and escalate to human if needed."]
|
|
30
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Validate inputs, persist feedback on the message row, update the ticket status on thumbs-down, attach feedback to the ai_interaction record, and emit an audit log."]
|
|
31
|
+
// CIL[DOC-CONTEXT module="ai-interactions" layer="functions" related_files=".framework/functions/_shared/audit.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/resolve-ids.ts,.framework/functions/admin-data.ts,.framework/functions/ai-interactions.ts"]
|
|
32
|
+
// CIL[DOC-CONTRACT inputs="message_id, ticket_id, feedback, reason, msgData" outputs="{message_id, ticket_id, feedback, escalated}" errors="missing fields, invalid feedback value" side_effects="updates messages.data, items status/data, and emits an audit log"]
|
|
33
|
+
// CIL[DOC-MICRO logic_summary="Validate required fields, update the message with feedback, on not_helpful assign the ticket to human (reopening resolved tickets via reopened_at/reopen_reason), on helpful resolve a pending_resolution ticket as ai_confirmed, find the linked ai_interaction and record customer_feedback, then emit a structured log." notable_decisions="thumbs are lifecycle accelerators — thumbs-up confirms a pending AI answer, thumbs-down escalates; resolved_via stamps make the outcome auditable"]
|
|
34
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
35
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
36
|
+
// Classify why a thumbs-down happened from the message's own evidence trail.
|
|
37
|
+
// Retrieval failure (no usable sources), reasoning failure (sources existed
|
|
38
|
+
// but weren't cited or were ignored), or missing knowledge (nothing to
|
|
39
|
+
// retrieve) each route to a different improvement path downstream.
|
|
40
|
+
function diagnoseFeedback(msgData: any): string {
|
|
41
|
+
const sources = msgData?.retrieved_sources || []
|
|
42
|
+
const cited = msgData?.cited_sources || []
|
|
43
|
+
const meanSim = msgData?.mean_similarity ?? msgData?.retrieval_confidence ?? 0
|
|
44
|
+
if (!sources.length) return 'missing_knowledge'
|
|
45
|
+
if (meanSim < 0.35) return 'retrieval_miss'
|
|
46
|
+
if (!cited.length) return 'reasoning_error'
|
|
47
|
+
return 'wrong_answer'
|
|
48
|
+
}
|
|
49
|
+
|
|
41
50
|
export const submitFeedback = createHandler(async (ctx, body) => {
|
|
42
|
-
const { message_id, ticket_id, feedback } = body || {}
|
|
51
|
+
const { message_id, ticket_id, feedback, reason } = body || {}
|
|
43
52
|
if (!message_id) throw new Error('message_id is required')
|
|
44
53
|
if (!ticket_id) throw new Error('ticket_id is required')
|
|
45
54
|
if (!['helpful', 'not_helpful'].includes(feedback)) {
|
|
@@ -48,25 +57,70 @@ export const submitFeedback = createHandler(async (ctx, body) => {
|
|
|
48
57
|
|
|
49
58
|
const { data: msg } = await adminDb
|
|
50
59
|
.from('messages').select('data').eq('id', message_id).single()
|
|
60
|
+
const diagnosis = feedback === 'not_helpful' ? diagnoseFeedback(msg?.data) : null
|
|
51
61
|
if (msg) {
|
|
52
62
|
await adminDb
|
|
53
63
|
.from('messages')
|
|
54
|
-
.update({ data: {
|
|
64
|
+
.update({ data: {
|
|
65
|
+
...(msg.data || {}),
|
|
66
|
+
feedback,
|
|
67
|
+
...(reason ? { feedback_reason: String(reason).slice(0, 2000) } : {}),
|
|
68
|
+
...(diagnosis ? { feedback_diagnosis: diagnosis, needs_review: true } : {}),
|
|
69
|
+
} })
|
|
55
70
|
.eq('id', message_id)
|
|
56
71
|
}
|
|
57
72
|
|
|
58
|
-
|
|
73
|
+
{
|
|
59
74
|
const { data: ticket } = await adminDb
|
|
60
75
|
.from('items').select('status, data').eq('id', ticket_id).single()
|
|
61
|
-
if (ticket
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
76
|
+
if (ticket) {
|
|
77
|
+
const now = new Date().toISOString()
|
|
78
|
+
// Thumbs-down is a definitive negative signal: escalate to a human from
|
|
79
|
+
// any state, and reopen when the ticket was already resolved/closed.
|
|
80
|
+
if (feedback === 'not_helpful' && ticket.status !== 'human_assigned' && ticket.status !== 'in_progress') {
|
|
81
|
+
const wasResolved = ticket.status === 'resolved' || ticket.status === 'closed'
|
|
82
|
+
await adminDb
|
|
83
|
+
.from('items')
|
|
84
|
+
.update({
|
|
85
|
+
status: 'human_assigned',
|
|
86
|
+
data: {
|
|
87
|
+
...(ticket.data || {}),
|
|
88
|
+
aim_escalation_reason: 'thumbs_down',
|
|
89
|
+
last_activity_at: now,
|
|
90
|
+
...(wasResolved ? {
|
|
91
|
+
reopened_at: now,
|
|
92
|
+
reopen_reason: 'thumbs_down',
|
|
93
|
+
resolved_at: null,
|
|
94
|
+
resolved_via: null,
|
|
95
|
+
aim_resolved_by_ai: false,
|
|
96
|
+
} : {
|
|
97
|
+
pending_proposed_by: null,
|
|
98
|
+
resolve_pending_since: null,
|
|
99
|
+
}),
|
|
100
|
+
},
|
|
101
|
+
updated_at: now,
|
|
102
|
+
})
|
|
103
|
+
.eq('id', ticket_id)
|
|
104
|
+
}
|
|
105
|
+
// Thumbs-up on a pending-resolution ticket is the explicit customer
|
|
106
|
+
// confirm: close it, attributing the resolution to whoever proposed it.
|
|
107
|
+
if (feedback === 'helpful' && ticket.status === 'pending_resolution') {
|
|
108
|
+
const via = ticket.data?.pending_proposed_by === 'human' ? 'human_confirmed' : 'ai_confirmed'
|
|
109
|
+
await adminDb
|
|
110
|
+
.from('items')
|
|
111
|
+
.update({
|
|
112
|
+
status: 'resolved',
|
|
113
|
+
data: {
|
|
114
|
+
...(ticket.data || {}),
|
|
115
|
+
resolved_at: now,
|
|
116
|
+
resolved_via: via,
|
|
117
|
+
aim_resolved_by_ai: via === 'ai_confirmed',
|
|
118
|
+
last_activity_at: now,
|
|
119
|
+
},
|
|
120
|
+
updated_at: now,
|
|
121
|
+
})
|
|
122
|
+
.eq('id', ticket_id)
|
|
123
|
+
}
|
|
70
124
|
}
|
|
71
125
|
}
|
|
72
126
|
|
|
@@ -79,32 +133,44 @@ export const submitFeedback = createHandler(async (ctx, body) => {
|
|
|
79
133
|
const interaction = interactionRows[0]
|
|
80
134
|
await adminDb
|
|
81
135
|
.from('items')
|
|
82
|
-
.update({ data: {
|
|
136
|
+
.update({ data: {
|
|
137
|
+
...(interaction.data || {}),
|
|
138
|
+
customer_feedback: feedback,
|
|
139
|
+
...(reason ? { feedback_reason: String(reason).slice(0, 2000) } : {}),
|
|
140
|
+
...(diagnosis ? { feedback_diagnosis: diagnosis, needs_review: true } : {}),
|
|
141
|
+
} })
|
|
83
142
|
.eq('id', interaction.id)
|
|
84
143
|
}
|
|
85
144
|
|
|
86
145
|
await emitLog(ctx, 'ai_interaction.feedback_submitted',
|
|
87
146
|
{ type: 'message', id: message_id },
|
|
88
|
-
{ after: { feedback, ticket_id, escalated: feedback === 'not_helpful' } }
|
|
147
|
+
{ after: { feedback, ticket_id, escalated: feedback === 'not_helpful', diagnosis } }
|
|
89
148
|
)
|
|
90
149
|
|
|
150
|
+
// Journey event: a customer submitted feedback through the calling app.
|
|
151
|
+
emitSignal(ctx, {
|
|
152
|
+
type_slug: 'funnel_signal',
|
|
153
|
+
action: 'feedback_submitted',
|
|
154
|
+
data: { ticket_id, feedback, diagnosis, source: ctx.appId ?? 'core' },
|
|
155
|
+
}).catch(() => {})
|
|
156
|
+
|
|
91
157
|
return { message_id, ticket_id, feedback, escalated: feedback === 'not_helpful' }
|
|
92
158
|
})
|
|
93
|
-
// CIL[
|
|
94
|
-
// CIL[
|
|
95
|
-
// CIL[DOC-
|
|
96
|
-
// CIL[DOC-
|
|
97
|
-
// CIL[DOC-CONTEXT module="ai-interactions" layer="api-handler" related_files="[\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/src/components/ui/dialog.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/functions/_shared/schema-utils.ts\",\"\\\"]"]
|
|
98
|
-
// CIL[DOC-CONTRACT inputs="none" outputs="created_record_or_skip" errors="thread_or_message_required,type_not_found" side_effects="database_record_creation,type_resolution"]
|
|
99
|
-
// CIL[DOC-MICRO logic_summary="Resolves type, creates record with interaction metadata, handles missing type gracefully" notable_decisions="[]"]
|
|
100
|
-
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="external_symbols_unknown"]
|
|
101
|
-
// CIL[DOC-STABILITY stability="stable"]
|
|
102
|
-
// CIL[DOC-VECTOR type="context" content="Layer: api-handler. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/TypeDetailPage.tsx, .framework/src/components/ui/dialog.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/functions/_shared/schema-utils.ts, \."]
|
|
103
|
-
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
104
|
-
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
105
|
-
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
159
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Record customer thumbs-up/thumbs-down feedback for an AI message and escalate to human if needed.'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/resolve-ids.ts"]
|
|
160
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
161
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
162
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
106
163
|
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
107
164
|
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
165
|
+
// CIL[END stable_id="~/.framework/functions/ai-interactions.ts:submitFeedback:constant"]
|
|
166
|
+
// CIL[BEGIN stable_id="~/.framework/functions/ai-interactions.ts:createInteraction:constant" type="constant" identity="createInteraction" parent="~/.framework/functions/ai-interactions.ts"]
|
|
167
|
+
// CIL[DOC-MACRO purpose="Create a new interaction-feedback item (default ai_feedback_record, overridable via type_slug) that captures per-message interaction metadata."]
|
|
168
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Resolve the caller-declared type_slug (default ai_feedback_record), validate required identifiers, and insert a typed record."]
|
|
169
|
+
// CIL[DOC-CONTEXT module="ai-interactions" layer="functions" related_files=".framework/functions/_shared/audit.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/resolve-ids.ts,.framework/functions/admin-data.ts,.framework/functions/ai-interactions.ts"]
|
|
170
|
+
// CIL[DOC-CONTRACT inputs="thread_id or ai_message_id plus optional metadata and optional type_slug" outputs="record or skipped object" errors="none thrown; returns skipped if type not found" side_effects="creates a row in items"]
|
|
171
|
+
// CIL[DOC-MICRO logic_summary="Require thread_id or ai_message_id, resolve body.type_slug (default ai_feedback_record) via resolveTypeId, call create with default/null fields, and return the record." notable_decisions="type_slug lets app-specific demos record interactions under their own item type without forking this function"]
|
|
172
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
173
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
108
174
|
export const createInteraction = createHandler(async (ctx, body) => {
|
|
109
175
|
const {
|
|
110
176
|
thread_id, ai_message_id, retrieved_sources = [],
|
|
@@ -112,20 +178,22 @@ export const createInteraction = createHandler(async (ctx, body) => {
|
|
|
112
178
|
ai_confidence, retrieval_confidence, kb_candidate,
|
|
113
179
|
answer_quality, assistance_outcome,
|
|
114
180
|
eval_case_id, cil_learning_proposal_id,
|
|
115
|
-
review_notes, reviewed_by, reviewed_at
|
|
181
|
+
review_notes, reviewed_by, reviewed_at,
|
|
182
|
+
type_slug
|
|
116
183
|
} = body || {}
|
|
117
184
|
|
|
118
185
|
if (!thread_id && !ai_message_id) {
|
|
119
186
|
throw new Error('thread_id or ai_message_id is required')
|
|
120
187
|
}
|
|
121
188
|
|
|
189
|
+
const resolvedSlug = type_slug || 'ai_feedback_record'
|
|
122
190
|
let typeId: string | null = null
|
|
123
191
|
try {
|
|
124
|
-
typeId = await resolveTypeId('item',
|
|
192
|
+
typeId = await resolveTypeId('item', resolvedSlug)
|
|
125
193
|
} catch {
|
|
126
|
-
return { skipped: true, reason:
|
|
194
|
+
return { skipped: true, reason: `${resolvedSlug} type not found` }
|
|
127
195
|
}
|
|
128
|
-
if (!typeId) return { skipped: true, reason:
|
|
196
|
+
if (!typeId) return { skipped: true, reason: `${resolvedSlug} type not found` }
|
|
129
197
|
|
|
130
198
|
const record = await create(ctx, {
|
|
131
199
|
entity: 'items',
|
|
@@ -157,21 +225,21 @@ export const createInteraction = createHandler(async (ctx, body) => {
|
|
|
157
225
|
|
|
158
226
|
return record
|
|
159
227
|
})
|
|
160
|
-
// CIL[
|
|
161
|
-
// CIL[
|
|
162
|
-
// CIL[DOC-
|
|
163
|
-
// CIL[DOC-
|
|
164
|
-
// CIL[DOC-CONTEXT module="ai-interactions" layer="api-handler" related_files="[\".framework/src/pages/admin/TypeDetailPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/functions/_shared/schema-utils.ts\",\"\\\"]"]
|
|
165
|
-
// CIL[DOC-CONTRACT inputs="none" outputs="updated_record" errors="id_required,no_updatable_fields,record_not_found" side_effects="database_update,data_merging"]
|
|
166
|
-
// CIL[DOC-MICRO logic_summary="Filters allowed fields, merges with existing data, updates record" notable_decisions="[]"]
|
|
167
|
-
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
168
|
-
// CIL[DOC-STABILITY stability="stable"]
|
|
169
|
-
// CIL[DOC-VECTOR type="context" content="Layer: api-handler. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/TypeDetailPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/functions/_shared/schema-utils.ts, \."]
|
|
170
|
-
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
171
|
-
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
172
|
-
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
228
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Create a new interaction-feedback item under a caller-declared type_slug (default ai_feedback_record).'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/resolve-ids.ts"]
|
|
229
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
230
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
231
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
173
232
|
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
174
233
|
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
234
|
+
// CIL[END stable_id="~/.framework/functions/ai-interactions.ts:createInteraction:constant"]
|
|
235
|
+
// CIL[BEGIN stable_id="~/.framework/functions/ai-interactions.ts:updateInteraction:constant" type="constant" identity="updateInteraction" parent="~/.framework/functions/ai-interactions.ts"]
|
|
236
|
+
// CIL[DOC-MACRO purpose="Update an existing ai_interaction record with allowed fields."]
|
|
237
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Validate id and allowed field list, merge patch into existing data, and delegate to the generic update helper."]
|
|
238
|
+
// CIL[DOC-CONTEXT module="ai-interactions" layer="functions" related_files=".framework/functions/_shared/audit.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/resolve-ids.ts,.framework/functions/admin-data.ts,.framework/functions/ai-interactions.ts"]
|
|
239
|
+
// CIL[DOC-CONTRACT inputs="id and one or more allowed fields" outputs="update result" errors="missing id, no updatable fields, record not found" side_effects="updates items.data"]
|
|
240
|
+
// CIL[DOC-MICRO logic_summary="Validate id, build a patch from the allow-list, fetch existing record data, and call update with merged data." notable_decisions="[]"]
|
|
241
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
242
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
175
243
|
export const updateInteraction = createHandler(async (ctx, body) => {
|
|
176
244
|
const { id, ...fields } = body || {}
|
|
177
245
|
if (!id) throw new Error('id is required')
|
|
@@ -197,21 +265,21 @@ export const updateInteraction = createHandler(async (ctx, body) => {
|
|
|
197
265
|
{ data: { ...(existing.data || {}), ...patch } }
|
|
198
266
|
)
|
|
199
267
|
})
|
|
200
|
-
// CIL[
|
|
201
|
-
// CIL[
|
|
202
|
-
// CIL[DOC-
|
|
203
|
-
// CIL[DOC-
|
|
204
|
-
// CIL[DOC-CONTEXT module="ai-interactions" layer="api-handler" related_files="["custom/apps/cortex/seed/types.json", ".framework/functions/admin-data.ts", ".framework/functions/_shared/schema-utils.ts", "\\\"]"]
|
|
205
|
-
// CIL[DOC-CONTRACT inputs="ticket_id, thread_id, ai_message_id, proposed_summary, source_*" outputs="created_proposal" errors="missing_summary_or_ticket, type_not_found" side_effects="database_record_creation"]
|
|
206
|
-
// CIL[DOC-MICRO logic_summary="Resolves cil_learning_proposal type and creates a draft proposal from support case context" notable_decisions=["Cortex may only create and update proposals; applying them is reserved for the developer workbench."]
|
|
207
|
-
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="external_symbols_unknown"]
|
|
208
|
-
// CIL[DOC-STABILITY stability="experimental"]
|
|
209
|
-
// CIL[DOC-VECTOR type="context" content="Layer: api-handler. Direct callers: 0. Direct calls: 0. Related files: custom/apps/cortex/seed/types.json, .framework/functions/admin-data.ts, .framework/functions/_shared/schema-utils.ts, \."]
|
|
210
|
-
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
211
|
-
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
212
|
-
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
268
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Update an existing ai_interaction record with allowed fields.'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/resolve-ids.ts"]
|
|
269
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
270
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
271
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
213
272
|
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
214
273
|
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
274
|
+
// CIL[END stable_id="~/.framework/functions/ai-interactions.ts:updateInteraction:constant"]
|
|
275
|
+
// CIL[BEGIN stable_id="~/.framework/functions/ai-interactions.ts:createCilLearningProposal:constant" type="constant" identity="createCilLearningProposal" parent="~/.framework/functions/ai-interactions.ts"]
|
|
276
|
+
// CIL[DOC-MACRO purpose="Create a draft CIL learning proposal from ticket context and source references."]
|
|
277
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Validate ticket_id and proposed_summary, resolve the cil_learning_proposal type, and insert a draft record."]
|
|
278
|
+
// CIL[DOC-CONTEXT module="ai-interactions" layer="functions" related_files=".framework/functions/_shared/audit.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/resolve-ids.ts,.framework/functions/admin-data.ts,.framework/functions/ai-interactions.ts"]
|
|
279
|
+
// CIL[DOC-CONTRACT inputs="ticket_id, proposed_summary, optional thread/message/tags" outputs="record or skipped object" errors="missing ticket_id or summary; returns skipped if type not found" side_effects="creates a draft proposal row in items"]
|
|
280
|
+
// CIL[DOC-MICRO logic_summary="Validate required inputs, resolve the proposal type, build data payload with source references, and create the record." notable_decisions="[]"]
|
|
281
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
282
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
215
283
|
export const createCilLearningProposal = createHandler(async (ctx, body) => {
|
|
216
284
|
const {
|
|
217
285
|
ticket_id, thread_id, ai_message_id, proposed_summary,
|
|
@@ -252,21 +320,21 @@ export const createCilLearningProposal = createHandler(async (ctx, body) => {
|
|
|
252
320
|
|
|
253
321
|
return record
|
|
254
322
|
})
|
|
255
|
-
// CIL[
|
|
256
|
-
// CIL[
|
|
257
|
-
// CIL[DOC-
|
|
258
|
-
// CIL[DOC-
|
|
259
|
-
// CIL[DOC-CONTEXT module="ai-interactions" layer="api-handler" related_files="[\".framework/src/pages/admin/TypeDetailPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/functions/_shared/schema-utils.ts\",\".framework/functions/_shared/principal.ts\",\"custom/apps/portal/pages/ContentPage.tsx\"]"]
|
|
260
|
-
// CIL[DOC-CONTRACT inputs="none" outputs="interaction_records[]" errors="database_error" side_effects="database_query,rls_filtering"]
|
|
261
|
-
// CIL[DOC-MICRO logic_summary="Builds filtered query for ai_feedback_record type with pagination" notable_decisions="[]"]
|
|
262
|
-
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
263
|
-
// CIL[DOC-STABILITY stability="stable"]
|
|
264
|
-
// CIL[DOC-VECTOR type="context" content="Layer: api-handler. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/TypeDetailPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/functions/_shared/schema-utils.ts, .framework/functions/_shared/principal.ts, custom/apps/portal/pages/ContentPage.tsx."]
|
|
265
|
-
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
266
|
-
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
267
|
-
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
323
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Create a draft CIL learning proposal from ticket context and source references.'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/resolve-ids.ts"]
|
|
324
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
325
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
326
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
268
327
|
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
269
328
|
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
329
|
+
// CIL[END stable_id="~/.framework/functions/ai-interactions.ts:createCilLearningProposal:constant"]
|
|
330
|
+
// CIL[BEGIN stable_id="~/.framework/functions/ai-interactions.ts:list:constant" type="constant" identity="list" parent="~/.framework/functions/ai-interactions.ts"]
|
|
331
|
+
// CIL[DOC-MACRO purpose="List AI interaction records filtered by feedback and kb_candidate."]
|
|
332
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Build a paged query scoped to the account, apply optional filters, and return matching rows."]
|
|
333
|
+
// CIL[DOC-CONTEXT module="ai-interactions" layer="functions" related_files=".framework/functions/_shared/audit.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/resolve-ids.ts,.framework/functions/admin-data.ts,.framework/functions/ai-interactions.ts"]
|
|
334
|
+
// CIL[DOC-CONTRACT inputs="ctx.query { feedback?, kb_candidate?, limit?, offset? }" outputs="array of records" errors="throws query error" side_effects="none"]
|
|
335
|
+
// CIL[DOC-MICRO logic_summary="Parse query parameters, select from items with account filter and optional data filters, then return data." notable_decisions="[]"]
|
|
336
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
337
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
270
338
|
export const list = createHandler(async (ctx, _body) => {
|
|
271
339
|
const { feedback, kb_candidate, limit = '50', offset = '0' } = ctx.query || {}
|
|
272
340
|
|
|
@@ -288,21 +356,21 @@ export const list = createHandler(async (ctx, _body) => {
|
|
|
288
356
|
if (error) throw error
|
|
289
357
|
return data || []
|
|
290
358
|
})
|
|
291
|
-
// CIL[
|
|
292
|
-
// CIL[
|
|
293
|
-
// CIL[DOC-
|
|
294
|
-
// CIL[DOC-
|
|
295
|
-
// CIL[DOC-CONTEXT module="ai-interactions" layer="api-handler" related_files="[]"]
|
|
296
|
-
// CIL[DOC-CONTRACT inputs="none" outputs="handler_response" errors="invalid_action_or_method" side_effects="delegates_to_interaction_handlers"]
|
|
297
|
-
// CIL[DOC-MICRO logic_summary="Routes actions to submit_feedback, create_interaction, update_interaction, list" notable_decisions="[]"]
|
|
298
|
-
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
299
|
-
// CIL[DOC-STABILITY stability="stable"]
|
|
300
|
-
// CIL[DOC-VECTOR type="context" content="Layer: api-handler. Direct callers: 0. Direct calls: 0. Related files: none."]
|
|
301
|
-
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
302
|
-
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
303
|
-
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
359
|
+
// CIL[DOC-VECTOR type="context" content="purpose='List AI interaction records filtered by feedback and kb_candidate.'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/resolve-ids.ts"]
|
|
360
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
361
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
362
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
304
363
|
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
305
364
|
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
365
|
+
// CIL[END stable_id="~/.framework/functions/ai-interactions.ts:list:constant"]
|
|
366
|
+
// CIL[BEGIN stable_id="~/.framework/functions/ai-interactions.ts:handler:constant" type="constant" identity="handler" parent="~/.framework/functions/ai-interactions.ts"]
|
|
367
|
+
// CIL[DOC-MACRO purpose="Main request router for the ai-interactions Netlify function."]
|
|
368
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Dispatch incoming requests to the correct action handler based on action and HTTP method."]
|
|
369
|
+
// CIL[DOC-CONTEXT module="ai-interactions" layer="functions" related_files=".framework/functions/_shared/audit.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/resolve-ids.ts,.framework/functions/admin-data.ts,.framework/functions/ai-interactions.ts"]
|
|
370
|
+
// CIL[DOC-CONTRACT inputs="ctx.query { action, method } and body" outputs="handler result" errors="invalid action or method" side_effects="delegates to other handlers"]
|
|
371
|
+
// CIL[DOC-MICRO logic_summary="Switch on action and method, call the appropriate sub-handler, and throw an error for unsupported combinations." notable_decisions="[]"]
|
|
372
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
373
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
306
374
|
export const handler = createHandler(async (ctx, body) => {
|
|
307
375
|
const { action } = ctx.query || {}
|
|
308
376
|
const method = ctx.query?.method || 'GET'
|
|
@@ -327,4 +395,10 @@ export const handler = createHandler(async (ctx, body) => {
|
|
|
327
395
|
|
|
328
396
|
throw new Error('Invalid action or method')
|
|
329
397
|
})
|
|
330
|
-
// CIL[
|
|
398
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Main request router for the ai-interactions Netlify function.'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/resolve-ids.ts"]
|
|
399
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
400
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
401
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
402
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
403
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
404
|
+
// CIL[END stable_id="~/.framework/functions/ai-interactions.ts:handler:constant"]
|