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.
Files changed (320) hide show
  1. package/.env.example +13 -3
  2. package/.framework/cli/commands/bootstrap.ts +392 -0
  3. package/.framework/cli/commands/dev.ts +91 -218
  4. package/.framework/cli/commands/doctor.ts +132 -26
  5. package/.framework/cli/commands/generate.ts +38 -298
  6. package/.framework/cli/commands/init.ts +20 -1
  7. package/.framework/cli/commands/migrate.ts +36 -30
  8. package/.framework/cli/commands/migrations.ts +16 -56
  9. package/.framework/cli/commands/upgrade.ts +35 -0
  10. package/.framework/cli/commands/validate-schema.ts +147 -0
  11. package/.framework/cli/context.ts +223 -110
  12. package/.framework/cli/index.ts +6 -0
  13. package/.framework/cli/lib/project-files.ts +241 -1
  14. package/.framework/functions/_shared/agent-runner.ts +1000 -81
  15. package/.framework/functions/_shared/cil.ts +2 -1
  16. package/.framework/functions/_shared/db.ts +3 -6
  17. package/.framework/functions/_shared/hash-api-key.ts +183 -79
  18. package/.framework/functions/_shared/kb.ts +61 -7
  19. package/.framework/functions/_shared/logging.ts +562 -224
  20. package/.framework/functions/_shared/message-sequence.ts +53 -0
  21. package/.framework/functions/_shared/middleware.ts +47 -44
  22. package/.framework/functions/_shared/pipeline-runner.ts +150 -37
  23. package/.framework/functions/_shared/principal.ts +9 -6
  24. package/.framework/functions/_shared/trigger-engine.ts +149 -40
  25. package/.framework/functions/admin-data.ts +48 -31
  26. package/.framework/functions/ai-agents.ts +103 -33
  27. package/.framework/functions/api-keys.ts +301 -122
  28. package/.framework/functions/apps.ts +43 -26
  29. package/.framework/functions/cil-ingest.ts +48 -15
  30. package/.framework/functions/debug-auth.ts +14 -8
  31. package/.framework/functions/deliveries.ts +39 -12
  32. package/.framework/functions/embeddings.ts +145 -76
  33. package/.framework/functions/integration-outbound.ts +67 -27
  34. package/.framework/functions/integrations.ts +254 -127
  35. package/.framework/functions/logs.ts +273 -133
  36. package/.framework/functions/observability.ts +277 -147
  37. package/.framework/functions/pipeline-executions.ts +1 -1
  38. package/.framework/functions/pipeline-runner-background.ts +120 -0
  39. package/.framework/functions/pipelines.ts +14 -9
  40. package/.framework/functions/prompt-configs.ts +7 -4
  41. package/.framework/functions/roles.ts +8 -5
  42. package/.framework/functions/security.ts +30 -17
  43. package/.framework/functions/system-cron.ts +250 -128
  44. package/.framework/functions/tests.ts +7 -6
  45. package/.framework/functions/timers.ts +310 -107
  46. package/.framework/functions/trigger-scheduler.ts +65 -5
  47. package/.framework/functions/triggers.ts +28 -13
  48. package/.framework/functions/types.ts +13 -10
  49. package/.framework/migrations/064_episode_leases.sql +196 -0
  50. package/.framework/migrations/065_execution_tables_updated_at.sql +20 -0
  51. package/.framework/migrations/066_episode_steal_thread_merge.sql +148 -0
  52. package/.framework/migrations/067_episode_lease_stale_steal.sql +93 -0
  53. package/.framework/migrations/068_cron_schedule_timer_rpcs.sql +251 -0
  54. package/.framework/migrations/069_log_stats_window.sql +54 -0
  55. package/.framework/migrations/070_app_type_schema_rpcs.sql +166 -0
  56. package/.framework/migrations/071_timer_interval_keys.sql +96 -0
  57. package/.framework/migrations/072_slug_autofill.sql +77 -0
  58. package/.framework/migrations/073_seed_member_roles.sql +26 -0
  59. package/.framework/schemas/spine.config.schema.json +62 -0
  60. package/.framework/src/App.tsx +3 -1
  61. package/.framework/src/apps/admin/index.tsx +1141 -775
  62. package/.framework/src/components/ErrorBoundary.tsx +136 -0
  63. package/.framework/src/components/admin/AdminListPage.tsx +81 -73
  64. package/.framework/src/components/admin/AdminSidebar.tsx +92 -81
  65. package/.framework/src/components/admin/EntitySelect.tsx +181 -0
  66. package/.framework/src/components/admin/PageInstructions.tsx +86 -127
  67. package/.framework/src/components/app-shell/GenericAppShell.tsx +3 -1
  68. package/.framework/src/components/app-shell/GenericDetailPage.tsx +37 -13
  69. package/.framework/src/components/app-shell/GenericListPage.tsx +28 -32
  70. package/.framework/src/components/auth/TurnstileWidget.tsx +9 -6
  71. package/.framework/src/components/kb/KBArticleEditor.tsx +49 -6
  72. package/.framework/src/components/layout/Layout.tsx +4 -2
  73. package/.framework/src/components/layout/Sidebar.tsx +304 -179
  74. package/.framework/src/components/runtime/DataDetailPage.tsx +67 -35
  75. package/.framework/src/components/runtime/DataHeader.tsx +96 -48
  76. package/.framework/src/components/runtime/DataListPage.tsx +3 -26
  77. package/.framework/src/components/runtime/DataStats.tsx +10 -10
  78. package/.framework/src/components/runtime/DataTable.tsx +12 -10
  79. package/.framework/src/components/ui/sheet.tsx +24 -26
  80. package/.framework/src/components/ui/textarea.tsx +74 -48
  81. package/.framework/src/hooks/useBranding.ts +47 -0
  82. package/.framework/src/hooks/useEntityList.ts +12 -9
  83. package/.framework/src/hooks/useListSchema.ts +108 -58
  84. package/.framework/src/instructions/README.md +57 -0
  85. package/.framework/src/instructions/ai-agents.md +69 -0
  86. package/.framework/src/instructions/alerts.md +80 -0
  87. package/.framework/src/instructions/api-keys.md +87 -0
  88. package/.framework/src/instructions/apps.md +77 -0
  89. package/.framework/src/instructions/concepts/ai-and-prompts.md +150 -0
  90. package/.framework/src/instructions/concepts/apps-and-renderers.md +162 -0
  91. package/.framework/src/instructions/concepts/auth-and-api-keys.md +133 -0
  92. package/.framework/src/instructions/concepts/automation.md +186 -0
  93. package/.framework/src/instructions/concepts/concurrency-and-idempotency.md +125 -0
  94. package/.framework/src/instructions/concepts/core-vs-custom.md +124 -0
  95. package/.framework/src/instructions/concepts/design-schema.md +152 -0
  96. package/.framework/src/instructions/concepts/integrations-and-webhooks.md +127 -0
  97. package/.framework/src/instructions/concepts/observability.md +116 -0
  98. package/.framework/src/instructions/concepts/permissions.md +150 -0
  99. package/.framework/src/instructions/concepts/runtime-records.md +111 -0
  100. package/.framework/src/instructions/concepts/scope-and-accounts.md +112 -0
  101. package/.framework/src/instructions/concepts/spine-way.md +172 -0
  102. package/.framework/src/instructions/deliveries.md +59 -0
  103. package/.framework/src/instructions/guide/00-orientation.md +106 -0
  104. package/.framework/src/instructions/guide/01-install-and-first-run.md +253 -0
  105. package/.framework/src/instructions/guide/02-project-map.md +147 -0
  106. package/.framework/src/instructions/guide/03-domain-model.md +223 -0
  107. package/.framework/src/instructions/guide/04-first-app.md +227 -0
  108. package/.framework/src/instructions/guide/05-glossary.md +183 -0
  109. package/.framework/src/instructions/integrations.md +96 -0
  110. package/.framework/src/instructions/internal/cil-markers.md +83 -0
  111. package/.framework/src/instructions/invites.md +60 -0
  112. package/.framework/src/instructions/kb.md +80 -0
  113. package/.framework/src/instructions/logs.md +77 -0
  114. package/.framework/src/instructions/observability.md +61 -0
  115. package/.framework/src/instructions/operations/deployment.md +115 -0
  116. package/.framework/src/instructions/operations/migrations.md +125 -0
  117. package/.framework/src/instructions/operations/security-checklist.md +148 -0
  118. package/.framework/src/instructions/operations/troubleshooting.md +170 -0
  119. package/.framework/src/instructions/operations/upgrade.md +116 -0
  120. package/.framework/src/instructions/pipeline-executions.md +62 -0
  121. package/.framework/src/instructions/pipelines.md +78 -0
  122. package/.framework/src/instructions/prompts.md +95 -0
  123. package/.framework/src/instructions/reference/api/admin-data.md +162 -0
  124. package/.framework/src/instructions/reference/api/auth.md +113 -0
  125. package/.framework/src/instructions/reference/api/errors-and-envelopes.md +113 -0
  126. package/.framework/src/instructions/reference/app-manifest.md +150 -0
  127. package/.framework/src/instructions/reference/cli.md +124 -0
  128. package/.framework/src/instructions/reference/database.md +132 -0
  129. package/.framework/src/instructions/reference/design-schema.md +280 -0
  130. package/.framework/src/instructions/reference/env-vars.md +133 -0
  131. package/.framework/src/instructions/reference/functions/account-nodes.md +75 -0
  132. package/.framework/src/instructions/reference/functions/admin-data.md +195 -0
  133. package/.framework/src/instructions/reference/functions/admin-funnel.md +90 -0
  134. package/.framework/src/instructions/reference/functions/admin-install-funnel.md +107 -0
  135. package/.framework/src/instructions/reference/functions/admin-signals.md +102 -0
  136. package/.framework/src/instructions/reference/functions/ai-agents.md +148 -0
  137. package/.framework/src/instructions/reference/functions/ai-interactions.md +156 -0
  138. package/.framework/src/instructions/reference/functions/api-keys.md +130 -0
  139. package/.framework/src/instructions/reference/functions/apps.md +140 -0
  140. package/.framework/src/instructions/reference/functions/auth.md +99 -0
  141. package/.framework/src/instructions/reference/functions/debug-auth.md +91 -0
  142. package/.framework/src/instructions/reference/functions/deliveries.md +110 -0
  143. package/.framework/src/instructions/reference/functions/embeddings.md +166 -0
  144. package/.framework/src/instructions/reference/functions/eval-harness.md +149 -0
  145. package/.framework/src/instructions/reference/functions/index.md +103 -0
  146. package/.framework/src/instructions/reference/functions/integration-outbound.md +200 -0
  147. package/.framework/src/instructions/reference/functions/integration-routes.md +151 -0
  148. package/.framework/src/instructions/reference/functions/integrations.md +130 -0
  149. package/.framework/src/instructions/reference/functions/invites.md +182 -0
  150. package/.framework/src/instructions/reference/functions/item-progress.md +107 -0
  151. package/.framework/src/instructions/reference/functions/kb.md +166 -0
  152. package/.framework/src/instructions/reference/functions/logs.md +141 -0
  153. package/.framework/src/instructions/reference/functions/observability.md +105 -0
  154. package/.framework/src/instructions/reference/functions/pipeline-executions.md +132 -0
  155. package/.framework/src/instructions/reference/functions/pipeline-runner-background.md +121 -0
  156. package/.framework/src/instructions/reference/functions/pipelines.md +136 -0
  157. package/.framework/src/instructions/reference/functions/prompt-configs.md +121 -0
  158. package/.framework/src/instructions/reference/functions/roles.md +121 -0
  159. package/.framework/src/instructions/reference/functions/security.md +140 -0
  160. package/.framework/src/instructions/reference/functions/system-cron.md +136 -0
  161. package/.framework/src/instructions/reference/functions/system.md +106 -0
  162. package/.framework/src/instructions/reference/functions/tests.md +97 -0
  163. package/.framework/src/instructions/reference/functions/timers.md +117 -0
  164. package/.framework/src/instructions/reference/functions/trigger-scheduler.md +102 -0
  165. package/.framework/src/instructions/reference/functions/triggers.md +140 -0
  166. package/.framework/src/instructions/reference/functions/types.md +146 -0
  167. package/.framework/src/instructions/reference/seeds.md +126 -0
  168. package/.framework/src/instructions/reference/shared-modules.md +127 -0
  169. package/.framework/src/instructions/reference/spine-config.md +114 -0
  170. package/.framework/src/instructions/roles.md +80 -0
  171. package/.framework/src/instructions/runtime-detail.md +70 -0
  172. package/.framework/src/instructions/runtime-list.md +77 -0
  173. package/.framework/src/instructions/security.md +67 -0
  174. package/.framework/src/instructions/tasks/add-a-pipeline.md +110 -0
  175. package/.framework/src/instructions/tasks/add-a-role.md +96 -0
  176. package/.framework/src/instructions/tasks/add-a-timer.md +114 -0
  177. package/.framework/src/instructions/tasks/add-a-trigger.md +106 -0
  178. package/.framework/src/instructions/tasks/add-a-type.md +151 -0
  179. package/.framework/src/instructions/tasks/add-a-webhook.md +108 -0
  180. package/.framework/src/instructions/tasks/add-an-ai-agent.md +108 -0
  181. package/.framework/src/instructions/tasks/add-an-integration.md +124 -0
  182. package/.framework/src/instructions/tasks/build-a-custom-page.md +118 -0
  183. package/.framework/src/instructions/tasks/package-and-install-an-app.md +127 -0
  184. package/.framework/src/instructions/tasks/test-your-code.md +108 -0
  185. package/.framework/src/instructions/tasks/write-a-function.md +132 -0
  186. package/.framework/src/instructions/tasks/write-a-migration.md +110 -0
  187. package/.framework/src/instructions/testing.md +59 -0
  188. package/.framework/src/instructions/timers.md +82 -0
  189. package/.framework/src/instructions/triggers.md +69 -0
  190. package/.framework/src/instructions/types.md +93 -0
  191. package/.framework/src/lib/branding.ts +128 -0
  192. package/.framework/src/pages/NoAppPage.tsx +3 -1
  193. package/.framework/src/pages/NotFoundPage.tsx +62 -31
  194. package/.framework/src/pages/SetupPage.tsx +5 -2
  195. package/.framework/src/pages/admin/AIAgentDetailPage.tsx +117 -106
  196. package/.framework/src/pages/admin/AIAgentsPage.tsx +86 -48
  197. package/.framework/src/pages/admin/APIKeyDetailPage.tsx +153 -152
  198. package/.framework/src/pages/admin/APIKeysPage.tsx +91 -90
  199. package/.framework/src/pages/admin/AlertsConfigPage.tsx +29 -18
  200. package/.framework/src/pages/admin/AppDetailPage.tsx +6 -60
  201. package/.framework/src/pages/admin/AppsPage.tsx +104 -66
  202. package/.framework/src/pages/admin/DeliveriesPage.tsx +5 -5
  203. package/.framework/src/pages/admin/EmbeddingDetailPage.tsx +5 -23
  204. package/.framework/src/pages/admin/EmbeddingsPage.tsx +5 -26
  205. package/.framework/src/pages/admin/IntegrationDetailPage.tsx +7 -7
  206. package/.framework/src/pages/admin/IntegrationsPage.tsx +85 -43
  207. package/.framework/src/pages/admin/LogsPage.tsx +144 -76
  208. package/.framework/src/pages/admin/ObservabilityDashboard.tsx +223 -140
  209. package/.framework/src/pages/admin/PipelineDetailPage.tsx +134 -113
  210. package/.framework/src/pages/admin/PipelineExecutionsPage.tsx +108 -45
  211. package/.framework/src/pages/admin/PipelinesPage.tsx +160 -115
  212. package/.framework/src/pages/admin/PromptConfigDetailPage.tsx +96 -98
  213. package/.framework/src/pages/admin/PromptConfigsPage.tsx +101 -59
  214. package/.framework/src/pages/admin/RoleDetailPage.tsx +90 -79
  215. package/.framework/src/pages/admin/RolesPage.tsx +86 -43
  216. package/.framework/src/pages/admin/SecurityPage.tsx +1 -1
  217. package/.framework/src/pages/admin/TestingDashboard.tsx +16 -28
  218. package/.framework/src/pages/admin/TimerDetailPage.tsx +117 -100
  219. package/.framework/src/pages/admin/TimersPage.tsx +90 -62
  220. package/.framework/src/pages/admin/TriggerDetailPage.tsx +90 -83
  221. package/.framework/src/pages/admin/TriggersPage.tsx +124 -99
  222. package/.framework/src/pages/admin/TypeDetailPage.tsx +152 -138
  223. package/.framework/src/pages/admin/TypesPage.tsx +90 -48
  224. package/.framework/src/pages/admin/cil/CILAgentPage.tsx +17 -25
  225. package/.framework/src/pages/admin/cil/CILChunkDetailPage.tsx +17 -27
  226. package/.framework/src/pages/admin/cil/CILDashboardPage.tsx +72 -40
  227. package/.framework/src/pages/admin/cil/CILFileListPage.tsx +321 -129
  228. package/.framework/src/pages/admin/cil/CILFileSelectPage.tsx +18 -29
  229. package/.framework/src/pages/admin/cil/CILGraphPage.tsx +26 -38
  230. package/.framework/src/pages/admin/cil/CILIngestionPage.tsx +34 -46
  231. package/.framework/src/pages/admin/cil/CILProjectsPage.tsx +189 -103
  232. package/.framework/src/pages/admin/cil/CILSearchPage.tsx +246 -136
  233. package/.framework/src/pages/admin/cil/CILSuggestionsPage.tsx +11 -22
  234. package/.framework/src/pages/admin/cil/CILVersionsPage.tsx +9 -20
  235. package/.framework/src/pages/admin/cil/FlexiblePipelinePage.tsx +26 -38
  236. package/.framework/src/pages/admin/kb/KBAdminPage.tsx +7 -26
  237. package/.framework/src/pages/auth/AuthConfirmPage.tsx +3 -1
  238. package/.framework/src/pages/auth/ForgotPasswordPage.tsx +3 -1
  239. package/.framework/src/pages/auth/LoginPage.tsx +4 -2
  240. package/.framework/src/pages/auth/RegisterPage.tsx +3 -1
  241. package/.framework/templates/agent/AGENTS.md +150 -0
  242. package/.framework/templates/agent/skills/spine-add-ai-agent/SKILL.md +58 -0
  243. package/.framework/templates/agent/skills/spine-add-automation/SKILL.md +62 -0
  244. package/.framework/templates/agent/skills/spine-add-integration/SKILL.md +63 -0
  245. package/.framework/templates/agent/skills/spine-architect/SKILL.md +86 -0
  246. package/.framework/templates/agent/skills/spine-install-app/SKILL.md +72 -0
  247. package/.framework/templates/agent/skills/spine-migration/SKILL.md +75 -0
  248. package/.framework/templates/agent/skills/spine-new-app/SKILL.md +67 -0
  249. package/.framework/templates/agent/skills/spine-new-function/SKILL.md +65 -0
  250. package/.framework/templates/agent/skills/spine-new-type/SKILL.md +65 -0
  251. package/.framework/templates/agent/skills/spine-schema/SKILL.md +77 -0
  252. package/.framework/templates/agent/skills/spine-test/SKILL.md +67 -0
  253. package/.framework/templates/agent/skills/spine-troubleshoot/SKILL.md +74 -0
  254. package/.framework/templates/agent/skills/spine-upgrade/SKILL.md +69 -0
  255. package/.framework/templates/project.json +5 -1
  256. package/.framework/tests/unit/account-scoping-gates.test.ts +392 -0
  257. package/.framework/tests/unit/agent-files.test.ts +355 -0
  258. package/.framework/tests/unit/agent-runner.test.ts +496 -47
  259. package/.framework/tests/unit/api-keys-create-scope-gate.test.ts +160 -0
  260. package/.framework/tests/unit/api-keys-omit-secret-fields.test.ts +38 -0
  261. package/.framework/tests/unit/bootstrap.test.ts +242 -0
  262. package/.framework/tests/unit/cli-context-api-key.test.ts +114 -0
  263. package/.framework/tests/unit/debug-auth.test.ts +38 -0
  264. package/.framework/tests/unit/deliveries-account-scoping.test.ts +185 -0
  265. package/.framework/tests/unit/episode-lease.test.ts +695 -0
  266. package/.framework/tests/unit/integration-outbound-credentials.test.ts +167 -0
  267. package/.framework/tests/unit/integrations-audit-redaction.test.ts +130 -0
  268. package/.framework/tests/unit/kb-ingest-lease.test.ts +19 -0
  269. package/.framework/tests/unit/logging-app-id.test.ts +75 -0
  270. package/.framework/tests/unit/pipeline-runner-background.test.ts +120 -0
  271. package/.framework/tests/unit/pipeline-runner.test.ts +153 -1
  272. package/.framework/tests/unit/principal-cache.test.ts +15 -0
  273. package/.framework/tests/unit/system-context-denial.test.ts +145 -0
  274. package/.framework/tests/unit/system-cron.test.ts +240 -0
  275. package/.framework/tests/unit/timers.test.ts +159 -0
  276. package/.framework/tests/unit/trigger-engine.test.ts +278 -91
  277. package/.framework/tests/unit/trigger-scheduler.test.ts +78 -0
  278. package/README.md +125 -166
  279. package/config/tsconfig.cli.json +2 -2
  280. package/netlify.toml +5 -0
  281. package/package.json +15 -4
  282. package/templates/project/package-lock.json +2 -2
  283. package/.framework/docs/admin-routes.md +0 -76
  284. package/.framework/docs/api-docs-progress.md +0 -38
  285. package/.framework/docs/api-governance.md +0 -146
  286. package/.framework/docs/api-testing-results.md +0 -212
  287. package/.framework/docs/assembly-launch-guide.md +0 -138
  288. package/.framework/docs/audit-results.md +0 -590
  289. package/.framework/docs/db-api-inventory.md +0 -95
  290. package/.framework/docs/gap-remediation-backlog.md +0 -103
  291. package/.framework/docs/ui-adoption-verification.md +0 -111
  292. package/.framework/docs/ui-api-coverage.md +0 -84
  293. package/.framework/docs/v2-compatibility-audit.md +0 -228
  294. package/.framework/mcp/index.ts +0 -133
  295. package/.framework/mcp/load-env.ts +0 -60
  296. package/.framework/mcp/shared/app-manifest.ts +0 -275
  297. package/.framework/mcp/shared/db.ts +0 -477
  298. package/.framework/mcp/shared/kb.ts +0 -118
  299. package/.framework/mcp/tools/architect.ts +0 -431
  300. package/.framework/mcp/tools/cil/context.ts +0 -345
  301. package/.framework/mcp/tools/cil/graph.ts +0 -242
  302. package/.framework/mcp/tools/cil/ingest.ts +0 -1217
  303. package/.framework/mcp/tools/cil/pipeline-orchestrator.ts +0 -693
  304. package/.framework/mcp/tools/cil/pipeline.ts +0 -767
  305. package/.framework/mcp/tools/cil/project.ts +0 -791
  306. package/.framework/mcp/tools/cil/retrieval.ts +0 -336
  307. package/.framework/mcp/tools/cil/search-core.ts +0 -454
  308. package/.framework/mcp/tools/cil/search.ts +0 -97
  309. package/.framework/mcp/tools/cil/suggest.ts +0 -186
  310. package/.framework/mcp/tools/cil/validate.ts +0 -1369
  311. package/.framework/mcp/tools/kb/delete.ts +0 -139
  312. package/.framework/mcp/tools/kb/index.ts +0 -52
  313. package/.framework/mcp/tools/kb/ingest.ts +0 -84
  314. package/.framework/mcp/tools/kb/list-types.ts +0 -102
  315. package/.framework/mcp/tools/kb/publish.ts +0 -100
  316. package/.framework/mcp/tools/kb/reindex.ts +0 -86
  317. package/.framework/mcp/tools/kb/revoke.ts +0 -85
  318. package/.framework/mcp/tools/kb/search.ts +0 -101
  319. package/.framework/mcp/tools/kb/upsert.ts +0 -125
  320. package/.framework/mcp/tools/observability.ts +0 -510
