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,592 @@
|
|
|
1
|
+
// CIL[BEGIN chunk_id="custom_apps_cortex_functions_custom_cil_agent_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-agent"]
|
|
3
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Own module-level imports, exports, and configuration for cortex.functions.custom_cil-agent"]
|
|
4
|
+
// CIL[DOC-CONTEXT module="cortex.functions.custom_cil-agent" layer="function" related_files="[\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/functions/_shared/schema-utils.ts\",\"\\\"]"]
|
|
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-agent" 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: custom/apps/cortex/pages/operations/OperationsDashboard.tsx, custom/apps/portal/pages/ContentPage.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/functions/_shared/principal.ts, .framework/functions/_shared/schema-utils.ts, \."]
|
|
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
|
+
|
|
19
|
+
|
|
20
|
+
import { createHandler } from './_shared/middleware'
|
|
21
|
+
import { adminDb } from './_shared/db'
|
|
22
|
+
import { resolveTypeId } from './_shared/resolve-ids'
|
|
23
|
+
import { create as adminCreate } from './admin-data'
|
|
24
|
+
import { callOpenAIChat, callOpenAIEmbeddings } from './_shared/llm'
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
// CIL[END chunk_id="custom_apps_cortex_functions_custom_cil_agent_module_header_1784235266"]
|
|
34
|
+
// CIL[BEGIN chunk_id="custom_apps_cortex_functions_custom_cil_agent_cil_tools_1784235266" type="variable" identity="cil_tools" parent="none"]
|
|
35
|
+
// CIL[DOC-MACRO purpose="Defines cil_tools configuration or state in cortex.functions.custom_cil-agent"]
|
|
36
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Hold the value and default configuration for cil_tools"]
|
|
37
|
+
// CIL[DOC-CONTEXT module="cortex.functions.custom_cil-agent" layer="function" related_files="[\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\"\\\"]"]
|
|
38
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="value of cil_tools" errors="none" side_effects="none"]
|
|
39
|
+
// CIL[DOC-MICRO logic_summary="Declares cil_tools with initial value or constant binding used by cortex.functions.custom_cil-agent" notable_decisions="[]"]
|
|
40
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
41
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
42
|
+
// CIL[DOC-VECTOR type="context" content="Layer: function. Direct callers: 0. Direct calls: 0. Related files: custom/apps/cortex/functions/custom_cil-embeddings.ts, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/functions/_shared/principal.ts, .framework/src/pages/admin/IntegrationsPage.tsx, \."]
|
|
43
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
44
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
45
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
46
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
47
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
48
|
+
const CIL_TOOLS = [
|
|
49
|
+
{
|
|
50
|
+
name: 'chunk_lookup',
|
|
51
|
+
description: 'Search for a chunk by name or purpose. Returns chunk_name, file_path, macro, micro, input_spec, output_spec, side_effects, stability.',
|
|
52
|
+
parameters: {
|
|
53
|
+
type: 'object',
|
|
54
|
+
properties: {
|
|
55
|
+
q: { type: 'string', description: 'Chunk name or description of what you are looking for' },
|
|
56
|
+
project_id: { type: 'string', description: 'Optional: scope to a specific project UUID' },
|
|
57
|
+
},
|
|
58
|
+
required: ['q'],
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
name: 'get_contract',
|
|
63
|
+
description: 'Get the full contract for a specific chunk by its ID.',
|
|
64
|
+
parameters: {
|
|
65
|
+
type: 'object',
|
|
66
|
+
properties: {
|
|
67
|
+
chunk_id: { type: 'string', description: 'UUID of the cil_chunk item' },
|
|
68
|
+
},
|
|
69
|
+
required: ['chunk_id'],
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
name: 'blast_radius',
|
|
74
|
+
description: 'Find all chunks that call a given chunk (BFS caller traversal). Use before refactoring.',
|
|
75
|
+
parameters: {
|
|
76
|
+
type: 'object',
|
|
77
|
+
properties: {
|
|
78
|
+
chunk_id: { type: 'string', description: 'UUID of the chunk to check callers for' },
|
|
79
|
+
max_depth: { type: 'number', description: 'Maximum traversal depth (default 3)' },
|
|
80
|
+
},
|
|
81
|
+
required: ['chunk_id'],
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
name: 'hash_validate',
|
|
86
|
+
description: 'Check whether a chunk\'s stored hash is current or has drifted (code was changed without updating CIL).',
|
|
87
|
+
parameters: {
|
|
88
|
+
type: 'object',
|
|
89
|
+
properties: {
|
|
90
|
+
chunk_id: { type: 'string', description: 'UUID of the chunk to validate' },
|
|
91
|
+
},
|
|
92
|
+
required: ['chunk_id'],
|
|
93
|
+
},
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
name: 'doc_gap_report',
|
|
97
|
+
description: 'List undocumented chunks in a project and overall documentation coverage.',
|
|
98
|
+
parameters: {
|
|
99
|
+
type: 'object',
|
|
100
|
+
properties: {
|
|
101
|
+
project_id: { type: 'string', description: 'UUID of the cil_project' },
|
|
102
|
+
},
|
|
103
|
+
required: ['project_id'],
|
|
104
|
+
},
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
name: 'project_status',
|
|
108
|
+
description: 'Get the full pipeline status for a project: file count, chunk count, embedding coverage, doc coverage, link counts.',
|
|
109
|
+
parameters: {
|
|
110
|
+
type: 'object',
|
|
111
|
+
properties: {
|
|
112
|
+
project_id: { type: 'string', description: 'UUID of the cil_project' },
|
|
113
|
+
},
|
|
114
|
+
required: ['project_id'],
|
|
115
|
+
},
|
|
116
|
+
},
|
|
117
|
+
]
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
// CIL[END chunk_id="custom_apps_cortex_functions_custom_cil_agent_cil_tools_1784235266"]
|
|
126
|
+
// CIL[BEGIN chunk_id="custom_apps_cortex_functions_custom_cil_agent_dispatchtool_1784235266" type="function" identity="dispatchtool" parent="none"]
|
|
127
|
+
// CIL[DOC-MACRO purpose="Implements dispatchtool logic in cortex.functions.custom_cil-agent"]
|
|
128
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Execute dispatchtool and return its computed result"]
|
|
129
|
+
// CIL[DOC-CONTEXT module="cortex.functions.custom_cil-agent" layer="function" related_files="[\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\".framework/functions/_shared/principal.ts\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\"\\\"]"]
|
|
130
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="return value from function execution" errors="throws on invalid input or runtime failure" side_effects="none"]
|
|
131
|
+
// CIL[DOC-MICRO logic_summary="Provides dispatchtool with dispatchTool( inputs, handling internal flow and returning a result" notable_decisions="[]"]
|
|
132
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
133
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
134
|
+
// CIL[DOC-VECTOR type="context" content="Layer: function. Direct callers: 0. Direct calls: 0. Related files: custom/apps/cortex/functions/custom_cil-embeddings.ts, .framework/functions/_shared/principal.ts, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/src/pages/admin/IntegrationsPage.tsx, \."]
|
|
135
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
136
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
137
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
138
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
139
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
140
|
+
async function dispatchTool(
|
|
141
|
+
toolName: string,
|
|
142
|
+
args: Record<string, any>,
|
|
143
|
+
accountId: string
|
|
144
|
+
): Promise<any> {
|
|
145
|
+
const base = process.env.URL || 'http://localhost:8888'
|
|
146
|
+
|
|
147
|
+
switch (toolName) {
|
|
148
|
+
case 'chunk_lookup': {
|
|
149
|
+
const params = new URLSearchParams({ action: 'search', q: args.q, mode: 'hybrid', limit: '5' })
|
|
150
|
+
if (args.project_id) params.set('project_id', args.project_id)
|
|
151
|
+
const res = await fetch(`${base}/.netlify/functions/cil-graph?${params}`)
|
|
152
|
+
const data: any = await res.json()
|
|
153
|
+
return { results: data?.results || data?.data?.results || [] }
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
case 'get_contract': {
|
|
157
|
+
const res = await fetch(`${base}/.netlify/functions/cil-graph?action=get_chunk_contract&chunk_id=${args.chunk_id}`)
|
|
158
|
+
const data: any = await res.json()
|
|
159
|
+
return data?.contract || data?.data?.contract || {}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
case 'blast_radius': {
|
|
163
|
+
const depth = args.max_depth || 3
|
|
164
|
+
const res = await fetch(`${base}/.netlify/functions/cil-graph?action=get_blast_radius&chunk_id=${args.chunk_id}&max_depth=${depth}`)
|
|
165
|
+
const data: any = await res.json()
|
|
166
|
+
return { affected: data?.affected || data?.data?.affected || [], depth }
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
case 'hash_validate': {
|
|
170
|
+
|
|
171
|
+
const { data: chunk } = await adminDb
|
|
172
|
+
.from('items').select('id, data').eq('id', args.chunk_id).maybeSingle()
|
|
173
|
+
if (!chunk) return { status: 'not_found', chunk_id: args.chunk_id }
|
|
174
|
+
|
|
175
|
+
const codeContent = chunk.data?.code_content || ''
|
|
176
|
+
if (!codeContent) return { status: 'no_code_content', chunk_id: args.chunk_id }
|
|
177
|
+
|
|
178
|
+
const res = await fetch(`${base}/.netlify/functions/cil-validate?action=validate`, {
|
|
179
|
+
method: 'POST',
|
|
180
|
+
headers: { 'Content-Type': 'application/json' },
|
|
181
|
+
body: JSON.stringify({
|
|
182
|
+
chunks: [{ chunk_id: args.chunk_id, chunk_name: chunk.data?.chunk_name || '', content: codeContent }],
|
|
183
|
+
}),
|
|
184
|
+
})
|
|
185
|
+
const data: any = await res.json()
|
|
186
|
+
const result = (data?.results || data?.data?.results)?.[0]
|
|
187
|
+
return result || { status: 'unknown', chunk_id: args.chunk_id }
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
case 'doc_gap_report': {
|
|
191
|
+
const res = await fetch(`${base}/.netlify/functions/cil-doc?action=gap_report&project_id=${args.project_id}`)
|
|
192
|
+
const data: any = await res.json()
|
|
193
|
+
return data?.data || data
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
case 'project_status': {
|
|
197
|
+
const pid = args.project_id
|
|
198
|
+
const [projectRes, embedRes, callmapRes] = await Promise.allSettled([
|
|
199
|
+
fetch(`${base}/.netlify/functions/cil-project?action=get&id=${pid}`).then(r => r.json()),
|
|
200
|
+
fetch(`${base}/.netlify/functions/cil-embeddings?action=status&project_id=${pid}`).then(r => r.json()),
|
|
201
|
+
fetch(`${base}/.netlify/functions/cil-callmap?action=status&project_id=${pid}`).then(r => r.json()),
|
|
202
|
+
])
|
|
203
|
+
|
|
204
|
+
const project = projectRes.status === 'fulfilled' ? (projectRes.value?.project || projectRes.value?.data?.project) : null
|
|
205
|
+
const embed = embedRes.status === 'fulfilled' ? (embedRes.value?.data || embedRes.value) : null
|
|
206
|
+
const callmap = callmapRes.status === 'fulfilled' ? (callmapRes.value?.data || callmapRes.value) : null
|
|
207
|
+
|
|
208
|
+
return {
|
|
209
|
+
project_id: pid,
|
|
210
|
+
file_count: project?.data?.file_count || 0,
|
|
211
|
+
chunk_count: project?.data?.chunk_count || 0,
|
|
212
|
+
embedding_coverage_pct: embed?.coverage_pct || 0,
|
|
213
|
+
embedded_chunks: embed?.embedded_chunks || 0,
|
|
214
|
+
import_links: callmap?.import_links || 0,
|
|
215
|
+
call_links: callmap?.call_links || 0,
|
|
216
|
+
total_ingestion_cost_usd: project?.data?.total_ingestion_cost_usd || 0,
|
|
217
|
+
last_ingested_at: project?.data?.last_ingested_at || null,
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
default:
|
|
222
|
+
return { error: `Unknown tool: ${toolName}` }
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
|
|
230
|
+
// CIL[END chunk_id="custom_apps_cortex_functions_custom_cil_agent_dispatchtool_1784235266"]
|
|
231
|
+
// CIL[BEGIN chunk_id="custom_apps_cortex_functions_custom_cil_agent_callllm_1784235266" type="function" identity="callllm" parent="none"]
|
|
232
|
+
// CIL[DOC-MACRO purpose="Implements callllm logic in cortex.functions.custom_cil-agent"]
|
|
233
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Execute callllm and return its computed result"]
|
|
234
|
+
// CIL[DOC-CONTEXT module="cortex.functions.custom_cil-agent" layer="function" related_files="[\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\".framework/functions/_shared/principal.ts\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\"\\\"]"]
|
|
235
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="return value from function execution" errors="throws on invalid input or runtime failure" side_effects="none"]
|
|
236
|
+
// CIL[DOC-MICRO logic_summary="Provides callllm with callLLM( inputs, handling internal flow and returning a result" notable_decisions="[]"]
|
|
237
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
238
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
239
|
+
// CIL[DOC-VECTOR type="context" content="Layer: function. Direct callers: 0. Direct calls: 0. Related files: custom/apps/cortex/functions/custom_cil-embeddings.ts, .framework/functions/_shared/principal.ts, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/src/pages/admin/IntegrationsPage.tsx, \."]
|
|
240
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
241
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
242
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
243
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
244
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
245
|
+
async function callLLM(
|
|
246
|
+
messages: { role: string; content: string }[],
|
|
247
|
+
tools: any[],
|
|
248
|
+
model: string
|
|
249
|
+
): Promise<{ content: string; tool_calls?: any[] }> {
|
|
250
|
+
const options: any = { temperature: 0.2, max_tokens: 1500 }
|
|
251
|
+
if (tools.length > 0) {
|
|
252
|
+
options.tools = tools.map(t => ({ type: 'function', function: t }))
|
|
253
|
+
options.tool_choice = 'auto'
|
|
254
|
+
}
|
|
255
|
+
const j = await callOpenAIChat(undefined, messages, model, options)
|
|
256
|
+
const choice = j.choices?.[0]
|
|
257
|
+
|
|
258
|
+
return {
|
|
259
|
+
content: choice?.message?.content || '',
|
|
260
|
+
tool_calls: choice?.message?.tool_calls || undefined,
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
|
|
265
|
+
|
|
266
|
+
|
|
267
|
+
|
|
268
|
+
// CIL[END chunk_id="custom_apps_cortex_functions_custom_cil_agent_callllm_1784235266"]
|
|
269
|
+
// CIL[BEGIN chunk_id="custom_apps_cortex_functions_custom_cil_agent_retrievechunkcontext_1784235266" type="function" identity="retrievechunkcontext" parent="none"]
|
|
270
|
+
// CIL[DOC-MACRO purpose="Implements retrievechunkcontext logic in cortex.functions.custom_cil-agent"]
|
|
271
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Execute retrievechunkcontext and return its computed result"]
|
|
272
|
+
// CIL[DOC-CONTEXT module="cortex.functions.custom_cil-agent" layer="function" related_files="[]"]
|
|
273
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="return value from function execution" errors="throws on invalid input or runtime failure" side_effects="none"]
|
|
274
|
+
// CIL[DOC-MICRO logic_summary="Provides retrievechunkcontext with retrieveChunkContext( inputs, handling internal flow and returning a result" notable_decisions="[]"]
|
|
275
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
276
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
277
|
+
// CIL[DOC-VECTOR type="context" content="Layer: function. Direct callers: 0. Direct calls: 0. Related files: none."]
|
|
278
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
279
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
280
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
281
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
282
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
283
|
+
async function retrieveChunkContext(
|
|
284
|
+
query: string,
|
|
285
|
+
projectId: string | null,
|
|
286
|
+
accountId: string
|
|
287
|
+
): Promise<string> {
|
|
288
|
+
try {
|
|
289
|
+
const ej = await callOpenAIEmbeddings(undefined, [query], 'text-embedding-3-small')
|
|
290
|
+
const vec = ej.data?.[0]?.embedding
|
|
291
|
+
if (!vec) return ''
|
|
292
|
+
|
|
293
|
+
const { data: matches } = await adminDb.rpc('match_embeddings', {
|
|
294
|
+
query_embedding: `[${vec.join(',')}]`,
|
|
295
|
+
match_count: 8,
|
|
296
|
+
filter_vector_type: 'semantic',
|
|
297
|
+
similarity_threshold: 0.2,
|
|
298
|
+
filter_item_types: ['cil_chunk'],
|
|
299
|
+
})
|
|
300
|
+
|
|
301
|
+
if (!matches?.length) return ''
|
|
302
|
+
|
|
303
|
+
const chunkIds = [...new Set((matches as any[]).map((m: any) => m.document_id))]
|
|
304
|
+
let chunkQuery = adminDb
|
|
305
|
+
.from('items')
|
|
306
|
+
.select('id, data')
|
|
307
|
+
.in('id', chunkIds)
|
|
308
|
+
|
|
309
|
+
if (projectId) {
|
|
310
|
+
chunkQuery = chunkQuery.filter('data->>project_id', 'eq', projectId)
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
const { data: chunks } = await chunkQuery
|
|
314
|
+
const chunkMap = new Map((chunks || []).map((c: any) => [c.id, c]))
|
|
315
|
+
|
|
316
|
+
const contextParts: string[] = []
|
|
317
|
+
for (const m of (matches as any[])) {
|
|
318
|
+
const chunk = chunkMap.get(m.document_id)
|
|
319
|
+
if (!chunk) continue
|
|
320
|
+
const d = chunk.data || {}
|
|
321
|
+
const parts = [
|
|
322
|
+
`## ${d.chunk_name || 'unknown'} (${d.chunk_type || ''}) — ${d.file_path || ''}`,
|
|
323
|
+
]
|
|
324
|
+
if (d.macro) parts.push(`Purpose: ${d.macro}`)
|
|
325
|
+
if (d.micro) parts.push(`Detail: ${d.micro}`)
|
|
326
|
+
if (d.input_spec) parts.push(`Inputs: ${d.input_spec}`)
|
|
327
|
+
if (d.output_spec) parts.push(`Returns: ${d.output_spec}`)
|
|
328
|
+
if (d.side_effects) parts.push(`Side effects: ${d.side_effects}`)
|
|
329
|
+
if (d.stability) parts.push(`Stability: ${d.stability}`)
|
|
330
|
+
parts.push(`Similarity: ${(m.similarity * 100).toFixed(0)}%`)
|
|
331
|
+
contextParts.push(parts.join('\n'))
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
return contextParts.join('\n\n')
|
|
335
|
+
} catch {
|
|
336
|
+
return ''
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
|
|
341
|
+
|
|
342
|
+
|
|
343
|
+
|
|
344
|
+
// CIL[END chunk_id="custom_apps_cortex_functions_custom_cil_agent_retrievechunkcontext_1784235266"]
|
|
345
|
+
// CIL[BEGIN chunk_id="custom_apps_cortex_functions_custom_cil_agent_system_prompt_1784235266" type="variable" identity="system_prompt" parent="none"]
|
|
346
|
+
// CIL[DOC-MACRO purpose="Defines system_prompt configuration or state in cortex.functions.custom_cil-agent"]
|
|
347
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Hold the value and default configuration for system_prompt"]
|
|
348
|
+
// CIL[DOC-CONTEXT module="cortex.functions.custom_cil-agent" layer="function" related_files="[]"]
|
|
349
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="value of system_prompt" errors="none" side_effects="none"]
|
|
350
|
+
// CIL[DOC-MICRO logic_summary="Declares system_prompt with initial value or constant binding used by cortex.functions.custom_cil-agent" notable_decisions="[]"]
|
|
351
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
352
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
353
|
+
// CIL[DOC-VECTOR type="context" content="Layer: function. Direct callers: 0. Direct calls: 0. Related files: none."]
|
|
354
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
355
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
356
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
357
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
358
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
359
|
+
const SYSTEM_PROMPT = `You are a Code Intelligence Layer assistant. You answer questions about this codebase using retrieved chunk contracts.
|
|
360
|
+
|
|
361
|
+
Each chunk record contains: chunk_name, file_path, macro (purpose), micro (implementation detail), input_spec, output_spec, side_effects, and stability.
|
|
362
|
+
|
|
363
|
+
Rules:
|
|
364
|
+
- Ground your answer in the retrieved chunk contracts — do not invent APIs.
|
|
365
|
+
- Cite chunk_name and file_path when referencing a specific function.
|
|
366
|
+
- If no relevant chunk is found, say so explicitly.
|
|
367
|
+
- For refactoring questions, always mention callers / blast radius if relevant.
|
|
368
|
+
- Use the available tools to look up specifics you are not sure about.
|
|
369
|
+
- Keep answers concise. Use markdown code blocks for examples.`
|
|
370
|
+
|
|
371
|
+
|
|
372
|
+
|
|
373
|
+
|
|
374
|
+
|
|
375
|
+
// CIL[END chunk_id="custom_apps_cortex_functions_custom_cil_agent_system_prompt_1784235266"]
|
|
376
|
+
// CIL[BEGIN chunk_id="custom_apps_cortex_functions_custom_cil_agent_runcilinference_1784235266" type="function" identity="runcilinference" parent="none"]
|
|
377
|
+
// CIL[DOC-MACRO purpose="Implements runcilinference logic in cortex.functions.custom_cil-agent"]
|
|
378
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Execute runcilinference and return its computed result"]
|
|
379
|
+
// CIL[DOC-CONTEXT module="cortex.functions.custom_cil-agent" layer="function" related_files="[]"]
|
|
380
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="return value from function execution" errors="throws on invalid input or runtime failure" side_effects="none"]
|
|
381
|
+
// CIL[DOC-MICRO logic_summary="Provides runcilinference with runCilInference( inputs, handling internal flow and returning a result" notable_decisions="[]"]
|
|
382
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
383
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
384
|
+
// CIL[DOC-VECTOR type="context" content="Layer: function. Direct callers: 0. Direct calls: 0. Related files: none."]
|
|
385
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
386
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
387
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
388
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
389
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
390
|
+
async function runCilInference(
|
|
391
|
+
question: string,
|
|
392
|
+
projectId: string | null,
|
|
393
|
+
history: { role: string; content: string }[],
|
|
394
|
+
accountId: string,
|
|
395
|
+
model = 'gpt-4o-mini'
|
|
396
|
+
): Promise<{ answer: string; sources: string[]; tool_calls_made: string[] }> {
|
|
397
|
+
|
|
398
|
+
const ragContext = await retrieveChunkContext(question, projectId, accountId)
|
|
399
|
+
|
|
400
|
+
const messages: { role: string; content: string | any[] }[] = [
|
|
401
|
+
{ role: 'system', content: SYSTEM_PROMPT },
|
|
402
|
+
]
|
|
403
|
+
|
|
404
|
+
if (ragContext) {
|
|
405
|
+
messages.push({
|
|
406
|
+
role: 'system',
|
|
407
|
+
content: `## Retrieved Chunk Contracts (from CIL index)\n\n${ragContext}`,
|
|
408
|
+
})
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
|
|
412
|
+
for (const msg of history) {
|
|
413
|
+
messages.push(msg)
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
messages.push({ role: 'user', content: question })
|
|
417
|
+
|
|
418
|
+
const toolCallsMade: string[] = []
|
|
419
|
+
const MAX_TOOL_ITERS = 4
|
|
420
|
+
|
|
421
|
+
for (let iter = 0; iter < MAX_TOOL_ITERS; iter++) {
|
|
422
|
+
const response = await callLLM(messages as any, CIL_TOOLS, model)
|
|
423
|
+
|
|
424
|
+
if (!response.tool_calls?.length) {
|
|
425
|
+
|
|
426
|
+
const sources: string[] = []
|
|
427
|
+
if (ragContext) {
|
|
428
|
+
const nameMatches = ragContext.match(/## (\w[\w.]+)/g) || []
|
|
429
|
+
sources.push(...nameMatches.map(m => m.replace('## ', '')).slice(0, 5))
|
|
430
|
+
}
|
|
431
|
+
return { answer: response.content, sources, tool_calls_made: toolCallsMade }
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
|
|
435
|
+
messages.push({ role: 'assistant', content: response.content || '', ...{ tool_calls: response.tool_calls } } as any)
|
|
436
|
+
|
|
437
|
+
for (const tc of response.tool_calls) {
|
|
438
|
+
const toolName = tc.function?.name || tc.name || ''
|
|
439
|
+
const toolArgs = (() => { try { return JSON.parse(tc.function?.arguments || '{}') } catch { return {} } })()
|
|
440
|
+
toolCallsMade.push(toolName)
|
|
441
|
+
|
|
442
|
+
let result: any
|
|
443
|
+
try {
|
|
444
|
+
result = await dispatchTool(toolName, toolArgs, accountId)
|
|
445
|
+
} catch (err) {
|
|
446
|
+
result = { error: err instanceof Error ? err.message : String(err) }
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
messages.push({
|
|
450
|
+
role: 'tool',
|
|
451
|
+
content: JSON.stringify(result),
|
|
452
|
+
...({ tool_call_id: tc.id }),
|
|
453
|
+
} as any)
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
return { answer: 'I exhausted my tool call budget. Please try a more specific question.', sources: [], tool_calls_made: toolCallsMade }
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
|
|
461
|
+
|
|
462
|
+
|
|
463
|
+
|
|
464
|
+
// CIL[END chunk_id="custom_apps_cortex_functions_custom_cil_agent_runcilinference_1784235266"]
|
|
465
|
+
// CIL[BEGIN chunk_id="custom_apps_cortex_functions_custom_cil_agent_getplatformaccountid_1784235266" type="function" identity="getplatformaccountid" parent="none"]
|
|
466
|
+
// CIL[DOC-MACRO purpose="Implements getplatformaccountid logic in cortex.functions.custom_cil-agent"]
|
|
467
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Execute getplatformaccountid and return its computed result"]
|
|
468
|
+
// CIL[DOC-CONTEXT module="cortex.functions.custom_cil-agent" layer="function" related_files="[]"]
|
|
469
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="return value from function execution" errors="throws on invalid input or runtime failure" side_effects="none"]
|
|
470
|
+
// CIL[DOC-MICRO logic_summary="Provides getplatformaccountid with getPlatformAccountId( inputs, handling internal flow and returning a result" notable_decisions="[]"]
|
|
471
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
472
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
473
|
+
// CIL[DOC-VECTOR type="context" content="Layer: function. Direct callers: 0. Direct calls: 0. Related files: none."]
|
|
474
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
475
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
476
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
477
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
478
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
479
|
+
async function getPlatformAccountId(): Promise<string> {
|
|
480
|
+
const { data } = await adminDb.from('accounts').select('id').eq('slug', 'spine-system').maybeSingle()
|
|
481
|
+
return data?.id || ''
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
|
|
485
|
+
|
|
486
|
+
|
|
487
|
+
|
|
488
|
+
// CIL[END chunk_id="custom_apps_cortex_functions_custom_cil_agent_getplatformaccountid_1784235266"]
|
|
489
|
+
// CIL[BEGIN chunk_id="custom_apps_cortex_functions_custom_cil_agent_handler_1784235266" type="variable" identity="handler" parent="none"]
|
|
490
|
+
// CIL[DOC-MACRO purpose="Defines handler configuration or state in cortex.functions.custom_cil-agent"]
|
|
491
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Hold the value and default configuration for handler"]
|
|
492
|
+
// CIL[DOC-CONTEXT module="cortex.functions.custom_cil-agent" layer="function" related_files="[]"]
|
|
493
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="value of handler" errors="none" side_effects="none"]
|
|
494
|
+
// CIL[DOC-MICRO logic_summary="Declares handler with initial value or constant binding used by cortex.functions.custom_cil-agent" notable_decisions="[]"]
|
|
495
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
496
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
497
|
+
// CIL[DOC-VECTOR type="context" content="Layer: function. Direct callers: 0. Direct calls: 0. Related files: none."]
|
|
498
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
499
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
500
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
501
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
502
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
503
|
+
export const handler = createHandler(async (ctx, body) => {
|
|
504
|
+
const action = ctx.query?.action || 'ask'
|
|
505
|
+
const accountId = ctx.accountId || await getPlatformAccountId()
|
|
506
|
+
|
|
507
|
+
|
|
508
|
+
if (action === 'tools') {
|
|
509
|
+
return { tools: CIL_TOOLS }
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
|
|
513
|
+
if (action === 'tool') {
|
|
514
|
+
const toolName = body?.tool
|
|
515
|
+
const toolArgs = body?.args || {}
|
|
516
|
+
if (!toolName) throw new Error('tool name is required')
|
|
517
|
+
const result = await dispatchTool(toolName, toolArgs, accountId)
|
|
518
|
+
return { tool: toolName, result }
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
|
|
522
|
+
if (action === 'ask') {
|
|
523
|
+
const question = body?.question || body?.q
|
|
524
|
+
const projectId = body?.project_id || ctx.query?.project_id || null
|
|
525
|
+
const model = body?.model || 'gpt-4o-mini'
|
|
526
|
+
if (!question) throw new Error('question is required')
|
|
527
|
+
|
|
528
|
+
const { answer, sources, tool_calls_made } = await runCilInference(
|
|
529
|
+
question, projectId, [], accountId, model
|
|
530
|
+
)
|
|
531
|
+
|
|
532
|
+
return { question, answer, sources, tool_calls_made }
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
|
|
536
|
+
if (action === 'chat') {
|
|
537
|
+
const message = body?.message
|
|
538
|
+
const threadId = body?.thread_id
|
|
539
|
+
const projectId = body?.project_id || null
|
|
540
|
+
const model = body?.model || 'gpt-4o-mini'
|
|
541
|
+
if (!message) throw new Error('message is required')
|
|
542
|
+
|
|
543
|
+
|
|
544
|
+
let history: { role: string; content: string }[] = []
|
|
545
|
+
if (threadId) {
|
|
546
|
+
const { data: messages } = await adminDb
|
|
547
|
+
.from('messages')
|
|
548
|
+
.select('data, content')
|
|
549
|
+
.eq('thread_id', threadId)
|
|
550
|
+
.order('created_at', { ascending: false })
|
|
551
|
+
.limit(10)
|
|
552
|
+
|
|
553
|
+
history = ((messages || []).reverse()).map((m: any) => ({
|
|
554
|
+
role: m.data?.message_type === 'human' ? 'user' : 'assistant',
|
|
555
|
+
content: m.content || '',
|
|
556
|
+
}))
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
const { answer, sources, tool_calls_made } = await runCilInference(
|
|
560
|
+
message, projectId, history, accountId, model
|
|
561
|
+
)
|
|
562
|
+
|
|
563
|
+
|
|
564
|
+
if (threadId) {
|
|
565
|
+
const messageTypeId = await resolveTypeId('message', 'message').catch(() => null)
|
|
566
|
+
if (messageTypeId) {
|
|
567
|
+
await adminCreate(ctx, {
|
|
568
|
+
entity: 'messages',
|
|
569
|
+
type_id: messageTypeId,
|
|
570
|
+
thread_id: threadId,
|
|
571
|
+
content: message,
|
|
572
|
+
data: { message_type: 'human' },
|
|
573
|
+
})
|
|
574
|
+
await adminCreate(ctx, {
|
|
575
|
+
entity: 'messages',
|
|
576
|
+
type_id: messageTypeId,
|
|
577
|
+
thread_id: threadId,
|
|
578
|
+
content: answer,
|
|
579
|
+
data: { message_type: 'agent', sources, tool_calls_made },
|
|
580
|
+
})
|
|
581
|
+
}
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
return { message, answer, sources, tool_calls_made, thread_id: threadId }
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
throw new Error(`Unknown action: ${action}. Valid: ask, chat, tool, tools`)
|
|
588
|
+
})
|
|
589
|
+
|
|
590
|
+
|
|
591
|
+
|
|
592
|
+
// CIL[END chunk_id="custom_apps_cortex_functions_custom_cil_agent_handler_1784235266"]
|