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
package/.framework/src/main.tsx
CHANGED
|
@@ -1,3 +1,21 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
// CIL[BEGIN chunk_id="main_module_header_1783672456" type="module_header" identity="imports" parent="none"]
|
|
5
|
+
// CIL[DOC-MACRO purpose="Import React and app dependencies"]
|
|
6
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Import all required modules for app bootstrap"]
|
|
7
|
+
// CIL[DOC-CONTEXT module="main" layer="frontend-entry" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/migrations/015_simplify_apps_table.sql\",\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\"\\\"]"]
|
|
8
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="React components" errors="none" side_effects="none"]
|
|
9
|
+
// CIL[DOC-MICRO logic_summary="Imports React, routing, state management, and app 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-entry. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/migrations/015_simplify_apps_table.sql, custom/apps/cortex/functions/custom_cil-embeddings.ts, \."]
|
|
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"]
|
|
1
19
|
import React from 'react'
|
|
2
20
|
import ReactDOM from 'react-dom/client'
|
|
3
21
|
import { BrowserRouter } from 'react-router-dom'
|
|
@@ -5,8 +23,21 @@ import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
|
|
|
5
23
|
import App from './App'
|
|
6
24
|
import { AuthProvider } from './contexts/AuthContext'
|
|
7
25
|
import './index.css'
|
|
8
|
-
|
|
9
|
-
//
|
|
26
|
+
// CIL[END chunk_id="main_module_header_1783672456"]
|
|
27
|
+
// CIL[BEGIN chunk_id="main_queryclient_1783672456" type="variable" identity="queryClient" parent="none"]
|
|
28
|
+
// CIL[DOC-MACRO purpose="Configure React Query client"]
|
|
29
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Create and configure query client instance"]
|
|
30
|
+
// CIL[DOC-CONTEXT module="main" layer="frontend-entry" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"\\\"]"]
|
|
31
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="QueryClient instance" errors="none" side_effects="none"]
|
|
32
|
+
// CIL[DOC-MICRO logic_summary="Creates QueryClient with retry and refetch options" notable_decisions="[]"]
|
|
33
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
34
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
35
|
+
// CIL[DOC-VECTOR type="context" content="Layer: frontend-entry. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, \."]
|
|
36
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
37
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
38
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
39
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
40
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
10
41
|
const queryClient = new QueryClient({
|
|
11
42
|
defaultOptions: {
|
|
12
43
|
queries: {
|
|
@@ -15,7 +46,21 @@ const queryClient = new QueryClient({
|
|
|
15
46
|
},
|
|
16
47
|
},
|
|
17
48
|
})
|
|
18
|
-
|
|
49
|
+
// CIL[END chunk_id="main_queryclient_1783672456"]
|
|
50
|
+
// CIL[BEGIN chunk_id="main_render_1783672456" type="function" identity="render" parent="none"]
|
|
51
|
+
// CIL[DOC-MACRO purpose="Render React app to DOM"]
|
|
52
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Bootstrap React application"]
|
|
53
|
+
// CIL[DOC-CONTEXT module="main" layer="frontend-entry" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/migrations/015_simplify_apps_table.sql\",\"\\\"]"]
|
|
54
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="DOM render" errors="none" side_effects="DOM manipulation"]
|
|
55
|
+
// CIL[DOC-MICRO logic_summary="Creates root and renders app with providers" notable_decisions="[]"]
|
|
56
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
57
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
58
|
+
// CIL[DOC-VECTOR type="context" content="Layer: frontend-entry. Direct callers: 2. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/functions/custom_cil-embeddings.ts, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/migrations/015_simplify_apps_table.sql, \."]
|
|
59
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 2. Total affected: 2."]
|
|
60
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
61
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
62
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
63
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
19
64
|
ReactDOM.createRoot(document.getElementById('root')!).render(
|
|
20
65
|
<QueryClientProvider client={queryClient}>
|
|
21
66
|
<BrowserRouter>
|
|
@@ -25,3 +70,4 @@ ReactDOM.createRoot(document.getElementById('root')!).render(
|
|
|
25
70
|
</BrowserRouter>
|
|
26
71
|
</QueryClientProvider>,
|
|
27
72
|
)
|
|
73
|
+
// CIL[END chunk_id="main_render_1783672456"]
|
|
@@ -1,36 +1,63 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @module src/pages/DashboardPage
|
|
3
|
-
* @audience installer
|
|
4
|
-
* @layer frontend-page
|
|
5
|
-
* @stability stable
|
|
6
|
-
*
|
|
7
|
-
* Admin home page. On mount, fetches all active item types (`kind=item`)
|
|
8
|
-
* from `/api/types` and then fans out parallel requests to
|
|
9
|
-
* `/api/admin-data?action=stats&entity=items&type_slug=…` to collect
|
|
10
|
-
* per-type item counts (capped at 8 types). Renders:
|
|
11
|
-
* - **Entity overview grid** — one stat card per type + a "Configuration"
|
|
12
|
-
* shortcut card
|
|
13
|
-
* - **Quick Actions row** — "New <Type>" buttons for the first 4 types plus
|
|
14
|
-
* a "Configure Types" shortcut
|
|
15
|
-
*
|
|
16
|
-
* @seeAlso src/contexts/AuthContext.tsx (provides current user)
|
|
17
|
-
* @seeAlso src/lib/api.ts (apiFetch)
|
|
18
|
-
*/
|
|
19
1
|
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
// CIL[BEGIN chunk_id="dashboardpage_module_header_1783672456" type="module_header" identity="imports" parent="none"]
|
|
5
|
+
// CIL[DOC-MACRO purpose="Import React and dashboard dependencies"]
|
|
6
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Import dashboard components and hooks"]
|
|
7
|
+
// CIL[DOC-CONTEXT module="DashboardPage" layer="frontend-page" related_files="[\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/components/ui/dialog.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\".framework/functions/_shared/principal.ts\",\"\\\"]"]
|
|
8
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="React hooks and components" errors="none" side_effects="none"]
|
|
9
|
+
// CIL[DOC-MICRO logic_summary="Imports React, hooks, routing, and icons" 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: custom/apps/cortex/pages/operations/OperationsDashboard.tsx, custom/apps/portal/pages/ContentPage.tsx, .framework/src/components/ui/dialog.tsx, .framework/src/pages/admin/RolesPage.tsx, .framework/functions/_shared/principal.ts, \."]
|
|
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"]
|
|
20
19
|
import React, { useState, useEffect } from 'react'
|
|
21
20
|
import { useAuth } from '../contexts/AuthContext'
|
|
22
21
|
import { useApi } from '../hooks/useApi'
|
|
23
22
|
import { apiFetch } from '../lib/api'
|
|
24
23
|
import { useNavigate } from 'react-router-dom'
|
|
25
|
-
import { Box, UserGroupIcon, FileText, BarChart3, Settings, Plus } from 'lucide-react';
|
|
26
|
-
|
|
24
|
+
import { Box, UserGroupIcon, FileText, BarChart3, Settings, Plus, CubeIcon } from 'lucide-react';
|
|
25
|
+
// CIL[END chunk_id="dashboardpage_module_header_1783672456"]
|
|
26
|
+
// CIL[BEGIN chunk_id="dashboardpage_typestat_1783672456" type="interface" identity="TypeStat" parent="none"]
|
|
27
|
+
// CIL[DOC-MACRO purpose="Define type statistics interface"]
|
|
28
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Type definition for dashboard stats"]
|
|
29
|
+
// CIL[DOC-CONTEXT module="DashboardPage" layer="frontend-page" related_files="[\".framework/functions/_shared/schema-utils.ts\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/functions/_shared/db.ts\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\"\\\"]"]
|
|
30
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Type definition" errors="none" side_effects="none"]
|
|
31
|
+
// CIL[DOC-MICRO logic_summary="Interface for entity type statistics" notable_decisions="[]"]
|
|
32
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
33
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
34
|
+
// CIL[DOC-VECTOR type="context" content="Layer: frontend-page. Direct callers: 0. Direct calls: 0. Related files: .framework/functions/_shared/schema-utils.ts, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/functions/_shared/db.ts, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/IntegrationsPage.tsx, \."]
|
|
35
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
36
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
37
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
38
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
39
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
27
40
|
interface TypeStat {
|
|
28
41
|
name: string
|
|
29
42
|
count: number
|
|
30
43
|
slug: string
|
|
31
44
|
icon: any
|
|
32
45
|
}
|
|
33
|
-
|
|
46
|
+
// CIL[END chunk_id="dashboardpage_typestat_1783672456"]
|
|
47
|
+
// CIL[BEGIN chunk_id="dashboardpage_dashboardpage_1783672456" type="function" identity="DashboardPage" parent="none"]
|
|
48
|
+
// CIL[DOC-MACRO purpose="Render admin dashboard"]
|
|
49
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Display entity overview and quick actions"]
|
|
50
|
+
// CIL[DOC-CONTEXT module="DashboardPage" layer="frontend-page" related_files="[\".framework/src/pages/admin/RolesPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\"\\\"]"]
|
|
51
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Dashboard JSX" errors="Network errors" side_effects="API calls, navigation"]
|
|
52
|
+
// CIL[DOC-MICRO logic_summary="Fetches type stats, displays overview cards and actions" notable_decisions="[]"]
|
|
53
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
54
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
55
|
+
// CIL[DOC-VECTOR type="context" content="Layer: frontend-page. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/RolesPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/src/pages/admin/IntegrationsPage.tsx, custom/apps/portal/pages/ContentPage.tsx, \."]
|
|
56
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
57
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
58
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
59
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
60
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
34
61
|
export function DashboardPage() {
|
|
35
62
|
const { user } = useAuth()
|
|
36
63
|
const navigate = useNavigate()
|
|
@@ -47,11 +74,10 @@ export function DashboardPage() {
|
|
|
47
74
|
useEffect(() => {
|
|
48
75
|
const fetchStats = async () => {
|
|
49
76
|
try {
|
|
50
|
-
// Fetch active types with their counts
|
|
51
77
|
const typesResponse = await apiFetch('/api/types?kind=item&is_active=true')
|
|
52
78
|
if (typesResponse.ok) {
|
|
53
79
|
const response = await typesResponse.json()
|
|
54
|
-
const types = response.data || response
|
|
80
|
+
const types = response.data || response
|
|
55
81
|
|
|
56
82
|
if (!Array.isArray(types)) {
|
|
57
83
|
console.error('Expected array of types, got:', types)
|
|
@@ -59,7 +85,6 @@ export function DashboardPage() {
|
|
|
59
85
|
return
|
|
60
86
|
}
|
|
61
87
|
|
|
62
|
-
// Get counts for each type
|
|
63
88
|
const statsPromises = types.map(async (type: any) => {
|
|
64
89
|
const countResponse = await apiFetch(`/api/admin-data?action=stats&entity=items&type_slug=${type.slug}`)
|
|
65
90
|
if (countResponse.ok) {
|
|
@@ -68,14 +93,14 @@ export function DashboardPage() {
|
|
|
68
93
|
name: type.name,
|
|
69
94
|
count: countData.count || 0,
|
|
70
95
|
slug: type.slug,
|
|
71
|
-
icon: CubeIcon
|
|
96
|
+
icon: CubeIcon
|
|
72
97
|
}
|
|
73
98
|
}
|
|
74
99
|
return null
|
|
75
100
|
})
|
|
76
101
|
|
|
77
102
|
const resolvedStats = await Promise.all(statsPromises)
|
|
78
|
-
const validStats = resolvedStats.filter((s): s is NonNullable<typeof s> => s !== null).slice(0, 8)
|
|
103
|
+
const validStats = resolvedStats.filter((s): s is NonNullable<typeof s> => s !== null).slice(0, 8)
|
|
79
104
|
setTypeStats(validStats)
|
|
80
105
|
}
|
|
81
106
|
} catch (error) {
|
|
@@ -106,7 +131,6 @@ export function DashboardPage() {
|
|
|
106
131
|
|
|
107
132
|
return (
|
|
108
133
|
<div className="space-y-6">
|
|
109
|
-
{/* Type Stats */}
|
|
110
134
|
<div>
|
|
111
135
|
<h2 className="text-lg font-semibold text-slate-900 mb-4">Entity Overview</h2>
|
|
112
136
|
<div className="grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4">
|
|
@@ -131,7 +155,6 @@ export function DashboardPage() {
|
|
|
131
155
|
)
|
|
132
156
|
})}
|
|
133
157
|
|
|
134
|
-
{/* Quick Actions Card */}
|
|
135
158
|
<div
|
|
136
159
|
className="rounded-xl border border-slate-200 bg-white p-5 hover:shadow-md transition-shadow cursor-pointer"
|
|
137
160
|
onClick={() => navigate('/spine-framework/admin/configs/types')}
|
|
@@ -149,7 +172,6 @@ export function DashboardPage() {
|
|
|
149
172
|
</div>
|
|
150
173
|
</div>
|
|
151
174
|
|
|
152
|
-
{/* Quick Actions */}
|
|
153
175
|
<div className="rounded-xl border border-slate-200 bg-white p-6">
|
|
154
176
|
<h3 className="text-sm font-semibold text-slate-900 mb-4">
|
|
155
177
|
Quick Actions
|
|
@@ -179,3 +201,4 @@ export function DashboardPage() {
|
|
|
179
201
|
</div>
|
|
180
202
|
)
|
|
181
203
|
}
|
|
204
|
+
// CIL[END chunk_id="dashboardpage_dashboardpage_1783672456"]
|
|
@@ -1,17 +1,38 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @module src/pages/NotFoundPage
|
|
3
|
-
* @audience installer
|
|
4
|
-
* @layer frontend-page
|
|
5
|
-
* @stability stable
|
|
6
|
-
*
|
|
7
|
-
* Generic 404 page rendered by the catch-all route. Displays a large
|
|
8
|
-
* "404" heading and a link back to the sign-in page.
|
|
9
|
-
*/
|
|
10
1
|
|
|
2
|
+
|
|
3
|
+
// CIL[BEGIN chunk_id="notfoundpage_module_header_1783672456" type="module_header" identity="imports" parent="none"]
|
|
4
|
+
// CIL[DOC-MACRO purpose="Import React and components"]
|
|
5
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Import required dependencies"]
|
|
6
|
+
// CIL[DOC-CONTEXT module="NotFoundPage" layer="frontend-page" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/components/ui/dialog.tsx\",\".framework/src/components/ui/table-primitives.tsx\",\"\\\"]"]
|
|
7
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="React components" errors="none" side_effects="none"]
|
|
8
|
+
// CIL[DOC-MICRO logic_summary="Imports React, Link, and Home icon" notable_decisions="[]"]
|
|
9
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
10
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
11
|
+
// CIL[DOC-AUDIENCE audience="developer"]
|
|
12
|
+
// CIL[DOC-VECTOR type="context" content="Layer: frontend-page. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/components/ui/dialog.tsx, .framework/src/components/ui/table-primitives.tsx, \."]
|
|
13
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
14
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
15
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
16
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
17
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
11
18
|
import React from 'react'
|
|
12
19
|
import { Link } from 'react-router-dom'
|
|
13
20
|
import { Home } from 'lucide-react';
|
|
14
|
-
|
|
21
|
+
// CIL[END chunk_id="notfoundpage_module_header_1783672456"]
|
|
22
|
+
// CIL[BEGIN chunk_id="notfoundpage_notfoundpage_1783672456" type="function" identity="NotFoundPage" parent="none"]
|
|
23
|
+
// CIL[DOC-MACRO purpose="Render 404 error page"]
|
|
24
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Display not found error with navigation"]
|
|
25
|
+
// CIL[DOC-CONTEXT module="NotFoundPage" layer="frontend-page" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\"\\\"]"]
|
|
26
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="404 page JSX" errors="none" side_effects="none"]
|
|
27
|
+
// CIL[DOC-MICRO logic_summary="Shows 404 message and login link" notable_decisions="[]"]
|
|
28
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
29
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
30
|
+
// CIL[DOC-VECTOR type="context" content="Layer: frontend-page. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/src/pages/admin/RolesPage.tsx, .framework/src/pages/admin/IntegrationsPage.tsx, \."]
|
|
31
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
32
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
33
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
34
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
35
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
15
36
|
export function NotFoundPage() {
|
|
16
37
|
return (
|
|
17
38
|
<div className="min-h-screen bg-slate-50 flex flex-col justify-center py-12 sm:px-6 lg:px-8">
|
|
@@ -37,3 +58,4 @@ export function NotFoundPage() {
|
|
|
37
58
|
</div>
|
|
38
59
|
)
|
|
39
60
|
}
|
|
61
|
+
// CIL[END chunk_id="notfoundpage_notfoundpage_1783672456"]
|
|
@@ -1,18 +1,37 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @module src/pages/SetupPage
|
|
3
|
-
* @audience installer
|
|
4
|
-
* @layer frontend-page
|
|
5
|
-
* @stability stable
|
|
6
|
-
*
|
|
7
|
-
* Shown at the root path when no apps are installed or no users have been
|
|
8
|
-
* created yet. Guides the developer through the initial setup steps.
|
|
9
|
-
* Replaces the old /dashboard fallback — the framework has no opinion
|
|
10
|
-
* about what lives at / once apps are installed.
|
|
11
|
-
*/
|
|
12
1
|
|
|
2
|
+
|
|
3
|
+
// CIL[BEGIN chunk_id="setuppage_module_header_1783672456" type="module_header" identity="imports" parent="none"]
|
|
4
|
+
// CIL[DOC-MACRO purpose="Import React and routing"]
|
|
5
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Import required components"]
|
|
6
|
+
// CIL[DOC-CONTEXT module="SetupPage" layer="frontend-page" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/components/ui/dialog.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\".framework/functions/_shared/principal.ts\",\"\\\"]"]
|
|
7
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="React components" errors="none" side_effects="none"]
|
|
8
|
+
// CIL[DOC-MICRO logic_summary="Imports React and Link for setup page" notable_decisions="[]"]
|
|
9
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
10
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
11
|
+
// CIL[DOC-AUDIENCE audience="developer"]
|
|
12
|
+
// CIL[DOC-VECTOR type="context" content="Layer: frontend-page. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/components/ui/dialog.tsx, .framework/src/pages/admin/RolesPage.tsx, .framework/functions/_shared/principal.ts, \."]
|
|
13
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
14
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
15
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
16
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
17
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
13
18
|
import React from 'react'
|
|
14
19
|
import { Link } from 'react-router-dom'
|
|
15
|
-
|
|
20
|
+
// CIL[END chunk_id="setuppage_module_header_1783672456"]
|
|
21
|
+
// CIL[BEGIN chunk_id="setuppage_setuppage_1783672456" type="function" identity="SetupPage" parent="none"]
|
|
22
|
+
// CIL[DOC-MACRO purpose="Render setup instructions page"]
|
|
23
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Show initial setup guide"]
|
|
24
|
+
// CIL[DOC-CONTEXT module="SetupPage" layer="frontend-page" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\"\\\"]"]
|
|
25
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Setup page JSX" errors="none" side_effects="none"]
|
|
26
|
+
// CIL[DOC-MICRO logic_summary="Displays setup steps and login link" notable_decisions="[]"]
|
|
27
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
28
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
29
|
+
// CIL[DOC-VECTOR type="context" content="Layer: frontend-page. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/src/pages/admin/RolesPage.tsx, .framework/src/pages/admin/IntegrationsPage.tsx, \."]
|
|
30
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
31
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
32
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
33
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
34
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
16
35
|
export function SetupPage() {
|
|
17
36
|
return (
|
|
18
37
|
<div className="min-h-screen flex items-center justify-center bg-slate-50 py-12 px-4 sm:px-6 lg:px-8">
|
|
@@ -64,3 +83,4 @@ export function SetupPage() {
|
|
|
64
83
|
</div>
|
|
65
84
|
)
|
|
66
85
|
}
|
|
86
|
+
// CIL[END chunk_id="setuppage_setuppage_1783672456"]
|
|
@@ -1,6 +1,22 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
// CIL[BEGIN chunk_id="aiagentdetailpage_module_header_1783668265" type="module_header" identity="module_header" parent="none"]
|
|
6
|
+
// CIL[DOC-MACRO purpose="Import dependencies for AIAgentDetailPage component"]
|
|
7
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Import React hooks, routing, API hooks, and UI components"]
|
|
8
|
+
// CIL[DOC-CONTEXT module="AIAgentDetailPage" layer="presentation" related_files="[\".framework/src/components/ui/dialog.tsx\",\"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\",\"\\\"]"]
|
|
9
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Imported modules" errors="none" side_effects="none"]
|
|
10
|
+
// CIL[DOC-MICRO logic_summary="Imports React state management, routing, API hooks, UI components" notable_decisions="[]"]
|
|
11
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
12
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
13
|
+
// CIL[DOC-AUDIENCE audience="developer"]
|
|
14
|
+
// CIL[DOC-VECTOR type="context" content="Layer: presentation. Direct callers: 0. Direct calls: 0. Related files: .framework/src/components/ui/dialog.tsx, 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, \."]
|
|
15
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
16
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
17
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
18
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
19
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
4
20
|
import { useState, useEffect } from 'react'
|
|
5
21
|
import { useParams, useNavigate } from 'react-router-dom'
|
|
6
22
|
import { useApi } from '../../hooks/useApi'
|
|
@@ -15,29 +31,74 @@ import { Card, CardContent, CardHeader, CardTitle } from '../../components/ui/ca
|
|
|
15
31
|
import { Skeleton } from '../../components/ui/skeleton'
|
|
16
32
|
import { Alert, AlertDescription, AlertTitle } from '../../components/ui/alert'
|
|
17
33
|
import { ArrowLeft, Bot, AlertCircle } from 'lucide-react'
|
|
18
|
-
|
|
34
|
+
import { PageInstructions } from '../../components/admin/PageInstructions'
|
|
35
|
+
// CIL[END chunk_id="aiagentdetailpage_module_header_1783668265"]
|
|
36
|
+
// CIL[BEGIN chunk_id="aiagentdetailpage_interface_aiagent_1783668265" type="interface" identity="AIAgent" parent="none"]
|
|
37
|
+
// CIL[DOC-MACRO purpose="Define AIAgent data structure"]
|
|
38
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Type definition for AI agent objects"]
|
|
39
|
+
// CIL[DOC-CONTEXT module="AIAgentDetailPage" layer="types" related_files="[\".framework/src/pages/admin/IntegrationsPage.tsx\",\".framework/functions/_shared/schema-utils.ts\",\".framework/functions/_shared/principal.ts\",\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\"\\\"]"]
|
|
40
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="AIAgent interface type" errors="none" side_effects="none"]
|
|
41
|
+
// CIL[DOC-MICRO logic_summary="Defines complete AI agent structure with model config and capabilities" 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: types. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/IntegrationsPage.tsx, .framework/functions/_shared/schema-utils.ts, .framework/functions/_shared/principal.ts, custom/apps/cortex/functions/custom_cil-embeddings.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"]
|
|
19
50
|
interface AIAgent {
|
|
20
51
|
id: string
|
|
21
52
|
name: string
|
|
22
53
|
description?: string
|
|
54
|
+
app_id?: string
|
|
23
55
|
agent_type: 'chat' | 'analysis' | 'automation' | 'custom'
|
|
24
56
|
model_config: { model: string; max_tokens?: number; temperature?: number }
|
|
25
57
|
system_prompt: string
|
|
26
58
|
tools: string[]
|
|
27
59
|
capabilities?: Record<string, any>
|
|
28
60
|
constraints?: Record<string, any>
|
|
61
|
+
metadata?: Record<string, any>
|
|
29
62
|
is_active: boolean
|
|
30
63
|
created_at: string
|
|
31
64
|
updated_at: string
|
|
32
65
|
}
|
|
33
|
-
|
|
66
|
+
// CIL[END chunk_id="aiagentdetailpage_interface_aiagent_1783668265"]
|
|
67
|
+
// CIL[BEGIN chunk_id="aiagentdetailpage_constant_agent_types_1783668265" type="constant" identity="AGENT_TYPES" parent="none"]
|
|
68
|
+
// CIL[DOC-MACRO purpose="Define AI agent type options"]
|
|
69
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Configure available agent type choices"]
|
|
70
|
+
// CIL[DOC-CONTEXT module="AIAgentDetailPage" layer="constants" related_files="[\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/migrations/025_retype_threads_messages.sql\",\".framework/functions/_shared/schema-utils.ts\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\"\\\"]"]
|
|
71
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Agent type options" errors="none" side_effects="none"]
|
|
72
|
+
// CIL[DOC-MICRO logic_summary="Defines chat, analysis, automation, and custom agent types" notable_decisions="[]"]
|
|
73
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
74
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
75
|
+
// CIL[DOC-VECTOR type="context" content="Layer: constants. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/TypeDetailPage.tsx, .framework/migrations/025_retype_threads_messages.sql, .framework/functions/_shared/schema-utils.ts, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/IntegrationsPage.tsx, \."]
|
|
76
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
77
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
78
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
79
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
80
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
34
81
|
const AGENT_TYPES = [
|
|
35
82
|
{ value: 'chat', label: 'Chat' },
|
|
36
83
|
{ value: 'analysis', label: 'Analysis' },
|
|
37
84
|
{ value: 'automation', label: 'Automation' },
|
|
38
85
|
{ value: 'custom', label: 'Custom' }
|
|
39
86
|
]
|
|
40
|
-
|
|
87
|
+
// CIL[END chunk_id="aiagentdetailpage_constant_agent_types_1783668265"]
|
|
88
|
+
// CIL[BEGIN chunk_id="aiagentdetailpage_function_aiagentdetailpage_1783668265" type="function" identity="AIAgentDetailPage" parent="none"]
|
|
89
|
+
// CIL[DOC-MACRO purpose="Main AIAgentDetailPage component implementation"]
|
|
90
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Render AI agent detail view with create/edit functionality"]
|
|
91
|
+
// CIL[DOC-CONTEXT module="AIAgentDetailPage" layer="presentation" related_files="[\".framework/src/components/ui/dialog.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\"\\\"]"]
|
|
92
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="React component" errors="API failures" side_effects="Navigation, API calls"]
|
|
93
|
+
// CIL[DOC-MICRO logic_summary="Manages CRUD operations for AI agents with form validation and state management" notable_decisions="[]"]
|
|
94
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
95
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
96
|
+
// CIL[DOC-VECTOR type="context" content="Layer: presentation. Direct callers: 0. Direct calls: 0. Related files: .framework/src/components/ui/dialog.tsx, custom/apps/portal/pages/ContentPage.tsx, .framework/src/pages/admin/RolesPage.tsx, \."]
|
|
97
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
98
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
99
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
100
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
101
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
41
102
|
export function AIAgentDetailPage() {
|
|
42
103
|
const { id } = useParams<{ id: string }>()
|
|
43
104
|
const navigate = useNavigate()
|
|
@@ -48,9 +109,9 @@ export function AIAgentDetailPage() {
|
|
|
48
109
|
const { data: agent, loading, error } = useApi<AIAgent>(
|
|
49
110
|
async () => {
|
|
50
111
|
if (isCreateMode) return {
|
|
51
|
-
id: '', name: '', description: '', agent_type: 'chat' as const,
|
|
112
|
+
id: '', name: '', description: '', app_id: '', agent_type: 'chat' as const,
|
|
52
113
|
model_config: { model: 'gpt-4', max_tokens: 2048, temperature: 0.7 },
|
|
53
|
-
system_prompt: '', tools: [], capabilities: {}, constraints: {},
|
|
114
|
+
system_prompt: '', tools: [], capabilities: {}, constraints: {}, metadata: {},
|
|
54
115
|
is_active: true, created_at: new Date().toISOString(), updated_at: new Date().toISOString()
|
|
55
116
|
}
|
|
56
117
|
const response = await apiFetch(`/api/ai-agents?method=GET&id=${id}`)
|
|
@@ -64,11 +125,12 @@ export function AIAgentDetailPage() {
|
|
|
64
125
|
useEffect(() => {
|
|
65
126
|
if (agent) {
|
|
66
127
|
setEditData({
|
|
67
|
-
name: agent.name, description: agent.description || '', agent_type: agent.agent_type,
|
|
128
|
+
name: agent.name, description: agent.description || '', app_id: agent.app_id || '', agent_type: agent.agent_type,
|
|
68
129
|
model_config: agent.model_config || { model: 'gpt-4', max_tokens: 2048, temperature: 0.7 },
|
|
69
130
|
system_prompt: agent.system_prompt || '', tools: (agent.tools || []).join('\n'),
|
|
70
131
|
capabilities: JSON.stringify(agent.capabilities || {}, null, 2),
|
|
71
132
|
constraints: JSON.stringify(agent.constraints || {}, null, 2),
|
|
133
|
+
metadata: JSON.stringify(agent.metadata || {}, null, 2),
|
|
72
134
|
is_active: agent.is_active
|
|
73
135
|
})
|
|
74
136
|
}
|
|
@@ -78,9 +140,11 @@ export function AIAgentDetailPage() {
|
|
|
78
140
|
try {
|
|
79
141
|
const payload = {
|
|
80
142
|
...editData,
|
|
143
|
+
app_id: editData.app_id || null,
|
|
81
144
|
tools: editData.tools?.split('\n').filter(Boolean) || [],
|
|
82
145
|
capabilities: JSON.parse(editData.capabilities || '{}'),
|
|
83
|
-
constraints: JSON.parse(editData.constraints || '{}')
|
|
146
|
+
constraints: JSON.parse(editData.constraints || '{}'),
|
|
147
|
+
metadata: JSON.parse(editData.metadata || '{}')
|
|
84
148
|
}
|
|
85
149
|
const url = isCreateMode ? '/api/ai-agents' : `/api/ai-agents?id=${id}`
|
|
86
150
|
const response = await apiFetch(url, {
|
|
@@ -115,6 +179,48 @@ export function AIAgentDetailPage() {
|
|
|
115
179
|
<h1 className="text-2xl font-bold">{isCreateMode ? 'Create AI Agent' : agent?.name}</h1>
|
|
116
180
|
</div>
|
|
117
181
|
|
|
182
|
+
<PageInstructions
|
|
183
|
+
description="Configure an AI agent with a model, system prompt, and tools."
|
|
184
|
+
sections={[
|
|
185
|
+
{ title: 'What this AI agent controls', content: 'An AI agent is a reusable model, prompt, and tool configuration that Spine invokes from pipelines, triggers, and chat interfaces. It defines how an LLM behaves, which tools it can call, and any guardrails.' },
|
|
186
|
+
{ title: 'Fields explained', content: <ul className="list-disc pl-4 space-y-1">
|
|
187
|
+
<li><strong>Name</strong> — string. The display name used in lists and callers. Missing or empty prevents the record from being saved.</li>
|
|
188
|
+
<li><strong>Type</strong> — select. Categorizes the agent as chat, analysis, automation, or custom. Used to filter and route agents; a missing value defaults to chat.</li>
|
|
189
|
+
<li><strong>Model</strong> — string. The LLM model name stored in <code>model_config.model</code>. If blank, the API call will fail because no model is targeted.</li>
|
|
190
|
+
<li><strong>Max Tokens</strong> — number. The maximum response length. Invalid or empty parses to an empty value and may cause provider errors.</li>
|
|
191
|
+
<li><strong>Temperature</strong> — number between 0 and 2. Lower is more deterministic, higher is more random. Out of range values may be rejected by the provider.</li>
|
|
192
|
+
<li><strong>Description</strong> — string (optional). Human-readable context for other admins.</li>
|
|
193
|
+
<li><strong>System Prompt</strong> — text. Defines the agent personality, instructions, and constraints. Empty means the model receives no system message.</li>
|
|
194
|
+
<li><strong>App ID</strong> — string. Optional owning app UUID; blank means account-scoped.</li>
|
|
195
|
+
<li><strong>Tools (one per line)</strong> — newline-separated string list. Tool names the agent is allowed to invoke. Unknown or missing tools cause runtime errors.</li>
|
|
196
|
+
<li><strong>Capabilities</strong> — JSON object. Optional flags or settings the agent can use. Must be valid JSON or save fails.</li>
|
|
197
|
+
<li><strong>Constraints</strong> — JSON object. Optional guardrails. Must be valid JSON or save fails.</li>
|
|
198
|
+
<li><strong>Metadata</strong> — JSON object. Optional metadata. Must be valid JSON or save fails.</li>
|
|
199
|
+
<li><strong>Active</strong> — checkbox. Inactive agents are not available for invocation.</li>
|
|
200
|
+
</ul> },
|
|
201
|
+
{ title: 'Options and values', content: <ul className="list-disc pl-4 space-y-1">
|
|
202
|
+
<li><strong>Agent type</strong>: <em>Chat</em> for conversational assistants, <em>Analysis</em> for data reasoning, <em>Automation</em> for pipeline actions, <em>Custom</em> for anything else.</li>
|
|
203
|
+
<li><strong>Active</strong>: enabled means the agent can be called; disabled means it is hidden from callers and will not run.</li>
|
|
204
|
+
</ul> },
|
|
205
|
+
{ title: 'Downstream impact', content: <ul className="list-disc pl-4 space-y-1">
|
|
206
|
+
<li>Pipelines, triggers, and chat UIs reference agents by ID; deleting or changing the model changes their output.</li>
|
|
207
|
+
<li>Tool names listed here must match registered tool names exactly, otherwise the agent cannot call them.</li>
|
|
208
|
+
<li>Invalid JSON in Capabilities or Constraints will stop the save and leave the previous config in place.</li>
|
|
209
|
+
</ul> },
|
|
210
|
+
{ title: 'How to create, save, and validate', content: <ol className="list-decimal pl-4 space-y-1">
|
|
211
|
+
<li>In create mode, fill every required field, enter at least a model name and system prompt.</li>
|
|
212
|
+
<li>Add tools one per line; supply optional JSON in Capabilities and Constraints.</li>
|
|
213
|
+
<li>Click Create. On existing records, click Edit, change fields, then Save.</li>
|
|
214
|
+
<li>Validation checks JSON syntax, parses Max Tokens and Temperature as numbers, and rejects empty Name/Model.</li>
|
|
215
|
+
</ol> },
|
|
216
|
+
{ title: 'Common mistakes', content: <ul className="list-disc pl-4 space-y-1">
|
|
217
|
+
<li>Pasting a multiline tools string as a single comma-separated line.</li>
|
|
218
|
+
<li>Using invalid JSON in Capabilities or Constraints.</li>
|
|
219
|
+
<li>Referencing a model name that is not configured in the account, causing calls to fail.</li>
|
|
220
|
+
</ul> },
|
|
221
|
+
]}
|
|
222
|
+
/>
|
|
223
|
+
|
|
118
224
|
<div className="flex justify-end gap-2">
|
|
119
225
|
{isEditing ? (
|
|
120
226
|
<><Button variant="outline" onClick={() => isCreateMode ? navigate(-1) : setIsEditing(false)}>Cancel</Button><Button onClick={handleSave}>{isCreateMode ? 'Create' : 'Save'}</Button></>
|
|
@@ -125,6 +231,7 @@ export function AIAgentDetailPage() {
|
|
|
125
231
|
<Card><CardContent className="p-6 space-y-4">
|
|
126
232
|
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
|
|
127
233
|
<div className="space-y-2"><Label>Name</Label><Input value={editData.name || ''} onChange={e => setEditData({...editData, name: e.target.value})} /></div>
|
|
234
|
+
<div className="space-y-2"><Label>App ID</Label><Input value={editData.app_id || ''} onChange={e => setEditData({...editData, app_id: e.target.value})} placeholder="Optional app UUID" /></div>
|
|
128
235
|
<div className="space-y-2"><Label>Type</Label><Select value={editData.agent_type || 'chat'} onValueChange={v => setEditData({...editData, agent_type: v})}><SelectTrigger><SelectValue /></SelectTrigger><SelectContent>{AGENT_TYPES.map(t => <SelectItem key={t.value} value={t.value}>{t.label}</SelectItem>)}</SelectContent></Select></div>
|
|
129
236
|
<div className="space-y-2"><Label>Model</Label><Input value={editData.model_config?.model || ''} onChange={e => setEditData({...editData, model_config: {...editData.model_config, model: e.target.value}})} /></div>
|
|
130
237
|
<div className="space-y-2"><Label>Max Tokens</Label><Input type="number" value={editData.model_config?.max_tokens || ''} onChange={e => setEditData({...editData, model_config: {...editData.model_config, max_tokens: parseInt(e.target.value)}})} /></div>
|
|
@@ -136,6 +243,7 @@ export function AIAgentDetailPage() {
|
|
|
136
243
|
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
|
|
137
244
|
<div className="space-y-2"><Label>Capabilities (JSON)</Label><Textarea value={editData.capabilities || '{}'} onChange={e => setEditData({...editData, capabilities: e.target.value})} rows={4} className="font-mono text-sm" /></div>
|
|
138
245
|
<div className="space-y-2"><Label>Constraints (JSON)</Label><Textarea value={editData.constraints || '{}'} onChange={e => setEditData({...editData, constraints: e.target.value})} rows={4} className="font-mono text-sm" /></div>
|
|
246
|
+
<div className="space-y-2"><Label>Metadata (JSON)</Label><Textarea value={editData.metadata || '{}'} onChange={e => setEditData({...editData, metadata: e.target.value})} rows={4} className="font-mono text-sm" /></div>
|
|
139
247
|
</div>
|
|
140
248
|
<div className="flex items-center gap-2"><Checkbox id="active" checked={editData.is_active} onCheckedChange={c => setEditData({...editData, is_active: c === true})} /><Label htmlFor="active">Active</Label></div>
|
|
141
249
|
</CardContent></Card>
|
|
@@ -159,3 +267,4 @@ export function AIAgentDetailPage() {
|
|
|
159
267
|
</div>
|
|
160
268
|
)
|
|
161
269
|
}
|
|
270
|
+
// CIL[END chunk_id="aiagentdetailpage_function_aiagentdetailpage_1783668265"]
|