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
|
@@ -0,0 +1,499 @@
|
|
|
1
|
+
// CIL[BEGIN chunk_id="custom_apps_cortex_functions_custom_cil_project_module_header_1784235266" type="module_header" identity="module_header" parent="none"]
|
|
2
|
+
// CIL[DOC-MACRO purpose="Module header and top-level exports for cortex.functions.custom_cil-project"]
|
|
3
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Own module-level imports, exports, and configuration for cortex.functions.custom_cil-project"]
|
|
4
|
+
// CIL[DOC-CONTEXT module="cortex.functions.custom_cil-project" layer="function" related_files="[\".framework/migrations/015_simplify_apps_table.sql\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/components/ui/table-primitives.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"\\\"]"]
|
|
5
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="module exports and side effects" errors="none" side_effects="none"]
|
|
6
|
+
// CIL[DOC-MICRO logic_summary="Declares module scope, imports dependencies, and exports public surface of cortex.functions.custom_cil-project" notable_decisions="[]"]
|
|
7
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
8
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
9
|
+
// CIL[DOC-AUDIENCE audience="developer"]
|
|
10
|
+
// CIL[DOC-VECTOR type="context" content="Layer: function. Direct callers: 0. Direct calls: 0. Related files: .framework/migrations/015_simplify_apps_table.sql, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, custom/apps/portal/pages/ContentPage.tsx, .framework/src/components/ui/table-primitives.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, \."]
|
|
11
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
12
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
13
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
14
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
15
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
import { createHandler } from './_shared/middleware'
|
|
19
|
+
import { adminDb } from './_shared/db'
|
|
20
|
+
import { resolveTypeId } from './_shared/resolve-ids'
|
|
21
|
+
import { create as adminCreate, update as adminUpdate, remove as adminRemove } from './admin-data'
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
// CIL[END chunk_id="custom_apps_cortex_functions_custom_cil_project_module_header_1784235266"]
|
|
30
|
+
// CIL[BEGIN chunk_id="custom_apps_cortex_functions_custom_cil_project_default_globs_1784235266" type="variable" identity="default_globs" parent="none"]
|
|
31
|
+
// CIL[DOC-MACRO purpose="Defines default_globs configuration or state in cortex.functions.custom_cil-project"]
|
|
32
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Hold the value and default configuration for default_globs"]
|
|
33
|
+
// CIL[DOC-CONTEXT module="cortex.functions.custom_cil-project" layer="function" related_files="[\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/functions/_shared/principal.ts\",\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\"\\\"]"]
|
|
34
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="value of default_globs" errors="none" side_effects="none"]
|
|
35
|
+
// CIL[DOC-MICRO logic_summary="Declares default_globs with initial value or constant binding used by cortex.functions.custom_cil-project" notable_decisions="[]"]
|
|
36
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
37
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
38
|
+
// CIL[DOC-VECTOR type="context" content="Layer: function. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/TypeDetailPage.tsx, .framework/functions/_shared/principal.ts, custom/apps/cortex/functions/custom_cil-embeddings.ts, .framework/src/pages/admin/IntegrationsPage.tsx, custom/apps/portal/pages/ContentPage.tsx, \."]
|
|
39
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
40
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
41
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
42
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
43
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
44
|
+
const DEFAULT_GLOBS = ['**/*.ts', '**/*.tsx', '**/*.sql']
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
// CIL[END chunk_id="custom_apps_cortex_functions_custom_cil_project_default_globs_1784235266"]
|
|
50
|
+
// CIL[BEGIN chunk_id="custom_apps_cortex_functions_custom_cil_project_default_exclude_globs_1784235266" type="variable" identity="default_exclude_globs" parent="none"]
|
|
51
|
+
// CIL[DOC-MACRO purpose="Defines default_exclude_globs configuration or state in cortex.functions.custom_cil-project"]
|
|
52
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Hold the value and default configuration for default_exclude_globs"]
|
|
53
|
+
// CIL[DOC-CONTEXT module="cortex.functions.custom_cil-project" layer="function" related_files="[\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/functions/_shared/principal.ts\",\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\"\\\"]"]
|
|
54
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="value of default_exclude_globs" errors="none" side_effects="none"]
|
|
55
|
+
// CIL[DOC-MICRO logic_summary="Declares default_exclude_globs with initial value or constant binding used by cortex.functions.custom_cil-project" notable_decisions="[]"]
|
|
56
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
57
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
58
|
+
// CIL[DOC-VECTOR type="context" content="Layer: function. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/TypeDetailPage.tsx, .framework/functions/_shared/principal.ts, custom/apps/cortex/functions/custom_cil-embeddings.ts, .framework/src/pages/admin/IntegrationsPage.tsx, custom/apps/portal/pages/ContentPage.tsx, \."]
|
|
59
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
60
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
61
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
62
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
63
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
64
|
+
const DEFAULT_EXCLUDE_GLOBS = ['node_modules/**', '.git/**', 'dist/**', 'build/**', '.netlify/**', '**/*.min.js', '**/*.d.ts']
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
// CIL[END chunk_id="custom_apps_cortex_functions_custom_cil_project_default_exclude_globs_1784235266"]
|
|
71
|
+
// CIL[BEGIN chunk_id="custom_apps_cortex_functions_custom_cil_project_sourceset_1784235266" type="interface" identity="sourceset" parent="none"]
|
|
72
|
+
// CIL[DOC-MACRO purpose="Defines the sourceset type contract in cortex.functions.custom_cil-project"]
|
|
73
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Describe the shape and allowed fields for sourceset"]
|
|
74
|
+
// CIL[DOC-CONTEXT module="cortex.functions.custom_cil-project" layer="function" related_files="[\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\".framework/migrations/015_simplify_apps_table.sql\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"\\\"]"]
|
|
75
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="type definition for sourceset" errors="none" side_effects="none"]
|
|
76
|
+
// CIL[DOC-MICRO logic_summary="Declares TypeScript type/interface sourceset with member definitions" notable_decisions="[]"]
|
|
77
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
78
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
79
|
+
// CIL[DOC-VECTOR type="context" content="Layer: function. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/TypeDetailPage.tsx, .framework/functions/_shared/principal.ts, .framework/src/pages/admin/IntegrationsPage.tsx, .framework/migrations/015_simplify_apps_table.sql, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, \."]
|
|
80
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
81
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
82
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
83
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
84
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
85
|
+
interface SourceSet {
|
|
86
|
+
id: string
|
|
87
|
+
name: string
|
|
88
|
+
base_path: string
|
|
89
|
+
globs?: string[]
|
|
90
|
+
exclude_globs?: string[]
|
|
91
|
+
layer?: string
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
// CIL[END chunk_id="custom_apps_cortex_functions_custom_cil_project_sourceset_1784235266"]
|
|
99
|
+
// CIL[BEGIN chunk_id="custom_apps_cortex_functions_custom_cil_project_createprojectrequest_1784235266" type="interface" identity="createprojectrequest" parent="none"]
|
|
100
|
+
// CIL[DOC-MACRO purpose="Defines the createprojectrequest type contract in cortex.functions.custom_cil-project"]
|
|
101
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Describe the shape and allowed fields for createprojectrequest"]
|
|
102
|
+
// CIL[DOC-CONTEXT module="cortex.functions.custom_cil-project" layer="function" related_files="[\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\".framework/migrations/015_simplify_apps_table.sql\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"\\\"]"]
|
|
103
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="type definition for createprojectrequest" errors="none" side_effects="none"]
|
|
104
|
+
// CIL[DOC-MICRO logic_summary="Declares TypeScript type/interface createprojectrequest with member definitions" notable_decisions="[]"]
|
|
105
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
106
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
107
|
+
// CIL[DOC-VECTOR type="context" content="Layer: function. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/TypeDetailPage.tsx, .framework/functions/_shared/principal.ts, .framework/src/pages/admin/IntegrationsPage.tsx, .framework/migrations/015_simplify_apps_table.sql, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, \."]
|
|
108
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
109
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
110
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
111
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
112
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
113
|
+
interface CreateProjectRequest {
|
|
114
|
+
name: string
|
|
115
|
+
description?: string
|
|
116
|
+
repo_path: string
|
|
117
|
+
language_mix?: string
|
|
118
|
+
globs?: string[]
|
|
119
|
+
exclude_globs?: string[]
|
|
120
|
+
source_sets?: SourceSet[]
|
|
121
|
+
dependencies?: string[]
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
// CIL[END chunk_id="custom_apps_cortex_functions_custom_cil_project_createprojectrequest_1784235266"]
|
|
129
|
+
// CIL[BEGIN chunk_id="custom_apps_cortex_functions_custom_cil_project_projectstats_1784235266" type="interface" identity="projectstats" parent="none"]
|
|
130
|
+
// CIL[DOC-MACRO purpose="Defines the projectstats type contract in cortex.functions.custom_cil-project"]
|
|
131
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Describe the shape and allowed fields for projectstats"]
|
|
132
|
+
// CIL[DOC-CONTEXT module="cortex.functions.custom_cil-project" layer="function" related_files="[]"]
|
|
133
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="type definition for projectstats" errors="none" side_effects="none"]
|
|
134
|
+
// CIL[DOC-MICRO logic_summary="Declares TypeScript type/interface projectstats with member definitions" notable_decisions="[]"]
|
|
135
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
136
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
137
|
+
// CIL[DOC-VECTOR type="context" content="Layer: function. Direct callers: 0. Direct calls: 0. Related files: none."]
|
|
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"]
|
|
143
|
+
interface ProjectStats {
|
|
144
|
+
file_count: number
|
|
145
|
+
chunk_count: number
|
|
146
|
+
proposal_count: number
|
|
147
|
+
approved_count: number
|
|
148
|
+
pending_review_count: number
|
|
149
|
+
dead_code_count: number
|
|
150
|
+
doc_verified_count: number
|
|
151
|
+
doc_ai_count: number
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
// CIL[END chunk_id="custom_apps_cortex_functions_custom_cil_project_projectstats_1784235266"]
|
|
161
|
+
// CIL[BEGIN chunk_id="custom_apps_cortex_functions_custom_cil_project_getprojectstats_1784235266" type="function" identity="getprojectstats" parent="none"]
|
|
162
|
+
// CIL[DOC-MACRO purpose="Implements getprojectstats logic in cortex.functions.custom_cil-project"]
|
|
163
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Execute getprojectstats and return its computed result"]
|
|
164
|
+
// CIL[DOC-CONTEXT module="cortex.functions.custom_cil-project" layer="function" related_files="[]"]
|
|
165
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="return value from function execution" errors="throws on invalid input or runtime failure" side_effects="none"]
|
|
166
|
+
// CIL[DOC-MICRO logic_summary="Provides getprojectstats with getProjectStats(projectId: string inputs, handling internal flow and returning a result" 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: function. Direct callers: 0. Direct calls: 0. Related files: none."]
|
|
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."]
|
|
173
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
174
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
175
|
+
async function getProjectStats(projectId: string): Promise<ProjectStats> {
|
|
176
|
+
const [filesResult, chunksResult, proposalsResult] = await Promise.all([
|
|
177
|
+
adminDb.from('items').select('id, data', { count: 'exact' })
|
|
178
|
+
.filter('data->>kb_type', 'eq', 'cil_file')
|
|
179
|
+
.filter('data->>project_id', 'eq', projectId)
|
|
180
|
+
.eq('is_active', true),
|
|
181
|
+
adminDb.from('items').select('id, data', { count: 'exact' })
|
|
182
|
+
.filter('data->>kb_type', 'eq', 'cil_chunk')
|
|
183
|
+
.filter('data->>project_id', 'eq', projectId)
|
|
184
|
+
.eq('is_active', true),
|
|
185
|
+
adminDb.from('items').select('id, data', { count: 'exact' })
|
|
186
|
+
.filter('data->>kb_type', 'eq', 'cil_chunk_proposal')
|
|
187
|
+
.filter('data->>project_id', 'eq', projectId)
|
|
188
|
+
.eq('is_active', true),
|
|
189
|
+
])
|
|
190
|
+
|
|
191
|
+
const chunks = chunksResult.data || []
|
|
192
|
+
const proposals = proposalsResult.data || []
|
|
193
|
+
|
|
194
|
+
return {
|
|
195
|
+
file_count: filesResult.count || 0,
|
|
196
|
+
chunk_count: chunksResult.count || 0,
|
|
197
|
+
proposal_count: proposalsResult.count || 0,
|
|
198
|
+
approved_count: chunks.filter(c => c.data?.review_status === 'approved').length,
|
|
199
|
+
pending_review_count: proposals.filter(p => p.data?.review_status === 'pending_review').length,
|
|
200
|
+
dead_code_count: chunks.filter(c => c.data?.is_dead_code === true).length,
|
|
201
|
+
doc_verified_count: chunks.filter(c => c.data?.doc_confidence === 'human_verified').length,
|
|
202
|
+
doc_ai_count: chunks.filter(c => c.data?.doc_confidence === 'ai_generated').length,
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
// CIL[END chunk_id="custom_apps_cortex_functions_custom_cil_project_getprojectstats_1784235266"]
|
|
212
|
+
// CIL[BEGIN chunk_id="custom_apps_cortex_functions_custom_cil_project_bulkadminremove_1784235266" type="function" identity="bulkadminremove" parent="none"]
|
|
213
|
+
// CIL[DOC-MACRO purpose="Implements bulkadminremove logic in cortex.functions.custom_cil-project"]
|
|
214
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Execute bulkadminremove and return its computed result"]
|
|
215
|
+
// CIL[DOC-CONTEXT module="cortex.functions.custom_cil-project" layer="function" related_files="[]"]
|
|
216
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="return value from function execution" errors="throws on invalid input or runtime failure" side_effects="none"]
|
|
217
|
+
// CIL[DOC-MICRO logic_summary="Provides bulkadminremove with bulkAdminRemove(ctx: any, entity: string, ids: string[] inputs, handling internal flow and returning a result" notable_decisions="[]"]
|
|
218
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
219
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
220
|
+
// CIL[DOC-VECTOR type="context" content="Layer: function. Direct callers: 0. Direct calls: 0. Related files: none."]
|
|
221
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
222
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
223
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
224
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
225
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
226
|
+
async function bulkAdminRemove(ctx: any, entity: string, ids: string[]): Promise<number> {
|
|
227
|
+
const results = await Promise.all(ids.map(id =>
|
|
228
|
+
adminRemove({ ...ctx, query: { ...(ctx.query || {}), entity, id, soft: 'false' } } as any).catch((e: any) => {
|
|
229
|
+
console.error(`bulkAdminRemove failed: ${entity}/${id}`, e.message || e)
|
|
230
|
+
return null
|
|
231
|
+
})
|
|
232
|
+
))
|
|
233
|
+
return results.filter(r => r !== null).length
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
|
|
240
|
+
// CIL[END chunk_id="custom_apps_cortex_functions_custom_cil_project_bulkadminremove_1784235266"]
|
|
241
|
+
// CIL[BEGIN chunk_id="custom_apps_cortex_functions_custom_cil_project_handler_1784235266" type="variable" identity="handler" parent="none"]
|
|
242
|
+
// CIL[DOC-MACRO purpose="Defines handler configuration or state in cortex.functions.custom_cil-project"]
|
|
243
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Hold the value and default configuration for handler"]
|
|
244
|
+
// CIL[DOC-CONTEXT module="cortex.functions.custom_cil-project" layer="function" related_files="[]"]
|
|
245
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="value of handler" errors="none" side_effects="none"]
|
|
246
|
+
// CIL[DOC-MICRO logic_summary="Declares handler with initial value or constant binding used by cortex.functions.custom_cil-project" notable_decisions="[]"]
|
|
247
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
248
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
249
|
+
// CIL[DOC-VECTOR type="context" content="Layer: function. Direct callers: 0. Direct calls: 0. Related files: none."]
|
|
250
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
251
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
252
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
253
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
254
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
255
|
+
export const handler = createHandler(async (ctx, body) => {
|
|
256
|
+
const action = ctx.query?.action
|
|
257
|
+
const method = (ctx as any).method || (body ? 'POST' : 'GET')
|
|
258
|
+
|
|
259
|
+
|
|
260
|
+
if (action === 'list_proposals') {
|
|
261
|
+
const id = ctx.query?.id
|
|
262
|
+
if (!id) throw new Error('id is required')
|
|
263
|
+
const status = ctx.query?.status || 'pending_review'
|
|
264
|
+
const limit = parseInt(ctx.query?.limit || '1000', 10)
|
|
265
|
+
|
|
266
|
+
const proposalTypeId = await resolveTypeId('item', 'cil_chunk_proposal')
|
|
267
|
+
const { data, error } = await adminDb
|
|
268
|
+
.from('items')
|
|
269
|
+
.select('id, title, data, created_at')
|
|
270
|
+
.eq('type_id', proposalTypeId)
|
|
271
|
+
.eq('is_active', true)
|
|
272
|
+
.filter('data->>project_id', 'eq', id)
|
|
273
|
+
.filter('data->>review_status', 'eq', status)
|
|
274
|
+
.order('created_at', { ascending: true })
|
|
275
|
+
.limit(limit)
|
|
276
|
+
|
|
277
|
+
if (error) throw new Error(`Failed to list proposals: ${error.message}`)
|
|
278
|
+
return { proposals: data || [], total: data?.length || 0 }
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
|
|
282
|
+
if (action === 'list' || (!action && method === 'GET' && !ctx.query?.id)) {
|
|
283
|
+
const typeId = await resolveTypeId('item', 'cil_project')
|
|
284
|
+
const { data, error } = await adminDb
|
|
285
|
+
.from('items')
|
|
286
|
+
.select('id, title, description, status, data, created_at, updated_at')
|
|
287
|
+
.eq('type_id', typeId)
|
|
288
|
+
.eq('is_active', true)
|
|
289
|
+
.order('created_at', { ascending: false })
|
|
290
|
+
|
|
291
|
+
if (error) throw new Error(`Failed to list projects: ${error.message}`)
|
|
292
|
+
return { projects: data || [] }
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
|
|
296
|
+
if (action === 'get' || (method === 'GET' && ctx.query?.id)) {
|
|
297
|
+
const id = ctx.query?.id
|
|
298
|
+
if (!id) throw new Error('id is required')
|
|
299
|
+
|
|
300
|
+
const { data, error } = await adminDb
|
|
301
|
+
.from('items')
|
|
302
|
+
.select('id, title, description, status, data, created_at, updated_at')
|
|
303
|
+
.eq('id', id)
|
|
304
|
+
.single()
|
|
305
|
+
|
|
306
|
+
if (error || !data) throw new Error(`Project not found: ${id}`)
|
|
307
|
+
|
|
308
|
+
const stats = await getProjectStats(id)
|
|
309
|
+
return { project: { ...data, stats } }
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
|
|
313
|
+
if (action === 'create' || (!action && method === 'POST')) {
|
|
314
|
+
const req = body as CreateProjectRequest
|
|
315
|
+
if (!req?.name) throw new Error('name is required')
|
|
316
|
+
if (!req?.repo_path) throw new Error('repo_path is required')
|
|
317
|
+
|
|
318
|
+
const result = await adminCreate(ctx, {
|
|
319
|
+
entity: 'items',
|
|
320
|
+
type_slug: 'cil_project',
|
|
321
|
+
title: req.name,
|
|
322
|
+
description: req.description || '',
|
|
323
|
+
status: 'active',
|
|
324
|
+
data: {
|
|
325
|
+
kb_type: 'cil_project',
|
|
326
|
+
repo_path: req.repo_path,
|
|
327
|
+
language_mix: req.language_mix || '',
|
|
328
|
+
ingestion_status: 'not_started',
|
|
329
|
+
file_count: 0,
|
|
330
|
+
chunk_count: 0,
|
|
331
|
+
total_ingestion_cost_usd: 0,
|
|
332
|
+
last_ingested_at: null,
|
|
333
|
+
globs: req.globs || DEFAULT_GLOBS,
|
|
334
|
+
exclude_globs: req.exclude_globs || DEFAULT_EXCLUDE_GLOBS,
|
|
335
|
+
source_sets: req.source_sets || [],
|
|
336
|
+
dependencies: req.dependencies || [],
|
|
337
|
+
}
|
|
338
|
+
})
|
|
339
|
+
|
|
340
|
+
return { project: result }
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
|
|
344
|
+
if (action === 'update' || (!action && method === 'PATCH')) {
|
|
345
|
+
const id = ctx.query?.id || body?.id
|
|
346
|
+
if (!id) throw new Error('id is required')
|
|
347
|
+
|
|
348
|
+
|
|
349
|
+
const { data: current, error: fetchErr } = await adminDb
|
|
350
|
+
.from('items').select('data').eq('id', id).maybeSingle()
|
|
351
|
+
if (fetchErr || !current) throw new Error(`Project not found: ${id}`)
|
|
352
|
+
|
|
353
|
+
const mergedData = { ...(current.data || {}), ...(body?.data || {}) }
|
|
354
|
+
|
|
355
|
+
const updateCtx = { ...ctx, query: { ...ctx.query, entity: 'items', id } }
|
|
356
|
+
const result = await adminUpdate(updateCtx, {
|
|
357
|
+
data: mergedData,
|
|
358
|
+
...(body?.status ? { status: body.status } : {}),
|
|
359
|
+
...(body?.title ? { title: body.title } : {}),
|
|
360
|
+
})
|
|
361
|
+
|
|
362
|
+
return { project: result }
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
|
|
366
|
+
|
|
367
|
+
if (action === 'delete' || method === 'DELETE') {
|
|
368
|
+
const id = ctx.query?.id || body?.id
|
|
369
|
+
if (!id) throw new Error('id is required')
|
|
370
|
+
|
|
371
|
+
|
|
372
|
+
const { data: projectItem } = await adminDb
|
|
373
|
+
.from('items')
|
|
374
|
+
.select('id, title, data')
|
|
375
|
+
.eq('id', id)
|
|
376
|
+
.maybeSingle()
|
|
377
|
+
|
|
378
|
+
if (!projectItem) throw new Error(`Project not found: ${id}`)
|
|
379
|
+
|
|
380
|
+
const deletedCounts: Record<string, number> = {}
|
|
381
|
+
|
|
382
|
+
|
|
383
|
+
const { data: fileItems } = await adminDb
|
|
384
|
+
.from('items')
|
|
385
|
+
.select('id')
|
|
386
|
+
.filter('data->>project_id', 'eq', id)
|
|
387
|
+
.filter('data->>kb_type', 'eq', 'cil_file')
|
|
388
|
+
|
|
389
|
+
const fileIds = (fileItems || []).map((f: any) => f.id)
|
|
390
|
+
|
|
391
|
+
|
|
392
|
+
const { data: chunkItems } = await adminDb
|
|
393
|
+
.from('items')
|
|
394
|
+
.select('id')
|
|
395
|
+
.filter('data->>project_id', 'eq', id)
|
|
396
|
+
.filter('data->>kb_type', 'eq', 'cil_chunk')
|
|
397
|
+
|
|
398
|
+
const chunkIds = (chunkItems || []).map((c: any) => c.id)
|
|
399
|
+
|
|
400
|
+
|
|
401
|
+
if (fileIds.length > 0 || chunkIds.length > 0) {
|
|
402
|
+
const allIds = [...fileIds, ...chunkIds]
|
|
403
|
+
const IN_LIMIT = 500
|
|
404
|
+
const linkIdsToDelete: string[] = []
|
|
405
|
+
for (let i = 0; i < allIds.length; i += IN_LIMIT) {
|
|
406
|
+
const batch = allIds.slice(i, i + IN_LIMIT)
|
|
407
|
+
const [{ data: sourceLinks }, { data: targetLinks }] = await Promise.all([
|
|
408
|
+
adminDb.from('links').select('id').in('source_id', batch),
|
|
409
|
+
adminDb.from('links').select('id').in('target_id', batch),
|
|
410
|
+
])
|
|
411
|
+
for (const l of sourceLinks || []) linkIdsToDelete.push(l.id)
|
|
412
|
+
for (const l of targetLinks || []) linkIdsToDelete.push(l.id)
|
|
413
|
+
}
|
|
414
|
+
deletedCounts.links = await bulkAdminRemove(ctx, 'links', [...new Set(linkIdsToDelete)])
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
|
|
418
|
+
if (chunkIds.length > 0) {
|
|
419
|
+
const CHUNK_SIZE = 50
|
|
420
|
+
let embeddingsDeleted = 0
|
|
421
|
+
for (let i = 0; i < chunkIds.length; i += CHUNK_SIZE) {
|
|
422
|
+
const batch = chunkIds.slice(i, i + CHUNK_SIZE)
|
|
423
|
+
const { count } = await adminDb
|
|
424
|
+
.from('embeddings')
|
|
425
|
+
.delete({ count: 'exact' })
|
|
426
|
+
.in('document_id', batch)
|
|
427
|
+
embeddingsDeleted += count || 0
|
|
428
|
+
}
|
|
429
|
+
deletedCounts.embeddings = embeddingsDeleted
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
|
|
433
|
+
for (const kbType of ['cil_chunk', 'cil_chunk_proposal', 'cil_file', 'cil_config']) {
|
|
434
|
+
const { data: itemsToDelete } = await adminDb
|
|
435
|
+
.from('items')
|
|
436
|
+
.select('id')
|
|
437
|
+
.filter('data->>project_id', 'eq', id)
|
|
438
|
+
.filter('data->>kb_type', 'eq', kbType)
|
|
439
|
+
deletedCounts[kbType] = await bulkAdminRemove(ctx, 'items', (itemsToDelete || []).map((i: any) => i.id))
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
|
|
443
|
+
await adminRemove({ ...ctx, query: { ...(ctx.query || {}), entity: 'items', id, soft: 'false' } } as any)
|
|
444
|
+
deletedCounts.project = 1
|
|
445
|
+
|
|
446
|
+
return {
|
|
447
|
+
deleted: true,
|
|
448
|
+
project_id: id,
|
|
449
|
+
project_title: projectItem.title,
|
|
450
|
+
deleted_counts: deletedCounts,
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
|
|
455
|
+
if (action === 'pipeline_progress') {
|
|
456
|
+
const id = ctx.query?.id
|
|
457
|
+
if (!id) throw new Error('id is required')
|
|
458
|
+
|
|
459
|
+
const { data, error } = await adminDb
|
|
460
|
+
.from('items')
|
|
461
|
+
.select('data')
|
|
462
|
+
.eq('id', id)
|
|
463
|
+
.maybeSingle()
|
|
464
|
+
|
|
465
|
+
if (error || !data) throw new Error(`Project not found: ${id}`)
|
|
466
|
+
|
|
467
|
+
const fileStatuses: Record<string, string> = data.data?.file_statuses || {}
|
|
468
|
+
const selectedPaths: string[] = data.data?.selected_paths || []
|
|
469
|
+
|
|
470
|
+
|
|
471
|
+
const by_status: Record<string, number> = {}
|
|
472
|
+
for (const [key, val] of Object.entries(fileStatuses)) {
|
|
473
|
+
if (key.endsWith('_updated')) continue
|
|
474
|
+
by_status[val] = (by_status[val] || 0) + 1
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
|
|
478
|
+
const { count: total_chunks } = await adminDb.from('items')
|
|
479
|
+
.select('*', { count: 'exact', head: true })
|
|
480
|
+
.filter('data->>kb_type', 'eq', 'cil_chunk')
|
|
481
|
+
.filter('data->>project_id', 'eq', id)
|
|
482
|
+
.eq('is_active', true)
|
|
483
|
+
|
|
484
|
+
return {
|
|
485
|
+
progress: {
|
|
486
|
+
total_selected: selectedPaths.length,
|
|
487
|
+
by_status,
|
|
488
|
+
file_statuses: fileStatuses,
|
|
489
|
+
total_chunks: total_chunks || 0,
|
|
490
|
+
},
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
throw new Error(`Unknown action: ${action}. Valid: list, get, create, update, delete, pipeline_progress`)
|
|
495
|
+
})
|
|
496
|
+
|
|
497
|
+
|
|
498
|
+
|
|
499
|
+
// CIL[END chunk_id="custom_apps_cortex_functions_custom_cil_project_handler_1784235266"]
|