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.
Files changed (319) hide show
  1. package/.framework/cli/commands/agents.ts +35 -37
  2. package/.framework/cli/commands/auth.ts +35 -34
  3. package/.framework/cli/commands/create-app.ts +104 -40
  4. package/.framework/cli/commands/dev.ts +104 -69
  5. package/.framework/cli/commands/doctor.ts +179 -69
  6. package/.framework/cli/commands/generate.ts +83 -143
  7. package/.framework/cli/commands/init.ts +72 -34
  8. package/.framework/cli/commands/install-app.ts +260 -125
  9. package/.framework/cli/commands/items.ts +33 -44
  10. package/.framework/cli/commands/migrate.ts +122 -40
  11. package/.framework/cli/commands/migrations.ts +33 -40
  12. package/.framework/cli/commands/pipelines.ts +31 -39
  13. package/.framework/cli/commands/status.ts +47 -23
  14. package/.framework/cli/commands/system.ts +47 -37
  15. package/.framework/cli/commands/test.ts +112 -68
  16. package/.framework/cli/commands/validate-app.ts +215 -121
  17. package/.framework/cli/context.ts +112 -130
  18. package/.framework/cli/env-loader.ts +47 -18
  19. package/.framework/cli/index.ts +81 -42
  20. package/.framework/docs/runtime-types.md +1024 -0
  21. package/.framework/functions/_shared/agent-runner.ts +1296 -961
  22. package/.framework/functions/_shared/app-manifest.ts +82 -68
  23. package/.framework/functions/_shared/audit.ts +135 -83
  24. package/.framework/functions/_shared/{cil-state.ts → cil.ts} +158 -56
  25. package/.framework/functions/_shared/db.ts +80 -126
  26. package/.framework/functions/_shared/hash-api-key.ts +63 -0
  27. package/.framework/functions/_shared/index.ts +224 -335
  28. package/.framework/functions/_shared/kb.ts +319 -0
  29. package/.framework/functions/_shared/llm.ts +92 -0
  30. package/.framework/functions/_shared/logging.ts +288 -0
  31. package/.framework/functions/_shared/middleware.ts +329 -365
  32. package/.framework/functions/_shared/outcomes.ts +36 -0
  33. package/.framework/functions/_shared/permissions.ts +359 -643
  34. package/.framework/functions/_shared/pipeline-runner.ts +243 -316
  35. package/.framework/functions/_shared/principal.ts +376 -468
  36. package/.framework/functions/_shared/resolve-credentials.ts +102 -0
  37. package/.framework/functions/_shared/resolve-ids.ts +188 -16
  38. package/.framework/functions/_shared/retry-deliveries.ts +104 -0
  39. package/.framework/functions/_shared/schema-utils.ts +611 -373
  40. package/.framework/functions/_shared/testing.ts +207 -137
  41. package/.framework/functions/_shared/tracing.ts +276 -0
  42. package/.framework/functions/_shared/trigger-engine.ts +159 -211
  43. package/.framework/functions/_shared/webhook-registration.ts +95 -81
  44. package/.framework/functions/_shared/webhook-registry.ts +153 -75
  45. package/.framework/functions/account-nodes.ts +31 -53
  46. package/.framework/functions/adapters/generic-webhook-inbound.ts +56 -0
  47. package/.framework/functions/adapters/generic-webhook-outbound.ts +43 -0
  48. package/.framework/functions/adapters/openai-outbound.ts +40 -0
  49. package/.framework/functions/admin-data.ts +685 -537
  50. package/.framework/functions/admin-funnel.ts +31 -20
  51. package/.framework/functions/admin-install-funnel.ts +47 -28
  52. package/.framework/functions/admin-signals.ts +47 -29
  53. package/.framework/functions/ai-agents.ts +122 -147
  54. package/.framework/functions/ai-interactions.ts +180 -90
  55. package/.framework/functions/api-keys.ts +250 -192
  56. package/.framework/functions/apps.ts +203 -197
  57. package/.framework/functions/auth.ts +98 -91
  58. package/.framework/functions/cil-agent-ingest.ts +773 -0
  59. package/.framework/functions/cil-agent.ts +592 -0
  60. package/.framework/functions/cil-callmap.ts +1227 -0
  61. package/.framework/functions/cil-config.ts +583 -0
  62. package/.framework/functions/cil-context.ts +445 -0
  63. package/.framework/functions/cil-doc.ts +1752 -0
  64. package/.framework/functions/cil-embeddings.ts +1202 -0
  65. package/.framework/functions/cil-graph.ts +585 -0
  66. package/.framework/functions/cil-ingest.ts +2416 -0
  67. package/.framework/functions/cil-pipeline.ts +318 -0
  68. package/.framework/functions/cil-project.ts +499 -0
  69. package/.framework/functions/cil-validate.ts +469 -0
  70. package/.framework/functions/debug-auth.ts +73 -53
  71. package/.framework/functions/deliveries.ts +117 -0
  72. package/.framework/functions/embeddings.ts +528 -516
  73. package/.framework/functions/eval-harness.ts +158 -106
  74. package/.framework/functions/integration-outbound.ts +311 -0
  75. package/.framework/functions/integration-routes.ts +240 -466
  76. package/.framework/functions/integrations.ts +132 -140
  77. package/.framework/functions/invites.ts +401 -201
  78. package/.framework/functions/item-progress.ts +113 -53
  79. package/.framework/functions/kb.ts +28 -0
  80. package/.framework/functions/logs.ts +239 -222
  81. package/.framework/functions/observability.ts +308 -259
  82. package/.framework/functions/pipeline-executions.ts +179 -235
  83. package/.framework/functions/pipelines.ts +163 -205
  84. package/.framework/functions/prompt-configs.ts +109 -156
  85. package/.framework/functions/roles.ts +97 -147
  86. package/.framework/functions/system-cron.ts +132 -218
  87. package/.framework/functions/system.ts +112 -52
  88. package/.framework/functions/tests.ts +32 -28
  89. package/.framework/functions/timers.ts +162 -210
  90. package/.framework/functions/triggers.ts +282 -346
  91. package/.framework/functions/types.ts +283 -400
  92. package/.framework/migrations/001_core_schema.sql +630 -0
  93. package/.framework/migrations/002_core_rls_and_functions.sql +532 -0
  94. package/.framework/migrations/{003_system_data.sql → 003_core_system_data.sql} +26 -153
  95. package/.framework/migrations/004_core_rpc_and_broker.sql +421 -0
  96. package/.framework/migrations/005_core_observability.sql +598 -0
  97. package/.framework/migrations/006_security_hardening_rls.sql +97 -0
  98. package/.framework/migrations/007_kb_article_list.sql +237 -0
  99. package/.framework/migrations/008_items_target.sql +8 -0
  100. package/.framework/migrations/009_roles_slug_unique.sql +11 -0
  101. package/.framework/public/spine.config.json +91 -0
  102. package/.framework/scripts/app-install-cli.ts +112 -98
  103. package/.framework/src/App.tsx +67 -20
  104. package/.framework/src/apps/admin/index.tsx +97 -27
  105. package/.framework/src/components/AppWrapper.tsx +50 -11
  106. package/.framework/src/components/CustomAppLoader.tsx +131 -22
  107. package/.framework/src/components/admin/AdminListPage.tsx +75 -8
  108. package/.framework/src/components/admin/AdminSidebar.tsx +148 -36
  109. package/.framework/src/components/admin/AdminStatsCard.tsx +48 -29
  110. package/.framework/src/components/admin/PageInstructions.tsx +49 -0
  111. package/.framework/src/components/admin/SortableTableHeader.tsx +49 -2
  112. package/.framework/src/components/app-shell/GenericAppShell.tsx +69 -11
  113. package/.framework/src/components/app-shell/GenericDetailPage.tsx +55 -10
  114. package/.framework/src/components/app-shell/GenericListPage.tsx +76 -9
  115. package/.framework/src/components/app-sidebar.tsx +50 -3
  116. package/.framework/src/components/auth/ProtectedRoute.tsx +53 -45
  117. package/.framework/src/components/kb/KBArticleEditor.tsx +409 -0
  118. package/.framework/src/components/kb/KBArticleList.tsx +557 -0
  119. package/.framework/src/components/layout/AppShell.tsx +54 -16
  120. package/.framework/src/components/layout/Header.tsx +50 -38
  121. package/.framework/src/components/layout/Layout.tsx +48 -32
  122. package/.framework/src/components/layout/Sidebar.tsx +167 -16
  123. package/.framework/src/components/runtime/DataDetailHeader.tsx +33 -1
  124. package/.framework/src/components/runtime/DataDetailPage.tsx +289 -4
  125. package/.framework/src/components/runtime/DataFilters.tsx +78 -1
  126. package/.framework/src/components/runtime/DataHeader.tsx +32 -29
  127. package/.framework/src/components/runtime/DataListPage.tsx +161 -2
  128. package/.framework/src/components/runtime/DataStats.tsx +48 -1
  129. package/.framework/src/components/runtime/DataTable.tsx +153 -1
  130. package/.framework/src/components/runtime/SchemaDetailForm.tsx +77 -46
  131. package/.framework/src/components/runtime/index.ts +16 -9
  132. package/.framework/src/components/search-form.tsx +33 -1
  133. package/.framework/src/components/shared/AgentView.tsx +48 -51
  134. package/.framework/src/components/shared/FieldRenderer.tsx +84 -67
  135. package/.framework/src/components/shared/InviteManager.tsx +113 -52
  136. package/.framework/src/components/shared/MemberList.tsx +182 -0
  137. package/.framework/src/components/shared/SchemaFields.tsx +96 -78
  138. package/.framework/src/components/ui/DataTable.tsx +86 -56
  139. package/.framework/src/components/ui/Form.tsx +188 -109
  140. package/.framework/src/components/ui/ItemCard.tsx +86 -58
  141. package/.framework/src/components/ui/ItemListView.tsx +88 -61
  142. package/.framework/src/components/ui/LoadingSpinner.tsx +52 -27
  143. package/.framework/src/components/ui/Modal.tsx +81 -4
  144. package/.framework/src/components/ui/RichTextEditor.tsx +101 -9
  145. package/.framework/src/components/ui/accordion.tsx +97 -5
  146. package/.framework/src/components/ui/alert-dialog.tsx +225 -13
  147. package/.framework/src/components/ui/alert.tsx +113 -6
  148. package/.framework/src/components/ui/aspect-ratio.tsx +49 -2
  149. package/.framework/src/components/ui/avatar.tsx +129 -7
  150. package/.framework/src/components/ui/badge.tsx +65 -3
  151. package/.framework/src/components/ui/breadcrumb.tsx +145 -8
  152. package/.framework/src/components/ui/button-group.tsx +81 -4
  153. package/.framework/src/components/ui/button.tsx +49 -2
  154. package/.framework/src/components/ui/calendar.tsx +65 -3
  155. package/.framework/src/components/ui/card.tsx +145 -8
  156. package/.framework/src/components/ui/carousel.tsx +129 -7
  157. package/.framework/src/components/ui/chart.tsx +161 -10
  158. package/.framework/src/components/ui/checkbox.tsx +49 -2
  159. package/.framework/src/components/ui/collapsible.tsx +81 -5
  160. package/.framework/src/components/ui/combobox.tsx +305 -20
  161. package/.framework/src/components/ui/command.tsx +177 -11
  162. package/.framework/src/components/ui/context-menu.tsx +273 -17
  163. package/.framework/src/components/ui/dialog.tsx +209 -27
  164. package/.framework/src/components/ui/direction.tsx +64 -4
  165. package/.framework/src/components/ui/drawer.tsx +193 -12
  166. package/.framework/src/components/ui/dropdown-menu.tsx +273 -18
  167. package/.framework/src/components/ui/empty.tsx +145 -9
  168. package/.framework/src/components/ui/field.tsx +209 -14
  169. package/.framework/src/components/ui/hover-card.tsx +81 -4
  170. package/.framework/src/components/ui/input-group.tsx +162 -10
  171. package/.framework/src/components/ui/input-otp.tsx +98 -5
  172. package/.framework/src/components/ui/input.tsx +49 -2
  173. package/.framework/src/components/ui/item.tsx +225 -13
  174. package/.framework/src/components/ui/kbd.tsx +65 -3
  175. package/.framework/src/components/ui/label.tsx +49 -2
  176. package/.framework/src/components/ui/menubar.tsx +289 -17
  177. package/.framework/src/components/ui/native-select.tsx +97 -5
  178. package/.framework/src/components/ui/navigation-menu.tsx +177 -10
  179. package/.framework/src/components/ui/pagination.tsx +161 -9
  180. package/.framework/src/components/ui/popover.tsx +145 -8
  181. package/.framework/src/components/ui/progress.tsx +49 -2
  182. package/.framework/src/components/ui/radio-group.tsx +65 -3
  183. package/.framework/src/components/ui/resizable.tsx +82 -4
  184. package/.framework/src/components/ui/scroll-area.tsx +65 -3
  185. package/.framework/src/components/ui/select.tsx +193 -11
  186. package/.framework/src/components/ui/separator.tsx +49 -2
  187. package/.framework/src/components/ui/sheet.tsx +193 -11
  188. package/.framework/src/components/ui/sidebar.tsx +481 -38
  189. package/.framework/src/components/ui/skeleton.tsx +49 -2
  190. package/.framework/src/components/ui/slider.tsx +49 -2
  191. package/.framework/src/components/ui/sonner.tsx +49 -2
  192. package/.framework/src/components/ui/spinner.tsx +49 -2
  193. package/.framework/src/components/ui/switch.tsx +49 -2
  194. package/.framework/src/components/ui/table-primitives.tsx +160 -33
  195. package/.framework/src/components/ui/table.tsx +161 -9
  196. package/.framework/src/components/ui/tabs.tsx +113 -6
  197. package/.framework/src/components/ui/textarea.tsx +49 -2
  198. package/.framework/src/components/ui/toggle-group.tsx +81 -4
  199. package/.framework/src/components/ui/toggle.tsx +65 -3
  200. package/.framework/src/components/ui/tooltip.tsx +97 -5
  201. package/.framework/src/contexts/AppContext.tsx +129 -45
  202. package/.framework/src/contexts/AuthContext.tsx +187 -144
  203. package/.framework/src/hooks/use-mobile.ts +48 -2
  204. package/.framework/src/hooks/useApi.ts +208 -159
  205. package/.framework/src/hooks/useAppPath.ts +32 -23
  206. package/.framework/src/hooks/useApps.ts +51 -20
  207. package/.framework/src/hooks/useEntityList.ts +32 -78
  208. package/.framework/src/hooks/useEntityRecord.ts +35 -96
  209. package/.framework/src/hooks/useForm.ts +32 -92
  210. package/.framework/src/hooks/useListSchema.ts +49 -78
  211. package/.framework/src/hooks/useSchemaRecord.ts +114 -105
  212. package/.framework/src/lib/api.ts +195 -116
  213. package/.framework/src/lib/supabase.ts +98 -64
  214. package/.framework/src/lib/utils.ts +287 -151
  215. package/.framework/src/main.tsx +49 -3
  216. package/.framework/src/pages/DashboardPage.tsx +52 -29
  217. package/.framework/src/pages/NotFoundPage.tsx +32 -10
  218. package/.framework/src/pages/SetupPage.tsx +32 -12
  219. package/.framework/src/pages/admin/AIAgentDetailPage.tsx +119 -10
  220. package/.framework/src/pages/admin/AIAgentsPage.tsx +48 -19
  221. package/.framework/src/pages/admin/APIKeyDetailPage.tsx +187 -17
  222. package/.framework/src/pages/admin/APIKeysPage.tsx +98 -22
  223. package/.framework/src/pages/admin/AlertsConfigPage.tsx +113 -26
  224. package/.framework/src/pages/admin/AppDetailPage.tsx +125 -8
  225. package/.framework/src/pages/admin/AppsPage.tsx +49 -2
  226. package/.framework/src/pages/admin/DeliveriesPage.tsx +196 -0
  227. package/.framework/src/pages/admin/DesignedPage.tsx +32 -18
  228. package/.framework/src/pages/admin/EmbeddingDetailPage.tsx +215 -484
  229. package/.framework/src/pages/admin/EmbeddingsPage.tsx +116 -319
  230. package/.framework/src/pages/admin/ExtendedShadcnTestPage.tsx +34 -9
  231. package/.framework/src/pages/admin/IncrementalShadcnTestPage.tsx +34 -9
  232. package/.framework/src/pages/admin/IntegratedDashboard.tsx +32 -16
  233. package/.framework/src/pages/admin/IntegrationDetailPage.tsx +183 -26
  234. package/.framework/src/pages/admin/IntegrationsPage.tsx +48 -19
  235. package/.framework/src/pages/admin/InvitesPage.tsx +48 -14
  236. package/.framework/src/pages/admin/LogsPage.tsx +422 -75
  237. package/.framework/src/pages/admin/MinimalShadcnTestPage.tsx +34 -9
  238. package/.framework/src/pages/admin/ObservabilityDashboard.tsx +113 -24
  239. package/.framework/src/pages/admin/PipelineDetailPage.tsx +206 -34
  240. package/.framework/src/pages/admin/PipelineExecutionsPage.tsx +50 -17
  241. package/.framework/src/pages/admin/PipelinesPage.tsx +160 -21
  242. package/.framework/src/pages/admin/PromptConfigDetailPage.tsx +378 -88
  243. package/.framework/src/pages/admin/PromptConfigsPage.tsx +125 -16
  244. package/.framework/src/pages/admin/ProperlyDesignedPage.tsx +49 -10
  245. package/.framework/src/pages/admin/RoleDetailPage.tsx +130 -10
  246. package/.framework/src/pages/admin/RolesPage.tsx +171 -18
  247. package/.framework/src/pages/admin/SelectTestPage.tsx +34 -9
  248. package/.framework/src/pages/admin/ShadcnTestPage.tsx +49 -11
  249. package/.framework/src/pages/admin/SimpleDashboard.tsx +49 -10
  250. package/.framework/src/pages/admin/TestRunDetailPage.tsx +49 -4
  251. package/.framework/src/pages/admin/TestingDashboard.tsx +98 -28
  252. package/.framework/src/pages/admin/TimerDetailPage.tsx +143 -33
  253. package/.framework/src/pages/admin/TimersPage.tsx +48 -20
  254. package/.framework/src/pages/admin/TriggerDetailPage.tsx +118 -30
  255. package/.framework/src/pages/admin/TriggersPage.tsx +64 -19
  256. package/.framework/src/pages/admin/TypeDetailPage.tsx +138 -15
  257. package/.framework/src/pages/admin/TypesPage.tsx +48 -20
  258. package/.framework/src/pages/admin/cil/CILAgentPage.tsx +465 -0
  259. package/.framework/src/pages/admin/cil/CILChunkDetailPage.tsx +787 -0
  260. package/.framework/src/pages/admin/cil/CILDashboardPage.tsx +699 -0
  261. package/.framework/src/pages/admin/cil/CILFileListPage.tsx +647 -0
  262. package/.framework/src/pages/admin/cil/CILGraphPage.tsx +616 -0
  263. package/.framework/src/pages/admin/cil/CILIngestionPage.tsx +1402 -0
  264. package/.framework/src/pages/admin/cil/CILProjectsPage.tsx +614 -0
  265. package/.framework/src/pages/admin/cil/CILSearchPage.tsx +571 -0
  266. package/.framework/src/pages/admin/cil/FlexiblePipelinePage.tsx +731 -0
  267. package/.framework/src/pages/admin/kb/KBAdminPage.tsx +64 -0
  268. package/.framework/src/pages/auth/AuthConfirmPage.tsx +52 -51
  269. package/.framework/src/pages/auth/ForgotPasswordPage.tsx +31 -22
  270. package/.framework/src/pages/auth/LoginPage.tsx +50 -23
  271. package/.framework/src/pages/auth/PendingApprovalPage.tsx +31 -15
  272. package/.framework/src/pages/auth/RegisterPage.tsx +281 -317
  273. package/.framework/src/pages/spine-framework/APIPage.tsx +33 -0
  274. package/.framework/src/pages/spine-framework/CLIPage.tsx +33 -0
  275. package/.framework/src/types/auth.ts +128 -71
  276. package/.framework/src/types/types.ts +373 -157
  277. package/custom/.devin/skills/spine-workbench-discovery/SKILL.md +39 -0
  278. package/custom/.devin/skills/spine-workbench-idea/SKILL.md +36 -0
  279. package/custom/.devin/skills/spine-workbench-implement/SKILL.md +46 -0
  280. package/custom/.devin/skills/spine-workbench-initiative/SKILL.md +28 -0
  281. package/custom/.devin/skills/spine-workbench-plan/SKILL.md +38 -0
  282. package/docs/README.md +9 -130
  283. package/netlify.toml +5 -2
  284. package/package.json +13 -25
  285. package/scripts/kb-ingest-docs.ts +203 -0
  286. package/spine.config.json +65 -4
  287. package/.framework/migrations/001_schema.sql +0 -425
  288. package/.framework/migrations/002_rls_and_functions.sql +0 -763
  289. package/.framework/migrations/004_enhancements.sql +0 -43
  290. package/.framework/migrations/005_auth_user_trigger.sql +0 -105
  291. package/.framework/migrations/006_fix_current_actor_id.sql +0 -21
  292. package/.framework/migrations/016_invites.sql +0 -27
  293. package/.framework/migrations/017_fix_get_account_apps.sql +0 -78
  294. package/.framework/migrations/018_apps_required_roles.sql +0 -17
  295. package/.framework/migrations/019_triggers_unique_constraint.sql +0 -13
  296. package/.framework/migrations/020_get_account_apps_role_filter.sql +0 -117
  297. package/.framework/migrations/021_app_domains.sql +0 -112
  298. package/.framework/migrations/022_route_prefix_domain_unique.sql +0 -21
  299. package/.framework/migrations/023_match_embeddings_rpc.sql +0 -78
  300. package/.framework/migrations/024_messages_account_id.sql +0 -9
  301. package/.framework/migrations/025_retype_threads_messages.sql +0 -240
  302. package/.framework/migrations/026_fix_rls_policies.sql +0 -47
  303. package/.framework/migrations/027_embedding_lifecycle.sql +0 -176
  304. package/.framework/migrations/028_fix_message_data_permissions.sql +0 -49
  305. package/.framework/migrations/029_tighten_support_triage_prompt.sql +0 -41
  306. package/.framework/migrations/030_messages_updated_by.sql +0 -6
  307. package/.framework/migrations/031_seed_upsert_constraints.sql +0 -35
  308. package/docs/APPS.md +0 -232
  309. package/docs/ARCHITECTURE.md +0 -246
  310. package/docs/INSTALL.md +0 -155
  311. package/docs/design-schema-spec.md +0 -1837
  312. package/docs/dev-guides/01-create-an-app.md +0 -183
  313. package/docs/dev-guides/02-create-a-function.md +0 -178
  314. package/docs/dev-guides/03-create-a-component.md +0 -178
  315. package/docs/dev-guides/04-webhook-handlers.md +0 -129
  316. package/docs/dev-guides/05-testing.md +0 -168
  317. package/docs/dev-guides/README.md +0 -40
  318. package/docs/npm-packages-plan.md +0 -288
  319. package/docs/spine-core--api-reference.md +0 -822
