spine-framework 0.4.3 → 0.5.0-rc.4
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/.env.example +13 -3
- package/.framework/cli/commands/bootstrap.ts +392 -0
- package/.framework/cli/commands/dev.ts +91 -218
- package/.framework/cli/commands/doctor.ts +132 -26
- package/.framework/cli/commands/generate.ts +38 -298
- package/.framework/cli/commands/init.ts +20 -1
- package/.framework/cli/commands/migrate.ts +36 -30
- package/.framework/cli/commands/migrations.ts +16 -56
- package/.framework/cli/commands/upgrade.ts +35 -0
- package/.framework/cli/commands/validate-schema.ts +147 -0
- package/.framework/cli/context.ts +223 -110
- package/.framework/cli/index.ts +6 -0
- package/.framework/cli/lib/project-files.ts +241 -1
- package/.framework/functions/_shared/agent-runner.ts +1000 -81
- package/.framework/functions/_shared/cil.ts +2 -1
- package/.framework/functions/_shared/db.ts +3 -6
- package/.framework/functions/_shared/hash-api-key.ts +183 -79
- package/.framework/functions/_shared/kb.ts +61 -7
- package/.framework/functions/_shared/logging.ts +562 -224
- package/.framework/functions/_shared/message-sequence.ts +53 -0
- package/.framework/functions/_shared/middleware.ts +47 -44
- package/.framework/functions/_shared/pipeline-runner.ts +150 -37
- package/.framework/functions/_shared/principal.ts +9 -6
- package/.framework/functions/_shared/trigger-engine.ts +149 -40
- package/.framework/functions/admin-data.ts +48 -31
- package/.framework/functions/ai-agents.ts +103 -33
- package/.framework/functions/api-keys.ts +301 -122
- package/.framework/functions/apps.ts +43 -26
- package/.framework/functions/cil-ingest.ts +48 -15
- package/.framework/functions/debug-auth.ts +14 -8
- package/.framework/functions/deliveries.ts +39 -12
- package/.framework/functions/embeddings.ts +145 -76
- package/.framework/functions/integration-outbound.ts +67 -27
- package/.framework/functions/integrations.ts +254 -127
- package/.framework/functions/logs.ts +273 -133
- package/.framework/functions/observability.ts +277 -147
- package/.framework/functions/pipeline-executions.ts +1 -1
- package/.framework/functions/pipeline-runner-background.ts +120 -0
- package/.framework/functions/pipelines.ts +14 -9
- package/.framework/functions/prompt-configs.ts +7 -4
- package/.framework/functions/roles.ts +8 -5
- package/.framework/functions/security.ts +30 -17
- package/.framework/functions/system-cron.ts +250 -128
- package/.framework/functions/tests.ts +7 -6
- package/.framework/functions/timers.ts +310 -107
- package/.framework/functions/trigger-scheduler.ts +65 -5
- package/.framework/functions/triggers.ts +28 -13
- package/.framework/functions/types.ts +13 -10
- package/.framework/migrations/064_episode_leases.sql +196 -0
- package/.framework/migrations/065_execution_tables_updated_at.sql +20 -0
- package/.framework/migrations/066_episode_steal_thread_merge.sql +148 -0
- package/.framework/migrations/067_episode_lease_stale_steal.sql +93 -0
- package/.framework/migrations/068_cron_schedule_timer_rpcs.sql +251 -0
- package/.framework/migrations/069_log_stats_window.sql +54 -0
- package/.framework/migrations/070_app_type_schema_rpcs.sql +166 -0
- package/.framework/migrations/071_timer_interval_keys.sql +96 -0
- package/.framework/migrations/072_slug_autofill.sql +77 -0
- package/.framework/migrations/073_seed_member_roles.sql +26 -0
- package/.framework/schemas/spine.config.schema.json +62 -0
- package/.framework/src/App.tsx +3 -1
- package/.framework/src/apps/admin/index.tsx +1141 -775
- package/.framework/src/components/ErrorBoundary.tsx +136 -0
- package/.framework/src/components/admin/AdminListPage.tsx +81 -73
- package/.framework/src/components/admin/AdminSidebar.tsx +92 -81
- package/.framework/src/components/admin/EntitySelect.tsx +181 -0
- package/.framework/src/components/admin/PageInstructions.tsx +86 -127
- package/.framework/src/components/app-shell/GenericAppShell.tsx +3 -1
- package/.framework/src/components/app-shell/GenericDetailPage.tsx +37 -13
- package/.framework/src/components/app-shell/GenericListPage.tsx +28 -32
- package/.framework/src/components/auth/TurnstileWidget.tsx +9 -6
- package/.framework/src/components/kb/KBArticleEditor.tsx +49 -6
- package/.framework/src/components/layout/Layout.tsx +4 -2
- package/.framework/src/components/layout/Sidebar.tsx +304 -179
- package/.framework/src/components/runtime/DataDetailPage.tsx +67 -35
- package/.framework/src/components/runtime/DataHeader.tsx +96 -48
- package/.framework/src/components/runtime/DataListPage.tsx +3 -26
- package/.framework/src/components/runtime/DataStats.tsx +10 -10
- package/.framework/src/components/runtime/DataTable.tsx +12 -10
- package/.framework/src/components/ui/sheet.tsx +24 -26
- package/.framework/src/components/ui/textarea.tsx +74 -48
- package/.framework/src/hooks/useBranding.ts +47 -0
- package/.framework/src/hooks/useEntityList.ts +12 -9
- package/.framework/src/hooks/useListSchema.ts +108 -58
- package/.framework/src/instructions/README.md +57 -0
- package/.framework/src/instructions/ai-agents.md +69 -0
- package/.framework/src/instructions/alerts.md +80 -0
- package/.framework/src/instructions/api-keys.md +87 -0
- package/.framework/src/instructions/apps.md +77 -0
- package/.framework/src/instructions/concepts/ai-and-prompts.md +150 -0
- package/.framework/src/instructions/concepts/apps-and-renderers.md +162 -0
- package/.framework/src/instructions/concepts/auth-and-api-keys.md +133 -0
- package/.framework/src/instructions/concepts/automation.md +186 -0
- package/.framework/src/instructions/concepts/concurrency-and-idempotency.md +125 -0
- package/.framework/src/instructions/concepts/core-vs-custom.md +124 -0
- package/.framework/src/instructions/concepts/design-schema.md +152 -0
- package/.framework/src/instructions/concepts/integrations-and-webhooks.md +127 -0
- package/.framework/src/instructions/concepts/observability.md +116 -0
- package/.framework/src/instructions/concepts/permissions.md +150 -0
- package/.framework/src/instructions/concepts/runtime-records.md +111 -0
- package/.framework/src/instructions/concepts/scope-and-accounts.md +112 -0
- package/.framework/src/instructions/concepts/spine-way.md +172 -0
- package/.framework/src/instructions/deliveries.md +59 -0
- package/.framework/src/instructions/guide/00-orientation.md +106 -0
- package/.framework/src/instructions/guide/01-install-and-first-run.md +253 -0
- package/.framework/src/instructions/guide/02-project-map.md +147 -0
- package/.framework/src/instructions/guide/03-domain-model.md +223 -0
- package/.framework/src/instructions/guide/04-first-app.md +227 -0
- package/.framework/src/instructions/guide/05-glossary.md +183 -0
- package/.framework/src/instructions/integrations.md +96 -0
- package/.framework/src/instructions/internal/cil-markers.md +83 -0
- package/.framework/src/instructions/invites.md +60 -0
- package/.framework/src/instructions/kb.md +80 -0
- package/.framework/src/instructions/logs.md +77 -0
- package/.framework/src/instructions/observability.md +61 -0
- package/.framework/src/instructions/operations/deployment.md +115 -0
- package/.framework/src/instructions/operations/migrations.md +125 -0
- package/.framework/src/instructions/operations/security-checklist.md +148 -0
- package/.framework/src/instructions/operations/troubleshooting.md +170 -0
- package/.framework/src/instructions/operations/upgrade.md +116 -0
- package/.framework/src/instructions/pipeline-executions.md +62 -0
- package/.framework/src/instructions/pipelines.md +78 -0
- package/.framework/src/instructions/prompts.md +95 -0
- package/.framework/src/instructions/reference/api/admin-data.md +162 -0
- package/.framework/src/instructions/reference/api/auth.md +113 -0
- package/.framework/src/instructions/reference/api/errors-and-envelopes.md +113 -0
- package/.framework/src/instructions/reference/app-manifest.md +150 -0
- package/.framework/src/instructions/reference/cli.md +124 -0
- package/.framework/src/instructions/reference/database.md +132 -0
- package/.framework/src/instructions/reference/design-schema.md +280 -0
- package/.framework/src/instructions/reference/env-vars.md +133 -0
- package/.framework/src/instructions/reference/functions/account-nodes.md +75 -0
- package/.framework/src/instructions/reference/functions/admin-data.md +195 -0
- package/.framework/src/instructions/reference/functions/admin-funnel.md +90 -0
- package/.framework/src/instructions/reference/functions/admin-install-funnel.md +107 -0
- package/.framework/src/instructions/reference/functions/admin-signals.md +102 -0
- package/.framework/src/instructions/reference/functions/ai-agents.md +148 -0
- package/.framework/src/instructions/reference/functions/ai-interactions.md +156 -0
- package/.framework/src/instructions/reference/functions/api-keys.md +130 -0
- package/.framework/src/instructions/reference/functions/apps.md +140 -0
- package/.framework/src/instructions/reference/functions/auth.md +99 -0
- package/.framework/src/instructions/reference/functions/debug-auth.md +91 -0
- package/.framework/src/instructions/reference/functions/deliveries.md +110 -0
- package/.framework/src/instructions/reference/functions/embeddings.md +166 -0
- package/.framework/src/instructions/reference/functions/eval-harness.md +149 -0
- package/.framework/src/instructions/reference/functions/index.md +103 -0
- package/.framework/src/instructions/reference/functions/integration-outbound.md +200 -0
- package/.framework/src/instructions/reference/functions/integration-routes.md +151 -0
- package/.framework/src/instructions/reference/functions/integrations.md +130 -0
- package/.framework/src/instructions/reference/functions/invites.md +182 -0
- package/.framework/src/instructions/reference/functions/item-progress.md +107 -0
- package/.framework/src/instructions/reference/functions/kb.md +166 -0
- package/.framework/src/instructions/reference/functions/logs.md +141 -0
- package/.framework/src/instructions/reference/functions/observability.md +105 -0
- package/.framework/src/instructions/reference/functions/pipeline-executions.md +132 -0
- package/.framework/src/instructions/reference/functions/pipeline-runner-background.md +121 -0
- package/.framework/src/instructions/reference/functions/pipelines.md +136 -0
- package/.framework/src/instructions/reference/functions/prompt-configs.md +121 -0
- package/.framework/src/instructions/reference/functions/roles.md +121 -0
- package/.framework/src/instructions/reference/functions/security.md +140 -0
- package/.framework/src/instructions/reference/functions/system-cron.md +136 -0
- package/.framework/src/instructions/reference/functions/system.md +106 -0
- package/.framework/src/instructions/reference/functions/tests.md +97 -0
- package/.framework/src/instructions/reference/functions/timers.md +117 -0
- package/.framework/src/instructions/reference/functions/trigger-scheduler.md +102 -0
- package/.framework/src/instructions/reference/functions/triggers.md +140 -0
- package/.framework/src/instructions/reference/functions/types.md +146 -0
- package/.framework/src/instructions/reference/seeds.md +126 -0
- package/.framework/src/instructions/reference/shared-modules.md +127 -0
- package/.framework/src/instructions/reference/spine-config.md +114 -0
- package/.framework/src/instructions/roles.md +80 -0
- package/.framework/src/instructions/runtime-detail.md +70 -0
- package/.framework/src/instructions/runtime-list.md +77 -0
- package/.framework/src/instructions/security.md +67 -0
- package/.framework/src/instructions/tasks/add-a-pipeline.md +110 -0
- package/.framework/src/instructions/tasks/add-a-role.md +96 -0
- package/.framework/src/instructions/tasks/add-a-timer.md +114 -0
- package/.framework/src/instructions/tasks/add-a-trigger.md +106 -0
- package/.framework/src/instructions/tasks/add-a-type.md +151 -0
- package/.framework/src/instructions/tasks/add-a-webhook.md +108 -0
- package/.framework/src/instructions/tasks/add-an-ai-agent.md +108 -0
- package/.framework/src/instructions/tasks/add-an-integration.md +124 -0
- package/.framework/src/instructions/tasks/build-a-custom-page.md +118 -0
- package/.framework/src/instructions/tasks/package-and-install-an-app.md +127 -0
- package/.framework/src/instructions/tasks/test-your-code.md +108 -0
- package/.framework/src/instructions/tasks/write-a-function.md +132 -0
- package/.framework/src/instructions/tasks/write-a-migration.md +110 -0
- package/.framework/src/instructions/testing.md +59 -0
- package/.framework/src/instructions/timers.md +82 -0
- package/.framework/src/instructions/triggers.md +69 -0
- package/.framework/src/instructions/types.md +93 -0
- package/.framework/src/lib/branding.ts +128 -0
- package/.framework/src/pages/NoAppPage.tsx +3 -1
- package/.framework/src/pages/NotFoundPage.tsx +62 -31
- package/.framework/src/pages/SetupPage.tsx +5 -2
- package/.framework/src/pages/admin/AIAgentDetailPage.tsx +117 -106
- package/.framework/src/pages/admin/AIAgentsPage.tsx +86 -48
- package/.framework/src/pages/admin/APIKeyDetailPage.tsx +153 -152
- package/.framework/src/pages/admin/APIKeysPage.tsx +91 -90
- package/.framework/src/pages/admin/AlertsConfigPage.tsx +29 -18
- package/.framework/src/pages/admin/AppDetailPage.tsx +6 -60
- package/.framework/src/pages/admin/AppsPage.tsx +104 -66
- package/.framework/src/pages/admin/DeliveriesPage.tsx +5 -5
- package/.framework/src/pages/admin/EmbeddingDetailPage.tsx +5 -23
- package/.framework/src/pages/admin/EmbeddingsPage.tsx +5 -26
- package/.framework/src/pages/admin/IntegrationDetailPage.tsx +7 -7
- package/.framework/src/pages/admin/IntegrationsPage.tsx +85 -43
- package/.framework/src/pages/admin/LogsPage.tsx +144 -76
- package/.framework/src/pages/admin/ObservabilityDashboard.tsx +223 -140
- package/.framework/src/pages/admin/PipelineDetailPage.tsx +134 -113
- package/.framework/src/pages/admin/PipelineExecutionsPage.tsx +108 -45
- package/.framework/src/pages/admin/PipelinesPage.tsx +160 -115
- package/.framework/src/pages/admin/PromptConfigDetailPage.tsx +96 -98
- package/.framework/src/pages/admin/PromptConfigsPage.tsx +101 -59
- package/.framework/src/pages/admin/RoleDetailPage.tsx +90 -79
- package/.framework/src/pages/admin/RolesPage.tsx +86 -43
- package/.framework/src/pages/admin/SecurityPage.tsx +1 -1
- package/.framework/src/pages/admin/TestingDashboard.tsx +16 -28
- package/.framework/src/pages/admin/TimerDetailPage.tsx +117 -100
- package/.framework/src/pages/admin/TimersPage.tsx +90 -62
- package/.framework/src/pages/admin/TriggerDetailPage.tsx +90 -83
- package/.framework/src/pages/admin/TriggersPage.tsx +124 -99
- package/.framework/src/pages/admin/TypeDetailPage.tsx +152 -138
- package/.framework/src/pages/admin/TypesPage.tsx +90 -48
- package/.framework/src/pages/admin/cil/CILAgentPage.tsx +17 -25
- package/.framework/src/pages/admin/cil/CILChunkDetailPage.tsx +17 -27
- package/.framework/src/pages/admin/cil/CILDashboardPage.tsx +72 -40
- package/.framework/src/pages/admin/cil/CILFileListPage.tsx +321 -129
- package/.framework/src/pages/admin/cil/CILFileSelectPage.tsx +18 -29
- package/.framework/src/pages/admin/cil/CILGraphPage.tsx +26 -38
- package/.framework/src/pages/admin/cil/CILIngestionPage.tsx +34 -46
- package/.framework/src/pages/admin/cil/CILProjectsPage.tsx +189 -103
- package/.framework/src/pages/admin/cil/CILSearchPage.tsx +246 -136
- package/.framework/src/pages/admin/cil/CILSuggestionsPage.tsx +11 -22
- package/.framework/src/pages/admin/cil/CILVersionsPage.tsx +9 -20
- package/.framework/src/pages/admin/cil/FlexiblePipelinePage.tsx +26 -38
- package/.framework/src/pages/admin/kb/KBAdminPage.tsx +7 -26
- package/.framework/src/pages/auth/AuthConfirmPage.tsx +3 -1
- package/.framework/src/pages/auth/ForgotPasswordPage.tsx +3 -1
- package/.framework/src/pages/auth/LoginPage.tsx +4 -2
- package/.framework/src/pages/auth/RegisterPage.tsx +3 -1
- package/.framework/templates/agent/AGENTS.md +150 -0
- package/.framework/templates/agent/skills/spine-add-ai-agent/SKILL.md +58 -0
- package/.framework/templates/agent/skills/spine-add-automation/SKILL.md +62 -0
- package/.framework/templates/agent/skills/spine-add-integration/SKILL.md +63 -0
- package/.framework/templates/agent/skills/spine-architect/SKILL.md +86 -0
- package/.framework/templates/agent/skills/spine-install-app/SKILL.md +72 -0
- package/.framework/templates/agent/skills/spine-migration/SKILL.md +75 -0
- package/.framework/templates/agent/skills/spine-new-app/SKILL.md +67 -0
- package/.framework/templates/agent/skills/spine-new-function/SKILL.md +65 -0
- package/.framework/templates/agent/skills/spine-new-type/SKILL.md +65 -0
- package/.framework/templates/agent/skills/spine-schema/SKILL.md +77 -0
- package/.framework/templates/agent/skills/spine-test/SKILL.md +67 -0
- package/.framework/templates/agent/skills/spine-troubleshoot/SKILL.md +74 -0
- package/.framework/templates/agent/skills/spine-upgrade/SKILL.md +69 -0
- package/.framework/templates/project.json +5 -1
- package/.framework/tests/unit/account-scoping-gates.test.ts +392 -0
- package/.framework/tests/unit/agent-files.test.ts +355 -0
- package/.framework/tests/unit/agent-runner.test.ts +496 -47
- package/.framework/tests/unit/api-keys-create-scope-gate.test.ts +160 -0
- package/.framework/tests/unit/api-keys-omit-secret-fields.test.ts +38 -0
- package/.framework/tests/unit/bootstrap.test.ts +242 -0
- package/.framework/tests/unit/cli-context-api-key.test.ts +114 -0
- package/.framework/tests/unit/debug-auth.test.ts +38 -0
- package/.framework/tests/unit/deliveries-account-scoping.test.ts +185 -0
- package/.framework/tests/unit/episode-lease.test.ts +695 -0
- package/.framework/tests/unit/integration-outbound-credentials.test.ts +167 -0
- package/.framework/tests/unit/integrations-audit-redaction.test.ts +130 -0
- package/.framework/tests/unit/kb-ingest-lease.test.ts +19 -0
- package/.framework/tests/unit/logging-app-id.test.ts +75 -0
- package/.framework/tests/unit/pipeline-runner-background.test.ts +120 -0
- package/.framework/tests/unit/pipeline-runner.test.ts +153 -1
- package/.framework/tests/unit/principal-cache.test.ts +15 -0
- package/.framework/tests/unit/system-context-denial.test.ts +145 -0
- package/.framework/tests/unit/system-cron.test.ts +240 -0
- package/.framework/tests/unit/timers.test.ts +159 -0
- package/.framework/tests/unit/trigger-engine.test.ts +278 -91
- package/.framework/tests/unit/trigger-scheduler.test.ts +78 -0
- package/README.md +125 -166
- package/config/tsconfig.cli.json +2 -2
- package/netlify.toml +5 -0
- package/package.json +15 -4
- package/templates/project/package-lock.json +2 -2
- package/.framework/docs/admin-routes.md +0 -76
- package/.framework/docs/api-docs-progress.md +0 -38
- package/.framework/docs/api-governance.md +0 -146
- package/.framework/docs/api-testing-results.md +0 -212
- package/.framework/docs/assembly-launch-guide.md +0 -138
- package/.framework/docs/audit-results.md +0 -590
- package/.framework/docs/db-api-inventory.md +0 -95
- package/.framework/docs/gap-remediation-backlog.md +0 -103
- package/.framework/docs/ui-adoption-verification.md +0 -111
- package/.framework/docs/ui-api-coverage.md +0 -84
- package/.framework/docs/v2-compatibility-audit.md +0 -228
- package/.framework/mcp/index.ts +0 -133
- package/.framework/mcp/load-env.ts +0 -60
- package/.framework/mcp/shared/app-manifest.ts +0 -275
- package/.framework/mcp/shared/db.ts +0 -477
- package/.framework/mcp/shared/kb.ts +0 -118
- package/.framework/mcp/tools/architect.ts +0 -431
- package/.framework/mcp/tools/cil/context.ts +0 -345
- package/.framework/mcp/tools/cil/graph.ts +0 -242
- package/.framework/mcp/tools/cil/ingest.ts +0 -1217
- package/.framework/mcp/tools/cil/pipeline-orchestrator.ts +0 -693
- package/.framework/mcp/tools/cil/pipeline.ts +0 -767
- package/.framework/mcp/tools/cil/project.ts +0 -791
- package/.framework/mcp/tools/cil/retrieval.ts +0 -336
- package/.framework/mcp/tools/cil/search-core.ts +0 -454
- package/.framework/mcp/tools/cil/search.ts +0 -97
- package/.framework/mcp/tools/cil/suggest.ts +0 -186
- package/.framework/mcp/tools/cil/validate.ts +0 -1369
- package/.framework/mcp/tools/kb/delete.ts +0 -139
- package/.framework/mcp/tools/kb/index.ts +0 -52
- package/.framework/mcp/tools/kb/ingest.ts +0 -84
- package/.framework/mcp/tools/kb/list-types.ts +0 -102
- package/.framework/mcp/tools/kb/publish.ts +0 -100
- package/.framework/mcp/tools/kb/reindex.ts +0 -86
- package/.framework/mcp/tools/kb/revoke.ts +0 -85
- package/.framework/mcp/tools/kb/search.ts +0 -101
- package/.framework/mcp/tools/kb/upsert.ts +0 -125
- package/.framework/mcp/tools/observability.ts +0 -510
|
@@ -1,12 +1,28 @@
|
|
|
1
1
|
// CIL[BEGIN stable_id="~/.framework/src/pages/admin/PipelineDetailPage.tsx:module_header:module_header" type="module_header" identity="module_header" parent="~/.framework/src/pages/admin/PipelineDetailPage.tsx"]
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
2
|
+
/**
|
|
3
|
+
* @module PipelineDetailPage
|
|
4
|
+
* @audience internal
|
|
5
|
+
* @layer app-specific
|
|
6
|
+
* @stability stable
|
|
7
|
+
*
|
|
8
|
+
* This module represents the Pipeline Detail Page in the admin section of the application, allowing users to view and manage pipeline details. It integrates various UI components for user interaction and data display, relying on API calls to fetch relevant information.
|
|
9
|
+
* INVARIANT: The user must have appropriate permissions to access this page.
|
|
10
|
+
*
|
|
11
|
+
* @seeAlso apiFetch (handles API requests).
|
|
12
|
+
* @seeAlso PageInstructions (provides guidance on page usage).
|
|
13
|
+
* @seeAlso EntitySelect (for selecting entities related to the pipeline).
|
|
14
|
+
*
|
|
15
|
+
* @cil-generated
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
10
26
|
|
|
11
27
|
import { useState, useEffect } from 'react'
|
|
12
28
|
import { useParams, useNavigate } from 'react-router-dom'
|
|
@@ -17,29 +33,38 @@ import { Textarea } from '../../components/ui/textarea'
|
|
|
17
33
|
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../../components/ui/select'
|
|
18
34
|
import { Checkbox } from '../../components/ui/checkbox'
|
|
19
35
|
import { Label } from '../../components/ui/label'
|
|
36
|
+
import { AppSelect } from '../../components/admin/EntitySelect'
|
|
20
37
|
import { Card, CardContent, CardHeader, CardTitle } from '../../components/ui/card'
|
|
21
38
|
import { Skeleton } from '../../components/ui/skeleton'
|
|
22
39
|
import { Alert, AlertDescription, AlertTitle } from '../../components/ui/alert'
|
|
23
40
|
import { Badge } from '../../components/ui/badge'
|
|
24
41
|
import { ArrowLeft, Play, Pause, AlertCircle } from 'lucide-react'
|
|
25
42
|
import { formatDateTime } from '../../lib/utils'
|
|
26
|
-
import { PageInstructions } from '../../components/admin/PageInstructions'
|
|
27
|
-
// CIL[DOC-VECTOR type="context" content="purpose='Top-level module imports for the pipeline detail admin page'; No verified external callers; imports: .framework/src/lib/api.ts,.framework/src/components/ui/button.tsx,.framework/src/components/ui/input.tsx"]
|
|
28
|
-
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
29
|
-
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
30
|
-
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
31
|
-
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
32
|
-
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
33
43
|
// CIL[END stable_id="~/.framework/src/pages/admin/PipelineDetailPage.tsx:module_header:module_header"]
|
|
34
|
-
// CIL[BEGIN stable_id="~/.framework/src/pages/admin/PipelineDetailPage.tsx:pipeline:interface" type="interface" identity="pipeline" parent="~/.framework/src/pages/admin/PipelineDetailPage.tsx"]
|
|
35
|
-
// CIL[DOC-MACRO purpose="TypeScript shape of a pipeline record"]
|
|
36
|
-
// CIL[DOC-RESPONSIBILITY responsibility="Define the Pipeline data structure used by forms and API responses"]
|
|
37
|
-
// CIL[DOC-CONTEXT module="admin-pipeline" layer="pages" related_files=".framework/src/components/admin/PageInstructions.tsx,.framework/src/components/ui/alert.tsx,.framework/src/components/ui/badge.tsx,.framework/src/components/ui/button.tsx,.framework/src/components/ui/card.tsx,.framework/src/components/ui/checkbox.tsx,.framework/src/components/ui/input.tsx,.framework/src/components/ui/label.tsx,.framework/src/components/ui/select.tsx,.framework/src/components/ui/skeleton.tsx,.framework/src/components/ui/textarea.tsx,.framework/src/lib/api.ts,.framework/src/lib/utils.ts,.framework/src/pages/admin/PipelineDetailPage.tsx"]
|
|
38
|
-
// CIL[DOC-CONTRACT inputs="none" outputs="Pipeline type" errors="none" side_effects="none"]
|
|
39
|
-
// CIL[DOC-MICRO logic_summary="Describes id, name, description, trigger_type, stages, config, metadata, is_active and timestamps" notable_decisions="[]"]
|
|
40
|
-
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
41
|
-
// CIL[DOC-STABILITY stability="stable"]
|
|
42
44
|
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
// CIL[BEGIN stable_id="~/.framework/src/pages/admin/PipelineDetailPage.tsx:Pipeline:interface" type="interface" identity="Pipeline" parent="~/.framework/src/pages/admin/PipelineDetailPage.tsx"]
|
|
61
|
+
/**
|
|
62
|
+
* The Pipeline interface defines the structure for a pipeline object, which represents a sequence of processing stages in a data workflow. It includes properties for identification, configuration, and metadata related to the pipeline's execution.
|
|
63
|
+
*
|
|
64
|
+
* @sideEffects none
|
|
65
|
+
* @stability stable
|
|
66
|
+
* @cil-generated
|
|
67
|
+
*/
|
|
43
68
|
interface Pipeline {
|
|
44
69
|
id: string
|
|
45
70
|
name: string
|
|
@@ -54,66 +79,98 @@ interface Pipeline {
|
|
|
54
79
|
created_at: string
|
|
55
80
|
updated_at: string
|
|
56
81
|
}
|
|
57
|
-
// CIL[
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
82
|
+
// CIL[END stable_id="~/.framework/src/pages/admin/PipelineDetailPage.tsx:Pipeline:interface"]
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
|
|
72
98
|
|
|
99
|
+
// CIL[BEGIN stable_id="~/.framework/src/pages/admin/PipelineDetailPage.tsx:STATUSES:constant" type="constant" identity="STATUSES" parent="~/.framework/src/pages/admin/PipelineDetailPage.tsx"]
|
|
100
|
+
/**
|
|
101
|
+
* STATUSES is a constant array that defines the various states a pipeline can be in within the admin interface. It provides a structured way to reference these states throughout the application.
|
|
102
|
+
*
|
|
103
|
+
* @sideEffects none
|
|
104
|
+
* @stability stable
|
|
105
|
+
* @cil-generated
|
|
106
|
+
*/
|
|
73
107
|
const STATUSES = [
|
|
74
108
|
{ value: 'draft', label: 'Draft' },
|
|
75
109
|
{ value: 'active', label: 'Active' },
|
|
76
110
|
{ value: 'paused', label: 'Paused' },
|
|
77
111
|
{ value: 'archived', label: 'Archived' }
|
|
78
112
|
]
|
|
79
|
-
// CIL[
|
|
80
|
-
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
81
|
-
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
82
|
-
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
83
|
-
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
84
|
-
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
85
|
-
// CIL[END stable_id="~/.framework/src/pages/admin/PipelineDetailPage.tsx:statuses:constant"]
|
|
86
|
-
// CIL[BEGIN stable_id="~/.framework/src/pages/admin/PipelineDetailPage.tsx:trigger_types:constant" type="constant" identity="trigger_types" parent="~/.framework/src/pages/admin/PipelineDetailPage.tsx"]
|
|
87
|
-
// CIL[DOC-MACRO purpose="Selectable pipeline trigger type options"]
|
|
88
|
-
// CIL[DOC-RESPONSIBILITY responsibility="Provide value/label pairs for trigger type rendering"]
|
|
89
|
-
// CIL[DOC-CONTEXT module="admin-pipeline" layer="pages" related_files=".framework/src/components/admin/PageInstructions.tsx,.framework/src/components/ui/alert.tsx,.framework/src/components/ui/badge.tsx,.framework/src/components/ui/button.tsx,.framework/src/components/ui/card.tsx,.framework/src/components/ui/checkbox.tsx,.framework/src/components/ui/input.tsx,.framework/src/components/ui/label.tsx,.framework/src/components/ui/select.tsx,.framework/src/components/ui/skeleton.tsx,.framework/src/components/ui/textarea.tsx,.framework/src/lib/api.ts,.framework/src/lib/utils.ts,.framework/src/pages/admin/PipelineDetailPage.tsx"]
|
|
90
|
-
// CIL[DOC-CONTRACT inputs="none" outputs="TRIGGER_TYPES array" errors="none" side_effects="none"]
|
|
91
|
-
// CIL[DOC-MICRO logic_summary="Constant array mapping manual, scheduled, webhook, and event to display labels" notable_decisions="[]"]
|
|
92
|
-
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
93
|
-
// CIL[DOC-STABILITY stability="stable"]
|
|
113
|
+
// CIL[END stable_id="~/.framework/src/pages/admin/PipelineDetailPage.tsx:STATUSES:constant"]
|
|
94
114
|
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
// CIL[BEGIN stable_id="~/.framework/src/pages/admin/PipelineDetailPage.tsx:TRIGGER_TYPES:constant" type="constant" identity="TRIGGER_TYPES" parent="~/.framework/src/pages/admin/PipelineDetailPage.tsx"]
|
|
131
|
+
/**
|
|
132
|
+
* TRIGGER_TYPES defines a set of available trigger types for a pipeline, providing a structured way to categorize different triggering mechanisms. This constant is used to facilitate the selection of trigger types in the admin interface.
|
|
133
|
+
*
|
|
134
|
+
* @sideEffects none
|
|
135
|
+
* @stability stable
|
|
136
|
+
* @cil-generated
|
|
137
|
+
*/
|
|
95
138
|
const TRIGGER_TYPES = [
|
|
96
139
|
{ value: 'manual', label: 'Manual' },
|
|
97
140
|
{ value: 'scheduled', label: 'Scheduled' },
|
|
98
141
|
{ value: 'webhook', label: 'Webhook' },
|
|
99
142
|
{ value: 'event', label: 'Event' }
|
|
100
143
|
]
|
|
101
|
-
// CIL[
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
// CIL[END stable_id="~/.framework/src/pages/admin/PipelineDetailPage.tsx:trigger_types:constant"]
|
|
108
|
-
// CIL[BEGIN stable_id="~/.framework/src/pages/admin/PipelineDetailPage.tsx:pipelinedetailpage:component" type="component" identity="pipelinedetailpage" parent="~/.framework/src/pages/admin/PipelineDetailPage.tsx"]
|
|
109
|
-
// CIL[DOC-MACRO purpose="Admin page for viewing, creating, and editing a pipeline"]
|
|
110
|
-
// CIL[DOC-RESPONSIBILITY responsibility="Render pipeline form, load/save pipeline data, toggle activation, and display stage list"]
|
|
111
|
-
// CIL[DOC-CONTEXT module="admin-pipeline" layer="pages" related_files=".framework/src/components/admin/PageInstructions.tsx,.framework/src/components/ui/alert.tsx,.framework/src/components/ui/badge.tsx,.framework/src/components/ui/button.tsx,.framework/src/components/ui/card.tsx,.framework/src/components/ui/checkbox.tsx,.framework/src/components/ui/input.tsx,.framework/src/components/ui/label.tsx,.framework/src/components/ui/select.tsx,.framework/src/components/ui/skeleton.tsx,.framework/src/components/ui/textarea.tsx,.framework/src/lib/api.ts,.framework/src/lib/utils.ts,.framework/src/pages/admin/PipelineDetailPage.tsx"]
|
|
112
|
-
// CIL[DOC-CONTRACT inputs="none" outputs="React element" errors="Network or JSON parse errors" side_effects="Calls /api/pipelines, navigates, updates local state"]
|
|
113
|
-
// CIL[DOC-MICRO logic_summary="Fetches pipeline by URL id, manages form state, parses JSON fields, saves via API, and renders editable detail UI" notable_decisions="[]"]
|
|
114
|
-
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
115
|
-
// CIL[DOC-STABILITY stability="stable"]
|
|
144
|
+
// CIL[END stable_id="~/.framework/src/pages/admin/PipelineDetailPage.tsx:TRIGGER_TYPES:constant"]
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
|
|
116
150
|
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
// CIL[BEGIN stable_id="~/.framework/src/pages/admin/PipelineDetailPage.tsx:PipelineDetailPage:component" type="component" identity="PipelineDetailPage" parent="~/.framework/src/pages/admin/PipelineDetailPage.tsx"]
|
|
162
|
+
/**
|
|
163
|
+
* The PipelineDetailPage component manages the creation and editing of pipeline configurations in an admin interface. It fetches existing pipeline data or initializes a new pipeline form based on the provided ID.
|
|
164
|
+
*
|
|
165
|
+
* @macro Component responsible for displaying and managing pipeline details.
|
|
166
|
+
* @micro Uses React hooks to manage state and side effects for fetching and saving pipeline data.
|
|
167
|
+
* @outputSpec JSX.Element
|
|
168
|
+
* @sideEffects Fetches data from an external API and navigates to a different route upon saving.
|
|
169
|
+
* @stability stable
|
|
170
|
+
* @calls apiFetch, useParams, useNavigate
|
|
171
|
+
* @errorHandling Sets error state on fetch failure.
|
|
172
|
+
* @cil-generated
|
|
173
|
+
*/
|
|
117
174
|
export function PipelineDetailPage() {
|
|
118
175
|
const { id } = useParams<{ id: string }>()
|
|
119
176
|
const navigate = useNavigate()
|
|
@@ -242,49 +299,12 @@ export function PipelineDetailPage() {
|
|
|
242
299
|
) : !isCreateMode && <Button onClick={() => setIsEditing(true)}>Edit</Button>}
|
|
243
300
|
</div>
|
|
244
301
|
</div>
|
|
245
|
-
|
|
246
|
-
<PageInstructions
|
|
247
|
-
description="Configure a pipeline with trigger type, JSON stages, config, and metadata."
|
|
248
|
-
sections={[
|
|
249
|
-
{ 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.' },
|
|
250
|
-
{ title: 'Fields explained', content: <ul className="list-disc pl-4 space-y-1">
|
|
251
|
-
<li><strong>Name</strong> — string. The display name. Missing name prevents saving.</li>
|
|
252
|
-
<li><strong>Trigger Type</strong> — select. manual, scheduled, webhook, or event. Determines what causes a run.</li>
|
|
253
|
-
<li><strong>Active</strong> — checkbox. Inactive pipelines will not run regardless of trigger.</li>
|
|
254
|
-
<li><strong>App ID</strong> — string. Optional owning app UUID. Leave blank to make it account-scoped.</li>
|
|
255
|
-
<li><strong>Description</strong> — string. Optional human-readable notes.</li>
|
|
256
|
-
<li><strong>Config (JSON)</strong> — JSON. Free-form runtime configuration for the pipeline.</li>
|
|
257
|
-
<li><strong>Stages (JSON)</strong> — JSON. Required array of step definitions the runner executes.</li>
|
|
258
|
-
<li><strong>Metadata (JSON)</strong> — JSON. Optional metadata about the pipeline.</li>
|
|
259
|
-
</ul> },
|
|
260
|
-
{ title: 'Options and values', content: <ul className="list-disc pl-4 space-y-1">
|
|
261
|
-
<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>
|
|
262
|
-
</ul> },
|
|
263
|
-
{ title: 'Downstream impact', content: <ul className="list-disc pl-4 space-y-1">
|
|
264
|
-
<li>The runner uses the stages array to execute steps in order.</li>
|
|
265
|
-
|
|
266
|
-
<li>Triggers and timers reference pipelines by ID; changing the trigger type may require re-linking triggers or timers.</li>
|
|
267
|
-
</ul> },
|
|
268
|
-
{ title: 'How to create, save, and validate', content: <ol className="list-decimal pl-4 space-y-1">
|
|
269
|
-
<li>In create mode, enter a name and choose a trigger type. Fill in the Stages JSON array.</li>
|
|
270
|
-
<li>Paste valid JSON into the Config and Metadata textareas. Invalid JSON will be ignored on save.</li>
|
|
271
|
-
<li>Click Create to save, or Edit then Save for existing pipelines. Use the Activate/Pause button to toggle is_active.</li>
|
|
272
|
-
</ol> },
|
|
273
|
-
{ title: 'Common mistakes', content: <ul className="list-disc pl-4 space-y-1">
|
|
274
|
-
|
|
275
|
-
<li>Setting trigger type to scheduled but not linking a timer.</li>
|
|
276
|
-
<li>Pasting a non-array value into Stages (it must be a JSON array).</li>
|
|
277
|
-
<li>Expecting to edit step order here; the JSON stages field is the source of truth.</li>
|
|
278
|
-
</ul> },
|
|
279
|
-
]}
|
|
280
|
-
/>
|
|
281
|
-
|
|
282
302
|
<Card><CardContent className="p-6 space-y-6">
|
|
283
303
|
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
|
|
284
304
|
<div className="space-y-4">
|
|
285
305
|
<h3 className="text-sm font-medium text-muted-foreground">Configuration</h3>
|
|
286
306
|
<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>
|
|
287
|
-
<div className="space-y-2"><Label>App
|
|
307
|
+
<div className="space-y-2"><Label>App</Label>{isEditing ? <AppSelect value={formData.app_id} onChange={v => setFormData({...formData, app_id: v})} /> : <div className="text-sm font-mono">{pipeline?.app_id || '—'}</div>}</div>
|
|
288
308
|
<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>
|
|
289
309
|
<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>
|
|
290
310
|
</div>
|
|
@@ -319,10 +339,11 @@ export function PipelineDetailPage() {
|
|
|
319
339
|
</div>
|
|
320
340
|
)
|
|
321
341
|
}
|
|
322
|
-
// CIL[
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
342
|
+
// CIL[END stable_id="~/.framework/src/pages/admin/PipelineDetailPage.tsx:PipelineDetailPage:component"]
|
|
343
|
+
|
|
344
|
+
|
|
345
|
+
|
|
346
|
+
|
|
347
|
+
|
|
348
|
+
|
|
349
|
+
|
|
@@ -1,17 +1,35 @@
|
|
|
1
1
|
// CIL[BEGIN stable_id="~/.framework/src/pages/admin/PipelineExecutionsPage.tsx:module_header:module_header" type="module_header" identity="module_header" parent="~/.framework/src/pages/admin/PipelineExecutionsPage.tsx"]
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
2
|
+
/**
|
|
3
|
+
* @module PipelineExecutionsPage
|
|
4
|
+
* @audience both
|
|
5
|
+
* @layer shared-core
|
|
6
|
+
* @stability stable
|
|
7
|
+
*
|
|
8
|
+
* This module represents the Pipeline Executions Page in the admin section of the application, allowing users to view and manage pipeline execution statuses. It integrates with various UI components to present data in a sortable table format and leverages API hooks for data fetching.
|
|
9
|
+
* INVARIANT: The user must have admin privileges to access this page.
|
|
10
|
+
*
|
|
11
|
+
* @seeAlso LoadingSpinner (provides loading feedback).
|
|
12
|
+
* @seeAlso Button (used for user actions).
|
|
13
|
+
* @seeAlso AdminListPage (base component for admin-related lists).
|
|
14
|
+
* @seeAlso SortableTableHeader (enables sorting functionality in tables).
|
|
15
|
+
*
|
|
16
|
+
* @cil-generated
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
|
|
10
27
|
|
|
11
28
|
|
|
12
29
|
|
|
13
30
|
|
|
14
31
|
import React, { useState } from 'react'
|
|
32
|
+
import { useNavigate } from 'react-router-dom'
|
|
15
33
|
import { Play, CheckCircle, XCircle, Clock, RefreshCw, Zap } from 'lucide-react';
|
|
16
34
|
import { LoadingSpinner } from '../../components/ui/LoadingSpinner'
|
|
17
35
|
import { Button } from '../../components/ui/button'
|
|
@@ -20,22 +38,31 @@ import { SortableTableHeader } from '../../components/admin/SortableTableHeader'
|
|
|
20
38
|
import { formatDateTime } from '../../lib/utils'
|
|
21
39
|
import { useApi } from '../../hooks/useApi'
|
|
22
40
|
import { apiFetch } from '../../lib/api'
|
|
23
|
-
|
|
24
|
-
// CIL[DOC-VECTOR type="context" content="purpose='Provides the admin UI page for monitoring and managing pipeline execution runs'; No verified external callers; imports: .framework/src/components/ui/LoadingSpinner.tsx,.framework/src/components/ui/button.tsx,.framework/src/components/admin/AdminListPage.tsx"]
|
|
25
|
-
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
26
|
-
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
27
|
-
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
28
|
-
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
29
|
-
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
30
41
|
// CIL[END stable_id="~/.framework/src/pages/admin/PipelineExecutionsPage.tsx:module_header:module_header"]
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
|
|
31
58
|
// CIL[BEGIN stable_id="~/.framework/src/pages/admin/PipelineExecutionsPage.tsx:PipelineExecution:interface" type="interface" identity="PipelineExecution" parent="~/.framework/src/pages/admin/PipelineExecutionsPage.tsx"]
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
59
|
+
/**
|
|
60
|
+
* The PipelineExecution interface defines the structure of a pipeline execution record, capturing its status, metadata, and associated entities. It facilitates the management and tracking of pipeline executions within the application.
|
|
61
|
+
*
|
|
62
|
+
* @sideEffects none
|
|
63
|
+
* @stability internal
|
|
64
|
+
* @cil-generated
|
|
65
|
+
*/
|
|
39
66
|
interface PipelineExecution {
|
|
40
67
|
id: string
|
|
41
68
|
pipeline_id: string
|
|
@@ -59,23 +86,39 @@ interface PipelineExecution {
|
|
|
59
86
|
}
|
|
60
87
|
created_at: string
|
|
61
88
|
}
|
|
62
|
-
// CIL[DOC-VECTOR type="context" content="purpose='Defines the shape of a pipeline execution record'; No verified external callers; imports: .framework/src/components/ui/LoadingSpinner.tsx,.framework/src/components/ui/button.tsx,.framework/src/components/admin/AdminListPage.tsx"]
|
|
63
|
-
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
64
|
-
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
65
|
-
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
66
|
-
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
67
|
-
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
68
89
|
// CIL[END stable_id="~/.framework/src/pages/admin/PipelineExecutionsPage.tsx:PipelineExecution:interface"]
|
|
69
90
|
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
|
|
70
106
|
// CIL[BEGIN stable_id="~/.framework/src/pages/admin/PipelineExecutionsPage.tsx:PipelineExecutionsPage:component" type="component" identity="PipelineExecutionsPage" parent="~/.framework/src/pages/admin/PipelineExecutionsPage.tsx"]
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
107
|
+
/**
|
|
108
|
+
* The PipelineExecutionsPage component manages the display and interaction with pipeline execution data, allowing users to filter, sort, and navigate to detailed execution views. It fetches execution data and statistics from an API and provides a user-friendly interface for managing this information.
|
|
109
|
+
*
|
|
110
|
+
* @macro User interface component for managing and displaying pipeline execution data.
|
|
111
|
+
* @micro Utilizes multiple API calls to fetch pipeline executions, statistics, and pipeline names, and implements local state management for filtering and sorting.
|
|
112
|
+
* @outputSpec JSX.Element — renders the pipeline executions page with interactive elements.
|
|
113
|
+
* @throws Error — if fetching pipeline executions fails
|
|
114
|
+
* @sideEffects API calls to '/api/pipeline-executions?action=list', '/api/pipeline-executions?action=stats', and '/api/pipelines?action=list'
|
|
115
|
+
* @stability internal
|
|
116
|
+
* @calls useApi, apiFetch, useNavigate
|
|
117
|
+
* @errorHandling throws an error if fetching pipeline executions fails
|
|
118
|
+
* @cil-generated
|
|
119
|
+
*/
|
|
78
120
|
export function PipelineExecutionsPage() {
|
|
121
|
+
const navigate = useNavigate()
|
|
79
122
|
const [searchTerm, setSearchTerm] = useState('')
|
|
80
123
|
const [selectedStatus, setSelectedStatus] = useState('all')
|
|
81
124
|
const [sortKey, setSortKey] = useState('started_at')
|
|
@@ -101,9 +144,28 @@ export function PipelineExecutionsPage() {
|
|
|
101
144
|
{ immediate: true }
|
|
102
145
|
)
|
|
103
146
|
|
|
147
|
+
const { data: pipelines } = useApi<{ id: string; name: string }[]>(
|
|
148
|
+
async () => {
|
|
149
|
+
const response = await apiFetch('/api/pipelines?action=list')
|
|
150
|
+
if (!response.ok) return []
|
|
151
|
+
const result = await response.json()
|
|
152
|
+
return result.data || result
|
|
153
|
+
},
|
|
154
|
+
{ immediate: true }
|
|
155
|
+
)
|
|
156
|
+
|
|
157
|
+
const pipelineNameById = new Map((pipelines || []).map(p => [p.id, p.name]))
|
|
158
|
+
const pipelineName = (exec: PipelineExecution) =>
|
|
159
|
+
exec.pipeline?.name || pipelineNameById.get(exec.pipeline_id) || null
|
|
160
|
+
|
|
104
161
|
const filteredExecutions = (executions || []).filter(exec => {
|
|
105
|
-
const
|
|
106
|
-
|
|
162
|
+
const term = searchTerm.toLowerCase()
|
|
163
|
+
const matchesSearch = !term ||
|
|
164
|
+
pipelineName(exec)?.toLowerCase().includes(term) ||
|
|
165
|
+
exec.pipeline_id?.toLowerCase().includes(term) ||
|
|
166
|
+
exec.status?.toLowerCase().includes(term) ||
|
|
167
|
+
exec.error_message?.toLowerCase().includes(term) ||
|
|
168
|
+
false
|
|
107
169
|
const matchesStatus = selectedStatus === 'all' || exec.status === selectedStatus
|
|
108
170
|
return matchesSearch && matchesStatus
|
|
109
171
|
})
|
|
@@ -118,7 +180,7 @@ export function PipelineExecutionsPage() {
|
|
|
118
180
|
}
|
|
119
181
|
|
|
120
182
|
const handleRowClick = (exec: PipelineExecution) => {
|
|
121
|
-
|
|
183
|
+
navigate(`/spine-framework/admin/observability/executions/${exec.id}`)
|
|
122
184
|
}
|
|
123
185
|
|
|
124
186
|
const sortedExecutions = [...(filteredExecutions || [])].sort((a, b) => {
|
|
@@ -277,7 +339,7 @@ export function PipelineExecutionsPage() {
|
|
|
277
339
|
>
|
|
278
340
|
<td className="px-6 py-4 whitespace-nowrap">
|
|
279
341
|
<div className="font-medium text-slate-900">
|
|
280
|
-
{exec
|
|
342
|
+
{pipelineName(exec) || 'Unknown Pipeline'}
|
|
281
343
|
</div>
|
|
282
344
|
<div className="text-xs text-slate-500 font-mono">{exec.id.slice(0, 8)}</div>
|
|
283
345
|
</td>
|
|
@@ -304,10 +366,11 @@ export function PipelineExecutionsPage() {
|
|
|
304
366
|
</AdminListPage>
|
|
305
367
|
)
|
|
306
368
|
}
|
|
307
|
-
// CIL[DOC-VECTOR type="context" content="purpose='React component that renders the pipeline executions admin list page'; No verified external callers; imports: .framework/src/components/ui/LoadingSpinner.tsx,.framework/src/components/ui/button.tsx,.framework/src/components/admin/AdminListPage.tsx"]
|
|
308
|
-
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
309
|
-
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
310
|
-
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
311
|
-
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
312
|
-
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
313
369
|
// CIL[END stable_id="~/.framework/src/pages/admin/PipelineExecutionsPage.tsx:PipelineExecutionsPage:component"]
|
|
370
|
+
|
|
371
|
+
|
|
372
|
+
|
|
373
|
+
|
|
374
|
+
|
|
375
|
+
|
|
376
|
+
|