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,6 +1,23 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
// CIL[BEGIN chunk_id="pipelinedetailpage_module_header_1783666257" type="module_header" identity="imports" parent="none"]
|
|
7
|
+
// CIL[DOC-MACRO purpose="Import React dependencies and UI components"]
|
|
8
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Import all required modules for PipelineDetailPage component"]
|
|
9
|
+
// CIL[DOC-CONTEXT module="PipelineDetailPage" layer="ui" 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\",\"\\\"]"]
|
|
10
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="React hooks, UI components, utilities" errors="Import errors" side_effects="Module loading"]
|
|
11
|
+
// CIL[DOC-MICRO logic_summary="Imports React, router, UI components, icons, and utility functions" notable_decisions="[]"]
|
|
12
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
13
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
14
|
+
// CIL[DOC-AUDIENCE audience="developer"]
|
|
15
|
+
// CIL[DOC-VECTOR type="context" content="Layer: ui. 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, \."]
|
|
16
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
17
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
18
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
19
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
20
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
4
21
|
import { useState, useEffect } from 'react'
|
|
5
22
|
import { useParams, useNavigate } from 'react-router-dom'
|
|
6
23
|
import { apiFetch } from '../../lib/api'
|
|
@@ -16,23 +33,51 @@ import { Alert, AlertDescription, AlertTitle } from '../../components/ui/alert'
|
|
|
16
33
|
import { Badge } from '../../components/ui/badge'
|
|
17
34
|
import { ArrowLeft, Play, Pause, AlertCircle } from 'lucide-react'
|
|
18
35
|
import { formatDateTime } from '../../lib/utils'
|
|
19
|
-
|
|
36
|
+
import { PageInstructions } from '../../components/admin/PageInstructions'
|
|
37
|
+
// CIL[END chunk_id="pipelinedetailpage_module_header_1783666257"]
|
|
38
|
+
// CIL[BEGIN chunk_id="pipelinedetailpage_interface_pipeline_1783666257" type="interface" identity="Pipeline" parent="none"]
|
|
39
|
+
// CIL[DOC-MACRO purpose="Define pipeline data structure"]
|
|
40
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Type definition for pipeline entities"]
|
|
41
|
+
// CIL[DOC-CONTEXT module="PipelineDetailPage" 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="Pipeline interface" errors="Type errors" side_effects="Type system"]
|
|
43
|
+
// CIL[DOC-MICRO logic_summary="Defines structure for pipeline configuration with steps and execution data" 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"]
|
|
20
52
|
interface Pipeline {
|
|
21
53
|
id: string
|
|
22
54
|
name: string
|
|
23
55
|
description?: string
|
|
24
|
-
|
|
25
|
-
steps: Array<{ id: string; name: string; type: string; config: Record<string, any> }>
|
|
56
|
+
app_id?: string
|
|
26
57
|
trigger_type: 'manual' | 'scheduled' | 'webhook' | 'event'
|
|
27
|
-
|
|
58
|
+
stages?: Array<{ id: string; name: string; type: string; config: Record<string, any> }>
|
|
59
|
+
config?: Record<string, any>
|
|
60
|
+
metadata?: Record<string, any>
|
|
28
61
|
is_active: boolean
|
|
29
|
-
|
|
30
|
-
last_run_status?: 'success' | 'failed' | 'running'
|
|
31
|
-
run_count: number
|
|
62
|
+
is_system?: boolean
|
|
32
63
|
created_at: string
|
|
33
64
|
updated_at: string
|
|
34
65
|
}
|
|
35
|
-
|
|
66
|
+
// CIL[END chunk_id="pipelinedetailpage_interface_pipeline_1783666257"]
|
|
67
|
+
// CIL[BEGIN chunk_id="pipelinedetailpage_constants_1783666257" type="constants" identity="STATUSES" parent="none"]
|
|
68
|
+
// CIL[DOC-MACRO purpose="Define status and trigger type constants"]
|
|
69
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Configuration options for pipeline forms"]
|
|
70
|
+
// CIL[DOC-CONTEXT module="PipelineDetailPage" layer="constants" related_files="[\".framework/src/pages/admin/RolesPage.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\"\\\"]"]
|
|
71
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="status and trigger arrays" errors="none" side_effects="none"]
|
|
72
|
+
// CIL[DOC-MICRO logic_summary="Defines dropdown options for pipeline status and trigger 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/RolesPage.tsx, custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/TypeDetailPage.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"]
|
|
36
81
|
const STATUSES = [
|
|
37
82
|
{ value: 'draft', label: 'Draft' },
|
|
38
83
|
{ value: 'active', label: 'Active' },
|
|
@@ -46,7 +91,21 @@ const TRIGGER_TYPES = [
|
|
|
46
91
|
{ value: 'webhook', label: 'Webhook' },
|
|
47
92
|
{ value: 'event', label: 'Event' }
|
|
48
93
|
]
|
|
49
|
-
|
|
94
|
+
// CIL[END chunk_id="pipelinedetailpage_constants_1783666257"]
|
|
95
|
+
// CIL[BEGIN chunk_id="pipelinedetailpage_function_pipelinedetailpage_1783666257" type="function" identity="PipelineDetailPage" parent="none"]
|
|
96
|
+
// CIL[DOC-MACRO purpose="Render the complete pipeline detail interface"]
|
|
97
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Main render logic for pipeline detail page"]
|
|
98
|
+
// CIL[DOC-CONTEXT module="PipelineDetailPage" layer="ui" related_files="[\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/functions/_shared/schema-utils.ts\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/functions/_shared/principal.ts\",\"\\\"]"]
|
|
99
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="JSX structure" errors="Render errors" side_effects="DOM updates"]
|
|
100
|
+
// CIL[DOC-MICRO logic_summary="Renders loading states, error states, and pipeline form with all fields" notable_decisions="[]"]
|
|
101
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
102
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
103
|
+
// CIL[DOC-VECTOR type="context" content="Layer: ui. Direct callers: 0. Direct calls: 0. Related files: custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/functions/_shared/schema-utils.ts, custom/apps/portal/pages/ContentPage.tsx, .framework/functions/_shared/principal.ts, \."]
|
|
104
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
105
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
106
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
107
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
108
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
50
109
|
export function PipelineDetailPage() {
|
|
51
110
|
const { id } = useParams<{ id: string }>()
|
|
52
111
|
const navigate = useNavigate()
|
|
@@ -55,8 +114,31 @@ export function PipelineDetailPage() {
|
|
|
55
114
|
const [loading, setLoading] = useState(true)
|
|
56
115
|
const [error, setError] = useState<string | null>(null)
|
|
57
116
|
const [isEditing, setIsEditing] = useState(isCreateMode)
|
|
58
|
-
const [formData, setFormData] = useState({
|
|
117
|
+
const [formData, setFormData] = useState({
|
|
118
|
+
name: '',
|
|
119
|
+
description: '',
|
|
120
|
+
app_id: '',
|
|
121
|
+
trigger_type: 'manual' as const,
|
|
122
|
+
config: '{}',
|
|
123
|
+
stages: '[]',
|
|
124
|
+
metadata: '{}',
|
|
125
|
+
is_active: true
|
|
126
|
+
})
|
|
59
127
|
|
|
128
|
+
// CIL[BEGIN chunk_id="pipelinedetailpage_hooks_1783666257" type="hooks" identity="useEffect" parent="pipelinedetailpage_function_pipelinedetailpage_1783666257"]
|
|
129
|
+
// CIL[DOC-MACRO purpose="Fetch pipeline data and manage form state"]
|
|
130
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Handle useEffect"]
|
|
131
|
+
// CIL[DOC-CONTEXT module="useEffect" layer="unknown" related_files="[]"]
|
|
132
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="none" errors="none" side_effects="none"]
|
|
133
|
+
// CIL[DOC-MICRO logic_summary="Implements useEffect" notable_decisions="[]"]
|
|
134
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
135
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
136
|
+
// CIL[DOC-VECTOR type="context" content="Layer: unknown. Direct callers: 0. Direct calls: 0. Related files: none."]
|
|
137
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
138
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
139
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
140
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
141
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
60
142
|
useEffect(() => {
|
|
61
143
|
if (isCreateMode) {
|
|
62
144
|
setLoading(false)
|
|
@@ -71,8 +153,14 @@ export function PipelineDetailPage() {
|
|
|
71
153
|
const data = result.data
|
|
72
154
|
setPipeline(data)
|
|
73
155
|
setFormData({
|
|
74
|
-
name: data.name,
|
|
75
|
-
|
|
156
|
+
name: data.name,
|
|
157
|
+
description: data.description || '',
|
|
158
|
+
app_id: data.app_id || '',
|
|
159
|
+
trigger_type: data.trigger_type,
|
|
160
|
+
config: JSON.stringify(data.config || {}, null, 2),
|
|
161
|
+
stages: JSON.stringify(data.stages || [], null, 2),
|
|
162
|
+
metadata: JSON.stringify(data.metadata || {}, null, 2),
|
|
163
|
+
is_active: data.is_active ?? true
|
|
76
164
|
})
|
|
77
165
|
} catch (err) {
|
|
78
166
|
setError(err instanceof Error ? err.message : 'Failed to load pipeline')
|
|
@@ -82,12 +170,45 @@ export function PipelineDetailPage() {
|
|
|
82
170
|
}
|
|
83
171
|
fetchPipeline()
|
|
84
172
|
}, [id, isCreateMode])
|
|
173
|
+
// CIL[END chunk_id="pipelinedetailpage_hooks_1783666257"]
|
|
85
174
|
|
|
175
|
+
// CIL[BEGIN chunk_id="pipelinedetailpage_handlers_1783666257" type="event_handlers" identity="handleSave" parent="pipelinedetailpage_function_pipelinedetailpage_1783666257"]
|
|
176
|
+
// CIL[DOC-MACRO purpose="Handle form submission and pipeline status toggle"]
|
|
177
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Handle handleSave"]
|
|
178
|
+
// CIL[DOC-CONTEXT module="handleSave" layer="unknown" related_files="[]"]
|
|
179
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="none" errors="none" side_effects="none"]
|
|
180
|
+
// CIL[DOC-MICRO logic_summary="Implements handleSave" notable_decisions="[]"]
|
|
181
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
182
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
183
|
+
// CIL[DOC-VECTOR type="context" content="Layer: unknown. Direct callers: 0. Direct calls: 0. Related files: none."]
|
|
184
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
185
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
186
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
187
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
188
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
86
189
|
const handleSave = async () => {
|
|
87
190
|
try {
|
|
191
|
+
let parsedConfig = {}
|
|
192
|
+
let parsedStages: any[] = []
|
|
193
|
+
let parsedMetadata = {}
|
|
194
|
+
try { parsedConfig = JSON.parse(formData.config) } catch (error) { console.warn('Invalid JSON in config:', error) }
|
|
195
|
+
try { parsedStages = JSON.parse(formData.stages) } catch (error) { console.warn('Invalid JSON in stages:', error) }
|
|
196
|
+
try { parsedMetadata = JSON.parse(formData.metadata) } catch (error) { console.warn('Invalid JSON in metadata:', error) }
|
|
197
|
+
|
|
198
|
+
const saveData = {
|
|
199
|
+
name: formData.name,
|
|
200
|
+
description: formData.description,
|
|
201
|
+
app_id: formData.app_id || null,
|
|
202
|
+
trigger_type: formData.trigger_type,
|
|
203
|
+
is_active: formData.is_active,
|
|
204
|
+
config: parsedConfig,
|
|
205
|
+
stages: parsedStages,
|
|
206
|
+
metadata: parsedMetadata
|
|
207
|
+
}
|
|
208
|
+
|
|
88
209
|
const url = isCreateMode ? '/api/pipelines?action=create' : `/api/pipelines?action=update&id=${id}`
|
|
89
210
|
const method = isCreateMode ? 'POST' : 'PATCH'
|
|
90
|
-
const response = await apiFetch(url, { method, headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(
|
|
211
|
+
const response = await apiFetch(url, { method, headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(saveData) })
|
|
91
212
|
if (!response.ok) throw new Error('Failed to save')
|
|
92
213
|
if (isCreateMode) {
|
|
93
214
|
const result = await response.json()
|
|
@@ -100,16 +221,31 @@ export function PipelineDetailPage() {
|
|
|
100
221
|
|
|
101
222
|
const toggleStatus = async () => {
|
|
102
223
|
if (!pipeline) return
|
|
103
|
-
const
|
|
224
|
+
const newActive = !pipeline.is_active
|
|
104
225
|
try {
|
|
105
|
-
const response = await apiFetch(`/api/pipelines?action=update&id=${id}`, { method: 'PATCH', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({
|
|
226
|
+
const response = await apiFetch(`/api/pipelines?action=update&id=${id}`, { method: 'PATCH', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ is_active: newActive }) })
|
|
106
227
|
if (!response.ok) throw new Error('Failed to update status')
|
|
107
|
-
setPipeline({ ...pipeline,
|
|
228
|
+
setPipeline({ ...pipeline, is_active: newActive })
|
|
108
229
|
} catch (err) {
|
|
109
230
|
setError(err instanceof Error ? err.message : 'Failed to update status')
|
|
110
231
|
}
|
|
111
232
|
}
|
|
233
|
+
// CIL[END chunk_id="pipelinedetailpage_handlers_1783666257"]
|
|
112
234
|
|
|
235
|
+
// CIL[BEGIN chunk_id="pipelinedetailpage_render_1783666257" type="render_logic" identity="return" parent="pipelinedetailpage_function_pipelinedetailpage_1783666257"]
|
|
236
|
+
// CIL[DOC-MACRO purpose="Render the complete pipeline detail interface"]
|
|
237
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Handle return"]
|
|
238
|
+
// CIL[DOC-CONTEXT module="return" layer="unknown" related_files="[]"]
|
|
239
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="none" errors="none" side_effects="none"]
|
|
240
|
+
// CIL[DOC-MICRO logic_summary="Implements return" notable_decisions="[]"]
|
|
241
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
242
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
243
|
+
// CIL[DOC-VECTOR type="context" content="Layer: unknown. Direct callers: 0. Direct calls: 0. Related files: none."]
|
|
244
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
245
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
246
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
247
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
248
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
113
249
|
if (loading) return (
|
|
114
250
|
<div className="space-y-6">
|
|
115
251
|
<Skeleton className="h-8 w-48" />
|
|
@@ -128,12 +264,12 @@ export function PipelineDetailPage() {
|
|
|
128
264
|
<Button variant="ghost" onClick={() => isCreateMode ? navigate('/spine-framework/admin/configs/pipelines') : navigate(-1)}><ArrowLeft className="h-5 w-5" /></Button>
|
|
129
265
|
<div>
|
|
130
266
|
<h1 className="text-2xl font-bold">{isCreateMode ? 'Create Pipeline' : pipeline?.name}</h1>
|
|
131
|
-
{pipeline && <Badge variant={pipeline.
|
|
267
|
+
{pipeline && <Badge variant={pipeline.is_active ? 'default' : 'secondary'}>{pipeline.is_active ? 'Active' : 'Inactive'}</Badge>}
|
|
132
268
|
</div>
|
|
133
269
|
</div>
|
|
134
270
|
<div className="flex gap-2">
|
|
135
|
-
{!isCreateMode &&
|
|
136
|
-
<Button variant="outline" onClick={toggleStatus}>{pipeline?.
|
|
271
|
+
{!isCreateMode && (
|
|
272
|
+
<Button variant="outline" onClick={toggleStatus}>{pipeline?.is_active ? <><Pause className="h-4 w-4 mr-2" />Pause</> : <><Play className="h-4 w-4 mr-2" />Activate</>}</Button>
|
|
137
273
|
)}
|
|
138
274
|
{isEditing ? (
|
|
139
275
|
<><Button variant="outline" onClick={() => isCreateMode ? navigate(-1) : setIsEditing(false)}>Cancel</Button><Button onClick={handleSave}>{isCreateMode ? 'Create' : 'Save'}</Button></>
|
|
@@ -141,38 +277,72 @@ export function PipelineDetailPage() {
|
|
|
141
277
|
</div>
|
|
142
278
|
</div>
|
|
143
279
|
|
|
144
|
-
<
|
|
280
|
+
<PageInstructions
|
|
281
|
+
description="Configure a pipeline with trigger type, JSON stages, config, and metadata."
|
|
282
|
+
sections={[
|
|
283
|
+
{ title: 'What this pipeline controls', content: 'A pipeline is a multi-step workflow that can be triggered manually, on a schedule, by a webhook, or by an event. This page controls the pipeline metadata, trigger type, and the JSON stages/config that the runner executes.' },
|
|
284
|
+
{ title: 'Fields explained', content: <ul className="list-disc pl-4 space-y-1">
|
|
285
|
+
<li><strong>Name</strong> — string. The display name. Missing name prevents saving.</li>
|
|
286
|
+
<li><strong>Trigger Type</strong> — select. manual, scheduled, webhook, or event. Determines what causes a run.</li>
|
|
287
|
+
<li><strong>Active</strong> — checkbox. Inactive pipelines will not run regardless of trigger.</li>
|
|
288
|
+
<li><strong>App ID</strong> — string. Optional owning app UUID. Leave blank to make it account-scoped.</li>
|
|
289
|
+
<li><strong>Description</strong> — string. Optional human-readable notes.</li>
|
|
290
|
+
<li><strong>Config (JSON)</strong> — JSON. Free-form runtime configuration for the pipeline.</li>
|
|
291
|
+
<li><strong>Stages (JSON)</strong> — JSON. Required array of step definitions the runner executes.</li>
|
|
292
|
+
<li><strong>Metadata (JSON)</strong> — JSON. Optional metadata about the pipeline.</li>
|
|
293
|
+
</ul> },
|
|
294
|
+
{ title: 'Options and values', content: <ul className="list-disc pl-4 space-y-1">
|
|
295
|
+
<li><strong>Trigger Type</strong>: <em>manual</em> run by button; <em>scheduled</em> is invoked by a timer; <em>webhook</em> waits for an HTTP call; <em>event</em> waits for a Spine trigger event.</li>
|
|
296
|
+
</ul> },
|
|
297
|
+
{ title: 'Downstream impact', content: <ul className="list-disc pl-4 space-y-1">
|
|
298
|
+
<li>The runner uses the stages array to execute steps in order.</li>
|
|
299
|
+
<li>Triggers and timers reference pipelines by ID; changing the trigger type may require re-linking triggers or timers.</li>
|
|
300
|
+
</ul> },
|
|
301
|
+
{ title: 'How to create, save, and validate', content: <ol className="list-decimal pl-4 space-y-1">
|
|
302
|
+
<li>In create mode, enter a name and choose a trigger type. Fill in the Stages JSON array.</li>
|
|
303
|
+
<li>Paste valid JSON into the Config and Metadata textareas. Invalid JSON will be ignored on save.</li>
|
|
304
|
+
<li>Click Create to save, or Edit then Save for existing pipelines. Use the Activate/Pause button to toggle is_active.</li>
|
|
305
|
+
</ol> },
|
|
306
|
+
{ title: 'Common mistakes', content: <ul className="list-disc pl-4 space-y-1">
|
|
307
|
+
<li>Setting trigger type to scheduled but not linking a timer.</li>
|
|
308
|
+
<li>Pasting a non-array value into Stages (it must be a JSON array).</li>
|
|
309
|
+
<li>Expecting to edit step order here; the JSON stages field is the source of truth.</li>
|
|
310
|
+
</ul> },
|
|
311
|
+
]}
|
|
312
|
+
/>
|
|
313
|
+
|
|
314
|
+
<Card><CardContent className="p-6 space-y-6">
|
|
145
315
|
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
|
|
146
316
|
<div className="space-y-4">
|
|
147
317
|
<h3 className="text-sm font-medium text-muted-foreground">Configuration</h3>
|
|
148
318
|
<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">{pipeline?.name}</div>}</div>
|
|
149
|
-
<div className="space-y-2"><Label>
|
|
319
|
+
<div className="space-y-2"><Label>App ID</Label>{isEditing ? <Input value={formData.app_id} onChange={e => setFormData({...formData, app_id: e.target.value})} placeholder="Optional app UUID" /> : <div className="text-sm font-mono">{pipeline?.app_id || '—'}</div>}</div>
|
|
150
320
|
<div className="space-y-2"><Label>Trigger Type</Label>{isEditing ? <Select value={formData.trigger_type} onValueChange={v => setFormData({...formData, trigger_type: v as any})}><SelectTrigger><SelectValue /></SelectTrigger><SelectContent>{TRIGGER_TYPES.map(t => <SelectItem key={t.value} value={t.value}>{t.label}</SelectItem>)}</SelectContent></Select> : <div className="text-sm">{pipeline?.trigger_type}</div>}</div>
|
|
151
|
-
{formData.trigger_type === 'scheduled' && <div className="space-y-2"><Label>Schedule (cron)</Label>{isEditing ? <Input value={formData.schedule} onChange={e => setFormData({...formData, schedule: e.target.value})} placeholder="0 0 * * *" /> : <div className="text-sm font-mono">{pipeline?.schedule || '—'}</div>}</div>}
|
|
152
321
|
<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">{pipeline?.is_active ? 'Yes' : 'No'}</div>}</div>
|
|
153
322
|
</div>
|
|
154
323
|
<div className="space-y-4">
|
|
155
324
|
<h3 className="text-sm font-medium text-muted-foreground">Execution Info</h3>
|
|
156
325
|
{!isCreateMode && (
|
|
157
326
|
<>
|
|
158
|
-
<div className="flex justify-between"><span className="text-sm text-muted-foreground">
|
|
159
|
-
<div className="flex justify-between"><span className="text-sm text-muted-foreground">
|
|
160
|
-
<div className="flex justify-between"><span className="text-sm text-muted-foreground">Total Runs</span><span className="text-sm">{pipeline?.run_count || 0}</span></div>
|
|
161
|
-
<div className="flex justify-between"><span className="text-sm text-muted-foreground">Steps</span><span className="text-sm">{pipeline?.steps?.length || 0}</span></div>
|
|
327
|
+
<div className="flex justify-between"><span className="text-sm text-muted-foreground">Active</span><Badge variant={pipeline?.is_active ? 'default' : 'secondary'}>{pipeline?.is_active ? 'Active' : 'Inactive'}</Badge></div>
|
|
328
|
+
<div className="flex justify-between"><span className="text-sm text-muted-foreground">Stages</span><span className="text-sm">{pipeline?.stages?.length || 0}</span></div>
|
|
162
329
|
</>
|
|
163
330
|
)}
|
|
164
331
|
</div>
|
|
165
332
|
</div>
|
|
166
333
|
<div className="mt-6 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">{pipeline?.description || '—'}</div>}</div>
|
|
334
|
+
<div className="space-y-2"><Label>Config (JSON)</Label>{isEditing ? <Textarea value={formData.config} onChange={e => setFormData({...formData, config: e.target.value})} className="font-mono text-sm" rows={4} placeholder="{}" /> : <pre className="text-xs bg-muted p-3 rounded border overflow-auto max-h-48">{JSON.stringify(pipeline?.config || {}, null, 2)}</pre>}</div>
|
|
335
|
+
<div className="space-y-2"><Label>Stages (JSON)</Label>{isEditing ? <Textarea value={formData.stages} onChange={e => setFormData({...formData, stages: e.target.value})} className="font-mono text-sm" rows={6} placeholder="[]" /> : <pre className="text-xs bg-muted p-3 rounded border overflow-auto max-h-48">{JSON.stringify(pipeline?.stages || [], null, 2)}</pre>}</div>
|
|
336
|
+
<div className="space-y-2"><Label>Metadata (JSON)</Label>{isEditing ? <Textarea value={formData.metadata} onChange={e => setFormData({...formData, metadata: e.target.value})} className="font-mono text-sm" rows={4} placeholder="{}" /> : <pre className="text-xs bg-muted p-3 rounded border overflow-auto max-h-48">{JSON.stringify(pipeline?.metadata || {}, null, 2)}</pre>}</div>
|
|
167
337
|
</CardContent></Card>
|
|
168
338
|
|
|
169
|
-
{!isCreateMode && pipeline?.
|
|
170
|
-
<Card><CardHeader><CardTitle>
|
|
339
|
+
{!isCreateMode && pipeline?.stages && (
|
|
340
|
+
<Card><CardHeader><CardTitle>Stages ({pipeline.stages.length})</CardTitle></CardHeader><CardContent>
|
|
171
341
|
<div className="space-y-2">
|
|
172
|
-
{pipeline.
|
|
173
|
-
<div key={
|
|
342
|
+
{pipeline.stages.map((stage, idx) => (
|
|
343
|
+
<div key={stage.id || idx} className="flex items-center gap-4 p-3 bg-muted rounded">
|
|
174
344
|
<div className="flex h-8 w-8 items-center justify-center rounded-full bg-primary text-primary-foreground text-sm font-medium">{idx + 1}</div>
|
|
175
|
-
<div className="flex-1"><div className="font-medium">{
|
|
345
|
+
<div className="flex-1"><div className="font-medium">{stage.name}</div><div className="text-sm text-muted-foreground">{stage.type}</div></div>
|
|
176
346
|
</div>
|
|
177
347
|
))}
|
|
178
348
|
</div>
|
|
@@ -181,3 +351,5 @@ export function PipelineDetailPage() {
|
|
|
181
351
|
</div>
|
|
182
352
|
)
|
|
183
353
|
}
|
|
354
|
+
// CIL[END chunk_id="pipelinedetailpage_render_1783666257"]
|
|
355
|
+
// CIL[END chunk_id="pipelinedetailpage_function_pipelinedetailpage_1783666257"]
|
|
@@ -1,19 +1,23 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @module src/pages/admin/PipelineExecutionsPage
|
|
3
|
-
* @audience installer
|
|
4
|
-
* @layer frontend-page
|
|
5
|
-
* @stability stable
|
|
6
|
-
*
|
|
7
|
-
* Read-only log of pipeline execution history. Fetches execution records
|
|
8
|
-
* via `/api/pipelines?action=executions`, applies client-side search,
|
|
9
|
-
* status filter (`running` | `success` | `failed` | `cancelled`), and
|
|
10
|
-
* sort. Renders inside `AdminListPage` with a sortable table showing
|
|
11
|
-
* pipeline name, status, duration, and timestamps.
|
|
12
|
-
*
|
|
13
|
-
* @seeAlso src/pages/admin/PipelinesPage.tsx
|
|
14
|
-
* @seeAlso src/pages/admin/ObservabilityDashboard.tsx
|
|
15
|
-
*/
|
|
16
1
|
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
// CIL[BEGIN chunk_id="pipelineexecutionspage_module_header_1783666257" type="module_header" identity="imports" parent="none"]
|
|
7
|
+
// CIL[DOC-MACRO purpose="Import React dependencies and UI components"]
|
|
8
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Import all required modules for PipelineExecutionsPage component"]
|
|
9
|
+
// CIL[DOC-CONTEXT module="PipelineExecutionsPage" layer="ui" 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\",\"\\\"]"]
|
|
10
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="React hooks, UI components, utilities" errors="Import errors" side_effects="Module loading"]
|
|
11
|
+
// CIL[DOC-MICRO logic_summary="Imports React, icons, UI components, and utility functions" notable_decisions="[]"]
|
|
12
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
13
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
14
|
+
// CIL[DOC-AUDIENCE audience="developer"]
|
|
15
|
+
// CIL[DOC-VECTOR type="context" content="Layer: ui. 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, \."]
|
|
16
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
17
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
18
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
19
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
20
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
17
21
|
import React, { useState } from 'react'
|
|
18
22
|
import { Play, CheckCircle, XCircle, Clock, RefreshCw, Zap } from 'lucide-react';
|
|
19
23
|
import { LoadingSpinner } from '../../components/ui/LoadingSpinner'
|
|
@@ -23,7 +27,21 @@ import { SortableTableHeader } from '../../components/admin/SortableTableHeader'
|
|
|
23
27
|
import { formatDateTime } from '../../lib/utils'
|
|
24
28
|
import { useApi } from '../../hooks/useApi'
|
|
25
29
|
import { apiFetch } from '../../lib/api'
|
|
26
|
-
|
|
30
|
+
// CIL[END chunk_id="pipelineexecutionspage_module_header_1783666257"]
|
|
31
|
+
// CIL[BEGIN chunk_id="pipelineexecutionspage_interface_pipelineexecution_1783666257" type="interface" identity="PipelineExecution" parent="none"]
|
|
32
|
+
// CIL[DOC-MACRO purpose="Define pipeline execution data structure"]
|
|
33
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Type definition for pipeline execution records"]
|
|
34
|
+
// CIL[DOC-CONTEXT module="PipelineExecutionsPage" 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\",\"\\\"]"]
|
|
35
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="PipelineExecution interface" errors="Type errors" side_effects="Type system"]
|
|
36
|
+
// CIL[DOC-MICRO logic_summary="Defines structure for pipeline execution tracking with status and metadata" notable_decisions="[]"]
|
|
37
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
38
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
39
|
+
// 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, \."]
|
|
40
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
41
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
42
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
43
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
44
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
27
45
|
interface PipelineExecution {
|
|
28
46
|
id: string
|
|
29
47
|
pipeline_id: string
|
|
@@ -47,7 +65,21 @@ interface PipelineExecution {
|
|
|
47
65
|
}
|
|
48
66
|
created_at: string
|
|
49
67
|
}
|
|
50
|
-
|
|
68
|
+
// CIL[END chunk_id="pipelineexecutionspage_interface_pipelineexecution_1783666257"]
|
|
69
|
+
// CIL[BEGIN chunk_id="pipelineexecutionspage_function_pipelineexecutionspage_1783666257" type="function" identity="PipelineExecutionsPage" parent="none"]
|
|
70
|
+
// CIL[DOC-MACRO purpose="Main PipelineExecutionsPage component function"]
|
|
71
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Render pipeline execution monitoring interface"]
|
|
72
|
+
// CIL[DOC-CONTEXT module="PipelineExecutionsPage" layer="ui" related_files="[\".framework/src/components/ui/dialog.tsx\",\".framework/src/components/ui/table-primitives.tsx\",\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\"custom/apps/portal/pages/ContentPage.tsx\",\"\\\"]"]
|
|
73
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="JSX element" errors="Render errors" side_effects="API calls, navigation"]
|
|
74
|
+
// CIL[DOC-MICRO logic_summary="Main component that displays pipeline executions with filtering and sorting" 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: ui. Direct callers: 0. Direct calls: 0. Related files: .framework/src/components/ui/dialog.tsx, .framework/src/components/ui/table-primitives.tsx, custom/apps/cortex/functions/custom_cil-embeddings.ts, custom/apps/portal/pages/ContentPage.tsx, \."]
|
|
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"]
|
|
51
83
|
export function PipelineExecutionsPage() {
|
|
52
84
|
const [searchTerm, setSearchTerm] = useState('')
|
|
53
85
|
const [selectedStatus, setSelectedStatus] = useState('all')
|
|
@@ -277,3 +309,4 @@ export function PipelineExecutionsPage() {
|
|
|
277
309
|
</AdminListPage>
|
|
278
310
|
)
|
|
279
311
|
}
|
|
312
|
+
// CIL[END chunk_id="pipelineexecutionspage_function_pipelineexecutionspage_1783666257"]
|