@@ -1,12 +1,27 @@
1
1
  // CIL[BEGIN stable_id="~/.framework/src/pages/admin/PipelinesPage.tsx:module_header:module_header" type="module_header" identity="module_header" parent="~/.framework/src/pages/admin/PipelinesPage.tsx"]
2
- // CIL[DOC-MACRO purpose="Module header for the admin pipeline management page."]
3
- // CIL[DOC-RESPONSIBILITY responsibility="Declares module-level imports and metadata for PipelinesPage."]
4
- // CIL[DOC-CONTEXT module="admin" layer="pages" related_files=".framework/src/components/admin/AdminListPage.tsx,.framework/src/components/admin/SortableTableHeader.tsx,.framework/src/components/ui/LoadingSpinner.tsx,.framework/src/components/ui/badge.tsx,.framework/src/components/ui/button.tsx,.framework/src/hooks/useApi.ts,.framework/src/lib/api.ts,.framework/src/lib/utils.ts"]
5
- // CIL[DOC-CONTRACT inputs="none" outputs="none" errors="none" side_effects="none"]
6
- // CIL[DOC-MICRO logic_summary="Import dependencies and establish module context." notable_decisions="[]"]
7
- // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
8
- // CIL[DOC-STABILITY stability="stable"]
9
- // CIL[DOC-AUDIENCE audience="administrators, developers"]
2
+ /**
3
+ * @module PipelinesPage
4
+ * @audience both
5
+ * @layer shared-core
6
+ * @stability stable
7
+ *
8
+ * This module represents the PipelinesPage component within the admin section of the application, providing a user interface for managing and viewing pipelines. It leverages hooks for API interactions and includes various UI components for functionality such as sorting and filtering. INVARIANT: The user must have admin privileges to access this page.
9
+ *
10
+ * @seeAlso useApi (provides API interaction capabilities).
11
+ * @seeAlso AdminListPage (base component for admin list functionality).
12
+ * @seeAlso SortableTableHeader (for sorting capabilities in tables).
13
+ *
14
+ * @cil-generated
15
+ */
16
+
17
+
18
+
19
+
20
+
21
+
22
+
23
+
24
+
10
25
 
