spine-framework 0.3.124 → 0.3.126
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.framework/cli/commands/agents.ts +35 -37
- package/.framework/cli/commands/auth.ts +35 -34
- package/.framework/cli/commands/create-app.ts +104 -40
- package/.framework/cli/commands/dev.ts +104 -69
- package/.framework/cli/commands/doctor.ts +179 -69
- package/.framework/cli/commands/generate.ts +83 -143
- package/.framework/cli/commands/init.ts +72 -34
- package/.framework/cli/commands/install-app.ts +260 -125
- package/.framework/cli/commands/items.ts +33 -44
- package/.framework/cli/commands/migrate.ts +122 -40
- package/.framework/cli/commands/migrations.ts +33 -40
- package/.framework/cli/commands/pipelines.ts +31 -39
- package/.framework/cli/commands/status.ts +47 -23
- package/.framework/cli/commands/system.ts +47 -37
- package/.framework/cli/commands/test.ts +112 -68
- package/.framework/cli/commands/validate-app.ts +215 -121
- package/.framework/cli/context.ts +112 -130
- package/.framework/cli/env-loader.ts +47 -18
- package/.framework/cli/index.ts +81 -42
- package/.framework/docs/runtime-types.md +1024 -0
- package/.framework/functions/_shared/agent-runner.ts +1296 -961
- package/.framework/functions/_shared/app-manifest.ts +82 -68
- package/.framework/functions/_shared/audit.ts +135 -83
- package/.framework/functions/_shared/{cil-state.ts → cil.ts} +158 -56
- package/.framework/functions/_shared/db.ts +80 -126
- package/.framework/functions/_shared/hash-api-key.ts +63 -0
- package/.framework/functions/_shared/index.ts +224 -335
- package/.framework/functions/_shared/kb.ts +319 -0
- package/.framework/functions/_shared/llm.ts +92 -0
- package/.framework/functions/_shared/logging.ts +288 -0
- package/.framework/functions/_shared/middleware.ts +329 -365
- package/.framework/functions/_shared/outcomes.ts +36 -0
- package/.framework/functions/_shared/permissions.ts +359 -643
- package/.framework/functions/_shared/pipeline-runner.ts +243 -316
- package/.framework/functions/_shared/principal.ts +376 -468
- package/.framework/functions/_shared/resolve-credentials.ts +102 -0
- package/.framework/functions/_shared/resolve-ids.ts +188 -16
- package/.framework/functions/_shared/retry-deliveries.ts +104 -0
- package/.framework/functions/_shared/schema-utils.ts +611 -373
- package/.framework/functions/_shared/testing.ts +207 -137
- package/.framework/functions/_shared/tracing.ts +276 -0
- package/.framework/functions/_shared/trigger-engine.ts +159 -211
- package/.framework/functions/_shared/webhook-registration.ts +95 -81
- package/.framework/functions/_shared/webhook-registry.ts +153 -75
- package/.framework/functions/account-nodes.ts +31 -53
- package/.framework/functions/adapters/generic-webhook-inbound.ts +56 -0
- package/.framework/functions/adapters/generic-webhook-outbound.ts +43 -0
- package/.framework/functions/adapters/openai-outbound.ts +40 -0
- package/.framework/functions/admin-data.ts +685 -537
- package/.framework/functions/admin-funnel.ts +31 -20
- package/.framework/functions/admin-install-funnel.ts +47 -28
- package/.framework/functions/admin-signals.ts +47 -29
- package/.framework/functions/ai-agents.ts +122 -147
- package/.framework/functions/ai-interactions.ts +180 -90
- package/.framework/functions/api-keys.ts +250 -192
- package/.framework/functions/apps.ts +203 -197
- package/.framework/functions/auth.ts +98 -91
- package/.framework/functions/cil-agent-ingest.ts +773 -0
- package/.framework/functions/cil-agent.ts +592 -0
- package/.framework/functions/cil-callmap.ts +1227 -0
- package/.framework/functions/cil-config.ts +583 -0
- package/.framework/functions/cil-context.ts +445 -0
- package/.framework/functions/cil-doc.ts +1752 -0
- package/.framework/functions/cil-embeddings.ts +1202 -0
- package/.framework/functions/cil-graph.ts +585 -0
- package/.framework/functions/cil-ingest.ts +2416 -0
- package/.framework/functions/cil-pipeline.ts +318 -0
- package/.framework/functions/cil-project.ts +499 -0
- package/.framework/functions/cil-validate.ts +469 -0
- package/.framework/functions/debug-auth.ts +73 -53
- package/.framework/functions/deliveries.ts +117 -0
- package/.framework/functions/embeddings.ts +528 -516
- package/.framework/functions/eval-harness.ts +158 -106
- package/.framework/functions/integration-outbound.ts +311 -0
- package/.framework/functions/integration-routes.ts +240 -466
- package/.framework/functions/integrations.ts +132 -140
- package/.framework/functions/invites.ts +401 -201
- package/.framework/functions/item-progress.ts +113 -53
- package/.framework/functions/kb.ts +28 -0
- package/.framework/functions/logs.ts +239 -222
- package/.framework/functions/observability.ts +308 -259
- package/.framework/functions/pipeline-executions.ts +179 -235
- package/.framework/functions/pipelines.ts +163 -205
- package/.framework/functions/prompt-configs.ts +109 -156
- package/.framework/functions/roles.ts +97 -147
- package/.framework/functions/system-cron.ts +132 -218
- package/.framework/functions/system.ts +112 -52
- package/.framework/functions/tests.ts +32 -28
- package/.framework/functions/timers.ts +162 -210
- package/.framework/functions/triggers.ts +282 -346
- package/.framework/functions/types.ts +283 -400
- package/.framework/migrations/001_core_schema.sql +630 -0
- package/.framework/migrations/002_core_rls_and_functions.sql +532 -0
- package/.framework/migrations/{003_system_data.sql → 003_core_system_data.sql} +26 -153
- package/.framework/migrations/004_core_rpc_and_broker.sql +421 -0
- package/.framework/migrations/005_core_observability.sql +598 -0
- package/.framework/migrations/006_security_hardening_rls.sql +97 -0
- package/.framework/migrations/007_kb_article_list.sql +237 -0
- package/.framework/migrations/008_items_target.sql +8 -0
- package/.framework/migrations/009_roles_slug_unique.sql +11 -0
- package/.framework/public/spine.config.json +91 -0
- package/.framework/scripts/app-install-cli.ts +112 -98
- package/.framework/src/App.tsx +67 -20
- package/.framework/src/apps/admin/index.tsx +97 -27
- package/.framework/src/components/AppWrapper.tsx +50 -11
- package/.framework/src/components/CustomAppLoader.tsx +131 -22
- package/.framework/src/components/admin/AdminListPage.tsx +75 -8
- package/.framework/src/components/admin/AdminSidebar.tsx +148 -36
- package/.framework/src/components/admin/AdminStatsCard.tsx +48 -29
- package/.framework/src/components/admin/PageInstructions.tsx +49 -0
- package/.framework/src/components/admin/SortableTableHeader.tsx +49 -2
- package/.framework/src/components/app-shell/GenericAppShell.tsx +69 -11
- package/.framework/src/components/app-shell/GenericDetailPage.tsx +55 -10
- package/.framework/src/components/app-shell/GenericListPage.tsx +76 -9
- package/.framework/src/components/app-sidebar.tsx +50 -3
- package/.framework/src/components/auth/ProtectedRoute.tsx +53 -45
- package/.framework/src/components/kb/KBArticleEditor.tsx +409 -0
- package/.framework/src/components/kb/KBArticleList.tsx +557 -0
- package/.framework/src/components/layout/AppShell.tsx +54 -16
- package/.framework/src/components/layout/Header.tsx +50 -38
- package/.framework/src/components/layout/Layout.tsx +48 -32
- package/.framework/src/components/layout/Sidebar.tsx +167 -16
- package/.framework/src/components/runtime/DataDetailHeader.tsx +33 -1
- package/.framework/src/components/runtime/DataDetailPage.tsx +289 -4
- package/.framework/src/components/runtime/DataFilters.tsx +78 -1
- package/.framework/src/components/runtime/DataHeader.tsx +32 -29
- package/.framework/src/components/runtime/DataListPage.tsx +161 -2
- package/.framework/src/components/runtime/DataStats.tsx +48 -1
- package/.framework/src/components/runtime/DataTable.tsx +153 -1
- package/.framework/src/components/runtime/SchemaDetailForm.tsx +77 -46
- package/.framework/src/components/runtime/index.ts +16 -9
- package/.framework/src/components/search-form.tsx +33 -1
- package/.framework/src/components/shared/AgentView.tsx +48 -51
- package/.framework/src/components/shared/FieldRenderer.tsx +84 -67
- package/.framework/src/components/shared/InviteManager.tsx +113 -52
- package/.framework/src/components/shared/MemberList.tsx +182 -0
- package/.framework/src/components/shared/SchemaFields.tsx +96 -78
- package/.framework/src/components/ui/DataTable.tsx +86 -56
- package/.framework/src/components/ui/Form.tsx +188 -109
- package/.framework/src/components/ui/ItemCard.tsx +86 -58
- package/.framework/src/components/ui/ItemListView.tsx +88 -61
- package/.framework/src/components/ui/LoadingSpinner.tsx +52 -27
- package/.framework/src/components/ui/Modal.tsx +81 -4
- package/.framework/src/components/ui/RichTextEditor.tsx +101 -9
- package/.framework/src/components/ui/accordion.tsx +97 -5
- package/.framework/src/components/ui/alert-dialog.tsx +225 -13
- package/.framework/src/components/ui/alert.tsx +113 -6
- package/.framework/src/components/ui/aspect-ratio.tsx +49 -2
- package/.framework/src/components/ui/avatar.tsx +129 -7
- package/.framework/src/components/ui/badge.tsx +65 -3
- package/.framework/src/components/ui/breadcrumb.tsx +145 -8
- package/.framework/src/components/ui/button-group.tsx +81 -4
- package/.framework/src/components/ui/button.tsx +49 -2
- package/.framework/src/components/ui/calendar.tsx +65 -3
- package/.framework/src/components/ui/card.tsx +145 -8
- package/.framework/src/components/ui/carousel.tsx +129 -7
- package/.framework/src/components/ui/chart.tsx +161 -10
- package/.framework/src/components/ui/checkbox.tsx +49 -2
- package/.framework/src/components/ui/collapsible.tsx +81 -5
- package/.framework/src/components/ui/combobox.tsx +305 -20
- package/.framework/src/components/ui/command.tsx +177 -11
- package/.framework/src/components/ui/context-menu.tsx +273 -17
- package/.framework/src/components/ui/dialog.tsx +209 -27
- package/.framework/src/components/ui/direction.tsx +64 -4
- package/.framework/src/components/ui/drawer.tsx +193 -12
- package/.framework/src/components/ui/dropdown-menu.tsx +273 -18
- package/.framework/src/components/ui/empty.tsx +145 -9
- package/.framework/src/components/ui/field.tsx +209 -14
- package/.framework/src/components/ui/hover-card.tsx +81 -4
- package/.framework/src/components/ui/input-group.tsx +162 -10
- package/.framework/src/components/ui/input-otp.tsx +98 -5
- package/.framework/src/components/ui/input.tsx +49 -2
- package/.framework/src/components/ui/item.tsx +225 -13
- package/.framework/src/components/ui/kbd.tsx +65 -3
- package/.framework/src/components/ui/label.tsx +49 -2
- package/.framework/src/components/ui/menubar.tsx +289 -17
- package/.framework/src/components/ui/native-select.tsx +97 -5
- package/.framework/src/components/ui/navigation-menu.tsx +177 -10
- package/.framework/src/components/ui/pagination.tsx +161 -9
- package/.framework/src/components/ui/popover.tsx +145 -8
- package/.framework/src/components/ui/progress.tsx +49 -2
- package/.framework/src/components/ui/radio-group.tsx +65 -3
- package/.framework/src/components/ui/resizable.tsx +82 -4
- package/.framework/src/components/ui/scroll-area.tsx +65 -3
- package/.framework/src/components/ui/select.tsx +193 -11
- package/.framework/src/components/ui/separator.tsx +49 -2
- package/.framework/src/components/ui/sheet.tsx +193 -11
- package/.framework/src/components/ui/sidebar.tsx +481 -38
- package/.framework/src/components/ui/skeleton.tsx +49 -2
- package/.framework/src/components/ui/slider.tsx +49 -2
- package/.framework/src/components/ui/sonner.tsx +49 -2
- package/.framework/src/components/ui/spinner.tsx +49 -2
- package/.framework/src/components/ui/switch.tsx +49 -2
- package/.framework/src/components/ui/table-primitives.tsx +160 -33
- package/.framework/src/components/ui/table.tsx +161 -9
- package/.framework/src/components/ui/tabs.tsx +113 -6
- package/.framework/src/components/ui/textarea.tsx +49 -2
- package/.framework/src/components/ui/toggle-group.tsx +81 -4
- package/.framework/src/components/ui/toggle.tsx +65 -3
- package/.framework/src/components/ui/tooltip.tsx +97 -5
- package/.framework/src/contexts/AppContext.tsx +129 -45
- package/.framework/src/contexts/AuthContext.tsx +187 -144
- package/.framework/src/hooks/use-mobile.ts +48 -2
- package/.framework/src/hooks/useApi.ts +208 -159
- package/.framework/src/hooks/useAppPath.ts +32 -23
- package/.framework/src/hooks/useApps.ts +51 -20
- package/.framework/src/hooks/useEntityList.ts +32 -78
- package/.framework/src/hooks/useEntityRecord.ts +35 -96
- package/.framework/src/hooks/useForm.ts +32 -92
- package/.framework/src/hooks/useListSchema.ts +49 -78
- package/.framework/src/hooks/useSchemaRecord.ts +114 -105
- package/.framework/src/lib/api.ts +195 -116
- package/.framework/src/lib/supabase.ts +98 -64
- package/.framework/src/lib/utils.ts +287 -151
- package/.framework/src/main.tsx +49 -3
- package/.framework/src/pages/DashboardPage.tsx +52 -29
- package/.framework/src/pages/NotFoundPage.tsx +32 -10
- package/.framework/src/pages/SetupPage.tsx +32 -12
- package/.framework/src/pages/admin/AIAgentDetailPage.tsx +119 -10
- package/.framework/src/pages/admin/AIAgentsPage.tsx +48 -19
- package/.framework/src/pages/admin/APIKeyDetailPage.tsx +187 -17
- package/.framework/src/pages/admin/APIKeysPage.tsx +98 -22
- package/.framework/src/pages/admin/AlertsConfigPage.tsx +113 -26
- package/.framework/src/pages/admin/AppDetailPage.tsx +125 -8
- package/.framework/src/pages/admin/AppsPage.tsx +49 -2
- package/.framework/src/pages/admin/DeliveriesPage.tsx +196 -0
- package/.framework/src/pages/admin/DesignedPage.tsx +32 -18
- package/.framework/src/pages/admin/EmbeddingDetailPage.tsx +215 -484
- package/.framework/src/pages/admin/EmbeddingsPage.tsx +116 -319
- package/.framework/src/pages/admin/ExtendedShadcnTestPage.tsx +34 -9
- package/.framework/src/pages/admin/IncrementalShadcnTestPage.tsx +34 -9
- package/.framework/src/pages/admin/IntegratedDashboard.tsx +32 -16
- package/.framework/src/pages/admin/IntegrationDetailPage.tsx +183 -26
- package/.framework/src/pages/admin/IntegrationsPage.tsx +48 -19
- package/.framework/src/pages/admin/InvitesPage.tsx +48 -14
- package/.framework/src/pages/admin/LogsPage.tsx +422 -75
- package/.framework/src/pages/admin/MinimalShadcnTestPage.tsx +34 -9
- package/.framework/src/pages/admin/ObservabilityDashboard.tsx +113 -24
- package/.framework/src/pages/admin/PipelineDetailPage.tsx +206 -34
- package/.framework/src/pages/admin/PipelineExecutionsPage.tsx +50 -17
- package/.framework/src/pages/admin/PipelinesPage.tsx +160 -21
- package/.framework/src/pages/admin/PromptConfigDetailPage.tsx +378 -88
- package/.framework/src/pages/admin/PromptConfigsPage.tsx +125 -16
- package/.framework/src/pages/admin/ProperlyDesignedPage.tsx +49 -10
- package/.framework/src/pages/admin/RoleDetailPage.tsx +130 -10
- package/.framework/src/pages/admin/RolesPage.tsx +171 -18
- package/.framework/src/pages/admin/SelectTestPage.tsx +34 -9
- package/.framework/src/pages/admin/ShadcnTestPage.tsx +49 -11
- package/.framework/src/pages/admin/SimpleDashboard.tsx +49 -10
- package/.framework/src/pages/admin/TestRunDetailPage.tsx +49 -4
- package/.framework/src/pages/admin/TestingDashboard.tsx +98 -28
- package/.framework/src/pages/admin/TimerDetailPage.tsx +143 -33
- package/.framework/src/pages/admin/TimersPage.tsx +48 -20
- package/.framework/src/pages/admin/TriggerDetailPage.tsx +118 -30
- package/.framework/src/pages/admin/TriggersPage.tsx +64 -19
- package/.framework/src/pages/admin/TypeDetailPage.tsx +138 -15
- package/.framework/src/pages/admin/TypesPage.tsx +48 -20
- package/.framework/src/pages/admin/cil/CILAgentPage.tsx +465 -0
- package/.framework/src/pages/admin/cil/CILChunkDetailPage.tsx +787 -0
- package/.framework/src/pages/admin/cil/CILDashboardPage.tsx +699 -0
- package/.framework/src/pages/admin/cil/CILFileListPage.tsx +647 -0
- package/.framework/src/pages/admin/cil/CILGraphPage.tsx +616 -0
- package/.framework/src/pages/admin/cil/CILIngestionPage.tsx +1402 -0
- package/.framework/src/pages/admin/cil/CILProjectsPage.tsx +614 -0
- package/.framework/src/pages/admin/cil/CILSearchPage.tsx +571 -0
- package/.framework/src/pages/admin/cil/FlexiblePipelinePage.tsx +731 -0
- package/.framework/src/pages/admin/kb/KBAdminPage.tsx +64 -0
- package/.framework/src/pages/auth/AuthConfirmPage.tsx +52 -51
- package/.framework/src/pages/auth/ForgotPasswordPage.tsx +31 -22
- package/.framework/src/pages/auth/LoginPage.tsx +50 -23
- package/.framework/src/pages/auth/PendingApprovalPage.tsx +31 -15
- package/.framework/src/pages/auth/RegisterPage.tsx +281 -317
- package/.framework/src/pages/spine-framework/APIPage.tsx +33 -0
- package/.framework/src/pages/spine-framework/CLIPage.tsx +33 -0
- package/.framework/src/types/auth.ts +128 -71
- package/.framework/src/types/types.ts +373 -157
- package/custom/.devin/skills/spine-workbench-discovery/SKILL.md +39 -0
- package/custom/.devin/skills/spine-workbench-idea/SKILL.md +36 -0
- package/custom/.devin/skills/spine-workbench-implement/SKILL.md +46 -0
- package/custom/.devin/skills/spine-workbench-initiative/SKILL.md +28 -0
- package/custom/.devin/skills/spine-workbench-plan/SKILL.md +38 -0
- package/docs/README.md +9 -130
- package/netlify.toml +5 -2
- package/package.json +13 -25
- package/scripts/kb-ingest-docs.ts +203 -0
- package/spine.config.json +65 -4
- package/.framework/migrations/001_schema.sql +0 -425
- package/.framework/migrations/002_rls_and_functions.sql +0 -763
- package/.framework/migrations/004_enhancements.sql +0 -43
- package/.framework/migrations/005_auth_user_trigger.sql +0 -105
- package/.framework/migrations/006_fix_current_actor_id.sql +0 -21
- package/.framework/migrations/016_invites.sql +0 -27
- package/.framework/migrations/017_fix_get_account_apps.sql +0 -78
- package/.framework/migrations/018_apps_required_roles.sql +0 -17
- package/.framework/migrations/019_triggers_unique_constraint.sql +0 -13
- package/.framework/migrations/020_get_account_apps_role_filter.sql +0 -117
- package/.framework/migrations/021_app_domains.sql +0 -112
- package/.framework/migrations/022_route_prefix_domain_unique.sql +0 -21
- package/.framework/migrations/023_match_embeddings_rpc.sql +0 -78
- package/.framework/migrations/024_messages_account_id.sql +0 -9
- package/.framework/migrations/025_retype_threads_messages.sql +0 -240
- package/.framework/migrations/026_fix_rls_policies.sql +0 -47
- package/.framework/migrations/027_embedding_lifecycle.sql +0 -176
- package/.framework/migrations/028_fix_message_data_permissions.sql +0 -49
- package/.framework/migrations/029_tighten_support_triage_prompt.sql +0 -41
- package/.framework/migrations/030_messages_updated_by.sql +0 -6
- package/.framework/migrations/031_seed_upsert_constraints.sql +0 -35
- package/docs/APPS.md +0 -232
- package/docs/ARCHITECTURE.md +0 -246
- package/docs/INSTALL.md +0 -155
- package/docs/design-schema-spec.md +0 -1837
- package/docs/dev-guides/01-create-an-app.md +0 -183
- package/docs/dev-guides/02-create-a-function.md +0 -178
- package/docs/dev-guides/03-create-a-component.md +0 -178
- package/docs/dev-guides/04-webhook-handlers.md +0 -129
- package/docs/dev-guides/05-testing.md +0 -168
- package/docs/dev-guides/README.md +0 -40
- package/docs/npm-packages-plan.md +0 -288
- package/docs/spine-core--api-reference.md +0 -822
|
@@ -1,19 +1,21 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @module src/pages/admin/TypesPage
|
|
3
|
-
* @audience installer
|
|
4
|
-
* @layer frontend-page
|
|
5
|
-
* @stability stable
|
|
6
|
-
*
|
|
7
|
-
* Admin list page for item/account/person types. Fetches all types via
|
|
8
|
-
* `/api/types?action=list`, then applies client-side search, category
|
|
9
|
-
* filter (`all` | `system` | `custom` | `active`), and sort. Renders
|
|
10
|
-
* inside `AdminListPage` with four stat cards and a sortable table.
|
|
11
|
-
* Row clicks navigate to `/spine-framework/admin/configs/types/:id`.
|
|
12
|
-
*
|
|
13
|
-
* @seeAlso src/components/admin/AdminListPage.tsx
|
|
14
|
-
* @seeAlso src/pages/admin/TypeDetailPage.tsx
|
|
15
|
-
*/
|
|
16
1
|
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
// CIL[BEGIN chunk_id="typespage_moduleheader_1783664706" type="module_header" identity="module_header" parent="none"]
|
|
5
|
+
// CIL[DOC-MACRO purpose="Import dependencies for TypesPage component"]
|
|
6
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Provide all external dependencies and UI components"]
|
|
7
|
+
// CIL[DOC-CONTEXT module="TypesPage" layer="frontend-page" related_files="[\".framework/src/components/layout/Sidebar.tsx\",\".framework/src/components/ui/dialog.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/portal/pages/CoursesPage.tsx\",\"\\\"]"]
|
|
8
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="React components and utilities" errors="none" side_effects="none"]
|
|
9
|
+
// CIL[DOC-MICRO logic_summary="Imports React hooks, API utilities, icons, and UI components" notable_decisions="[]"]
|
|
10
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
11
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
12
|
+
// CIL[DOC-AUDIENCE audience="developer"]
|
|
13
|
+
// CIL[DOC-VECTOR type="context" content="Layer: frontend-page. Direct callers: 0. Direct calls: 0. Related files: .framework/src/components/layout/Sidebar.tsx, .framework/src/components/ui/dialog.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, custom/apps/portal/pages/ContentPage.tsx, custom/apps/portal/pages/CoursesPage.tsx, \."]
|
|
14
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
15
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
16
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
17
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
18
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
17
19
|
import React, { useState } from 'react'
|
|
18
20
|
import { useApi } from '../../hooks/useApi'
|
|
19
21
|
import { apiFetch } from '../../lib/api'
|
|
@@ -30,7 +32,21 @@ import { Button } from '../../components/ui/button'
|
|
|
30
32
|
import { AdminListPage } from '../../components/admin/AdminListPage'
|
|
31
33
|
import { SortableTableHeader } from '../../components/admin/SortableTableHeader'
|
|
32
34
|
import { formatDateTime } from '../../lib/utils'
|
|
33
|
-
|
|
35
|
+
// CIL[END chunk_id="typespage_moduleheader_1783664706"]
|
|
36
|
+
// CIL[BEGIN chunk_id="typespage_type_1783664706" type="interface" identity="Type" parent="none"]
|
|
37
|
+
// CIL[DOC-MACRO purpose="Define the Type data structure for type management"]
|
|
38
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Provide type definition for item/account/person types"]
|
|
39
|
+
// CIL[DOC-CONTEXT module="TypesPage" layer="frontend-page" related_files="[\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/migrations/025_retype_threads_messages.sql\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\".framework/functions/_shared/schema-utils.ts\",\"\\\"]"]
|
|
40
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Type interface" errors="none" side_effects="none"]
|
|
41
|
+
// CIL[DOC-MICRO logic_summary="Defines comprehensive type structure with metadata and schema" notable_decisions="[]"]
|
|
42
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
43
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
44
|
+
// CIL[DOC-VECTOR type="context" content="Layer: frontend-page. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/TypeDetailPage.tsx, .framework/migrations/025_retype_threads_messages.sql, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/IntegrationsPage.tsx, .framework/functions/_shared/schema-utils.ts, \."]
|
|
45
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
46
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
47
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
48
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
49
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
34
50
|
interface Type {
|
|
35
51
|
id: string
|
|
36
52
|
name: string
|
|
@@ -54,14 +70,27 @@ interface Type {
|
|
|
54
70
|
app_id?: string | null
|
|
55
71
|
app?: any
|
|
56
72
|
}
|
|
57
|
-
|
|
73
|
+
// CIL[END chunk_id="typespage_type_1783664706"]
|
|
74
|
+
// CIL[BEGIN chunk_id="typespage_typespage_1783664706" type="function" identity="TypesPage" parent="none"]
|
|
75
|
+
// CIL[DOC-MACRO purpose="Admin list page for managing item/account/person types"]
|
|
76
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Fetch, filter, sort, and display types with navigation"]
|
|
77
|
+
// CIL[DOC-CONTEXT module="TypesPage" layer="frontend-page" related_files="[\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"custom/apps/portal/pages/CoursesPage.tsx\",\"\\\"]"]
|
|
78
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="React component with type list" errors="API failures" side_effects="API calls, navigation"]
|
|
79
|
+
// CIL[DOC-MICRO logic_summary="Client-side filtering, sorting, and stats calculation for types" notable_decisions="[]"]
|
|
80
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
81
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
82
|
+
// CIL[DOC-VECTOR type="context" content="Layer: frontend-page. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/TypeDetailPage.tsx, .framework/src/pages/admin/RolesPage.tsx, custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, custom/apps/portal/pages/CoursesPage.tsx, \."]
|
|
83
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
84
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
85
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
86
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
87
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
58
88
|
export function TypesPage() {
|
|
59
89
|
const [searchTerm, setSearchTerm] = useState('')
|
|
60
90
|
const [selectedCategory, setSelectedCategory] = useState('all')
|
|
61
91
|
const [sortKey, setSortKey] = useState('name')
|
|
62
92
|
const [sortDirection, setSortDirection] = useState<'asc' | 'desc'>('asc')
|
|
63
93
|
|
|
64
|
-
// Fetch types from API
|
|
65
94
|
const { data: types, loading, error, refetch } = useApi<Type[]>(
|
|
66
95
|
async ({ signal }: { signal?: AbortSignal }) => {
|
|
67
96
|
const response = await apiFetch('/api/types?action=list', { signal })
|
|
@@ -95,7 +124,6 @@ export function TypesPage() {
|
|
|
95
124
|
return matchesSearch && matchesCategory
|
|
96
125
|
})
|
|
97
126
|
|
|
98
|
-
// Helper functions
|
|
99
127
|
const getCategoryBadgeColor = (type: Type) => {
|
|
100
128
|
if (type.ownership === 'system') {
|
|
101
129
|
return 'bg-purple-50 text-purple-700'
|
|
@@ -122,7 +150,6 @@ export function TypesPage() {
|
|
|
122
150
|
window.location.href = `/spine-framework/admin/configs/types/${type.id}`
|
|
123
151
|
}
|
|
124
152
|
|
|
125
|
-
// Sort types
|
|
126
153
|
const sortedTypes = [...(filteredTypes || [])].sort((a, b) => {
|
|
127
154
|
let aValue: any = a[sortKey as keyof Type]
|
|
128
155
|
let bValue: any = b[sortKey as keyof Type]
|
|
@@ -293,3 +320,4 @@ export function TypesPage() {
|
|
|
293
320
|
</AdminListPage>
|
|
294
321
|
)
|
|
295
322
|
}
|
|
323
|
+
// CIL[END chunk_id="typespage_typespage_1783664706"]
|
|
@@ -0,0 +1,465 @@
|
|
|
1
|
+
// CIL[BEGIN chunk_id="cilagentpage_module_header_1784193942" type="module_header" identity="module_header" parent="none"]
|
|
2
|
+
// CIL[DOC-MACRO purpose="Import dependencies and icons for the CIL agent page"]
|
|
3
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Provides module imports and icon references used by the page"]
|
|
4
|
+
// CIL[DOC-CONTEXT module="cortex:cil-agent" layer="presentation" related_files="[\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\"\\\"]"]
|
|
5
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="none" errors="none" side_effects="none"]
|
|
6
|
+
// CIL[DOC-MICRO logic_summary="Sets up React hooks, router, apiFetch, app path hook, UI components, and lucide icons" 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: presentation. 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/src/pages/admin/RolesPage.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
|
+
import { useState, useRef, useEffect, useCallback } from 'react'
|
|
17
|
+
import { useParams } from 'react-router-dom'
|
|
18
|
+
import { apiFetch } from '@core/lib/api'
|
|
19
|
+
import { Button } from '@core/components/ui/button'
|
|
20
|
+
import { Textarea } from '@core/components/ui/textarea'
|
|
21
|
+
import { Badge } from '@core/components/ui/badge'
|
|
22
|
+
import { Skeleton } from '@core/components/ui/skeleton'
|
|
23
|
+
import {
|
|
24
|
+
Bot,
|
|
25
|
+
User,
|
|
26
|
+
ChevronRight,
|
|
27
|
+
Send,
|
|
28
|
+
RefreshCw,
|
|
29
|
+
Zap,
|
|
30
|
+
Wrench,
|
|
31
|
+
Code2,
|
|
32
|
+
AlertTriangle,
|
|
33
|
+
Plus,
|
|
34
|
+
FileCode2,
|
|
35
|
+
} from 'lucide-react'
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
import { PageInstructions } from '../../../components/admin/PageInstructions'
|
|
40
|
+
// CIL[END chunk_id="cilagentpage_module_header_1784193942"]
|
|
41
|
+
// CIL[BEGIN chunk_id="cilagentpage_message_1784193942" type="interface" identity="Message" parent="none"]
|
|
42
|
+
// CIL[DOC-MACRO purpose="Define the shape of a chat message"]
|
|
43
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Declares the TypeScript interface for messages exchanged in the agent chat"]
|
|
44
|
+
// CIL[DOC-CONTEXT module="cortex:cil-agent" layer="presentation" related_files="[\".framework/functions/_shared/principal.ts\",\".framework/migrations/025_retype_threads_messages.sql\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\".framework/functions/_shared/schema-utils.ts\",\"\\\"]"]
|
|
45
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Message type contract" errors="none" side_effects="none"]
|
|
46
|
+
// CIL[DOC-MICRO logic_summary="Describes id, role, content, optional sources, tool_calls_made, and loading flag" notable_decisions="[]"]
|
|
47
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
48
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
49
|
+
// CIL[DOC-VECTOR type="context" content="Layer: presentation. Direct callers: 0. Direct calls: 0. Related files: .framework/functions/_shared/principal.ts, .framework/migrations/025_retype_threads_messages.sql, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/IntegrationsPage.tsx, .framework/functions/_shared/schema-utils.ts, \."]
|
|
50
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
51
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
52
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
53
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
54
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
55
|
+
interface Message {
|
|
56
|
+
id: string
|
|
57
|
+
role: 'user' | 'assistant' | 'system'
|
|
58
|
+
content: string
|
|
59
|
+
sources?: string[]
|
|
60
|
+
tool_calls_made?: string[]
|
|
61
|
+
loading?: boolean
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
// CIL[END chunk_id="cilagentpage_message_1784193942"]
|
|
68
|
+
// CIL[BEGIN chunk_id="cilagentpage_rendermarkdown_1784193942" type="function" identity="renderMarkdown" parent="none"]
|
|
69
|
+
// CIL[DOC-MACRO purpose="Render assistant message text with code blocks and inline formatting"]
|
|
70
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Convert plain text containing markdown-style formatting into React nodes"]
|
|
71
|
+
// CIL[DOC-CONTEXT module="cortex:cil-agent" layer="presentation" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/functions/_shared/schema-utils.ts\",\".framework/migrations/025_retype_threads_messages.sql\",\".framework/src/pages/admin/RolesPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"\\\"]"]
|
|
72
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="React.ReactNode[]" errors="none" side_effects="none"]
|
|
73
|
+
// CIL[DOC-MICRO logic_summary="Splits on triple-backtick blocks, renders pre/code, then applies inline code, bold, and newline processing" notable_decisions="[]"]
|
|
74
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
75
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
76
|
+
// CIL[DOC-VECTOR type="context" content="Layer: presentation. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, .framework/functions/_shared/schema-utils.ts, .framework/migrations/025_retype_threads_messages.sql, .framework/src/pages/admin/RolesPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, \."]
|
|
77
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
78
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
79
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
80
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
81
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
82
|
+
function renderMarkdown(text: string): React.ReactNode[] {
|
|
83
|
+
const parts: React.ReactNode[] = []
|
|
84
|
+
let key = 0
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
const segments = text.split(/(```[\s\S]*?```)/g)
|
|
88
|
+
for (const seg of segments) {
|
|
89
|
+
if (seg.startsWith('```')) {
|
|
90
|
+
const lines = seg.slice(3, -3).split('\n')
|
|
91
|
+
const lang = lines[0].trim()
|
|
92
|
+
const code = lines.slice(lang ? 1 : 0).join('\n')
|
|
93
|
+
parts.push(
|
|
94
|
+
<pre key={key++} className="bg-slate-900 text-slate-100 rounded-md p-3 my-2 overflow-auto text-xs font-mono whitespace-pre">
|
|
95
|
+
{lang && <div className="text-slate-400 text-xs mb-1">{lang}</div>}
|
|
96
|
+
{code}
|
|
97
|
+
</pre>
|
|
98
|
+
)
|
|
99
|
+
} else {
|
|
100
|
+
|
|
101
|
+
const inline = seg.split(/(`[^`]+`|\*\*[^*]+\*\*|\n)/g).map((chunk, i) => {
|
|
102
|
+
if (chunk.startsWith('`') && chunk.endsWith('`')) {
|
|
103
|
+
return <code key={i} className="bg-muted px-1 py-0.5 rounded text-xs font-mono">{chunk.slice(1, -1)}</code>
|
|
104
|
+
}
|
|
105
|
+
if (chunk.startsWith('**') && chunk.endsWith('**')) {
|
|
106
|
+
return <strong key={i}>{chunk.slice(2, -2)}</strong>
|
|
107
|
+
}
|
|
108
|
+
if (chunk === '\n') return <br key={i} />
|
|
109
|
+
return chunk
|
|
110
|
+
})
|
|
111
|
+
parts.push(<span key={key++}>{inline}</span>)
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return parts
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
// CIL[END chunk_id="cilagentpage_rendermarkdown_1784193942"]
|
|
120
|
+
// CIL[BEGIN chunk_id="cilagentpage_messagebubble_1784193942" type="function" identity="MessageBubble" parent="none"]
|
|
121
|
+
// CIL[DOC-MACRO purpose="Render a single chat message bubble with metadata chips"]
|
|
122
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Display a user or assistant message, loading skeleton, and source or tool chips"]
|
|
123
|
+
// CIL[DOC-CONTEXT module="cortex:cil-agent" layer="presentation" related_files="[\".framework/migrations/025_retype_threads_messages.sql\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\".framework/functions/_shared/schema-utils.ts\",\"\\\"]"]
|
|
124
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="JSX.Element" errors="none" side_effects="none"]
|
|
125
|
+
// CIL[DOC-MICRO logic_summary="Determines user vs assistant layout, calls renderMarkdown for assistant content, and links to source chunks" notable_decisions="[]"]
|
|
126
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
127
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
128
|
+
// CIL[DOC-VECTOR type="context" content="Layer: presentation. Direct callers: 0. Direct calls: 0. Related files: .framework/migrations/025_retype_threads_messages.sql, .framework/src/pages/admin/TypeDetailPage.tsx, custom/apps/portal/pages/ContentPage.tsx, .framework/src/pages/admin/IntegrationsPage.tsx, .framework/functions/_shared/schema-utils.ts, \."]
|
|
129
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
130
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
131
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
132
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
133
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
134
|
+
function MessageBubble({ message, projectId, appPath }: {
|
|
135
|
+
message: Message
|
|
136
|
+
projectId: string
|
|
137
|
+
appPath: (p: string) => string
|
|
138
|
+
}) {
|
|
139
|
+
const isUser = message.role === 'user'
|
|
140
|
+
|
|
141
|
+
if (message.loading) {
|
|
142
|
+
return (
|
|
143
|
+
<div className="flex items-start gap-2.5">
|
|
144
|
+
<div className="h-6 w-6 rounded-full bg-indigo-100 flex items-center justify-center shrink-0 mt-0.5">
|
|
145
|
+
<Bot className="h-3.5 w-3.5 text-indigo-600" />
|
|
146
|
+
</div>
|
|
147
|
+
<div className="flex-1 space-y-1.5 pt-0.5">
|
|
148
|
+
<Skeleton className="h-3 w-48" />
|
|
149
|
+
<Skeleton className="h-3 w-64" />
|
|
150
|
+
<Skeleton className="h-3 w-40" />
|
|
151
|
+
</div>
|
|
152
|
+
</div>
|
|
153
|
+
)
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
return (
|
|
157
|
+
<div className={`flex items-start gap-2.5 ${isUser ? 'flex-row-reverse' : ''}`}>
|
|
158
|
+
<div className={`h-6 w-6 rounded-full flex items-center justify-center shrink-0 mt-0.5 ${isUser ? 'bg-slate-200' : 'bg-indigo-100'}`}>
|
|
159
|
+
{isUser
|
|
160
|
+
? <User className="h-3.5 w-3.5 text-slate-600" />
|
|
161
|
+
: <Bot className="h-3.5 w-3.5 text-indigo-600" />
|
|
162
|
+
}
|
|
163
|
+
</div>
|
|
164
|
+
|
|
165
|
+
<div className={`flex-1 min-w-0 ${isUser ? 'items-end' : 'items-start'} flex flex-col`}>
|
|
166
|
+
<div className={`rounded-xl px-3.5 py-2.5 max-w-[85%] text-sm leading-relaxed ${
|
|
167
|
+
isUser
|
|
168
|
+
? 'bg-slate-900 text-white rounded-tr-sm'
|
|
169
|
+
: 'bg-muted rounded-tl-sm'
|
|
170
|
+
}`}>
|
|
171
|
+
{isUser
|
|
172
|
+
? <span className="whitespace-pre-wrap">{message.content}</span>
|
|
173
|
+
: <div className="prose-sm">{renderMarkdown(message.content)}</div>
|
|
174
|
+
}
|
|
175
|
+
</div>
|
|
176
|
+
|
|
177
|
+
{}
|
|
178
|
+
{!isUser && (message.tool_calls_made?.length || message.sources?.length) ? (
|
|
179
|
+
<div className="flex flex-wrap gap-1.5 mt-1.5 ml-0.5">
|
|
180
|
+
{(message.tool_calls_made || []).map((tc, i) => (
|
|
181
|
+
<span key={`tc-${tc}-${i}`} className="inline-flex items-center gap-1 text-xs bg-amber-50 border border-amber-200 text-amber-700 rounded-full px-2 py-0.5">
|
|
182
|
+
<Wrench className="h-2.5 w-2.5" /> {tc}
|
|
183
|
+
</span>
|
|
184
|
+
))}
|
|
185
|
+
{(message.sources || []).map((src, i) => (
|
|
186
|
+
<a
|
|
187
|
+
key={`src-${src}-${i}`}
|
|
188
|
+
href={appPath(projectId ? `/cil/${projectId}/chunks/${src}` : `/cil/chunks/${src}`)}
|
|
189
|
+
className="inline-flex items-center gap-1 text-xs bg-indigo-50 border border-indigo-200 text-indigo-700 rounded-full px-2 py-0.5 hover:bg-indigo-100 transition-colors"
|
|
190
|
+
title={`Open chunk: ${src}`}
|
|
191
|
+
>
|
|
192
|
+
<Code2 className="h-2.5 w-2.5" /> {src}
|
|
193
|
+
</a>
|
|
194
|
+
))}
|
|
195
|
+
</div>
|
|
196
|
+
) : null}
|
|
197
|
+
</div>
|
|
198
|
+
</div>
|
|
199
|
+
)
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
// CIL[END chunk_id="cilagentpage_messagebubble_1784193942"]
|
|
205
|
+
// CIL[BEGIN chunk_id="cilagentpage_suggestions_1784193942" type="constant" identity="SUGGESTIONS" parent="none"]
|
|
206
|
+
// CIL[DOC-MACRO purpose="Provide default example questions for the CIL agent chat"]
|
|
207
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Supplies a constant list of sample user queries for the empty state"]
|
|
208
|
+
// CIL[DOC-CONTEXT module="cortex:cil-agent" layer="presentation" related_files="[\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"\\\"]"]
|
|
209
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="readonly string[]" errors="none" side_effects="none"]
|
|
210
|
+
// CIL[DOC-MICRO logic_summary="Array of natural-language questions covering auth, embeddings, refactoring, and undocumented chunks" notable_decisions="[]"]
|
|
211
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
212
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
213
|
+
// CIL[DOC-VECTOR type="context" content="Layer: presentation. Direct callers: 0. Direct calls: 0. Related files: custom/apps/cortex/functions/custom_cil-embeddings.ts, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/functions/_shared/principal.ts, .framework/src/pages/admin/TypeDetailPage.tsx, \."]
|
|
214
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
215
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
216
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
217
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
218
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
219
|
+
const SUGGESTIONS = [
|
|
220
|
+
'What does the authentication middleware do?',
|
|
221
|
+
'Which functions write to the embeddings table?',
|
|
222
|
+
'Is it safe to refactor the createHandler function?',
|
|
223
|
+
'What are the side effects of the runAgent function?',
|
|
224
|
+
'Which chunks have no callers (potential dead code)?',
|
|
225
|
+
'Show me undocumented chunks in this project',
|
|
226
|
+
]
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
|
|
230
|
+
// CIL[END chunk_id="cilagentpage_suggestions_1784193942"]
|
|
231
|
+
// CIL[BEGIN chunk_id="cilagentpage_cilagentpage_1784193942" type="component" identity="CILAgentPage" parent="none"]
|
|
232
|
+
// CIL[DOC-MACRO purpose="Render the interactive CIL agent chat page"]
|
|
233
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Manage chat state, send questions to the CIL agent API, and render the conversation UI"]
|
|
234
|
+
// CIL[DOC-CONTEXT module="cortex:cil-agent" layer="presentation" related_files="[]"]
|
|
235
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="JSX.Element" errors="Displays API errors as assistant messages" side_effects="Calls /api/cil-agent and /api/cil-project; updates messages and input state"]
|
|
236
|
+
// CIL[DOC-MICRO logic_summary="Loads project title, maintains messages/input/sending refs, sends messages via apiFetch, scrolls to bottom, and renders messages and input area" 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: presentation. Direct callers: 0. Direct calls: 0. Related files: none."]
|
|
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
|
+
export default function CILAgentPage() {
|
|
246
|
+
const { id: projectId } = useParams<{ id: string }>()
|
|
247
|
+
const appPath = (path: string) => '/spine-framework/admin' + (path.startsWith('/') ? path : '/' + path)
|
|
248
|
+
const [messages, setMessages] = useState<Message[]>([])
|
|
249
|
+
const [input, setInput] = useState('')
|
|
250
|
+
const [sending, setSending] = useState(false)
|
|
251
|
+
const [projectTitle, setProjectTitle] = useState('')
|
|
252
|
+
const bottomRef = useRef<HTMLDivElement>(null)
|
|
253
|
+
const textareaRef = useRef<HTMLTextAreaElement>(null)
|
|
254
|
+
|
|
255
|
+
|
|
256
|
+
useEffect(() => {
|
|
257
|
+
if (!projectId) return
|
|
258
|
+
apiFetch(`/api/cil-project?action=get&id=${projectId}`)
|
|
259
|
+
.then(r => r.json())
|
|
260
|
+
.then(data => {
|
|
261
|
+
const p = data?.project || data?.data?.project
|
|
262
|
+
if (p?.title) setProjectTitle(p.title)
|
|
263
|
+
})
|
|
264
|
+
.catch(() => {})
|
|
265
|
+
}, [projectId])
|
|
266
|
+
|
|
267
|
+
|
|
268
|
+
useEffect(() => {
|
|
269
|
+
bottomRef.current?.scrollIntoView({ behavior: 'smooth' })
|
|
270
|
+
}, [messages])
|
|
271
|
+
|
|
272
|
+
const sendMessage = useCallback(async (text: string) => {
|
|
273
|
+
if (!text.trim() || sending) return
|
|
274
|
+
|
|
275
|
+
const userMsg: Message = {
|
|
276
|
+
id: crypto.randomUUID(),
|
|
277
|
+
role: 'user',
|
|
278
|
+
content: text.trim(),
|
|
279
|
+
}
|
|
280
|
+
const loadingMsg: Message = {
|
|
281
|
+
id: crypto.randomUUID(),
|
|
282
|
+
role: 'assistant',
|
|
283
|
+
content: '',
|
|
284
|
+
loading: true,
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
setMessages(prev => [...prev, userMsg, loadingMsg])
|
|
288
|
+
setInput('')
|
|
289
|
+
setSending(true)
|
|
290
|
+
|
|
291
|
+
try {
|
|
292
|
+
const res = await apiFetch('/api/cil-agent?action=ask', {
|
|
293
|
+
method: 'POST',
|
|
294
|
+
headers: { 'Content-Type': 'application/json' },
|
|
295
|
+
body: JSON.stringify({
|
|
296
|
+
question: text.trim(),
|
|
297
|
+
project_id: projectId,
|
|
298
|
+
}),
|
|
299
|
+
})
|
|
300
|
+
const data = await res.json()
|
|
301
|
+
const r = data?.data || data
|
|
302
|
+
const answer = r?.answer || 'Sorry, I could not generate a response.'
|
|
303
|
+
|
|
304
|
+
setMessages(prev => [
|
|
305
|
+
...prev.slice(0, -1),
|
|
306
|
+
{
|
|
307
|
+
id: crypto.randomUUID(),
|
|
308
|
+
role: 'assistant',
|
|
309
|
+
content: answer,
|
|
310
|
+
sources: r?.sources || [],
|
|
311
|
+
tool_calls_made: r?.tool_calls_made || [],
|
|
312
|
+
},
|
|
313
|
+
])
|
|
314
|
+
} catch (err) {
|
|
315
|
+
setMessages(prev => [
|
|
316
|
+
...prev.slice(0, -1),
|
|
317
|
+
{
|
|
318
|
+
id: crypto.randomUUID(),
|
|
319
|
+
role: 'assistant',
|
|
320
|
+
content: `Error: ${err instanceof Error ? err.message : String(err)}`,
|
|
321
|
+
},
|
|
322
|
+
])
|
|
323
|
+
} finally {
|
|
324
|
+
setSending(false)
|
|
325
|
+
setTimeout(() => textareaRef.current?.focus(), 50)
|
|
326
|
+
}
|
|
327
|
+
}, [projectId, sending])
|
|
328
|
+
|
|
329
|
+
const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {
|
|
330
|
+
if (e.key === 'Enter' && !e.shiftKey) {
|
|
331
|
+
e.preventDefault()
|
|
332
|
+
sendMessage(input)
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
const clearConversation = () => {
|
|
337
|
+
setMessages([])
|
|
338
|
+
setInput('')
|
|
339
|
+
textareaRef.current?.focus()
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
const isEmpty = messages.length === 0
|
|
343
|
+
|
|
344
|
+
return (
|
|
345
|
+
<div className="flex flex-col h-[calc(100vh-64px)]">
|
|
346
|
+
{}
|
|
347
|
+
<div className="flex items-center justify-between px-4 py-2.5 border-b bg-background shrink-0">
|
|
348
|
+
<div className="flex items-center gap-2 text-sm text-muted-foreground">
|
|
349
|
+
<a href={appPath('/cil')} className="hover:underline">Code Intelligence</a>
|
|
350
|
+
<ChevronRight className="h-3 w-3" />
|
|
351
|
+
{projectId && (
|
|
352
|
+
<>
|
|
353
|
+
<a href={appPath(`/cil/${projectId}/dashboard`)} className="hover:underline">{projectTitle || 'Project'}</a>
|
|
354
|
+
<ChevronRight className="h-3 w-3" />
|
|
355
|
+
</>
|
|
356
|
+
)}
|
|
357
|
+
<span className="flex items-center gap-1 text-foreground font-medium">
|
|
358
|
+
<Bot className="h-3.5 w-3.5 text-indigo-500" /> CIL Agent
|
|
359
|
+
</span>
|
|
360
|
+
</div>
|
|
361
|
+
|
|
362
|
+
<div className="flex items-center gap-2">
|
|
363
|
+
{projectId && (
|
|
364
|
+
<Badge variant="outline" className="text-xs font-mono">
|
|
365
|
+
<FileCode2 className="h-3 w-3 mr-1" />
|
|
366
|
+
{projectTitle || projectId.slice(0, 8)}
|
|
367
|
+
</Badge>
|
|
368
|
+
)}
|
|
369
|
+
{!isEmpty && (
|
|
370
|
+
<Button size="sm" variant="ghost" onClick={clearConversation} className="h-7 text-xs text-muted-foreground">
|
|
371
|
+
<Plus className="h-3 w-3 mr-1" /> New Chat
|
|
372
|
+
</Button>
|
|
373
|
+
)}
|
|
374
|
+
</div>
|
|
375
|
+
</div>
|
|
376
|
+
|
|
377
|
+
<PageInstructions
|
|
378
|
+
description="Ask the CIL agent questions about the indexed codebase."
|
|
379
|
+
sections={[
|
|
380
|
+
{ title: 'What this page is for', content: 'Use this chat to ask natural-language questions about the indexed codebase. The agent searches chunk contracts and the call graph to answer accurately.' },
|
|
381
|
+
{ title: 'How to use this page', content: 'Type a question in the input and press Enter or click send. Select a suggested prompt to start quickly. The agent returns citations from chunks and may call tools.' },
|
|
382
|
+
{ title: 'How to interpret results', content: 'Assistant messages include source chunk references. Click a reference to open the chunk detail. No project ID means the search spans all indexed chunks.' },
|
|
383
|
+
{ title: 'Important notes', content: 'The agent only knows what has been ingested and embedded. Run the CIL ingestion pipeline first for fresh or missing code.' },
|
|
384
|
+
]}
|
|
385
|
+
/>
|
|
386
|
+
|
|
387
|
+
{}
|
|
388
|
+
<div className="flex-1 overflow-y-auto px-4 py-4 space-y-4">
|
|
389
|
+
{isEmpty && (
|
|
390
|
+
<div className="flex flex-col items-center justify-center h-full space-y-6 text-center">
|
|
391
|
+
<div className="h-16 w-16 rounded-full bg-indigo-100 flex items-center justify-center">
|
|
392
|
+
<Bot className="h-8 w-8 text-indigo-600" />
|
|
393
|
+
</div>
|
|
394
|
+
<div className="space-y-1">
|
|
395
|
+
<h2 className="text-lg font-semibold">CIL Codebase Assistant</h2>
|
|
396
|
+
<p className="text-sm text-muted-foreground max-w-sm">
|
|
397
|
+
Ask me anything about this codebase. I'll search the indexed chunk contracts and call graph to answer accurately.
|
|
398
|
+
</p>
|
|
399
|
+
</div>
|
|
400
|
+
<div className="flex flex-wrap gap-2 justify-center max-w-lg">
|
|
401
|
+
{SUGGESTIONS.map(s => (
|
|
402
|
+
<button
|
|
403
|
+
key={s}
|
|
404
|
+
className="text-xs px-3 py-1.5 rounded-full border hover:bg-muted transition-colors text-muted-foreground hover:text-foreground text-left"
|
|
405
|
+
onClick={() => sendMessage(s)}
|
|
406
|
+
>
|
|
407
|
+
{s}
|
|
408
|
+
</button>
|
|
409
|
+
))}
|
|
410
|
+
</div>
|
|
411
|
+
{!projectId && (
|
|
412
|
+
<div className="flex items-center gap-1.5 text-xs text-amber-600 bg-amber-50 border border-amber-200 rounded-lg px-3 py-2">
|
|
413
|
+
<AlertTriangle className="h-3.5 w-3.5 shrink-0" />
|
|
414
|
+
No project scope — searching across all indexed chunks
|
|
415
|
+
</div>
|
|
416
|
+
)}
|
|
417
|
+
</div>
|
|
418
|
+
)}
|
|
419
|
+
|
|
420
|
+
{messages.map(msg => (
|
|
421
|
+
<MessageBubble
|
|
422
|
+
key={msg.id}
|
|
423
|
+
message={msg}
|
|
424
|
+
projectId={projectId || ''}
|
|
425
|
+
appPath={appPath}
|
|
426
|
+
/>
|
|
427
|
+
))}
|
|
428
|
+
|
|
429
|
+
<div ref={bottomRef} />
|
|
430
|
+
</div>
|
|
431
|
+
|
|
432
|
+
{}
|
|
433
|
+
<div className="border-t bg-background px-4 py-3 shrink-0">
|
|
434
|
+
<div className="flex items-end gap-2 max-w-4xl mx-auto">
|
|
435
|
+
<Textarea
|
|
436
|
+
ref={textareaRef}
|
|
437
|
+
value={input}
|
|
438
|
+
onChange={e => setInput(e.target.value)}
|
|
439
|
+
onKeyDown={handleKeyDown}
|
|
440
|
+
placeholder="Ask about a function, safe refactoring, callers, or blast radius…"
|
|
441
|
+
className="min-h-[44px] max-h-[200px] resize-none text-sm"
|
|
442
|
+
rows={1}
|
|
443
|
+
disabled={sending}
|
|
444
|
+
/>
|
|
445
|
+
<Button
|
|
446
|
+
onClick={() => sendMessage(input)}
|
|
447
|
+
disabled={!input.trim() || sending}
|
|
448
|
+
className="h-11 w-11 p-0 shrink-0"
|
|
449
|
+
>
|
|
450
|
+
{sending
|
|
451
|
+
? <RefreshCw className="h-4 w-4 animate-spin" />
|
|
452
|
+
: <Send className="h-4 w-4" />
|
|
453
|
+
}
|
|
454
|
+
</Button>
|
|
455
|
+
</div>
|
|
456
|
+
<p className="text-xs text-center text-muted-foreground mt-1.5">
|
|
457
|
+
<Zap className="h-3 w-3 inline mr-1" />
|
|
458
|
+
Grounded in CIL chunk contracts · Press Shift+Enter for a new line
|
|
459
|
+
</p>
|
|
460
|
+
</div>
|
|
461
|
+
</div>
|
|
462
|
+
)
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
// CIL[END chunk_id="cilagentpage_cilagentpage_1784193942"]
|