spine-framework 0.3.124 → 0.3.126
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/.framework/cli/commands/agents.ts +35 -37
- package/.framework/cli/commands/auth.ts +35 -34
- package/.framework/cli/commands/create-app.ts +104 -40
- package/.framework/cli/commands/dev.ts +104 -69
- package/.framework/cli/commands/doctor.ts +179 -69
- package/.framework/cli/commands/generate.ts +83 -143
- package/.framework/cli/commands/init.ts +72 -34
- package/.framework/cli/commands/install-app.ts +260 -125
- package/.framework/cli/commands/items.ts +33 -44
- package/.framework/cli/commands/migrate.ts +122 -40
- package/.framework/cli/commands/migrations.ts +33 -40
- package/.framework/cli/commands/pipelines.ts +31 -39
- package/.framework/cli/commands/status.ts +47 -23
- package/.framework/cli/commands/system.ts +47 -37
- package/.framework/cli/commands/test.ts +112 -68
- package/.framework/cli/commands/validate-app.ts +215 -121
- package/.framework/cli/context.ts +112 -130
- package/.framework/cli/env-loader.ts +47 -18
- package/.framework/cli/index.ts +81 -42
- package/.framework/docs/runtime-types.md +1024 -0
- package/.framework/functions/_shared/agent-runner.ts +1296 -961
- package/.framework/functions/_shared/app-manifest.ts +82 -68
- package/.framework/functions/_shared/audit.ts +135 -83
- package/.framework/functions/_shared/{cil-state.ts → cil.ts} +158 -56
- package/.framework/functions/_shared/db.ts +80 -126
- package/.framework/functions/_shared/hash-api-key.ts +63 -0
- package/.framework/functions/_shared/index.ts +224 -335
- package/.framework/functions/_shared/kb.ts +319 -0
- package/.framework/functions/_shared/llm.ts +92 -0
- package/.framework/functions/_shared/logging.ts +288 -0
- package/.framework/functions/_shared/middleware.ts +329 -365
- package/.framework/functions/_shared/outcomes.ts +36 -0
- package/.framework/functions/_shared/permissions.ts +359 -643
- package/.framework/functions/_shared/pipeline-runner.ts +243 -316
- package/.framework/functions/_shared/principal.ts +376 -468
- package/.framework/functions/_shared/resolve-credentials.ts +102 -0
- package/.framework/functions/_shared/resolve-ids.ts +188 -16
- package/.framework/functions/_shared/retry-deliveries.ts +104 -0
- package/.framework/functions/_shared/schema-utils.ts +611 -373
- package/.framework/functions/_shared/testing.ts +207 -137
- package/.framework/functions/_shared/tracing.ts +276 -0
- package/.framework/functions/_shared/trigger-engine.ts +159 -211
- package/.framework/functions/_shared/webhook-registration.ts +95 -81
- package/.framework/functions/_shared/webhook-registry.ts +153 -75
- package/.framework/functions/account-nodes.ts +31 -53
- package/.framework/functions/adapters/generic-webhook-inbound.ts +56 -0
- package/.framework/functions/adapters/generic-webhook-outbound.ts +43 -0
- package/.framework/functions/adapters/openai-outbound.ts +40 -0
- package/.framework/functions/admin-data.ts +685 -537
- package/.framework/functions/admin-funnel.ts +31 -20
- package/.framework/functions/admin-install-funnel.ts +47 -28
- package/.framework/functions/admin-signals.ts +47 -29
- package/.framework/functions/ai-agents.ts +122 -147
- package/.framework/functions/ai-interactions.ts +180 -90
- package/.framework/functions/api-keys.ts +250 -192
- package/.framework/functions/apps.ts +203 -197
- package/.framework/functions/auth.ts +98 -91
- package/.framework/functions/cil-agent-ingest.ts +773 -0
- package/.framework/functions/cil-agent.ts +592 -0
- package/.framework/functions/cil-callmap.ts +1227 -0
- package/.framework/functions/cil-config.ts +583 -0
- package/.framework/functions/cil-context.ts +445 -0
- package/.framework/functions/cil-doc.ts +1752 -0
- package/.framework/functions/cil-embeddings.ts +1202 -0
- package/.framework/functions/cil-graph.ts +585 -0
- package/.framework/functions/cil-ingest.ts +2416 -0
- package/.framework/functions/cil-pipeline.ts +318 -0
- package/.framework/functions/cil-project.ts +499 -0
- package/.framework/functions/cil-validate.ts +469 -0
- package/.framework/functions/debug-auth.ts +73 -53
- package/.framework/functions/deliveries.ts +117 -0
- package/.framework/functions/embeddings.ts +528 -516
- package/.framework/functions/eval-harness.ts +158 -106
- package/.framework/functions/integration-outbound.ts +311 -0
- package/.framework/functions/integration-routes.ts +240 -466
- package/.framework/functions/integrations.ts +132 -140
- package/.framework/functions/invites.ts +401 -201
- package/.framework/functions/item-progress.ts +113 -53
- package/.framework/functions/kb.ts +28 -0
- package/.framework/functions/logs.ts +239 -222
- package/.framework/functions/observability.ts +308 -259
- package/.framework/functions/pipeline-executions.ts +179 -235
- package/.framework/functions/pipelines.ts +163 -205
- package/.framework/functions/prompt-configs.ts +109 -156
- package/.framework/functions/roles.ts +97 -147
- package/.framework/functions/system-cron.ts +132 -218
- package/.framework/functions/system.ts +112 -52
- package/.framework/functions/tests.ts +32 -28
- package/.framework/functions/timers.ts +162 -210
- package/.framework/functions/triggers.ts +282 -346
- package/.framework/functions/types.ts +283 -400
- package/.framework/migrations/001_core_schema.sql +630 -0
- package/.framework/migrations/002_core_rls_and_functions.sql +532 -0
- package/.framework/migrations/{003_system_data.sql → 003_core_system_data.sql} +26 -153
- package/.framework/migrations/004_core_rpc_and_broker.sql +421 -0
- package/.framework/migrations/005_core_observability.sql +598 -0
- package/.framework/migrations/006_security_hardening_rls.sql +97 -0
- package/.framework/migrations/007_kb_article_list.sql +237 -0
- package/.framework/migrations/008_items_target.sql +8 -0
- package/.framework/migrations/009_roles_slug_unique.sql +11 -0
- package/.framework/public/spine.config.json +91 -0
- package/.framework/scripts/app-install-cli.ts +112 -98
- package/.framework/src/App.tsx +67 -20
- package/.framework/src/apps/admin/index.tsx +97 -27
- package/.framework/src/components/AppWrapper.tsx +50 -11
- package/.framework/src/components/CustomAppLoader.tsx +131 -22
- package/.framework/src/components/admin/AdminListPage.tsx +75 -8
- package/.framework/src/components/admin/AdminSidebar.tsx +148 -36
- package/.framework/src/components/admin/AdminStatsCard.tsx +48 -29
- package/.framework/src/components/admin/PageInstructions.tsx +49 -0
- package/.framework/src/components/admin/SortableTableHeader.tsx +49 -2
- package/.framework/src/components/app-shell/GenericAppShell.tsx +69 -11
- package/.framework/src/components/app-shell/GenericDetailPage.tsx +55 -10
- package/.framework/src/components/app-shell/GenericListPage.tsx +76 -9
- package/.framework/src/components/app-sidebar.tsx +50 -3
- package/.framework/src/components/auth/ProtectedRoute.tsx +53 -45
- package/.framework/src/components/kb/KBArticleEditor.tsx +409 -0
- package/.framework/src/components/kb/KBArticleList.tsx +557 -0
- package/.framework/src/components/layout/AppShell.tsx +54 -16
- package/.framework/src/components/layout/Header.tsx +50 -38
- package/.framework/src/components/layout/Layout.tsx +48 -32
- package/.framework/src/components/layout/Sidebar.tsx +167 -16
- package/.framework/src/components/runtime/DataDetailHeader.tsx +33 -1
- package/.framework/src/components/runtime/DataDetailPage.tsx +289 -4
- package/.framework/src/components/runtime/DataFilters.tsx +78 -1
- package/.framework/src/components/runtime/DataHeader.tsx +32 -29
- package/.framework/src/components/runtime/DataListPage.tsx +161 -2
- package/.framework/src/components/runtime/DataStats.tsx +48 -1
- package/.framework/src/components/runtime/DataTable.tsx +153 -1
- package/.framework/src/components/runtime/SchemaDetailForm.tsx +77 -46
- package/.framework/src/components/runtime/index.ts +16 -9
- package/.framework/src/components/search-form.tsx +33 -1
- package/.framework/src/components/shared/AgentView.tsx +48 -51
- package/.framework/src/components/shared/FieldRenderer.tsx +84 -67
- package/.framework/src/components/shared/InviteManager.tsx +113 -52
- package/.framework/src/components/shared/MemberList.tsx +182 -0
- package/.framework/src/components/shared/SchemaFields.tsx +96 -78
- package/.framework/src/components/ui/DataTable.tsx +86 -56
- package/.framework/src/components/ui/Form.tsx +188 -109
- package/.framework/src/components/ui/ItemCard.tsx +86 -58
- package/.framework/src/components/ui/ItemListView.tsx +88 -61
- package/.framework/src/components/ui/LoadingSpinner.tsx +52 -27
- package/.framework/src/components/ui/Modal.tsx +81 -4
- package/.framework/src/components/ui/RichTextEditor.tsx +101 -9
- package/.framework/src/components/ui/accordion.tsx +97 -5
- package/.framework/src/components/ui/alert-dialog.tsx +225 -13
- package/.framework/src/components/ui/alert.tsx +113 -6
- package/.framework/src/components/ui/aspect-ratio.tsx +49 -2
- package/.framework/src/components/ui/avatar.tsx +129 -7
- package/.framework/src/components/ui/badge.tsx +65 -3
- package/.framework/src/components/ui/breadcrumb.tsx +145 -8
- package/.framework/src/components/ui/button-group.tsx +81 -4
- package/.framework/src/components/ui/button.tsx +49 -2
- package/.framework/src/components/ui/calendar.tsx +65 -3
- package/.framework/src/components/ui/card.tsx +145 -8
- package/.framework/src/components/ui/carousel.tsx +129 -7
- package/.framework/src/components/ui/chart.tsx +161 -10
- package/.framework/src/components/ui/checkbox.tsx +49 -2
- package/.framework/src/components/ui/collapsible.tsx +81 -5
- package/.framework/src/components/ui/combobox.tsx +305 -20
- package/.framework/src/components/ui/command.tsx +177 -11
- package/.framework/src/components/ui/context-menu.tsx +273 -17
- package/.framework/src/components/ui/dialog.tsx +209 -27
- package/.framework/src/components/ui/direction.tsx +64 -4
- package/.framework/src/components/ui/drawer.tsx +193 -12
- package/.framework/src/components/ui/dropdown-menu.tsx +273 -18
- package/.framework/src/components/ui/empty.tsx +145 -9
- package/.framework/src/components/ui/field.tsx +209 -14
- package/.framework/src/components/ui/hover-card.tsx +81 -4
- package/.framework/src/components/ui/input-group.tsx +162 -10
- package/.framework/src/components/ui/input-otp.tsx +98 -5
- package/.framework/src/components/ui/input.tsx +49 -2
- package/.framework/src/components/ui/item.tsx +225 -13
- package/.framework/src/components/ui/kbd.tsx +65 -3
- package/.framework/src/components/ui/label.tsx +49 -2
- package/.framework/src/components/ui/menubar.tsx +289 -17
- package/.framework/src/components/ui/native-select.tsx +97 -5
- package/.framework/src/components/ui/navigation-menu.tsx +177 -10
- package/.framework/src/components/ui/pagination.tsx +161 -9
- package/.framework/src/components/ui/popover.tsx +145 -8
- package/.framework/src/components/ui/progress.tsx +49 -2
- package/.framework/src/components/ui/radio-group.tsx +65 -3
- package/.framework/src/components/ui/resizable.tsx +82 -4
- package/.framework/src/components/ui/scroll-area.tsx +65 -3
- package/.framework/src/components/ui/select.tsx +193 -11
- package/.framework/src/components/ui/separator.tsx +49 -2
- package/.framework/src/components/ui/sheet.tsx +193 -11
- package/.framework/src/components/ui/sidebar.tsx +481 -38
- package/.framework/src/components/ui/skeleton.tsx +49 -2
- package/.framework/src/components/ui/slider.tsx +49 -2
- package/.framework/src/components/ui/sonner.tsx +49 -2
- package/.framework/src/components/ui/spinner.tsx +49 -2
- package/.framework/src/components/ui/switch.tsx +49 -2
- package/.framework/src/components/ui/table-primitives.tsx +160 -33
- package/.framework/src/components/ui/table.tsx +161 -9
- package/.framework/src/components/ui/tabs.tsx +113 -6
- package/.framework/src/components/ui/textarea.tsx +49 -2
- package/.framework/src/components/ui/toggle-group.tsx +81 -4
- package/.framework/src/components/ui/toggle.tsx +65 -3
- package/.framework/src/components/ui/tooltip.tsx +97 -5
- package/.framework/src/contexts/AppContext.tsx +129 -45
- package/.framework/src/contexts/AuthContext.tsx +187 -144
- package/.framework/src/hooks/use-mobile.ts +48 -2
- package/.framework/src/hooks/useApi.ts +208 -159
- package/.framework/src/hooks/useAppPath.ts +32 -23
- package/.framework/src/hooks/useApps.ts +51 -20
- package/.framework/src/hooks/useEntityList.ts +32 -78
- package/.framework/src/hooks/useEntityRecord.ts +35 -96
- package/.framework/src/hooks/useForm.ts +32 -92
- package/.framework/src/hooks/useListSchema.ts +49 -78
- package/.framework/src/hooks/useSchemaRecord.ts +114 -105
- package/.framework/src/lib/api.ts +195 -116
- package/.framework/src/lib/supabase.ts +98 -64
- package/.framework/src/lib/utils.ts +287 -151
- package/.framework/src/main.tsx +49 -3
- package/.framework/src/pages/DashboardPage.tsx +52 -29
- package/.framework/src/pages/NotFoundPage.tsx +32 -10
- package/.framework/src/pages/SetupPage.tsx +32 -12
- package/.framework/src/pages/admin/AIAgentDetailPage.tsx +119 -10
- package/.framework/src/pages/admin/AIAgentsPage.tsx +48 -19
- package/.framework/src/pages/admin/APIKeyDetailPage.tsx +187 -17
- package/.framework/src/pages/admin/APIKeysPage.tsx +98 -22
- package/.framework/src/pages/admin/AlertsConfigPage.tsx +113 -26
- package/.framework/src/pages/admin/AppDetailPage.tsx +125 -8
- package/.framework/src/pages/admin/AppsPage.tsx +49 -2
- package/.framework/src/pages/admin/DeliveriesPage.tsx +196 -0
- package/.framework/src/pages/admin/DesignedPage.tsx +32 -18
- package/.framework/src/pages/admin/EmbeddingDetailPage.tsx +215 -484
- package/.framework/src/pages/admin/EmbeddingsPage.tsx +116 -319
- package/.framework/src/pages/admin/ExtendedShadcnTestPage.tsx +34 -9
- package/.framework/src/pages/admin/IncrementalShadcnTestPage.tsx +34 -9
- package/.framework/src/pages/admin/IntegratedDashboard.tsx +32 -16
- package/.framework/src/pages/admin/IntegrationDetailPage.tsx +183 -26
- package/.framework/src/pages/admin/IntegrationsPage.tsx +48 -19
- package/.framework/src/pages/admin/InvitesPage.tsx +48 -14
- package/.framework/src/pages/admin/LogsPage.tsx +422 -75
- package/.framework/src/pages/admin/MinimalShadcnTestPage.tsx +34 -9
- package/.framework/src/pages/admin/ObservabilityDashboard.tsx +113 -24
- package/.framework/src/pages/admin/PipelineDetailPage.tsx +206 -34
- package/.framework/src/pages/admin/PipelineExecutionsPage.tsx +50 -17
- package/.framework/src/pages/admin/PipelinesPage.tsx +160 -21
- package/.framework/src/pages/admin/PromptConfigDetailPage.tsx +378 -88
- package/.framework/src/pages/admin/PromptConfigsPage.tsx +125 -16
- package/.framework/src/pages/admin/ProperlyDesignedPage.tsx +49 -10
- package/.framework/src/pages/admin/RoleDetailPage.tsx +130 -10
- package/.framework/src/pages/admin/RolesPage.tsx +171 -18
- package/.framework/src/pages/admin/SelectTestPage.tsx +34 -9
- package/.framework/src/pages/admin/ShadcnTestPage.tsx +49 -11
- package/.framework/src/pages/admin/SimpleDashboard.tsx +49 -10
- package/.framework/src/pages/admin/TestRunDetailPage.tsx +49 -4
- package/.framework/src/pages/admin/TestingDashboard.tsx +98 -28
- package/.framework/src/pages/admin/TimerDetailPage.tsx +143 -33
- package/.framework/src/pages/admin/TimersPage.tsx +48 -20
- package/.framework/src/pages/admin/TriggerDetailPage.tsx +118 -30
- package/.framework/src/pages/admin/TriggersPage.tsx +64 -19
- package/.framework/src/pages/admin/TypeDetailPage.tsx +138 -15
- package/.framework/src/pages/admin/TypesPage.tsx +48 -20
- package/.framework/src/pages/admin/cil/CILAgentPage.tsx +465 -0
- package/.framework/src/pages/admin/cil/CILChunkDetailPage.tsx +787 -0
- package/.framework/src/pages/admin/cil/CILDashboardPage.tsx +699 -0
- package/.framework/src/pages/admin/cil/CILFileListPage.tsx +647 -0
- package/.framework/src/pages/admin/cil/CILGraphPage.tsx +616 -0
- package/.framework/src/pages/admin/cil/CILIngestionPage.tsx +1402 -0
- package/.framework/src/pages/admin/cil/CILProjectsPage.tsx +614 -0
- package/.framework/src/pages/admin/cil/CILSearchPage.tsx +571 -0
- package/.framework/src/pages/admin/cil/FlexiblePipelinePage.tsx +731 -0
- package/.framework/src/pages/admin/kb/KBAdminPage.tsx +64 -0
- package/.framework/src/pages/auth/AuthConfirmPage.tsx +52 -51
- package/.framework/src/pages/auth/ForgotPasswordPage.tsx +31 -22
- package/.framework/src/pages/auth/LoginPage.tsx +50 -23
- package/.framework/src/pages/auth/PendingApprovalPage.tsx +31 -15
- package/.framework/src/pages/auth/RegisterPage.tsx +281 -317
- package/.framework/src/pages/spine-framework/APIPage.tsx +33 -0
- package/.framework/src/pages/spine-framework/CLIPage.tsx +33 -0
- package/.framework/src/types/auth.ts +128 -71
- package/.framework/src/types/types.ts +373 -157
- package/custom/.devin/skills/spine-workbench-discovery/SKILL.md +39 -0
- package/custom/.devin/skills/spine-workbench-idea/SKILL.md +36 -0
- package/custom/.devin/skills/spine-workbench-implement/SKILL.md +46 -0
- package/custom/.devin/skills/spine-workbench-initiative/SKILL.md +28 -0
- package/custom/.devin/skills/spine-workbench-plan/SKILL.md +38 -0
- package/docs/README.md +9 -130
- package/netlify.toml +5 -2
- package/package.json +13 -25
- package/scripts/kb-ingest-docs.ts +203 -0
- package/spine.config.json +65 -4
- package/.framework/migrations/001_schema.sql +0 -425
- package/.framework/migrations/002_rls_and_functions.sql +0 -763
- package/.framework/migrations/004_enhancements.sql +0 -43
- package/.framework/migrations/005_auth_user_trigger.sql +0 -105
- package/.framework/migrations/006_fix_current_actor_id.sql +0 -21
- package/.framework/migrations/016_invites.sql +0 -27
- package/.framework/migrations/017_fix_get_account_apps.sql +0 -78
- package/.framework/migrations/018_apps_required_roles.sql +0 -17
- package/.framework/migrations/019_triggers_unique_constraint.sql +0 -13
- package/.framework/migrations/020_get_account_apps_role_filter.sql +0 -117
- package/.framework/migrations/021_app_domains.sql +0 -112
- package/.framework/migrations/022_route_prefix_domain_unique.sql +0 -21
- package/.framework/migrations/023_match_embeddings_rpc.sql +0 -78
- package/.framework/migrations/024_messages_account_id.sql +0 -9
- package/.framework/migrations/025_retype_threads_messages.sql +0 -240
- package/.framework/migrations/026_fix_rls_policies.sql +0 -47
- package/.framework/migrations/027_embedding_lifecycle.sql +0 -176
- package/.framework/migrations/028_fix_message_data_permissions.sql +0 -49
- package/.framework/migrations/029_tighten_support_triage_prompt.sql +0 -41
- package/.framework/migrations/030_messages_updated_by.sql +0 -6
- package/.framework/migrations/031_seed_upsert_constraints.sql +0 -35
- package/docs/APPS.md +0 -232
- package/docs/ARCHITECTURE.md +0 -246
- package/docs/INSTALL.md +0 -155
- package/docs/design-schema-spec.md +0 -1837
- package/docs/dev-guides/01-create-an-app.md +0 -183
- package/docs/dev-guides/02-create-a-function.md +0 -178
- package/docs/dev-guides/03-create-a-component.md +0 -178
- package/docs/dev-guides/04-webhook-handlers.md +0 -129
- package/docs/dev-guides/05-testing.md +0 -168
- package/docs/dev-guides/README.md +0 -40
- package/docs/npm-packages-plan.md +0 -288
- package/docs/spine-core--api-reference.md +0 -822
|
@@ -1,21 +1,37 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @module admin-funnel
|
|
3
|
-
* @audience system-admin
|
|
4
|
-
* @layer api-handler
|
|
5
|
-
* @stability stable
|
|
6
|
-
*
|
|
7
|
-
* Admin API for funnel metrics and analytics
|
|
8
|
-
*/
|
|
9
1
|
|
|
2
|
+
// CIL[BEGIN chunk_id="admin-funnel_module_header_1784019432" type="module_header" identity="imports" parent="none"]
|
|
3
|
+
// CIL[DOC-MACRO purpose="Import dependencies for funnel metrics"]
|
|
4
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Provide middleware and admin database access"]
|
|
5
|
+
// CIL[DOC-CONTEXT module="admin-funnel" layer="api-handler" related_files="[\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/functions/_shared/schema-utils.ts\",\"custom/apps/portal/pages/ContentPage.tsx\",\"\\\"]"]
|
|
6
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="imported_modules" errors="none" side_effects="none"]
|
|
7
|
+
// CIL[DOC-MICRO logic_summary="Imports required modules for funnel analytics" notable_decisions="[]"]
|
|
8
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
9
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
10
|
+
// CIL[DOC-AUDIENCE audience="developer"]
|
|
11
|
+
// CIL[DOC-VECTOR type="context" content="Layer: api-handler. Direct callers: 0. Direct calls: 0. Related files: custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/functions/_shared/principal.ts, .framework/functions/_shared/schema-utils.ts, custom/apps/portal/pages/ContentPage.tsx, \."]
|
|
12
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
13
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
14
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
15
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
16
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
10
17
|
import { createHandler } from './_shared/middleware'
|
|
11
18
|
import { adminDb } from './_shared/db'
|
|
12
|
-
|
|
13
|
-
//
|
|
14
|
-
//
|
|
15
|
-
//
|
|
16
|
-
|
|
19
|
+
// CIL[END chunk_id="admin-funnel_module_header_1784019432"]
|
|
20
|
+
// CIL[BEGIN chunk_id="admin-funnel_metrics_1784019432" type="function" identity="metrics" parent="none"]
|
|
21
|
+
// CIL[DOC-MACRO purpose="Calculate funnel metrics and conversion rates"]
|
|
22
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Aggregate funnel data across visitor journey stages"]
|
|
23
|
+
// CIL[DOC-CONTEXT module="admin-funnel" layer="api-handler" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/components/ui/dialog.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\".framework/functions/_shared/principal.ts\",\"\\\"]"]
|
|
24
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="funnel_metrics_object" errors="types_not_found" side_effects="database_queries,aggregation_calculations"]
|
|
25
|
+
// CIL[DOC-MICRO logic_summary="Queries signals, sessions, instances; calculates conversion rates and stage distribution" notable_decisions="[]"]
|
|
26
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="external_symbols_unknown"]
|
|
27
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
28
|
+
// CIL[DOC-VECTOR type="context" content="Layer: api-handler. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/components/ui/dialog.tsx, .framework/src/pages/admin/RolesPage.tsx, .framework/functions/_shared/principal.ts, \."]
|
|
29
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
30
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
31
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
32
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
33
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
17
34
|
export const metrics = createHandler(async (ctx, body) => {
|
|
18
|
-
// Get type IDs
|
|
19
35
|
const { data: signalType } = await adminDb
|
|
20
36
|
.from('item_type_registry')
|
|
21
37
|
.select('id')
|
|
@@ -38,7 +54,6 @@ export const metrics = createHandler(async (ctx, body) => {
|
|
|
38
54
|
throw new Error('Required types not found')
|
|
39
55
|
}
|
|
40
56
|
|
|
41
|
-
// Count by stage
|
|
42
57
|
const { data: stageData } = await adminDb
|
|
43
58
|
.from('items')
|
|
44
59
|
.select('data->>stage, account_id')
|
|
@@ -55,7 +70,6 @@ export const metrics = createHandler(async (ctx, body) => {
|
|
|
55
70
|
|
|
56
71
|
const totalStageSignals = Object.values(stageCounts).reduce((sum, count) => sum + count, 0)
|
|
57
72
|
|
|
58
|
-
// Anonymous visitors (sessions without account)
|
|
59
73
|
const { count: anonymousSessions } = await adminDb
|
|
60
74
|
.from('items')
|
|
61
75
|
.select('*', { count: 'exact', head: true })
|
|
@@ -63,7 +77,6 @@ export const metrics = createHandler(async (ctx, body) => {
|
|
|
63
77
|
.is('data->lifecycle->>stitched_to_account_id', null)
|
|
64
78
|
.gte('created_at', new Date(Date.now() - 30 * 24 * 60 * 60 * 1000).toISOString())
|
|
65
79
|
|
|
66
|
-
// Identified users (unique accounts with signals)
|
|
67
80
|
const { data: accountData } = await adminDb
|
|
68
81
|
.from('items')
|
|
69
82
|
.select('account_id')
|
|
@@ -73,21 +86,18 @@ export const metrics = createHandler(async (ctx, body) => {
|
|
|
73
86
|
|
|
74
87
|
const uniqueAccounts = new Set(accountData?.map(item => item.account_id)).size
|
|
75
88
|
|
|
76
|
-
// Installed instances
|
|
77
89
|
const { count: installedInstances } = await adminDb
|
|
78
90
|
.from('items')
|
|
79
91
|
.select('*', { count: 'exact', head: true })
|
|
80
92
|
.eq('type_id', instanceType.id)
|
|
81
93
|
.not('data->>claimed_by_person_id', 'is', null)
|
|
82
94
|
|
|
83
|
-
// Stage distribution with percentages
|
|
84
95
|
const stageDistribution = Object.entries(stageCounts).map(([stage, count]) => ({
|
|
85
96
|
stage,
|
|
86
97
|
count,
|
|
87
98
|
percentage: totalStageSignals > 0 ? (count / totalStageSignals) * 100 : 0
|
|
88
99
|
}))
|
|
89
100
|
|
|
90
|
-
// Conversion rates (simplified)
|
|
91
101
|
const anonymousToIdentified = anonymousSessions > 0 ? (uniqueAccounts / anonymousSessions) * 100 : 0
|
|
92
102
|
const identifiedToInstalled = uniqueAccounts > 0 ? (installedInstances / uniqueAccounts) * 100 : 0
|
|
93
103
|
|
|
@@ -102,3 +112,4 @@ export const metrics = createHandler(async (ctx, body) => {
|
|
|
102
112
|
stage_distribution: stageDistribution
|
|
103
113
|
}
|
|
104
114
|
})
|
|
115
|
+
// CIL[END chunk_id="admin-funnel_metrics_1784019432"]
|
|
@@ -1,21 +1,38 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @module admin-install-funnel
|
|
3
|
-
* @audience system-admin
|
|
4
|
-
* @layer api-handler
|
|
5
|
-
* @stability stable
|
|
6
|
-
*
|
|
7
|
-
* Admin API for install funnel metrics and analytics
|
|
8
|
-
*/
|
|
9
1
|
|
|
2
|
+
|
|
3
|
+
// CIL[BEGIN chunk_id="admin-install-funnel_module_header_1784019432" type="module_header" identity="imports" parent="none"]
|
|
4
|
+
// CIL[DOC-MACRO purpose="Import dependencies for install funnel analytics"]
|
|
5
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Provide middleware and admin database access"]
|
|
6
|
+
// CIL[DOC-CONTEXT module="admin-install-funnel" layer="api-handler" related_files="[\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/src/components/layout/Sidebar.tsx\",\".framework/functions/_shared/schema-utils.ts\",\"\\\"]"]
|
|
7
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="imported_modules" errors="none" side_effects="none"]
|
|
8
|
+
// CIL[DOC-MICRO logic_summary="Imports required modules for install funnel processing" notable_decisions="[]"]
|
|
9
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
10
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
11
|
+
// CIL[DOC-AUDIENCE audience="developer"]
|
|
12
|
+
// CIL[DOC-VECTOR type="context" content="Layer: api-handler. Direct callers: 0. Direct calls: 0. Related files: custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/functions/_shared/principal.ts, .framework/src/components/layout/Sidebar.tsx, .framework/functions/_shared/schema-utils.ts, \."]
|
|
13
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
14
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
15
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
16
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
17
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
10
18
|
import { createHandler } from './_shared/middleware'
|
|
11
19
|
import { adminDb } from './_shared/db'
|
|
12
|
-
|
|
13
|
-
//
|
|
14
|
-
//
|
|
15
|
-
//
|
|
16
|
-
|
|
20
|
+
// CIL[END chunk_id="admin-install-funnel_module_header_1784019432"]
|
|
21
|
+
// CIL[BEGIN chunk_id="admin-install-funnel_metrics_1784019432" type="function" identity="metrics" parent="none"]
|
|
22
|
+
// CIL[DOC-MACRO purpose="Calculate install funnel metrics and trends"]
|
|
23
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Aggregate install data with conversion rates and version analytics"]
|
|
24
|
+
// CIL[DOC-CONTEXT module="admin-install-funnel" layer="api-handler" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\".framework/src/components/ui/dialog.tsx\",\"\\\"]"]
|
|
25
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="install_metrics_object" errors="funnel_signal_type_not_found" side_effects="database_queries,aggregation_calculations,trend_analysis"]
|
|
26
|
+
// CIL[DOC-MICRO logic_summary="Counts downloads/installs, calculates conversion rates, analyzes versions, tracks trends" notable_decisions="[]"]
|
|
27
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="external_symbols_unknown"]
|
|
28
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
29
|
+
// CIL[DOC-VECTOR type="context" content="Layer: api-handler. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/RolesPage.tsx, .framework/src/components/ui/dialog.tsx, \."]
|
|
30
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
31
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
32
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
33
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
34
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
17
35
|
export const metrics = createHandler(async (ctx, body) => {
|
|
18
|
-
// Get type IDs
|
|
19
36
|
const { data: signalType } = await adminDb
|
|
20
37
|
.from('item_type_registry')
|
|
21
38
|
.select('id')
|
|
@@ -26,7 +43,6 @@ export const metrics = createHandler(async (ctx, body) => {
|
|
|
26
43
|
throw new Error('funnel_signal type not found')
|
|
27
44
|
}
|
|
28
45
|
|
|
29
|
-
// Total downloads (signals with source='inst' and action_type='download')
|
|
30
46
|
const { count: totalDownloads } = await adminDb
|
|
31
47
|
.from('items')
|
|
32
48
|
.select('*', { count: 'exact', head: true })
|
|
@@ -34,7 +50,6 @@ export const metrics = createHandler(async (ctx, body) => {
|
|
|
34
50
|
.eq('data->>source', 'inst')
|
|
35
51
|
.eq('data->>action_type', 'download')
|
|
36
52
|
|
|
37
|
-
// Unique installers (unique serial numbers from install signals)
|
|
38
53
|
const { data: installerData } = await adminDb
|
|
39
54
|
.from('items')
|
|
40
55
|
.select('data->>serial')
|
|
@@ -44,7 +59,6 @@ export const metrics = createHandler(async (ctx, body) => {
|
|
|
44
59
|
|
|
45
60
|
const uniqueInstallers = new Set(installerData?.map(item => item.data?.serial)).size
|
|
46
61
|
|
|
47
|
-
// Active instances (install signals with serial in last 7 days)
|
|
48
62
|
const sevenDaysAgo = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString()
|
|
49
63
|
const { count: activeInstances } = await adminDb
|
|
50
64
|
.from('items')
|
|
@@ -54,7 +68,6 @@ export const metrics = createHandler(async (ctx, body) => {
|
|
|
54
68
|
.not('data->>serial', 'is', null)
|
|
55
69
|
.gte('created_at', sevenDaysAgo)
|
|
56
70
|
|
|
57
|
-
// Conversion funnel counts
|
|
58
71
|
const { count: installations } = await adminDb
|
|
59
72
|
.from('items')
|
|
60
73
|
.select('*', { count: 'exact', head: true })
|
|
@@ -76,7 +89,6 @@ export const metrics = createHandler(async (ctx, body) => {
|
|
|
76
89
|
.eq('data->>source', 'inst')
|
|
77
90
|
.not('data->>claimed_by_person_id', 'is', null)
|
|
78
91
|
|
|
79
|
-
// Recent installs with account info
|
|
80
92
|
const { data: recentInstalls } = await adminDb
|
|
81
93
|
.from('items')
|
|
82
94
|
.select(`
|
|
@@ -111,7 +123,6 @@ export const metrics = createHandler(async (ctx, body) => {
|
|
|
111
123
|
person_email: instance.people?.email
|
|
112
124
|
}))
|
|
113
125
|
|
|
114
|
-
// Version distribution
|
|
115
126
|
const { data: versionData } = await adminDb
|
|
116
127
|
.from('items')
|
|
117
128
|
.select('data->>version')
|
|
@@ -133,7 +144,6 @@ export const metrics = createHandler(async (ctx, body) => {
|
|
|
133
144
|
percentage: totalVersions > 0 ? (count / totalVersions) * 100 : 0
|
|
134
145
|
}))
|
|
135
146
|
|
|
136
|
-
// Install trends (last 30 days)
|
|
137
147
|
const thirtyDaysAgo = new Date(Date.now() - 30 * 24 * 60 * 60 * 1000)
|
|
138
148
|
const installTrends = []
|
|
139
149
|
|
|
@@ -183,13 +193,22 @@ export const metrics = createHandler(async (ctx, body) => {
|
|
|
183
193
|
top_versions: topVersions
|
|
184
194
|
}
|
|
185
195
|
})
|
|
186
|
-
|
|
187
|
-
//
|
|
188
|
-
//
|
|
189
|
-
//
|
|
190
|
-
|
|
196
|
+
// CIL[END chunk_id="admin-install-funnel_metrics_1784019432"]
|
|
197
|
+
// CIL[BEGIN chunk_id="admin-install-funnel_exportdata_1784019432" type="function" identity="exportData" parent="none"]
|
|
198
|
+
// CIL[DOC-MACRO purpose="Export all install instances with full details"]
|
|
199
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Provide complete install data for analysis and reporting"]
|
|
200
|
+
// CIL[DOC-CONTEXT module="admin-install-funnel" layer="api-handler" related_files="[\".framework/functions/_shared/schema-utils.ts\",\".framework/src/components/layout/Sidebar.tsx\",\".framework/src/components/ui/dialog.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"\\\"]"]
|
|
201
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="export_data_object" errors="funnel_signal_type_not_found" side_effects="database_query,data_export"]
|
|
202
|
+
// CIL[DOC-MICRO logic_summary="Queries all install instances with full details and metadata" notable_decisions="[]"]
|
|
203
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
204
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
205
|
+
// 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/layout/Sidebar.tsx, .framework/src/components/ui/dialog.tsx, .framework/functions/_shared/principal.ts, .framework/src/pages/admin/TypeDetailPage.tsx, \."]
|
|
206
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
207
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
208
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
209
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
210
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
191
211
|
export const exportData = createHandler(async (ctx, body) => {
|
|
192
|
-
// Get type IDs
|
|
193
212
|
const { data: signalType } = await adminDb
|
|
194
213
|
.from('item_type_registry')
|
|
195
214
|
.select('id')
|
|
@@ -200,7 +219,6 @@ export const exportData = createHandler(async (ctx, body) => {
|
|
|
200
219
|
throw new Error('funnel_signal type not found')
|
|
201
220
|
}
|
|
202
221
|
|
|
203
|
-
// Export all instances with full details
|
|
204
222
|
const { data: instances } = await adminDb
|
|
205
223
|
.from('items')
|
|
206
224
|
.select(`
|
|
@@ -223,3 +241,4 @@ export const exportData = createHandler(async (ctx, body) => {
|
|
|
223
241
|
total_count: instances?.length || 0
|
|
224
242
|
}
|
|
225
243
|
})
|
|
244
|
+
// CIL[END chunk_id="admin-install-funnel_exportdata_1784019432"]
|
|
@@ -1,25 +1,42 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @module admin-signals
|
|
3
|
-
* @audience system-admin
|
|
4
|
-
* @layer api-handler
|
|
5
|
-
* @stability stable
|
|
6
|
-
*
|
|
7
|
-
* Admin API for signal analytics and audit functionality
|
|
8
|
-
*/
|
|
9
1
|
|
|
2
|
+
|
|
3
|
+
// CIL[BEGIN chunk_id="admin-signals_module_header_1784019432" type="module_header" identity="imports" parent="none"]
|
|
4
|
+
// CIL[DOC-MACRO purpose="Import dependencies for signal analytics"]
|
|
5
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Provide middleware and admin database access"]
|
|
6
|
+
// CIL[DOC-CONTEXT module="admin-signals" layer="api-handler" related_files="[\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/functions/_shared/schema-utils.ts\",\"custom/apps/portal/pages/ContentPage.tsx\",\"\\\"]"]
|
|
7
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="imported_modules" errors="none" side_effects="none"]
|
|
8
|
+
// CIL[DOC-MICRO logic_summary="Imports required modules for signal processing" notable_decisions="[]"]
|
|
9
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
10
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
11
|
+
// CIL[DOC-AUDIENCE audience="developer"]
|
|
12
|
+
// CIL[DOC-VECTOR type="context" content="Layer: api-handler. Direct callers: 0. Direct calls: 0. Related files: custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/functions/_shared/principal.ts, .framework/functions/_shared/schema-utils.ts, custom/apps/portal/pages/ContentPage.tsx, \."]
|
|
13
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
14
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
15
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
16
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
17
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
10
18
|
import { createHandler } from './_shared/middleware'
|
|
11
19
|
import { adminDb } from './_shared/db'
|
|
12
|
-
|
|
13
|
-
//
|
|
14
|
-
//
|
|
15
|
-
//
|
|
16
|
-
|
|
20
|
+
// CIL[END chunk_id="admin-signals_module_header_1784019432"]
|
|
21
|
+
// CIL[BEGIN chunk_id="admin-signals_metrics_1784019432" type="function" identity="metrics" parent="none"]
|
|
22
|
+
// CIL[DOC-MACRO purpose="Calculate signal metrics and analytics"]
|
|
23
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Aggregate signal data with conversion rates and trends"]
|
|
24
|
+
// CIL[DOC-CONTEXT module="admin-signals" layer="api-handler" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/components/ui/dialog.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\".framework/functions/_shared/principal.ts\",\"\\\"]"]
|
|
25
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="signal_metrics_object" errors="funnel_signal_type_not_found" side_effects="database_queries,aggregation_calculations"]
|
|
26
|
+
// CIL[DOC-MICRO logic_summary="Counts signals by time periods, calculates sources, formats recent signals, computes conversion rates" notable_decisions="[]"]
|
|
27
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="external_symbols_unknown"]
|
|
28
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
29
|
+
// CIL[DOC-VECTOR type="context" content="Layer: api-handler. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/components/ui/dialog.tsx, .framework/src/pages/admin/RolesPage.tsx, .framework/functions/_shared/principal.ts, \."]
|
|
30
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
31
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
32
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
33
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
34
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
17
35
|
export const metrics = createHandler(async (ctx, body) => {
|
|
18
36
|
const now = new Date()
|
|
19
37
|
const today = now.toISOString().split('T')[0]
|
|
20
38
|
const weekAgo = new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000).toISOString()
|
|
21
39
|
|
|
22
|
-
// Get funnel_signal type ID
|
|
23
40
|
const { data: signalType } = await adminDb
|
|
24
41
|
.from('item_type_registry')
|
|
25
42
|
.select('id')
|
|
@@ -30,27 +47,23 @@ export const metrics = createHandler(async (ctx, body) => {
|
|
|
30
47
|
throw new Error('funnel_signal type not found')
|
|
31
48
|
}
|
|
32
49
|
|
|
33
|
-
// Total signals
|
|
34
50
|
const { count: totalSignals } = await adminDb
|
|
35
51
|
.from('items')
|
|
36
52
|
.select('*', { count: 'exact', head: true })
|
|
37
53
|
.eq('type_id', signalType.id)
|
|
38
54
|
|
|
39
|
-
// Signals today
|
|
40
55
|
const { count: signalsToday } = await adminDb
|
|
41
56
|
.from('items')
|
|
42
57
|
.select('*', { count: 'exact', head: true })
|
|
43
58
|
.eq('type_id', signalType.id)
|
|
44
59
|
.gte('created_at', today)
|
|
45
60
|
|
|
46
|
-
// Signals this week
|
|
47
61
|
const { count: signalsThisWeek } = await adminDb
|
|
48
62
|
.from('items')
|
|
49
63
|
.select('*', { count: 'exact', head: true })
|
|
50
64
|
.eq('type_id', signalType.id)
|
|
51
65
|
.gte('created_at', weekAgo)
|
|
52
66
|
|
|
53
|
-
// Top sources
|
|
54
67
|
const { data: sourceData } = await adminDb
|
|
55
68
|
.from('items')
|
|
56
69
|
.select('data->>source')
|
|
@@ -68,7 +81,6 @@ export const metrics = createHandler(async (ctx, body) => {
|
|
|
68
81
|
.slice(0, 10)
|
|
69
82
|
.map(([source, count]) => ({ source, count }))
|
|
70
83
|
|
|
71
|
-
// Recent signals with account info
|
|
72
84
|
const { data: recentSignals } = await adminDb
|
|
73
85
|
.from('items')
|
|
74
86
|
.select(`
|
|
@@ -95,7 +107,6 @@ export const metrics = createHandler(async (ctx, body) => {
|
|
|
95
107
|
rating: parseInt(signal.data?.rating || '1')
|
|
96
108
|
}))
|
|
97
109
|
|
|
98
|
-
// Calculate conversion rate (simplified - signals with rating >= 4)
|
|
99
110
|
const { count: highValueSignals } = await adminDb
|
|
100
111
|
.from('items')
|
|
101
112
|
.select('*', { count: 'exact', head: true })
|
|
@@ -114,11 +125,21 @@ export const metrics = createHandler(async (ctx, body) => {
|
|
|
114
125
|
recent_signals: formattedSignals || []
|
|
115
126
|
}
|
|
116
127
|
})
|
|
117
|
-
|
|
118
|
-
//
|
|
119
|
-
//
|
|
120
|
-
//
|
|
121
|
-
|
|
128
|
+
// CIL[END chunk_id="admin-signals_metrics_1784019432"]
|
|
129
|
+
// CIL[BEGIN chunk_id="admin-signals_audit_1784019432" type="function" identity="audit" parent="none"]
|
|
130
|
+
// CIL[DOC-MACRO purpose="Audit and export signal data with filtering"]
|
|
131
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Provide searchable, filterable signal audit trail"]
|
|
132
|
+
// CIL[DOC-CONTEXT module="admin-signals" layer="api-handler" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/functions/_shared/db.ts\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\".framework/functions/_shared/schema-utils.ts\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"\\\"]"]
|
|
133
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="paginated_signals_or_export_data" errors="funnel_signal_type_not_found" side_effects="database_queries,data_formatting"]
|
|
134
|
+
// CIL[DOC-MICRO logic_summary="Builds filtered query, applies pagination, formats signal data for audit/export" notable_decisions="[]"]
|
|
135
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="external_symbols_unknown"]
|
|
136
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
137
|
+
// CIL[DOC-VECTOR type="context" content="Layer: api-handler. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, .framework/functions/_shared/db.ts, .framework/src/pages/admin/IntegrationsPage.tsx, .framework/functions/_shared/schema-utils.ts, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, \."]
|
|
138
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
139
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
140
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
141
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
142
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
122
143
|
export const audit = createHandler(async (ctx, body) => {
|
|
123
144
|
const {
|
|
124
145
|
page = '1',
|
|
@@ -134,7 +155,6 @@ export const audit = createHandler(async (ctx, body) => {
|
|
|
134
155
|
export: exportData
|
|
135
156
|
} = ctx.query || {}
|
|
136
157
|
|
|
137
|
-
// Get funnel_signal type ID
|
|
138
158
|
const { data: signalType } = await adminDb
|
|
139
159
|
.from('item_type_registry')
|
|
140
160
|
.select('id')
|
|
@@ -145,7 +165,6 @@ export const audit = createHandler(async (ctx, body) => {
|
|
|
145
165
|
throw new Error('funnel_signal type not found')
|
|
146
166
|
}
|
|
147
167
|
|
|
148
|
-
// Build query
|
|
149
168
|
let query = adminDb
|
|
150
169
|
.from('items')
|
|
151
170
|
.select(`
|
|
@@ -169,7 +188,6 @@ export const audit = createHandler(async (ctx, body) => {
|
|
|
169
188
|
`, { count: 'exact' })
|
|
170
189
|
.eq('type_id', signalType.id)
|
|
171
190
|
|
|
172
|
-
// Apply filters
|
|
173
191
|
if (date_from) {
|
|
174
192
|
query = query.gte('created_at', date_from)
|
|
175
193
|
}
|
|
@@ -195,7 +213,6 @@ export const audit = createHandler(async (ctx, body) => {
|
|
|
195
213
|
query = query.or(`accounts.name.ilike.%${search}%,people.email.ilike.%${search}%,data->attribution->>first_touch_referrer_domain.ilike.%${search}%`)
|
|
196
214
|
}
|
|
197
215
|
|
|
198
|
-
// Order and paginate
|
|
199
216
|
const offset = (parseInt(page) - 1) * parseInt(limit)
|
|
200
217
|
query = query.order('created_at', { ascending: false })
|
|
201
218
|
|
|
@@ -239,3 +256,4 @@ export const audit = createHandler(async (ctx, body) => {
|
|
|
239
256
|
limit: parseInt(limit)
|
|
240
257
|
}
|
|
241
258
|
})
|
|
259
|
+
// CIL[END chunk_id="admin-signals_audit_1784019432"]
|