11
26
 
12
27
 
@@ -25,22 +40,31 @@ import { Badge } from '../../components/ui/badge'
25
40
  import { formatDateTime } from '../../lib/utils'
26
41
  import { AdminListPage } from '../../components/admin/AdminListPage'
27
42
  import { SortableTableHeader } from '../../components/admin/SortableTableHeader'
28
-
29
- // CIL[DOC-VECTOR type="context" content="purpose='Module header for the admin pipeline management page.'; No verified external callers; imports: .framework/src/hooks/useApi.ts,.framework/src/lib/api.ts,.framework/src/components/ui/LoadingSpinner.tsx"]
30
- // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
31
- // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
32
- // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
33
- // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
34
- // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
35
43
  // CIL[END stable_id="~/.framework/src/pages/admin/PipelinesPage.tsx:module_header:module_header"]
44
+
45
+
46
+
47
+
48
+
49
+
50
+
51
+
52
+
53
+
54
+
55
+
56
+
57
+
58
+
59
+
36
60
  // CIL[BEGIN stable_id="~/.framework/src/pages/admin/PipelinesPage.tsx:Pipeline:interface" type="interface" identity="Pipeline" parent="~/.framework/src/pages/admin/PipelinesPage.tsx"]
37
- // CIL[DOC-MACRO purpose="Define the shape of a Pipeline record."]
38
- // CIL[DOC-RESPONSIBILITY responsibility="Provide a TypeScript contract for pipeline objects."]
39
- // CIL[DOC-CONTEXT module="admin" layer="types" related_files=".framework/src/components/admin/AdminListPage.tsx,.framework/src/components/admin/SortableTableHeader.tsx,.framework/src/components/ui/LoadingSpinner.tsx,.framework/src/components/ui/badge.tsx,.framework/src/components/ui/button.tsx,.framework/src/hooks/useApi.ts,.framework/src/lib/api.ts,.framework/src/lib/utils.ts,.framework/src/pages/admin/PipelinesPage.tsx"]
40
- // CIL[DOC-CONTRACT inputs="none" outputs="Pipeline type definition" errors="none" side_effects="none"]
41
- // CIL[DOC-MICRO logic_summary="Interface describing pipeline fields, triggers, stages, and execution metadata." notable_decisions="[]"]
42
- // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
43
- // CIL[DOC-STABILITY stability="stable"]
61
+ /**
62
+ * The Pipeline interface defines the structure of a data pipeline, including its configuration, stages, and metadata. It is used to manage and execute data processing workflows within the application.
63
+ *
64
+ * @sideEffects none
65
+ * @stability internal
66
+ * @cil-generated
67
+ */
44
68
  interface Pipeline {
45
69
  id: string
46
70
  name: string
@@ -54,114 +78,143 @@ interface Pipeline {
54
78
  order: number
55
79
  }>
56
80
  is_active: boolean
81
+ app_id?: string
57
82
  created_at: string
58
83
  updated_at: string
59
84
  created_by: string
60
85
  account_id: string
61
- execution_count: number
86
+ execution_count?: number
62
87
  last_execution?: string
63
88
  next_execution?: string
64
89
  }
