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,13 +1,20 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @module src/pages/admin/IntegratedDashboard
|
|
3
|
-
* @audience installer
|
|
4
|
-
* @layer frontend-page
|
|
5
|
-
* @stability testing
|
|
6
|
-
*
|
|
7
|
-
* A dashboard page that properly integrates with the Spine admin layout.
|
|
8
|
-
* Uses the existing sidebar and content structure.
|
|
9
|
-
*/
|
|
10
1
|
|
|
2
|
+
|
|
3
|
+
// CIL[BEGIN chunk_id="integrateddashboard_module_header_1783668265" type="module_header" identity="module_header" parent="none"]
|
|
4
|
+
// CIL[DOC-MACRO purpose="Import dependencies for IntegratedDashboard component"]
|
|
5
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Import React hooks and comprehensive UI components"]
|
|
6
|
+
// CIL[DOC-CONTEXT module="IntegratedDashboard" layer="presentation" related_files="[\".framework/src/components/ui/dialog.tsx\",\".framework/src/components/ui/table-primitives.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\"\\\"]"]
|
|
7
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Imported modules" errors="none" side_effects="none"]
|
|
8
|
+
// CIL[DOC-MICRO logic_summary="Imports React state management and extensive UI component library" 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: presentation. Direct callers: 0. Direct calls: 0. Related files: .framework/src/components/ui/dialog.tsx, .framework/src/components/ui/table-primitives.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, custom/apps/portal/pages/ContentPage.tsx, \."]
|
|
13
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
14
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
15
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
16
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
17
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
11
18
|
import { useState } from 'react'
|
|
12
19
|
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '../../components/ui/card'
|
|
13
20
|
import { Button } from '../../components/ui/button'
|
|
@@ -60,7 +67,21 @@ import {
|
|
|
60
67
|
Calendar,
|
|
61
68
|
Clock
|
|
62
69
|
} from 'lucide-react'
|
|
63
|
-
|
|
70
|
+
// CIL[END chunk_id="integrateddashboard_module_header_1783668265"]
|
|
71
|
+
// CIL[BEGIN chunk_id="integrateddashboard_function_integrateddashboard_1783668265" type="function" identity="IntegratedDashboard" parent="none"]
|
|
72
|
+
// CIL[DOC-MACRO purpose="Main IntegratedDashboard component implementation"]
|
|
73
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Render comprehensive admin dashboard with stats, activity, and settings"]
|
|
74
|
+
// CIL[DOC-CONTEXT module="IntegratedDashboard" layer="presentation" related_files="[\".framework/src/components/ui/dialog.tsx\",\".framework/src/components/ui/table-primitives.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\"\\\"]"]
|
|
75
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="React component" errors="none" side_effects="State management"]
|
|
76
|
+
// CIL[DOC-MICRO logic_summary="Creates full-featured dashboard with metrics cards, activity feed, and tabbed content" notable_decisions="[]"]
|
|
77
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
78
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
79
|
+
// CIL[DOC-VECTOR type="context" content="Layer: presentation. Direct callers: 0. Direct calls: 0. Related files: .framework/src/components/ui/dialog.tsx, .framework/src/components/ui/table-primitives.tsx, custom/apps/portal/pages/ContentPage.tsx, .framework/src/pages/admin/RolesPage.tsx, \."]
|
|
80
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
81
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
82
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
83
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
84
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
64
85
|
export function IntegratedDashboard() {
|
|
65
86
|
const [selectedTab, setSelectedTab] = useState('overview')
|
|
66
87
|
const [searchQuery, setSearchQuery] = useState('')
|
|
@@ -68,7 +89,6 @@ export function IntegratedDashboard() {
|
|
|
68
89
|
|
|
69
90
|
return (
|
|
70
91
|
<div className="flex-1 space-y-6">
|
|
71
|
-
{/* Page Header */}
|
|
72
92
|
<div className="flex items-center justify-between">
|
|
73
93
|
<div>
|
|
74
94
|
<h2 className="text-3xl font-bold tracking-tight">Dashboard</h2>
|
|
@@ -88,7 +108,6 @@ export function IntegratedDashboard() {
|
|
|
88
108
|
</div>
|
|
89
109
|
</div>
|
|
90
110
|
|
|
91
|
-
{/* Search and Filter Bar */}
|
|
92
111
|
<Card>
|
|
93
112
|
<CardContent className="pt-6">
|
|
94
113
|
<div className="flex flex-col gap-4 sm:flex-row sm:items-center">
|
|
@@ -115,7 +134,6 @@ export function IntegratedDashboard() {
|
|
|
115
134
|
</CardContent>
|
|
116
135
|
</Card>
|
|
117
136
|
|
|
118
|
-
{/* Stats Cards */}
|
|
119
137
|
<div className="grid gap-4 md:grid-cols-2 lg:grid-cols-4">
|
|
120
138
|
<Card className="relative overflow-hidden">
|
|
121
139
|
<CardHeader className="flex flex-row items-center justify-between space-y-0 pb-2">
|
|
@@ -178,7 +196,6 @@ export function IntegratedDashboard() {
|
|
|
178
196
|
</Card>
|
|
179
197
|
</div>
|
|
180
198
|
|
|
181
|
-
{/* Main Content Tabs */}
|
|
182
199
|
<Tabs value={selectedTab} onValueChange={setSelectedTab} className="space-y-4">
|
|
183
200
|
<TabsList className="grid w-full grid-cols-4">
|
|
184
201
|
<TabsTrigger value="overview">Overview</TabsTrigger>
|
|
@@ -189,7 +206,6 @@ export function IntegratedDashboard() {
|
|
|
189
206
|
|
|
190
207
|
<TabsContent value="overview" className="space-y-4">
|
|
191
208
|
<div className="grid gap-6 lg:grid-cols-3">
|
|
192
|
-
{/* Recent Activity */}
|
|
193
209
|
<Card className="lg:col-span-2">
|
|
194
210
|
<CardHeader>
|
|
195
211
|
<CardTitle>Recent Activity</CardTitle>
|
|
@@ -235,7 +251,6 @@ export function IntegratedDashboard() {
|
|
|
235
251
|
</CardContent>
|
|
236
252
|
</Card>
|
|
237
253
|
|
|
238
|
-
{/* Quick Actions */}
|
|
239
254
|
<Card>
|
|
240
255
|
<CardHeader>
|
|
241
256
|
<CardTitle>Quick Actions</CardTitle>
|
|
@@ -400,3 +415,4 @@ export function IntegratedDashboard() {
|
|
|
400
415
|
</div>
|
|
401
416
|
)
|
|
402
417
|
}
|
|
418
|
+
// CIL[END chunk_id="integrateddashboard_function_integrateddashboard_1783668265"]
|
|
@@ -1,6 +1,22 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
// CIL[BEGIN chunk_id="integrationdetailpage_module_header_1783668265" type="module_header" identity="module_header" parent="none"]
|
|
6
|
+
// CIL[DOC-MACRO purpose="Import dependencies for IntegrationDetailPage component"]
|
|
7
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Import React hooks, routing, API hooks, and UI components"]
|
|
8
|
+
// CIL[DOC-CONTEXT module="IntegrationDetailPage" layer="presentation" related_files="[\".framework/src/components/ui/dialog.tsx\",\".framework/src/components/ui/table-primitives.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"custom/apps/portal/pages/ContentPage.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, .framework/src/components/ui/table-primitives.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, custom/apps/portal/pages/ContentPage.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 { apiFetch } from '../../lib/api'
|
|
@@ -15,26 +31,55 @@ import { Skeleton } from '../../components/ui/skeleton'
|
|
|
15
31
|
import { Alert, AlertDescription, AlertTitle } from '../../components/ui/alert'
|
|
16
32
|
import { Modal } from '../../components/ui/Modal'
|
|
17
33
|
import { Badge } from '../../components/ui/badge'
|
|
18
|
-
import {
|
|
19
|
-
import {
|
|
34
|
+
import { Collapsible, CollapsibleContent, CollapsibleTrigger } from '../../components/ui/collapsible'
|
|
35
|
+
import { ArrowLeft, Pencil, Trash2, CheckCircle, XCircle, AlertTriangle, AlertCircle, ChevronDown } from 'lucide-react'
|
|
20
36
|
|
|
37
|
+
// CIL[END chunk_id="integrationdetailpage_module_header_1783668265"]
|
|
38
|
+
// CIL[BEGIN chunk_id="integrationdetailpage_interface_integration_1783668265" type="interface" identity="Integration" parent="none"]
|
|
39
|
+
// CIL[DOC-MACRO purpose="Define Integration data structure"]
|
|
40
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Type definition for integration objects"]
|
|
41
|
+
// CIL[DOC-CONTEXT module="IntegrationDetailPage" 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\",\"\\\"]"]
|
|
42
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Integration interface type" errors="none" side_effects="none"]
|
|
43
|
+
// CIL[DOC-MICRO logic_summary="Defines complete integration structure with config and sync status" notable_decisions="[]"]
|
|
44
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
45
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
46
|
+
// 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, \."]
|
|
47
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
48
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
49
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
50
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
51
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
21
52
|
interface Integration {
|
|
22
53
|
id: string
|
|
23
54
|
name: string
|
|
24
55
|
provider: string
|
|
56
|
+
version?: string
|
|
25
57
|
integration_type: 'webhook' | 'api' | 'database' | 'file' | 'custom'
|
|
26
58
|
description?: string
|
|
27
59
|
config: Record<string, any>
|
|
60
|
+
credentials?: Record<string, any>
|
|
28
61
|
is_active: boolean
|
|
29
62
|
is_system?: boolean
|
|
63
|
+
is_configured?: boolean
|
|
30
64
|
created_at: string
|
|
31
65
|
updated_at: string
|
|
32
|
-
account_id: string
|
|
33
|
-
last_sync?: string
|
|
34
|
-
sync_status?: 'success' | 'failed' | 'pending'
|
|
35
|
-
error_message?: string
|
|
66
|
+
account_id: string | null
|
|
36
67
|
}
|
|
37
|
-
|
|
68
|
+
// CIL[END chunk_id="integrationdetailpage_interface_integration_1783668265"]
|
|
69
|
+
// CIL[BEGIN chunk_id="integrationdetailpage_constant_integration_types_1783668265" type="constant" identity="INTEGRATION_TYPES" parent="none"]
|
|
70
|
+
// CIL[DOC-MACRO purpose="Define integration type options"]
|
|
71
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Configure available integration type choices"]
|
|
72
|
+
// CIL[DOC-CONTEXT module="IntegrationDetailPage" layer="constants" related_files="[\".framework/src/pages/admin/IntegrationsPage.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/migrations/025_retype_threads_messages.sql\",\".framework/functions/_shared/schema-utils.ts\",\".framework/functions/_shared/principal.ts\",\"\\\"]"]
|
|
73
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Integration type options" errors="none" side_effects="none"]
|
|
74
|
+
// CIL[DOC-MICRO logic_summary="Defines webhook, API, database, file, and custom integration types" notable_decisions="[]"]
|
|
75
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
76
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
77
|
+
// CIL[DOC-VECTOR type="context" content="Layer: constants. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/IntegrationsPage.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/migrations/025_retype_threads_messages.sql, .framework/functions/_shared/schema-utils.ts, .framework/functions/_shared/principal.ts, \."]
|
|
78
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
79
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
80
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
81
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
82
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
38
83
|
const INTEGRATION_TYPES = [
|
|
39
84
|
{ value: 'webhook', label: 'Webhook' },
|
|
40
85
|
{ value: 'api', label: 'API' },
|
|
@@ -42,7 +87,21 @@ const INTEGRATION_TYPES = [
|
|
|
42
87
|
{ value: 'file', label: 'File' },
|
|
43
88
|
{ value: 'custom', label: 'Custom' }
|
|
44
89
|
]
|
|
45
|
-
|
|
90
|
+
// CIL[END chunk_id="integrationdetailpage_constant_integration_types_1783668265"]
|
|
91
|
+
// CIL[BEGIN chunk_id="integrationdetailpage_function_integrationdetailpage_1783668265" type="function" identity="IntegrationDetailPage" parent="none"]
|
|
92
|
+
// CIL[DOC-MACRO purpose="Main IntegrationDetailPage component implementation"]
|
|
93
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Render integration detail view with create/edit/delete functionality"]
|
|
94
|
+
// CIL[DOC-CONTEXT module="IntegrationDetailPage" layer="presentation" related_files="[\".framework/src/components/ui/dialog.tsx\",\".framework/src/components/ui/table-primitives.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\"\\\"]"]
|
|
95
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="React component" errors="API failures" side_effects="Navigation, API calls"]
|
|
96
|
+
// CIL[DOC-MICRO logic_summary="Manages CRUD operations for integrations with form validation and state management" notable_decisions="[]"]
|
|
97
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
98
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
99
|
+
// CIL[DOC-VECTOR type="context" content="Layer: presentation. Direct callers: 0. Direct calls: 0. Related files: .framework/src/components/ui/dialog.tsx, .framework/src/components/ui/table-primitives.tsx, custom/apps/portal/pages/ContentPage.tsx, .framework/src/pages/admin/RolesPage.tsx, \."]
|
|
100
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
101
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
102
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
103
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
104
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
46
105
|
export function IntegrationDetailPage() {
|
|
47
106
|
const { id } = useParams<{ id: string }>()
|
|
48
107
|
const navigate = useNavigate()
|
|
@@ -53,7 +112,7 @@ export function IntegrationDetailPage() {
|
|
|
53
112
|
const [isEditing, setIsEditing] = useState(isCreateMode)
|
|
54
113
|
const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false)
|
|
55
114
|
const [formData, setFormData] = useState({
|
|
56
|
-
name: '', provider: '', integration_type: 'api' as const, description: '', config: '{}', is_active: true
|
|
115
|
+
name: '', provider: '', version: '', integration_type: 'api' as const, description: '', config: '{}', credentials: '{}', is_active: true
|
|
57
116
|
})
|
|
58
117
|
|
|
59
118
|
useEffect(() => {
|
|
@@ -72,8 +131,11 @@ export function IntegrationDetailPage() {
|
|
|
72
131
|
const data = result.data
|
|
73
132
|
setIntegration(data)
|
|
74
133
|
setFormData({
|
|
75
|
-
name: data.name, provider: data.provider, integration_type: data.integration_type,
|
|
76
|
-
description: data.description || '',
|
|
134
|
+
name: data.name, provider: data.provider, version: data.version || '', integration_type: data.integration_type,
|
|
135
|
+
description: data.description || '',
|
|
136
|
+
config: JSON.stringify(data.config || {}, null, 2),
|
|
137
|
+
credentials: JSON.stringify(data.credentials || {}, null, 2),
|
|
138
|
+
is_active: data.is_active
|
|
77
139
|
})
|
|
78
140
|
} catch (err) {
|
|
79
141
|
setError(err instanceof Error ? err.message : 'Failed to load integration')
|
|
@@ -88,9 +150,12 @@ export function IntegrationDetailPage() {
|
|
|
88
150
|
try {
|
|
89
151
|
let parsedConfig = {}
|
|
90
152
|
try { parsedConfig = JSON.parse(formData.config) } catch { throw new Error('Invalid JSON in config') }
|
|
153
|
+
let parsedCredentials = {}
|
|
154
|
+
try { parsedCredentials = JSON.parse(formData.credentials) } catch { throw new Error('Invalid JSON in credentials') }
|
|
91
155
|
const url = isCreateMode ? '/api/integrations?action=create' : `/api/integrations?action=update&id=${id}`
|
|
92
156
|
const method = isCreateMode ? 'POST' : 'PATCH'
|
|
93
|
-
const
|
|
157
|
+
const body = { ...formData, config: parsedConfig, credentials: parsedCredentials }
|
|
158
|
+
const response = await apiFetch(url, { method, headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body) })
|
|
94
159
|
if (!response.ok) throw new Error('Failed to save integration')
|
|
95
160
|
if (isCreateMode) {
|
|
96
161
|
const result = await response.json()
|
|
@@ -126,13 +191,68 @@ export function IntegrationDetailPage() {
|
|
|
126
191
|
<Alert variant="destructive"><AlertCircle className="h-4 w-4" /><AlertTitle>Error</AlertTitle><AlertDescription>{error}</AlertDescription></Alert>
|
|
127
192
|
)
|
|
128
193
|
|
|
129
|
-
const
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
194
|
+
const typeInstructions = [
|
|
195
|
+
{
|
|
196
|
+
type: 'api',
|
|
197
|
+
title: 'API integration',
|
|
198
|
+
description: 'For outbound REST calls such as OpenAI, custom LLM providers, or generic HTTP endpoints. Set config.outbound_adapter and credentials.api_token.',
|
|
199
|
+
config: {
|
|
200
|
+
outbound_adapter: 'adapters/openai-outbound',
|
|
201
|
+
base_url: 'https://api.openai.com/v1',
|
|
202
|
+
models: { chat: 'gpt-4o-mini', embedding: 'text-embedding-3-small' }
|
|
203
|
+
},
|
|
204
|
+
credentials: { api_token: { source: 'env_var', value: 'OPENAI_API_KEY' } }
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
type: 'webhook',
|
|
208
|
+
title: 'Webhook integration',
|
|
209
|
+
description: 'For inbound HTTP events. Define the adapter that will handle the webhook and any events it listens to. Credentials usually hold a signing secret or API key.',
|
|
210
|
+
config: {
|
|
211
|
+
inbound_adapter: 'adapters/generic-webhook-inbound',
|
|
212
|
+
events: ['my.event']
|
|
213
|
+
},
|
|
214
|
+
credentials: { signing_secret: { source: 'env_var', value: 'WEBHOOK_SECRET' } }
|
|
215
|
+
},
|
|
216
|
+
{
|
|
217
|
+
type: 'database',
|
|
218
|
+
title: 'Database integration',
|
|
219
|
+
description: 'For external database reads/writes. Use env_var sources for host, port, database, and a credentials field for the password.',
|
|
220
|
+
config: {
|
|
221
|
+
adapter: 'adapters/postgres-outbound',
|
|
222
|
+
host_env_var: 'DB_HOST',
|
|
223
|
+
port_env_var: 'DB_PORT',
|
|
224
|
+
database_env_var: 'DB_NAME'
|
|
225
|
+
},
|
|
226
|
+
credentials: { password: { source: 'env_var', value: 'DB_PASSWORD' } }
|
|
227
|
+
},
|
|
228
|
+
{
|
|
229
|
+
type: 'file',
|
|
230
|
+
title: 'File / storage integration',
|
|
231
|
+
description: 'For S3, GCS, or other object storage. Provide bucket and region in config and access keys in credentials.',
|
|
232
|
+
config: {
|
|
233
|
+
adapter: 'adapters/s3-outbound',
|
|
234
|
+
bucket: 'my-bucket',
|
|
235
|
+
region: 'us-east-1'
|
|
236
|
+
},
|
|
237
|
+
credentials: {
|
|
238
|
+
access_key_id: { source: 'env_var', value: 'AWS_ACCESS_KEY_ID' },
|
|
239
|
+
secret_access_key: { source: 'env_var', value: 'AWS_SECRET_ACCESS_KEY' }
|
|
240
|
+
}
|
|
241
|
+
},
|
|
242
|
+
{
|
|
243
|
+
type: 'custom',
|
|
244
|
+
title: 'Custom integration',
|
|
245
|
+
description: 'For any integration not covered above. Point config.outbound_adapter or config.inbound_adapter to a custom function path and define the credentials fields your adapter expects.',
|
|
246
|
+
config: {
|
|
247
|
+
outbound_adapter: 'custom/apps/myapp/functions/my-adapter'
|
|
248
|
+
},
|
|
249
|
+
credentials: { api_token: { source: 'env_var', value: 'MY_CUSTOM_TOKEN' } }
|
|
135
250
|
}
|
|
251
|
+
]
|
|
252
|
+
|
|
253
|
+
const getStatusIcon = (configured?: boolean) => {
|
|
254
|
+
if (configured) return <CheckCircle className="h-4 w-4 text-green-500" />
|
|
255
|
+
return <AlertTriangle className="h-4 w-4 text-yellow-500" />
|
|
136
256
|
}
|
|
137
257
|
|
|
138
258
|
return (
|
|
@@ -156,27 +276,63 @@ export function IntegrationDetailPage() {
|
|
|
156
276
|
)}
|
|
157
277
|
</div>
|
|
158
278
|
|
|
279
|
+
<Card>
|
|
280
|
+
<CardContent className="p-4">
|
|
281
|
+
<Collapsible>
|
|
282
|
+
<CollapsibleTrigger className="group flex w-full items-center justify-between text-sm font-medium text-slate-700">
|
|
283
|
+
<span>Integration setup instructions</span>
|
|
284
|
+
<ChevronDown className="h-4 w-4 transition-transform group-data-[state=open]:rotate-180" />
|
|
285
|
+
</CollapsibleTrigger>
|
|
286
|
+
<CollapsibleContent className="space-y-4 pt-4">
|
|
287
|
+
<p className="text-sm text-slate-600">
|
|
288
|
+
Integrations connect Spine to external services. <code>Configuration (JSON)</code> defines the adapter and runtime settings. <code>Credentials (JSON)</code> stores secrets as either <code>env_var</code> (an environment variable name) or <code>value</code> (the literal secret). Fill in the fields for your integration type, save, and the broker will use them on the next call.
|
|
289
|
+
</p>
|
|
290
|
+
<div className="space-y-2">
|
|
291
|
+
{typeInstructions.map((t) => (
|
|
292
|
+
<Collapsible key={t.type}>
|
|
293
|
+
<CollapsibleTrigger className="group flex w-full items-center justify-between border-b py-2 text-sm font-medium text-slate-700">
|
|
294
|
+
<span>{t.title}</span>
|
|
295
|
+
<ChevronDown className="h-4 w-4 transition-transform group-data-[state=open]:rotate-180" />
|
|
296
|
+
</CollapsibleTrigger>
|
|
297
|
+
<CollapsibleContent className="space-y-2 pt-2">
|
|
298
|
+
<p className="text-sm text-slate-600">{t.description}</p>
|
|
299
|
+
<div className="space-y-1">
|
|
300
|
+
<div className="text-xs font-medium text-slate-500">Config template</div>
|
|
301
|
+
<pre className="text-xs bg-muted p-2 rounded overflow-auto font-mono">{JSON.stringify(t.config, null, 2)}</pre>
|
|
302
|
+
</div>
|
|
303
|
+
<div className="space-y-1">
|
|
304
|
+
<div className="text-xs font-medium text-slate-500">Credentials template</div>
|
|
305
|
+
<pre className="text-xs bg-muted p-2 rounded overflow-auto font-mono">{JSON.stringify(t.credentials, null, 2)}</pre>
|
|
306
|
+
</div>
|
|
307
|
+
</CollapsibleContent>
|
|
308
|
+
</Collapsible>
|
|
309
|
+
))}
|
|
310
|
+
</div>
|
|
311
|
+
</CollapsibleContent>
|
|
312
|
+
</Collapsible>
|
|
313
|
+
</CardContent>
|
|
314
|
+
</Card>
|
|
315
|
+
|
|
159
316
|
<Card><CardContent className="p-6">
|
|
160
317
|
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
|
|
161
318
|
<div className="space-y-4">
|
|
162
319
|
<h3 className="text-sm font-medium text-muted-foreground">Basic Info</h3>
|
|
163
320
|
<div className="space-y-2"><Label>Name</Label>{isEditing ? <Input value={formData.name} onChange={e => setFormData({...formData, name: e.target.value})} /> : <div className="text-sm">{integration?.name}</div>}</div>
|
|
164
321
|
<div className="space-y-2"><Label>Provider</Label>{isEditing ? <Input value={formData.provider} onChange={e => setFormData({...formData, provider: e.target.value})} /> : <div className="text-sm">{integration?.provider}</div>}</div>
|
|
322
|
+
<div className="space-y-2"><Label>Version</Label>{isEditing ? <Input value={formData.version} onChange={e => setFormData({...formData, version: e.target.value})} /> : <div className="text-sm">{integration?.version || '—'}</div>}</div>
|
|
165
323
|
<div className="space-y-2"><Label>Type</Label>{isEditing ? <Select value={formData.integration_type} onValueChange={v => setFormData({...formData, integration_type: v as any})}><SelectTrigger><SelectValue /></SelectTrigger><SelectContent>{INTEGRATION_TYPES.map(t => <SelectItem key={t.value} value={t.value}>{t.label}</SelectItem>)}</SelectContent></Select> : <Badge>{integration?.integration_type}</Badge>}</div>
|
|
166
324
|
<div className="space-y-2"><Label>Active</Label>{isEditing ? <div className="flex items-center gap-2"><Checkbox id="active" checked={formData.is_active} onCheckedChange={c => setFormData({...formData, is_active: c === true})} /><Label htmlFor="active">Enabled</Label></div> : <div className="text-sm">{integration?.is_active ? 'Yes' : 'No'}</div>}</div>
|
|
167
325
|
</div>
|
|
168
326
|
<div className="space-y-4">
|
|
169
|
-
<h3 className="text-sm font-medium text-muted-foreground">
|
|
327
|
+
<h3 className="text-sm font-medium text-muted-foreground">Status</h3>
|
|
170
328
|
{!isCreateMode && (
|
|
171
|
-
|
|
172
|
-
<div className="flex justify-between items-center"><span className="text-sm text-muted-foreground">Status</span><div className="flex items-center gap-2">{getStatusIcon(integration?.sync_status)}<span className="text-sm capitalize">{integration?.sync_status || '—'}</span></div></div>
|
|
173
|
-
<div className="flex justify-between items-center"><span className="text-sm text-muted-foreground">Last Sync</span><span className="text-sm">{integration?.last_sync ? formatDateTime(integration.last_sync) : '—'}</span></div>
|
|
174
|
-
</>
|
|
329
|
+
<div className="flex justify-between items-center"><span className="text-sm text-muted-foreground">Configured</span><div className="flex items-center gap-2">{getStatusIcon(integration?.is_configured)}<span className="text-sm capitalize">{integration?.is_configured ? 'Configured' : 'Pending'}</span></div></div>
|
|
175
330
|
)}
|
|
176
331
|
<div className="space-y-2"><Label>Description</Label>{isEditing ? <Textarea value={formData.description} onChange={e => setFormData({...formData, description: e.target.value})} rows={3} /> : <div className="text-sm">{integration?.description || '—'}</div>}</div>
|
|
177
332
|
</div>
|
|
178
333
|
</div>
|
|
179
334
|
<div className="mt-6 space-y-2"><Label>Configuration (JSON)</Label>{isEditing ? <Textarea value={formData.config} onChange={e => setFormData({...formData, config: e.target.value})} rows={8} className="font-mono text-sm" /> : <pre className="text-sm bg-muted p-3 rounded overflow-auto">{JSON.stringify(integration?.config || {}, null, 2)}</pre>}</div>
|
|
335
|
+
<div className="mt-6 space-y-2"><Label>Credentials (JSON)</Label>{isEditing ? <Textarea value={formData.credentials} onChange={e => setFormData({...formData, credentials: e.target.value})} rows={8} className="font-mono text-sm" /> : <pre className="text-sm bg-muted p-3 rounded overflow-auto">{JSON.stringify(integration?.credentials || {}, null, 2)}</pre>}</div>
|
|
180
336
|
</CardContent></Card>
|
|
181
337
|
|
|
182
338
|
<Modal isOpen={isDeleteModalOpen} onClose={() => setIsDeleteModalOpen(false)} title="Delete Integration" description="Are you sure you want to delete this integration?" size="sm">
|
|
@@ -185,3 +341,4 @@ export function IntegrationDetailPage() {
|
|
|
185
341
|
</div>
|
|
186
342
|
)
|
|
187
343
|
}
|
|
344
|
+
// CIL[END chunk_id="integrationdetailpage_function_integrationdetailpage_1783668265"]
|
|
@@ -1,18 +1,21 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @module src/pages/admin/IntegrationsPage
|
|
3
|
-
* @audience installer
|
|
4
|
-
* @layer frontend-page
|
|
5
|
-
* @stability stable
|
|
6
|
-
*
|
|
7
|
-
* Admin list page for third-party integrations (integration instances).
|
|
8
|
-
* Fetches all integration instances via `/api/integrations?action=list`,
|
|
9
|
-
* applies client-side search, status filter, and sort. Renders inside
|
|
10
|
-
* `AdminListPage`. Row clicks navigate to
|
|
11
|
-
* `/spine-framework/admin/configs/integrations/:id`.
|
|
12
|
-
*
|
|
13
|
-
* @seeAlso src/pages/admin/IntegrationDetailPage.tsx
|
|
14
|
-
*/
|
|
15
1
|
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
// CIL[BEGIN chunk_id="integrationspage_module_header_1783668265" type="module_header" identity="module_header" parent="none"]
|
|
5
|
+
// CIL[DOC-MACRO purpose="Import dependencies for IntegrationsPage component"]
|
|
6
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Import React hooks, UI components, and utilities"]
|
|
7
|
+
// CIL[DOC-CONTEXT module="IntegrationsPage" 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\",\"\\\"]"]
|
|
8
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Imported modules" errors="none" side_effects="none"]
|
|
9
|
+
// CIL[DOC-MICRO logic_summary="Imports React state management, UI components, API hooks, 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: 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, \."]
|
|
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"]
|
|
16
19
|
import { useState } from 'react'
|
|
17
20
|
import { Link, CheckCircle, AlertTriangle, Settings, Cog } from 'lucide-react';
|
|
18
21
|
import { formatDateTime } from '../../lib/utils'
|
|
@@ -20,7 +23,21 @@ import { apiFetch } from '../../lib/api'
|
|
|
20
23
|
import { AdminListPage } from '../../components/admin/AdminListPage'
|
|
21
24
|
import { SortableTableHeader } from '../../components/admin/SortableTableHeader'
|
|
22
25
|
import { useApi } from '../../hooks/useApi'
|
|
23
|
-
|
|
26
|
+
// CIL[END chunk_id="integrationspage_module_header_1783668265"]
|
|
27
|
+
// CIL[BEGIN chunk_id="integrationspage_interface_integration_1783668265" type="interface" identity="Integration" parent="none"]
|
|
28
|
+
// CIL[DOC-MACRO purpose="Define Integration data structure"]
|
|
29
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Type definition for integration objects"]
|
|
30
|
+
// CIL[DOC-CONTEXT module="IntegrationsPage" layer="types" related_files="[\".framework/functions/_shared/schema-utils.ts\",\".framework/functions/_shared/principal.ts\",\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\"\\\"]"]
|
|
31
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Integration interface type" errors="none" side_effects="none"]
|
|
32
|
+
// CIL[DOC-MICRO logic_summary="Defines complete integration structure with sync status and metadata" 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: types. Direct callers: 0. Direct calls: 0. Related files: .framework/functions/_shared/schema-utils.ts, .framework/functions/_shared/principal.ts, custom/apps/cortex/functions/custom_cil-embeddings.ts, \."]
|
|
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"]
|
|
24
41
|
interface Integration {
|
|
25
42
|
id: string
|
|
26
43
|
name: string
|
|
@@ -46,7 +63,21 @@ interface Integration {
|
|
|
46
63
|
email: string
|
|
47
64
|
}
|
|
48
65
|
}
|
|
49
|
-
|
|
66
|
+
// CIL[END chunk_id="integrationspage_interface_integration_1783668265"]
|
|
67
|
+
// CIL[BEGIN chunk_id="integrationspage_function_integrationspage_1783668265" type="function" identity="IntegrationsPage" parent="none"]
|
|
68
|
+
// CIL[DOC-MACRO purpose="Main IntegrationsPage component implementation"]
|
|
69
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Render integrations management interface with filtering, sorting, and stats"]
|
|
70
|
+
// CIL[DOC-CONTEXT module="IntegrationsPage" layer="presentation" related_files="[\".framework/src/components/ui/dialog.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\"\\\"]"]
|
|
71
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="React component" errors="API failures" side_effects="Navigation, API calls"]
|
|
72
|
+
// CIL[DOC-MICRO logic_summary="Manages state, fetches integrations, handles filtering/sorting, renders table" 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: 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, \."]
|
|
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"]
|
|
50
81
|
export function IntegrationsPage() {
|
|
51
82
|
const [searchTerm, setSearchTerm] = useState('')
|
|
52
83
|
const [selectedStatus, setSelectedStatus] = useState('all')
|
|
@@ -54,7 +85,6 @@ export function IntegrationsPage() {
|
|
|
54
85
|
const [sortKey, setSortKey] = useState('name')
|
|
55
86
|
const [sortDirection, setSortDirection] = useState<'asc' | 'desc'>('asc')
|
|
56
87
|
|
|
57
|
-
// Fetch integrations from API
|
|
58
88
|
const { data: integrations, loading, error } = useApi<Integration[]>(
|
|
59
89
|
async ({ signal }: { signal?: AbortSignal }) => {
|
|
60
90
|
const response = await apiFetch('/api/integrations?action=list', { signal })
|
|
@@ -78,7 +108,6 @@ export function IntegrationsPage() {
|
|
|
78
108
|
|
|
79
109
|
const types = Array.from(new Set((integrations || []).map(i => i.integration_type)))
|
|
80
110
|
|
|
81
|
-
// Helper functions
|
|
82
111
|
const getStatusBadge = (integration: Integration) => {
|
|
83
112
|
if (!integration.is_active) {
|
|
84
113
|
return <span className="inline-flex px-2 py-1 text-xs font-semibold rounded-full bg-slate-100 text-slate-800">Inactive</span>
|
|
@@ -105,7 +134,6 @@ export function IntegrationsPage() {
|
|
|
105
134
|
window.location.href = `/spine-framework/admin/configs/integrations/${integration.id}`
|
|
106
135
|
}
|
|
107
136
|
|
|
108
|
-
// Sort integrations
|
|
109
137
|
const sortedIntegrations = [...(filteredIntegrations || [])].sort((a, b) => {
|
|
110
138
|
let aValue: any = a[sortKey as keyof Integration]
|
|
111
139
|
let bValue: any = b[sortKey as keyof Integration]
|
|
@@ -299,3 +327,4 @@ export function IntegrationsPage() {
|
|
|
299
327
|
</AdminListPage>
|
|
300
328
|
)
|
|
301
329
|
}
|
|
330
|
+
// CIL[END chunk_id="integrationspage_function_integrationspage_1783668265"]
|
|
@@ -1,26 +1,59 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @module src/pages/admin/InvitesPage
|
|
3
|
-
* @audience installer
|
|
4
|
-
* @layer frontend-page
|
|
5
|
-
* @stability stable
|
|
6
|
-
*
|
|
7
|
-
* System-level invite management page for system_admin.
|
|
8
|
-
* Shows invites for the spine-system account scoped to system_admin role only.
|
|
9
|
-
* Rendered at /spine-framework/admin/access/invites
|
|
10
|
-
*
|
|
11
|
-
* @seeAlso src/components/shared/InviteManager.tsx
|
|
12
|
-
*/
|
|
13
1
|
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
// CIL[BEGIN chunk_id="invitespage_module_header_1783668265" type="module_header" identity="module_header" parent="none"]
|
|
5
|
+
// CIL[DOC-MACRO purpose="Import dependencies for InvitesPage component"]
|
|
6
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Import React and shared components"]
|
|
7
|
+
// CIL[DOC-CONTEXT module="InvitesPage" layer="presentation" 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\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"\\\"]"]
|
|
8
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Imported modules" errors="none" side_effects="none"]
|
|
9
|
+
// CIL[DOC-MICRO logic_summary="Imports React, InviteManager component, and auth context" 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: presentation. 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, .framework/src/pages/admin/TypeDetailPage.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"]
|
|
14
19
|
import React from 'react'
|
|
15
20
|
import { InviteManager } from '../../components/shared/InviteManager'
|
|
16
21
|
import { useAuth } from '../../contexts/AuthContext'
|
|
17
|
-
|
|
22
|
+
// CIL[END chunk_id="invitespage_module_header_1783668265"]
|
|
23
|
+
// CIL[BEGIN chunk_id="invitespage_constant_framework_roles_1783668265" type="constant" identity="FRAMEWORK_ROLES" parent="none"]
|
|
24
|
+
// CIL[DOC-MACRO purpose="Define framework admin roles"]
|
|
25
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Configure available system admin roles"]
|
|
26
|
+
// CIL[DOC-CONTEXT module="InvitesPage" layer="constants" related_files="[\".framework/src/pages/admin/RolesPage.tsx\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"\\\"]"]
|
|
27
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Role constants" errors="none" side_effects="none"]
|
|
28
|
+
// CIL[DOC-MICRO logic_summary="Defines system admin role with slug and name" notable_decisions="[]"]
|
|
29
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
30
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
31
|
+
// CIL[DOC-VECTOR type="context" content="Layer: constants. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/RolesPage.tsx, .framework/src/pages/admin/IntegrationsPage.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, \."]
|
|
32
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
33
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
34
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
35
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
36
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
18
37
|
const FRAMEWORK_ROLES = [
|
|
19
38
|
{ slug: 'system_admin', name: 'System Admin' },
|
|
20
39
|
]
|
|
21
40
|
|
|
22
41
|
const FRAMEWORK_ROLE_SLUGS = FRAMEWORK_ROLES.map(r => r.slug).join(',')
|
|
23
|
-
|
|
42
|
+
// CIL[END chunk_id="invitespage_constant_framework_roles_1783668265"]
|
|
43
|
+
// CIL[BEGIN chunk_id="invitespage_function_invitespage_1783668265" type="function" identity="InvitesPage" parent="none"]
|
|
44
|
+
// CIL[DOC-MACRO purpose="Main InvitesPage component implementation"]
|
|
45
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Render invite management interface for system admins"]
|
|
46
|
+
// CIL[DOC-CONTEXT module="InvitesPage" layer="presentation" related_files="[\".framework/src/components/ui/dialog.tsx\",\".framework/src/components/layout/Sidebar.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\"\\\"]"]
|
|
47
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="React component" errors="Auth context errors" side_effects="none"]
|
|
48
|
+
// CIL[DOC-MICRO logic_summary="Renders page header and InviteManager with framework roles" notable_decisions="[]"]
|
|
49
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
50
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
51
|
+
// CIL[DOC-VECTOR type="context" content="Layer: presentation. Direct callers: 0. Direct calls: 0. Related files: .framework/src/components/ui/dialog.tsx, .framework/src/components/layout/Sidebar.tsx, custom/apps/portal/pages/ContentPage.tsx, .framework/src/pages/admin/RolesPage.tsx, \."]
|
|
52
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
53
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
54
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
55
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
56
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
24
57
|
export function InvitesPage() {
|
|
25
58
|
const { user } = useAuth()
|
|
26
59
|
|
|
@@ -42,3 +75,4 @@ export function InvitesPage() {
|
|
|
42
75
|
</div>
|
|
43
76
|
)
|
|
44
77
|
}
|
|
78
|
+
// CIL[END chunk_id="invitespage_function_invitespage_1783668265"]
|