@@ -1,6 +1,23 @@
1
- /**
2
- * @module src/pages/admin/PipelineDetailPage
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
- status: 'draft' | 'active' | 'paused' | 'archived'
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
- schedule?: string
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
- last_run?: string
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({ name: '', description: '', status: 'draft' as const, trigger_type: 'manual' as const, schedule: '', is_active: true, steps: [] as any[] })
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, description: data.description || '', status: data.status, trigger_type: data.trigger_type,
75
- schedule: data.schedule || '', is_active: data.is_active, steps: data.steps || []
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(formData) })
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 newStatus = pipeline.status === 'active' ? 'paused' : 'active'
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({ status: newStatus }) })
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, status: newStatus })
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.status === 'active' ? 'default' : pipeline.status === 'paused' ? 'secondary' : 'outline'}>{pipeline.status}</Badge>}
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 && pipeline?.status !== 'archived' && (
136
- <Button variant="outline" onClick={toggleStatus}>{pipeline?.status === 'active' ? <><Pause className="h-4 w-4 mr-2" />Pause</> : <><Play className="h-4 w-4 mr-2" />Activate</>}</Button>
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
- <Card><CardContent className="p-6">
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>Status</Label>{isEditing ? <Select value={formData.status} onValueChange={v => setFormData({...formData, status: v as any})}><SelectTrigger><SelectValue /></SelectTrigger><SelectContent>{STATUSES.map(s => <SelectItem key={s.value} value={s.value}>{s.label}</SelectItem>)}</SelectContent></Select> : <Badge>{pipeline?.status}</Badge>}</div>
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">Last Run</span><span className="text-sm">{pipeline?.last_run ? formatDateTime(pipeline.last_run) : '—'}</span></div>
159
- <div className="flex justify-between"><span className="text-sm text-muted-foreground">Last Status</span><Badge variant={pipeline?.last_run_status === 'success' ? 'default' : pipeline?.last_run_status === 'failed' ? 'destructive' : 'outline'}>{pipeline?.last_run_status || '—'}</Badge></div>
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?.steps && (
170
- <Card><CardHeader><CardTitle>Steps ({pipeline.steps.length})</CardTitle></CardHeader><CardContent>
339
+ {!isCreateMode && pipeline?.stages && (
340
+ <Card><CardHeader><CardTitle>Stages ({pipeline.stages.length})</CardTitle></CardHeader><CardContent>
171
341
  <div className="space-y-2">
172
- {pipeline.steps.map((step, idx) => (
173
- <div key={step.id} className="flex items-center gap-4 p-3 bg-muted rounded">
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">{step.name}</div><div className="text-sm text-muted-foreground">{step.type}</div></div>
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"]