65
- // CIL[DOC-VECTOR type="context" content="purpose='Define the shape of a Pipeline record.'; No verified external callers; imports: .framework/src/hooks/useApi.ts,.framework/src/lib/api.ts,.framework/src/components/ui/LoadingSpinner.tsx"]
66
- // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
67
- // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
68
- // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
69
- // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
70
- // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
71
90
  // CIL[END stable_id="~/.framework/src/pages/admin/PipelinesPage.tsx:Pipeline:interface"]
72
91
 
92
+
93
+
94
+
95
+
96
+
97
+
98
+
99
+
100
+
101
+
102
+
103
+
104
+
105
+
106
+
73
107
  // CIL[BEGIN stable_id="~/.framework/src/pages/admin/PipelinesPage.tsx:PipelineExecution:interface" type="interface" identity="PipelineExecution" parent="~/.framework/src/pages/admin/PipelinesPage.tsx"]
74
- // CIL[DOC-MACRO purpose="Define the shape of a pipeline execution record."]
75
- // CIL[DOC-RESPONSIBILITY responsibility="Provide a TypeScript contract for pipeline execution objects."]
76
- // CIL[DOC-CONTEXT module="admin" layer="types" related_files=".framework/src/components/admin/AdminListPage.tsx,.framework/src/components/admin/SortableTableHeader.tsx,.framework/src/components/ui/LoadingSpinner.tsx,.framework/src/components/ui/badge.tsx,.framework/src/components/ui/button.tsx,.framework/src/hooks/useApi.ts,.framework/src/lib/api.ts,.framework/src/lib/utils.ts,.framework/src/pages/admin/PipelinesPage.tsx"]
77
- // CIL[DOC-CONTRACT inputs="none" outputs="PipelineExecution type definition" errors="none" side_effects="none"]
78
- // CIL[DOC-MICRO logic_summary="Interface describing pipeline execution fields and status values." notable_decisions="[]"]
79
- // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
80
- // CIL[DOC-STABILITY stability="stable"]
108
+ /**
109
+ * The PipelineExecution interface defines the structure for tracking the execution state of a pipeline, including its status and timestamps. It is essential for managing and monitoring the lifecycle of pipeline executions within the application.
110
+ *
111
+ * @sideEffects none
112
+ * @stability internal
113
+ * @cil-generated
114
+ */
81
115
  interface PipelineExecution {
82
116
  id: string
83
117
  pipeline_id: string
84
118
  status: 'pending' | 'running' | 'completed' | 'failed'
85
- started_at: string
119
+ started_at?: string
120
+ created_at: string
86
121
  completed_at?: string
87
- trigger_data: Record<string, any>
122
+ trigger_data?: Record<string, any>
88
123
  result?: Record<string, any>
89
124
  error?: string
90
125
  }
91
- // CIL[DOC-VECTOR type="context" content="purpose='Define the shape of a pipeline execution record.'; No verified external callers; imports: .framework/src/hooks/useApi.ts,.framework/src/lib/api.ts,.framework/src/components/ui/LoadingSpinner.tsx"]
92
- // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
93
- // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
94
- // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
95
- // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
96
- // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
97
126
  // CIL[END stable_id="~/.framework/src/pages/admin/PipelinesPage.tsx:PipelineExecution:interface"]
98
127
 
128
+
129
+
130
+
131
+
132
+
133
+
134
+
135
+
136
+
137
+
138
+
139
+
140
+
141
+
142
+
99
143
  // CIL[BEGIN stable_id="~/.framework/src/pages/admin/PipelinesPage.tsx:PipelinesPage:component" type="component" identity="PipelinesPage" parent="~/.framework/src/pages/admin/PipelinesPage.tsx"]
100
- // CIL[DOC-MACRO purpose="Render and manage the admin pipelines list page."]
101
- // CIL[DOC-RESPONSIBILITY responsibility="Fetch, filter, sort and display pipelines; provide navigation to pipeline details, executions, and editing."]
102
- // CIL[DOC-CONTEXT module="admin" layer="pages" related_files=".framework/src/components/admin/AdminListPage.tsx,.framework/src/components/admin/SortableTableHeader.tsx,.framework/src/components/ui/LoadingSpinner.tsx,.framework/src/components/ui/badge.tsx,.framework/src/components/ui/button.tsx,.framework/src/hooks/useApi.ts,.framework/src/lib/api.ts,.framework/src/lib/utils.ts,.framework/src/pages/admin/PipelinesPage.tsx"]
103
- // CIL[DOC-CONTRACT inputs="none (React component with no props)" outputs="JSX admin pipeline list UI" errors="Throws on failed pipeline fetch; error surfaced by useApi" side_effects="Calls apiFetch and Supabase session; logs debug messages; navigates via React Router"]
104
- // CIL[DOC-MICRO logic_summary="Uses useApi to load pipelines from /api/pipelines, filters by search/status/trigger, sorts, and renders an AdminListPage with a table. Includes handlers for view executions, edit, row click, sorting, and status badges." notable_decisions="[]"]
105
- // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
106
- // CIL[DOC-STABILITY stability="stable"]
144
+ /**
145
+ * The PipelinesPage component manages the display and interaction with pipeline data in the admin interface. It fetches pipelines, executions, and related statistics from the API and allows users to filter and sort this data.
146
+ *
147
+ * @macro Admin interface component for managing and displaying pipeline data.
148
+ * @micro Uses multiple API calls to fetch pipelines, executions, and statistics, and maintains local state for filtering and sorting.
149
+ * @outputSpec JSX.Element — renders the pipelines management interface.
150
+ * @throws Error — failed to fetch pipelines
151
+ * @sideEffects Makes external API calls to fetch pipeline and execution data.
152
+ * @stability internal
153
+ * @calls useApi, apiFetch
154
+ * @errorHandling none
155
+ * @cil-generated
156
+ */
107
157
  export function PipelinesPage() {
108
- console.log('PipelinesPage rendering...')
109
158
  const navigate = useNavigate()
110
159
  const [searchTerm, setSearchTerm] = useState('')
111
160
  const [selectedTrigger, setSelectedTrigger] = useState('all')
112
161
  const [selectedStatus, setSelectedStatus] = useState('all')
113
- const [selectedPipeline, setSelectedPipeline] = useState<Pipeline | null>(null)
114
162
  const [sortKey, setSortKey] = useState('name')
115
163
  const [sortDirection, setSortDirection] = useState<'asc' | 'desc'>('asc')
116
164
 
117
-
118
165
  const { data: pipelines, loading, error, refetch } = useApi<Pipeline[]>(
119
166
  async ({ signal }: { signal?: AbortSignal }) => {
120
- try {
121
- console.log('Fetching pipelines...')
122
-
123
-
124
- const { supabase } = await import('../../lib/supabase')
125
- const { data: { session } } = await supabase.auth.getSession()
126
- console.log('Supabase session exists:', !!session)
127
- console.log('Supabase access token exists:', !!session?.access_token)
128
- console.log('Supabase access token length:', session?.access_token?.length || 0)
129
-
130
-
131
- const localToken = localStorage.getItem('access_token')
132
- console.log('localStorage token exists:', !!localToken)
133
- console.log('localStorage token length:', localToken?.length || 0)
134
-
135
- const response = await apiFetch('/api/pipelines?action=list', { signal })
136
- console.log('Response status:', response.status)
137
- console.log('Response headers:', Object.fromEntries(response.headers.entries()))
138
-
139
- if (!response.ok) {
140
- console.error('Response not ok:', response.statusText)
141
- throw new Error(`Failed to fetch pipelines: ${response.statusText}`)
142
- }
143
-
144
- const result = await response.json()
145
- console.log('Raw API result:', result)
146
- console.log('Result data type:', typeof result.data)
147
- console.log('Result data is array:', Array.isArray(result.data))
148
- console.log('Result data length:', result.data?.length || 'N/A')
149
-
150
-
151
- const pipelines = result.data || result
152
- console.log('Pipelines after processing:', pipelines)
153
- console.log('Pipelines is array:', Array.isArray(pipelines))
154
- console.log('Pipelines length:', pipelines.length)
155
-
156
- return pipelines
157
- } catch (error) {
158
- console.error('Error in PipelinesPage:', error)
159
- throw error
160
- }
167
+ const response = await apiFetch('/api/pipelines?action=list', { signal })
168
+ if (!response.ok) throw new Error('Failed to fetch pipelines')
169
+ const result = await response.json()
170
+ return result.data || result
161
171
  },
162
172
  { immediate: true }
163
173
  )
164
174
 
175
+ const { data: executions } = useApi<PipelineExecution[]>(
176
+ async ({ signal }: { signal?: AbortSignal }) => {
177
+ const response = await apiFetch('/api/pipeline-executions?action=list&limit=500', { signal })
178
+ if (!response.ok) return []
179
+ const result = await response.json()
180
+ return result.data || result || []
181
+ },
182
+ { immediate: true }
183
+ )
184
+
185
+ const { data: execStats } = useApi<{ total: number }>(
186
+ async ({ signal }: { signal?: AbortSignal }) => {
187
+ const today = new Date()
188
+ today.setUTCHours(0, 0, 0, 0)
189
+ const response = await apiFetch(`/api/pipeline-executions?action=stats&date_from=${encodeURIComponent(today.toISOString())}`, { signal })
190
+ if (!response.ok) return { total: 0 }
191
+ const result = await response.json()
192
+ return result.data || result
193
+ },
194
+ { immediate: true }
195
+ )
196
+
197
+ const { data: apps } = useApi<Array<{ id: string; name: string }>>(
198
+ async ({ signal }: { signal?: AbortSignal }) => {
199
+ const response = await apiFetch('/api/apps?action=list', { signal })
200
+ if (!response.ok) return []
201
+ const result = await response.json()
202
+ return result.data || []
203
+ },
204
+ { immediate: true }
205
+ )
206
+
207
+ const appNameById = new Map((apps || []).map(a => [a.id, a.name]))
208
+
209
+ const lastExecByPipeline = new Map<string, string>()
210
+ const execCountByPipeline = new Map<string, number>()
211
+ for (const exec of executions || []) {
212
+ const ts = exec.started_at || exec.created_at
213
+ execCountByPipeline.set(exec.pipeline_id, (execCountByPipeline.get(exec.pipeline_id) || 0) + 1)
214
+ const prev = lastExecByPipeline.get(exec.pipeline_id)
215
+ if (ts && (!prev || ts > prev)) lastExecByPipeline.set(exec.pipeline_id, ts)
216
+ }
217
+
165
218
  const triggerOptions = [
166
219
  { value: 'all', label: 'All Triggers' },
167
220
  { value: 'schedule', label: 'Schedule' },
@@ -238,14 +291,6 @@ export function PipelinesPage() {
238
291
  return isActive ? 'bg-green-100 text-green-800' : 'bg-slate-100 text-slate-800'
239
292
  }
240
293
 
241
- const handleTogglePipeline = (pipeline: Pipeline) => {
242
- console.log('Toggle pipeline:', pipeline.id)
243
- }
244
-
245
- const handleExecutePipeline = (pipeline: Pipeline) => {
246
- console.log('Execute pipeline:', pipeline.id)
247
- }
248
-
249
294
  const handleViewExecutions = (pipeline: Pipeline) => {
250
295
  navigate(`/spine-framework/admin/configs/pipelines/${pipeline.id}/executions`)
251
296
  }
@@ -288,7 +333,7 @@ export function PipelinesPage() {
288
333
  },
289
334
  {
290
335
  title: "Runs Today",
291
- value: "32",
336
+ value: execStats?.total ?? 0,
292
337
  icon: Clock,
293
338
  iconColor: "text-orange-600"
294
339
  }
@@ -356,8 +401,8 @@ export function PipelinesPage() {
356
401
  onSort={handleSort}
357
402
  />
358
403
  <SortableTableHeader
359
- title="Executions"
360
- sortKey="execution_count"
404
+ title="App"
405
+ sortKey="app_id"
361
406
  currentSortKey={sortKey}
362
407
  currentSortDirection={sortDirection}
363
408
  onSort={handleSort}
@@ -403,10 +448,10 @@ export function PipelinesPage() {
403
448
  </Badge>
404
449
  </td>
405
450
  <td className="px-6 py-4 whitespace-nowrap text-sm text-slate-900">
406
- {pipeline.execution_count}
451
+ {(pipeline.app_id && appNameById.get(pipeline.app_id)) || '—'}
407
452
  </td>
408
453
  <td className="px-6 py-4 whitespace-nowrap text-sm text-slate-500">
409
- {pipeline.last_execution ? formatDateTime(pipeline.last_execution) : 'Never'}
454
+ {lastExecByPipeline.get(pipeline.id) ? formatDateTime(lastExecByPipeline.get(pipeline.id)!) : 'Never'}
410
455
  </td>
411
456
  <td className="px-6 py-4 whitespace-nowrap text-right text-sm font-medium">
412
457
  <div className="flex justify-end space-x-2" onClick={(e) => e.stopPropagation()}>
@@ -434,10 +479,10 @@ export function PipelinesPage() {
434
479
  </AdminListPage>
435
480
  )
436
481
  }
437
- // CIL[DOC-VECTOR type="context" content="purpose='Render and manage the admin pipelines list page.'; No verified external callers; imports: .framework/src/hooks/useApi.ts,.framework/src/lib/api.ts,.framework/src/components/ui/LoadingSpinner.tsx"]
438
- // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
439
- // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
440
- // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
441
- // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
442
- // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
443
- // CIL[END stable_id="~/.framework/src/pages/admin/PipelinesPage.tsx:PipelinesPage:component"]
482
+ // CIL[END stable_id="~/.framework/src/pages/admin/PipelinesPage.tsx:PipelinesPage:component"]
483
+
484
+
485
+
486
+
487
+
488
+