spine-framework 0.4.4 → 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 (283) 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/hash-api-key.ts +183 -79
  15. package/.framework/functions/_shared/logging.ts +562 -224
  16. package/.framework/functions/_shared/middleware.ts +47 -44
  17. package/.framework/functions/admin-data.ts +39 -28
  18. package/.framework/functions/ai-agents.ts +10 -6
  19. package/.framework/functions/api-keys.ts +301 -122
  20. package/.framework/functions/apps.ts +43 -26
  21. package/.framework/functions/cil-ingest.ts +48 -15
  22. package/.framework/functions/debug-auth.ts +14 -8
  23. package/.framework/functions/deliveries.ts +39 -12
  24. package/.framework/functions/embeddings.ts +145 -76
  25. package/.framework/functions/integration-outbound.ts +67 -27
  26. package/.framework/functions/integrations.ts +254 -127
  27. package/.framework/functions/logs.ts +273 -133
  28. package/.framework/functions/observability.ts +277 -147
  29. package/.framework/functions/pipeline-executions.ts +1 -1
  30. package/.framework/functions/pipelines.ts +14 -9
  31. package/.framework/functions/prompt-configs.ts +7 -4
  32. package/.framework/functions/roles.ts +8 -5
  33. package/.framework/functions/security.ts +30 -17
  34. package/.framework/functions/system-cron.ts +240 -127
  35. package/.framework/functions/tests.ts +7 -6
  36. package/.framework/functions/timers.ts +310 -107
  37. package/.framework/functions/triggers.ts +28 -13
  38. package/.framework/functions/types.ts +13 -10
  39. package/.framework/migrations/069_log_stats_window.sql +54 -0
  40. package/.framework/migrations/070_app_type_schema_rpcs.sql +166 -0
  41. package/.framework/migrations/071_timer_interval_keys.sql +96 -0
  42. package/.framework/migrations/072_slug_autofill.sql +77 -0
  43. package/.framework/migrations/073_seed_member_roles.sql +26 -0
  44. package/.framework/src/apps/admin/index.tsx +1141 -775
  45. package/.framework/src/components/ErrorBoundary.tsx +136 -0
  46. package/.framework/src/components/admin/AdminListPage.tsx +81 -73
  47. package/.framework/src/components/admin/AdminSidebar.tsx +88 -79
  48. package/.framework/src/components/admin/EntitySelect.tsx +181 -0
  49. package/.framework/src/components/admin/PageInstructions.tsx +86 -127
  50. package/.framework/src/components/app-shell/GenericDetailPage.tsx +37 -13
  51. package/.framework/src/components/app-shell/GenericListPage.tsx +28 -32
  52. package/.framework/src/components/layout/Sidebar.tsx +300 -177
  53. package/.framework/src/components/runtime/DataDetailPage.tsx +67 -35
  54. package/.framework/src/components/runtime/DataHeader.tsx +96 -48
  55. package/.framework/src/components/runtime/DataListPage.tsx +3 -26
  56. package/.framework/src/components/runtime/DataStats.tsx +10 -10
  57. package/.framework/src/components/runtime/DataTable.tsx +12 -10
  58. package/.framework/src/components/ui/sheet.tsx +24 -26
  59. package/.framework/src/components/ui/textarea.tsx +74 -48
  60. package/.framework/src/hooks/useEntityList.ts +12 -9
  61. package/.framework/src/hooks/useListSchema.ts +108 -58
  62. package/.framework/src/instructions/README.md +57 -0
  63. package/.framework/src/instructions/ai-agents.md +69 -0
  64. package/.framework/src/instructions/alerts.md +80 -0
  65. package/.framework/src/instructions/api-keys.md +87 -0
  66. package/.framework/src/instructions/apps.md +77 -0
  67. package/.framework/src/instructions/concepts/ai-and-prompts.md +150 -0
  68. package/.framework/src/instructions/concepts/apps-and-renderers.md +162 -0
  69. package/.framework/src/instructions/concepts/auth-and-api-keys.md +133 -0
  70. package/.framework/src/instructions/concepts/automation.md +186 -0
  71. package/.framework/src/instructions/concepts/concurrency-and-idempotency.md +125 -0
  72. package/.framework/src/instructions/concepts/core-vs-custom.md +124 -0
  73. package/.framework/src/instructions/concepts/design-schema.md +152 -0
  74. package/.framework/src/instructions/concepts/integrations-and-webhooks.md +127 -0
  75. package/.framework/src/instructions/concepts/observability.md +116 -0
  76. package/.framework/src/instructions/concepts/permissions.md +150 -0
  77. package/.framework/src/instructions/concepts/runtime-records.md +111 -0
  78. package/.framework/src/instructions/concepts/scope-and-accounts.md +112 -0
  79. package/.framework/src/instructions/concepts/spine-way.md +172 -0
  80. package/.framework/src/instructions/deliveries.md +59 -0
  81. package/.framework/src/instructions/guide/00-orientation.md +106 -0
  82. package/.framework/src/instructions/guide/01-install-and-first-run.md +253 -0
  83. package/.framework/src/instructions/guide/02-project-map.md +147 -0
  84. package/.framework/src/instructions/guide/03-domain-model.md +223 -0
  85. package/.framework/src/instructions/guide/04-first-app.md +227 -0
  86. package/.framework/src/instructions/guide/05-glossary.md +183 -0
  87. package/.framework/src/instructions/integrations.md +96 -0
  88. package/.framework/src/instructions/internal/cil-markers.md +83 -0
  89. package/.framework/src/instructions/invites.md +60 -0
  90. package/.framework/src/instructions/kb.md +80 -0
  91. package/.framework/src/instructions/logs.md +77 -0
  92. package/.framework/src/instructions/observability.md +61 -0
  93. package/.framework/src/instructions/operations/deployment.md +115 -0
  94. package/.framework/src/instructions/operations/migrations.md +125 -0
  95. package/.framework/src/instructions/operations/security-checklist.md +148 -0
  96. package/.framework/src/instructions/operations/troubleshooting.md +170 -0
  97. package/.framework/src/instructions/operations/upgrade.md +116 -0
  98. package/.framework/src/instructions/pipeline-executions.md +62 -0
  99. package/.framework/src/instructions/pipelines.md +78 -0
  100. package/.framework/src/instructions/prompts.md +95 -0
  101. package/.framework/src/instructions/reference/api/admin-data.md +162 -0
  102. package/.framework/src/instructions/reference/api/auth.md +113 -0
  103. package/.framework/src/instructions/reference/api/errors-and-envelopes.md +113 -0
  104. package/.framework/src/instructions/reference/app-manifest.md +150 -0
  105. package/.framework/src/instructions/reference/cli.md +124 -0
  106. package/.framework/src/instructions/reference/database.md +132 -0
  107. package/.framework/src/instructions/reference/design-schema.md +280 -0
  108. package/.framework/src/instructions/reference/env-vars.md +133 -0
  109. package/.framework/src/instructions/reference/functions/account-nodes.md +75 -0
  110. package/.framework/src/instructions/reference/functions/admin-data.md +195 -0
  111. package/.framework/src/instructions/reference/functions/admin-funnel.md +90 -0
  112. package/.framework/src/instructions/reference/functions/admin-install-funnel.md +107 -0
  113. package/.framework/src/instructions/reference/functions/admin-signals.md +102 -0
  114. package/.framework/src/instructions/reference/functions/ai-agents.md +148 -0
  115. package/.framework/src/instructions/reference/functions/ai-interactions.md +156 -0
  116. package/.framework/src/instructions/reference/functions/api-keys.md +130 -0
  117. package/.framework/src/instructions/reference/functions/apps.md +140 -0
  118. package/.framework/src/instructions/reference/functions/auth.md +99 -0
  119. package/.framework/src/instructions/reference/functions/debug-auth.md +91 -0
  120. package/.framework/src/instructions/reference/functions/deliveries.md +110 -0
  121. package/.framework/src/instructions/reference/functions/embeddings.md +166 -0
  122. package/.framework/src/instructions/reference/functions/eval-harness.md +149 -0
  123. package/.framework/src/instructions/reference/functions/index.md +103 -0
  124. package/.framework/src/instructions/reference/functions/integration-outbound.md +200 -0
  125. package/.framework/src/instructions/reference/functions/integration-routes.md +151 -0
  126. package/.framework/src/instructions/reference/functions/integrations.md +130 -0
  127. package/.framework/src/instructions/reference/functions/invites.md +182 -0
  128. package/.framework/src/instructions/reference/functions/item-progress.md +107 -0
  129. package/.framework/src/instructions/reference/functions/kb.md +166 -0
  130. package/.framework/src/instructions/reference/functions/logs.md +141 -0
  131. package/.framework/src/instructions/reference/functions/observability.md +105 -0
  132. package/.framework/src/instructions/reference/functions/pipeline-executions.md +132 -0
  133. package/.framework/src/instructions/reference/functions/pipeline-runner-background.md +121 -0
  134. package/.framework/src/instructions/reference/functions/pipelines.md +136 -0
  135. package/.framework/src/instructions/reference/functions/prompt-configs.md +121 -0
  136. package/.framework/src/instructions/reference/functions/roles.md +121 -0
  137. package/.framework/src/instructions/reference/functions/security.md +140 -0
  138. package/.framework/src/instructions/reference/functions/system-cron.md +136 -0
  139. package/.framework/src/instructions/reference/functions/system.md +106 -0
  140. package/.framework/src/instructions/reference/functions/tests.md +97 -0
  141. package/.framework/src/instructions/reference/functions/timers.md +117 -0
  142. package/.framework/src/instructions/reference/functions/trigger-scheduler.md +102 -0
  143. package/.framework/src/instructions/reference/functions/triggers.md +140 -0
  144. package/.framework/src/instructions/reference/functions/types.md +146 -0
  145. package/.framework/src/instructions/reference/seeds.md +126 -0
  146. package/.framework/src/instructions/reference/shared-modules.md +127 -0
  147. package/.framework/src/instructions/reference/spine-config.md +114 -0
  148. package/.framework/src/instructions/roles.md +80 -0
  149. package/.framework/src/instructions/runtime-detail.md +70 -0
  150. package/.framework/src/instructions/runtime-list.md +77 -0
  151. package/.framework/src/instructions/security.md +67 -0
  152. package/.framework/src/instructions/tasks/add-a-pipeline.md +110 -0
  153. package/.framework/src/instructions/tasks/add-a-role.md +96 -0
  154. package/.framework/src/instructions/tasks/add-a-timer.md +114 -0
  155. package/.framework/src/instructions/tasks/add-a-trigger.md +106 -0
  156. package/.framework/src/instructions/tasks/add-a-type.md +151 -0
  157. package/.framework/src/instructions/tasks/add-a-webhook.md +108 -0
  158. package/.framework/src/instructions/tasks/add-an-ai-agent.md +108 -0
  159. package/.framework/src/instructions/tasks/add-an-integration.md +124 -0
  160. package/.framework/src/instructions/tasks/build-a-custom-page.md +118 -0
  161. package/.framework/src/instructions/tasks/package-and-install-an-app.md +127 -0
  162. package/.framework/src/instructions/tasks/test-your-code.md +108 -0
  163. package/.framework/src/instructions/tasks/write-a-function.md +132 -0
  164. package/.framework/src/instructions/tasks/write-a-migration.md +110 -0
  165. package/.framework/src/instructions/testing.md +59 -0
  166. package/.framework/src/instructions/timers.md +82 -0
  167. package/.framework/src/instructions/triggers.md +69 -0
  168. package/.framework/src/instructions/types.md +93 -0
  169. package/.framework/src/pages/NotFoundPage.tsx +62 -31
  170. package/.framework/src/pages/admin/AIAgentDetailPage.tsx +117 -106
  171. package/.framework/src/pages/admin/AIAgentsPage.tsx +86 -48
  172. package/.framework/src/pages/admin/APIKeyDetailPage.tsx +153 -152
  173. package/.framework/src/pages/admin/APIKeysPage.tsx +91 -90
  174. package/.framework/src/pages/admin/AlertsConfigPage.tsx +29 -18
  175. package/.framework/src/pages/admin/AppDetailPage.tsx +6 -60
  176. package/.framework/src/pages/admin/AppsPage.tsx +104 -66
  177. package/.framework/src/pages/admin/DeliveriesPage.tsx +5 -5
  178. package/.framework/src/pages/admin/EmbeddingDetailPage.tsx +5 -23
  179. package/.framework/src/pages/admin/EmbeddingsPage.tsx +5 -26
  180. package/.framework/src/pages/admin/IntegrationDetailPage.tsx +7 -7
  181. package/.framework/src/pages/admin/IntegrationsPage.tsx +85 -43
  182. package/.framework/src/pages/admin/LogsPage.tsx +144 -76
  183. package/.framework/src/pages/admin/ObservabilityDashboard.tsx +223 -140
  184. package/.framework/src/pages/admin/PipelineDetailPage.tsx +134 -113
  185. package/.framework/src/pages/admin/PipelineExecutionsPage.tsx +108 -45
  186. package/.framework/src/pages/admin/PipelinesPage.tsx +160 -115
  187. package/.framework/src/pages/admin/PromptConfigDetailPage.tsx +96 -98
  188. package/.framework/src/pages/admin/PromptConfigsPage.tsx +101 -59
  189. package/.framework/src/pages/admin/RoleDetailPage.tsx +90 -79
  190. package/.framework/src/pages/admin/RolesPage.tsx +86 -43
  191. package/.framework/src/pages/admin/SecurityPage.tsx +1 -1
  192. package/.framework/src/pages/admin/TestingDashboard.tsx +16 -28
  193. package/.framework/src/pages/admin/TimerDetailPage.tsx +117 -100
  194. package/.framework/src/pages/admin/TimersPage.tsx +90 -62
  195. package/.framework/src/pages/admin/TriggerDetailPage.tsx +90 -83
  196. package/.framework/src/pages/admin/TriggersPage.tsx +124 -99
  197. package/.framework/src/pages/admin/TypeDetailPage.tsx +152 -138
  198. package/.framework/src/pages/admin/TypesPage.tsx +90 -48
  199. package/.framework/src/pages/admin/cil/CILAgentPage.tsx +17 -25
  200. package/.framework/src/pages/admin/cil/CILChunkDetailPage.tsx +17 -27
  201. package/.framework/src/pages/admin/cil/CILDashboardPage.tsx +72 -40
  202. package/.framework/src/pages/admin/cil/CILFileListPage.tsx +321 -129
  203. package/.framework/src/pages/admin/cil/CILFileSelectPage.tsx +18 -29
  204. package/.framework/src/pages/admin/cil/CILGraphPage.tsx +26 -38
  205. package/.framework/src/pages/admin/cil/CILIngestionPage.tsx +34 -46
  206. package/.framework/src/pages/admin/cil/CILProjectsPage.tsx +189 -103
  207. package/.framework/src/pages/admin/cil/CILSearchPage.tsx +246 -136
  208. package/.framework/src/pages/admin/cil/CILSuggestionsPage.tsx +11 -22
  209. package/.framework/src/pages/admin/cil/CILVersionsPage.tsx +9 -20
  210. package/.framework/src/pages/admin/cil/FlexiblePipelinePage.tsx +26 -38
  211. package/.framework/src/pages/admin/kb/KBAdminPage.tsx +7 -26
  212. package/.framework/templates/agent/AGENTS.md +150 -0
  213. package/.framework/templates/agent/skills/spine-add-ai-agent/SKILL.md +58 -0
  214. package/.framework/templates/agent/skills/spine-add-automation/SKILL.md +62 -0
  215. package/.framework/templates/agent/skills/spine-add-integration/SKILL.md +63 -0
  216. package/.framework/templates/agent/skills/spine-architect/SKILL.md +86 -0
  217. package/.framework/templates/agent/skills/spine-install-app/SKILL.md +72 -0
  218. package/.framework/templates/agent/skills/spine-migration/SKILL.md +75 -0
  219. package/.framework/templates/agent/skills/spine-new-app/SKILL.md +67 -0
  220. package/.framework/templates/agent/skills/spine-new-function/SKILL.md +65 -0
  221. package/.framework/templates/agent/skills/spine-new-type/SKILL.md +65 -0
  222. package/.framework/templates/agent/skills/spine-schema/SKILL.md +77 -0
  223. package/.framework/templates/agent/skills/spine-test/SKILL.md +67 -0
  224. package/.framework/templates/agent/skills/spine-troubleshoot/SKILL.md +74 -0
  225. package/.framework/templates/agent/skills/spine-upgrade/SKILL.md +69 -0
  226. package/.framework/templates/project.json +4 -1
  227. package/.framework/tests/unit/account-scoping-gates.test.ts +392 -0
  228. package/.framework/tests/unit/agent-files.test.ts +355 -0
  229. package/.framework/tests/unit/agent-runner.test.ts +479 -44
  230. package/.framework/tests/unit/api-keys-create-scope-gate.test.ts +160 -0
  231. package/.framework/tests/unit/api-keys-omit-secret-fields.test.ts +38 -0
  232. package/.framework/tests/unit/bootstrap.test.ts +242 -0
  233. package/.framework/tests/unit/cli-context-api-key.test.ts +114 -0
  234. package/.framework/tests/unit/debug-auth.test.ts +38 -0
  235. package/.framework/tests/unit/deliveries-account-scoping.test.ts +185 -0
  236. package/.framework/tests/unit/integration-outbound-credentials.test.ts +167 -0
  237. package/.framework/tests/unit/integrations-audit-redaction.test.ts +130 -0
  238. package/.framework/tests/unit/logging-app-id.test.ts +75 -0
  239. package/.framework/tests/unit/system-context-denial.test.ts +145 -0
  240. package/.framework/tests/unit/system-cron.test.ts +240 -0
  241. package/.framework/tests/unit/timers.test.ts +159 -0
  242. package/README.md +125 -166
  243. package/config/tsconfig.cli.json +2 -2
  244. package/package.json +15 -4
  245. package/templates/project/package-lock.json +2 -2
  246. package/.framework/docs/admin-routes.md +0 -76
  247. package/.framework/docs/api-docs-progress.md +0 -38
  248. package/.framework/docs/api-governance.md +0 -146
  249. package/.framework/docs/api-testing-results.md +0 -212
  250. package/.framework/docs/assembly-launch-guide.md +0 -138
  251. package/.framework/docs/audit-results.md +0 -590
  252. package/.framework/docs/db-api-inventory.md +0 -95
  253. package/.framework/docs/gap-remediation-backlog.md +0 -103
  254. package/.framework/docs/ui-adoption-verification.md +0 -111
  255. package/.framework/docs/ui-api-coverage.md +0 -84
  256. package/.framework/docs/v2-compatibility-audit.md +0 -228
  257. package/.framework/mcp/index.ts +0 -133
  258. package/.framework/mcp/load-env.ts +0 -60
  259. package/.framework/mcp/shared/app-manifest.ts +0 -275
  260. package/.framework/mcp/shared/db.ts +0 -477
  261. package/.framework/mcp/shared/kb.ts +0 -118
  262. package/.framework/mcp/tools/architect.ts +0 -431
  263. package/.framework/mcp/tools/cil/context.ts +0 -345
  264. package/.framework/mcp/tools/cil/graph.ts +0 -242
  265. package/.framework/mcp/tools/cil/ingest.ts +0 -1217
  266. package/.framework/mcp/tools/cil/pipeline-orchestrator.ts +0 -693
  267. package/.framework/mcp/tools/cil/pipeline.ts +0 -767
  268. package/.framework/mcp/tools/cil/project.ts +0 -791
  269. package/.framework/mcp/tools/cil/retrieval.ts +0 -336
  270. package/.framework/mcp/tools/cil/search-core.ts +0 -454
  271. package/.framework/mcp/tools/cil/search.ts +0 -97
  272. package/.framework/mcp/tools/cil/suggest.ts +0 -186
  273. package/.framework/mcp/tools/cil/validate.ts +0 -1369
  274. package/.framework/mcp/tools/kb/delete.ts +0 -139
  275. package/.framework/mcp/tools/kb/index.ts +0 -52
  276. package/.framework/mcp/tools/kb/ingest.ts +0 -84
  277. package/.framework/mcp/tools/kb/list-types.ts +0 -102
  278. package/.framework/mcp/tools/kb/publish.ts +0 -100
  279. package/.framework/mcp/tools/kb/reindex.ts +0 -86
  280. package/.framework/mcp/tools/kb/revoke.ts +0 -85
  281. package/.framework/mcp/tools/kb/search.ts +0 -101
  282. package/.framework/mcp/tools/kb/upsert.ts +0 -125
  283. package/.framework/mcp/tools/observability.ts +0 -510
@@ -1,12 +1,28 @@
1
1
  // CIL[BEGIN stable_id="~/.framework/src/pages/admin/TriggerDetailPage.tsx:module_header:module_header" type="module_header" identity="module_header" parent="~/.framework/src/pages/admin/TriggerDetailPage.tsx"]
2
- // CIL[DOC-MACRO purpose="Provides the admin trigger detail page module"]
3
- // CIL[DOC-RESPONSIBILITY responsibility="Imports React, routing, UI components, and utilities used by TriggerDetailPage"]
4
- // CIL[DOC-CONTEXT module="triggers" layer="presentation" related_files=".framework/src/components/admin/PageInstructions.tsx,.framework/src/components/ui/alert.tsx,.framework/src/components/ui/badge.tsx,.framework/src/components/ui/button.tsx,.framework/src/components/ui/card.tsx,.framework/src/components/ui/checkbox.tsx,.framework/src/components/ui/input.tsx,.framework/src/components/ui/label.tsx,.framework/src/components/ui/select.tsx,.framework/src/components/ui/skeleton.tsx,.framework/src/components/ui/textarea.tsx,.framework/src/lib/api.ts,.framework/src/lib/utils.ts"]
5
- // CIL[DOC-CONTRACT inputs="none" outputs="none" errors="none" side_effects="none"]
6
- // CIL[DOC-MICRO logic_summary="Assembles the module dependencies for the admin trigger detail and editing page" 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"]
2
+ /**
3
+ * @module TriggerDetailPage
4
+ * @audience internal
5
+ * @layer app-specific
6
+ * @stability stable
7
+ *
8
+ * The TriggerDetailPage module is responsible for displaying and managing the details of a specific trigger within the admin interface. It allows users to view, edit, and configure trigger settings, integrating with the backend API for data fetching and updates. INVARIANT: The user must have appropriate permissions to access this page.
9
+ *
10
+ * @seeAlso apiFetch (for data fetching functionality).
11
+ * @seeAlso PageInstructions (for user guidance on the page).
12
+ * @seeAlso EntitySelect (for selecting entities related to triggers).
13
+ * @seeAlso utils (for utility functions like formatDateTime).
14
+ *
15
+ * @cil-generated
16
+ */
17
+
18
+
19
+
20
+
21
+
22
+
23
+
24
+
25
+
10
26
 
11
27
 
12
28
 
@@ -20,30 +36,40 @@ import { Textarea } from '../../components/ui/textarea'
20
36
  import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../../components/ui/select'
21
37
  import { Checkbox } from '../../components/ui/checkbox'
22
38
  import { Label } from '../../components/ui/label'
39
+ import { AppSelect, PipelineSelect } from '../../components/admin/EntitySelect'
23
40
  import { Card, CardContent, CardHeader, CardTitle } from '../../components/ui/card'
24
41
  import { Skeleton } from '../../components/ui/skeleton'
25
42
  import { Alert, AlertDescription, AlertTitle } from '../../components/ui/alert'
26
43
  import { Badge } from '../../components/ui/badge'
27
44
  import { ArrowLeft, Zap, AlertCircle } from 'lucide-react'
28
45
  import { formatDateTime } from '../../lib/utils'
29
- import { PageInstructions } from '../../components/admin/PageInstructions'
30
-
31
- // CIL[DOC-VECTOR type="context" content="purpose='Provides the admin trigger detail page module'; No verified external callers; imports: .framework/src/lib/api.ts,.framework/src/components/ui/button.tsx,.framework/src/components/ui/input.tsx"]
32
- // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
33
- // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
34
- // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
35
- // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
36
- // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
37
46
  // CIL[END stable_id="~/.framework/src/pages/admin/TriggerDetailPage.tsx:module_header:module_header"]
38
- // CIL[BEGIN stable_id="~/.framework/src/pages/admin/TriggerDetailPage.tsx:Trigger:interface" type="interface" identity="Trigger" parent="~/.framework/src/pages/admin/TriggerDetailPage.tsx"]
39
- // CIL[DOC-MACRO purpose="Defines the shape of a trigger record"]
40
- // CIL[DOC-RESPONSIBILITY responsibility="Provides the TypeScript interface for trigger data used in the admin page"]
41
- // CIL[DOC-CONTEXT module="triggers" layer="presentation" related_files=".framework/src/components/admin/PageInstructions.tsx,.framework/src/components/ui/alert.tsx,.framework/src/components/ui/badge.tsx,.framework/src/components/ui/button.tsx,.framework/src/components/ui/card.tsx,.framework/src/components/ui/checkbox.tsx,.framework/src/components/ui/input.tsx,.framework/src/components/ui/label.tsx,.framework/src/components/ui/select.tsx,.framework/src/components/ui/skeleton.tsx,.framework/src/components/ui/textarea.tsx,.framework/src/lib/api.ts,.framework/src/lib/utils.ts,.framework/src/pages/admin/TriggerDetailPage.tsx"]
42
- // CIL[DOC-CONTRACT inputs="none" outputs="Trigger type definition" errors="none" side_effects="none"]
43
- // CIL[DOC-MICRO logic_summary="Declares the fields, optionality, and types for a Trigger record" notable_decisions="[]"]
44
- // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
45
- // CIL[DOC-STABILITY stability="stable"]
46
47
 
48
+
49
+
50
+
51
+
52
+
53
+
54
+
55
+
56
+
57
+
58
+
59
+
60
+
61
+
62
+
63
+
64
+
65
+ // CIL[BEGIN stable_id="~/.framework/src/pages/admin/TriggerDetailPage.tsx:Trigger:interface" type="interface" identity="Trigger" parent="~/.framework/src/pages/admin/TriggerDetailPage.tsx"]
66
+ /**
67
+ * The Trigger interface defines the structure for a trigger object used in the application, encapsulating essential properties related to the trigger's identity, configuration, and state. It serves to standardize the representation of triggers across the application.
68
+ *
69
+ * @sideEffects none
70
+ * @stability stable
71
+ * @cil-generated
72
+ */
47
73
  interface Trigger {
48
74
  id: string
49
75
  name: string
@@ -57,23 +83,39 @@ interface Trigger {
57
83
  created_at: string
58
84
  updated_at: string
59
85
  }
60
- // CIL[DOC-VECTOR type="context" content="purpose='Defines the shape of a trigger record'; No verified external callers; imports: .framework/src/lib/api.ts,.framework/src/components/ui/button.tsx,.framework/src/components/ui/input.tsx"]
61
- // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
62
- // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
63
- // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
64
- // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
65
- // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
66
86
  // CIL[END stable_id="~/.framework/src/pages/admin/TriggerDetailPage.tsx:Trigger:interface"]
67
87
 
68
- // CIL[BEGIN stable_id="~/.framework/src/pages/admin/TriggerDetailPage.tsx:TriggerDetailPage:component" type="component" identity="TriggerDetailPage" parent="~/.framework/src/pages/admin/TriggerDetailPage.tsx"]
69
- // CIL[DOC-MACRO purpose="Renders and manages the trigger create/edit form"]
70
- // CIL[DOC-RESPONSIBILITY responsibility="Fetches trigger data, manages form state, validates JSON, and saves the trigger via the admin API"]
71
- // CIL[DOC-CONTEXT module="triggers" layer="presentation" related_files=".framework/src/components/admin/PageInstructions.tsx,.framework/src/components/ui/alert.tsx,.framework/src/components/ui/badge.tsx,.framework/src/components/ui/button.tsx,.framework/src/components/ui/card.tsx,.framework/src/components/ui/checkbox.tsx,.framework/src/components/ui/input.tsx,.framework/src/components/ui/label.tsx,.framework/src/components/ui/select.tsx,.framework/src/components/ui/skeleton.tsx,.framework/src/components/ui/textarea.tsx,.framework/src/lib/api.ts,.framework/src/lib/utils.ts,.framework/src/pages/admin/TriggerDetailPage.tsx"]
72
- // CIL[DOC-CONTRACT inputs="id route param" outputs="JSX detail page with edit/create controls" errors="API or JSON parse failures" side_effects="Updates form state, navigates on save"]
73
- // CIL[DOC-MICRO logic_summary="Loads a trigger, supports create and edit modes, validates config and metadata JSON, persists via apiFetch, and renders PageInstructions" notable_decisions="[]"]
74
- // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
75
- // CIL[DOC-STABILITY stability="stable"]
76
88
 
89
+
90
+
91
+
92
+
93
+
94
+
95
+
96
+
97
+
98
+
99
+
100
+
101
+
102
+
103
+
104
+
105
+
106
+ // CIL[BEGIN stable_id="~/.framework/src/pages/admin/TriggerDetailPage.tsx:TriggerDetailPage:component" type="component" identity="TriggerDetailPage" parent="~/.framework/src/pages/admin/TriggerDetailPage.tsx"]
107
+ /**
108
+ * The TriggerDetailPage component manages the creation and editing of trigger configurations in an admin interface. It handles fetching existing trigger data or initializing a new trigger form based on the provided ID.
109
+ *
110
+ * @macro Component for managing trigger details in an admin interface.
111
+ * @micro Utilizes React hooks for state management and side effects, including fetching data from an external API.
112
+ * @outputSpec JSX.Element
113
+ * @sideEffects Fetches trigger data from an external API, updates application state.
114
+ * @stability stable
115
+ * @calls apiFetch, useParams, useNavigate
116
+ * @errorHandling Sets error state on failure to fetch or save trigger data.
117
+ * @cil-generated
118
+ */
77
119
  export function TriggerDetailPage() {
78
120
  const { id } = useParams<{ id: string }>()
79
121
  const navigate = useNavigate()
@@ -174,54 +216,18 @@ export function TriggerDetailPage() {
174
216
  ) : !isCreateMode && <Button onClick={() => setIsEditing(true)}>Edit</Button>}
175
217
  </div>
176
218
  </div>
177
-
178
- <PageInstructions
179
- description="Define a trigger that reacts to events and invokes a pipeline."
180
- sections={[
181
- { title: 'What this trigger controls', content: 'A trigger listens for a Spine event_type and, when active, hands the event payload to a pipeline for processing. The config and metadata JSON objects configure the trigger engine.' },
182
- { title: 'Fields explained', content: <ul className="list-disc pl-4 space-y-1">
183
- <li><strong>Name</strong> — string. The display name. Missing name prevents saving.</li>
184
- <li><strong>Event Type</strong> — string. The event to listen to, e.g. item.created. Must match the emitted event name exactly.</li>
185
- <li><strong>App ID</strong> — string. Optional owning app UUID; blank means account-scoped.</li>
186
- <li><strong>Pipeline ID</strong> — string. The pipeline to invoke when the trigger fires.</li>
187
- <li><strong>Active</strong> — checkbox. Inactive triggers ignore all events.</li>
188
- <li><strong>Description</strong> — string. Optional notes.</li>
189
- <li><strong>Config (JSON)</strong> — JSON. Trigger engine configuration, e.g. filters or payload mapping.</li>
190
- <li><strong>Metadata (JSON)</strong> — JSON. Optional metadata about the trigger.</li>
191
- </ul> },
192
- { title: 'Options and values', content: <ul className="list-disc pl-4 space-y-1">
193
- <li><strong>Active</strong>: enabled means the trigger subscribes to the event bus; disabled means it is ignored.</li>
194
- </ul> },
195
- { title: 'Downstream impact', content: <ul className="list-disc pl-4 space-y-1">
196
- <li>The event bus routes matching events to active triggers. A wrong Event Type means no execution.</li>
197
- <li>Pipeline ID must refer to an existing pipeline; otherwise the event is dropped.</li>
198
- <li>Config JSON is passed to the trigger engine; bad config can cause repeated failures.</li>
199
- </ul> },
200
- { title: 'How to create, save, and validate', content: <ol className="list-decimal pl-4 space-y-1">
201
- <li>In create mode, enter the name, event type, and pipeline ID, and provide Config and Metadata as valid JSON.</li>
202
- <li>Click Create or Save. The form validates JSON and required fields.</li>
203
- <li>After saving, the trigger subscribes to the event bus when active.</li>
204
- </ol> },
205
- { title: 'Common mistakes', content: <ul className="list-disc pl-4 space-y-1">
206
- <li>Using a typo in the Event Type so the trigger never matches.</li>
207
- <li>Forgetting to set Active after saving.</li>
208
- <li>Writing Config as a string instead of a JSON object.</li>
209
- </ul> },
210
- ]}
211
- />
212
-
213
219
  <Card><CardContent className="p-6 space-y-6">
214
220
  <div className="grid grid-cols-1 md:grid-cols-2 gap-6">
215
221
  <div className="space-y-4">
216
222
  <h3 className="text-sm font-medium text-muted-foreground">Trigger</h3>
217
223
  <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">{trigger?.name}</div>}</div>
218
- <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">{trigger?.app_id || '—'}</div>}</div>
224
+ <div className="space-y-2"><Label>App</Label>{isEditing ? <AppSelect value={formData.app_id} onChange={v => setFormData({...formData, app_id: v})} /> : <div className="text-sm font-mono">{trigger?.app_id || '—'}</div>}</div>
219
225
  <div className="space-y-2"><Label>Event Type</Label>{isEditing ? <Input value={formData.event_type} onChange={e => setFormData({...formData, event_type: e.target.value})} placeholder="e.g., item.created" /> : <Badge>{trigger?.event_type}</Badge>}</div>
220
226
  <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">{trigger?.is_active ? 'Yes' : 'No'}</div>}</div>
221
227
  </div>
222
228
  <div className="space-y-4">
223
229
  <h3 className="text-sm font-medium text-muted-foreground">Action</h3>
224
- <div className="space-y-2"><Label>Pipeline ID</Label>{isEditing ? <Input value={formData.pipeline_id} onChange={e => setFormData({...formData, pipeline_id: e.target.value})} placeholder="Pipeline to invoke" /> : <div className="text-sm font-mono">{trigger?.pipeline_id || '—'}</div>}</div>
230
+ <div className="space-y-2"><Label>Pipeline</Label>{isEditing ? <PipelineSelect value={formData.pipeline_id} onChange={v => setFormData({...formData, pipeline_id: v})} /> : <div className="text-sm font-mono">{trigger?.pipeline_id || '—'}</div>}</div>
225
231
  </div>
226
232
  </div>
227
233
  <div className="mt-6 space-y-2"><Label>Description</Label>{isEditing ? <Textarea value={formData.description} onChange={e => setFormData({...formData, description: e.target.value})} rows={2} /> : <div className="text-sm">{trigger?.description || '—'}</div>}</div>
@@ -233,10 +239,11 @@ export function TriggerDetailPage() {
233
239
  </div>
234
240
  )
235
241
  }
236
- // CIL[DOC-VECTOR type="context" content="purpose='Renders and manages the trigger create/edit form'; No verified external callers; imports: .framework/src/lib/api.ts,.framework/src/components/ui/button.tsx,.framework/src/components/ui/input.tsx"]
237
- // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
238
- // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
239
- // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
240
- // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
241
- // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
242
- // CIL[END stable_id="~/.framework/src/pages/admin/TriggerDetailPage.tsx:TriggerDetailPage:component"]
242
+ // CIL[END stable_id="~/.framework/src/pages/admin/TriggerDetailPage.tsx:TriggerDetailPage:component"]
243
+
244
+
245
+
246
+
247
+
248
+
249
+
@@ -1,12 +1,28 @@
1
1
  // CIL[BEGIN stable_id="~/.framework/src/pages/admin/TriggersPage.tsx:module_header:module_header" type="module_header" identity="module_header" parent="~/.framework/src/pages/admin/TriggersPage.tsx"]
2
- // CIL[DOC-MACRO purpose="Admin triggers management module for the Spine framework"]
3
- // CIL[DOC-RESPONSIBILITY responsibility="Declare the TriggersPage module and its core dependencies for admin configuration"]
4
- // CIL[DOC-CONTEXT module="admin" layer="presentation" related_files=".framework/src/components/admin/AdminListPage.tsx,.framework/src/components/admin/SortableTableHeader.tsx,.framework/src/components/ui/LoadingSpinner.tsx,.framework/src/components/ui/Modal.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="module imports and component exports" errors="none" side_effects="none"]
6
- // CIL[DOC-MICRO logic_summary="Imports React hooks, API utilities, Lucide icons, and admin UI components used by TriggersPage" notable_decisions="[]"]
7
- // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
8
- // CIL[DOC-STABILITY stability="stable"]
9
- // CIL[DOC-AUDIENCE audience="developers"]
2
+ /**
3
+ * @module TriggersPage
4
+ * @audience internal
5
+ * @layer app-specific
6
+ * @stability stable
7
+ *
8
+ * The TriggersPage module provides an interface for managing triggers within the admin section of the application. It allows users to view, create, and manipulate triggers through a user-friendly UI. This module relies on various UI components and hooks for API interaction and state management.
9
+ *
10
+ * @seeAlso useApi (provides API interaction hooks).
11
+ * @seeAlso LoadingSpinner (displays loading state).
12
+ * @seeAlso AdminListPage (base component for admin list views).
13
+ * @seeAlso SortableTableHeader (enables sorting functionality in tables).
14
+ *
15
+ * @cil-generated
16
+ */
17
+
18
+
19
+
20
+
21
+
22
+
23
+
24
+
25
+
10
26
 
11
27
 
12
28
  import React, { useState } from 'react'
@@ -21,22 +37,32 @@ import { Badge } from '../../components/ui/badge'
21
37
  import { formatDateTime } from '../../lib/utils'
22
38
  import { AdminListPage } from '../../components/admin/AdminListPage'
23
39
  import { SortableTableHeader } from '../../components/admin/SortableTableHeader'
24
-
25
- // CIL[DOC-VECTOR type="context" content="purpose='Admin triggers management module for the Spine framework'; No verified external callers; imports: .framework/src/hooks/useApi.ts,.framework/src/lib/api.ts,.framework/src/components/ui/LoadingSpinner.tsx"]
26
- // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
27
- // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
28
- // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
29
- // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
30
- // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
31
40
  // CIL[END stable_id="~/.framework/src/pages/admin/TriggersPage.tsx:module_header:module_header"]
41
+
42
+
43
+
44
+
45
+
46
+
47
+
48
+
49
+
50
+
51
+
52
+
53
+
54
+
55
+
56
+
57
+
32
58
  // CIL[BEGIN stable_id="~/.framework/src/pages/admin/TriggersPage.tsx:Trigger:interface" type="interface" identity="Trigger" parent="~/.framework/src/pages/admin/TriggersPage.tsx"]
33
- // CIL[DOC-MACRO purpose="Define the data shape for a Trigger record"]
34
- // CIL[DOC-RESPONSIBILITY responsibility="Provide TypeScript typings for trigger entities consumed by TriggersPage"]
35
- // CIL[DOC-CONTEXT module="admin" layer="presentation" related_files=".framework/src/components/admin/AdminListPage.tsx,.framework/src/components/admin/SortableTableHeader.tsx,.framework/src/components/ui/LoadingSpinner.tsx,.framework/src/components/ui/Modal.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/TriggersPage.tsx"]
36
- // CIL[DOC-CONTRACT inputs="none" outputs="Trigger type definition" errors="none" side_effects="none"]
37
- // CIL[DOC-MICRO logic_summary="Describes all fields of a trigger including metadata, scheduling, and execution counters" notable_decisions="[]"]
38
- // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
39
- // CIL[DOC-STABILITY stability="stable"]
59
+ /**
60
+ * The Trigger interface defines the structure for trigger objects used in the admin panel, encapsulating properties related to the trigger's identity, configuration, and state. It serves as a blueprint for managing triggers within the application.
61
+ *
62
+ * @sideEffects none
63
+ * @stability stable
64
+ * @cil-generated
65
+ */
40
66
  interface Trigger {
41
67
  id: string
42
68
  name: string
@@ -50,26 +76,36 @@ interface Trigger {
50
76
  updated_at: string
51
77
  created_by: string
52
78
  account_id: string
53
- execution_count: number
54
- last_execution?: string
55
- next_execution?: string
79
+ trigger_count?: number
80
+ last_triggered?: string
56
81
  }
57
- // CIL[DOC-VECTOR type="context" content="purpose='Define the data shape for a Trigger record'; No verified external callers; imports: .framework/src/hooks/useApi.ts,.framework/src/lib/api.ts,.framework/src/components/ui/LoadingSpinner.tsx"]
58
- // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
59
- // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
60
- // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
61
- // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
62
- // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
63
82
  // CIL[END stable_id="~/.framework/src/pages/admin/TriggersPage.tsx:Trigger:interface"]
64
83
 
84
+
85
+
86
+
87
+
88
+
89
+
90
+
91
+
92
+
93
+
94
+
95
+
96
+
97
+
98
+
99
+
100
+
65
101
  // CIL[BEGIN stable_id="~/.framework/src/pages/admin/TriggersPage.tsx:TriggerExecution:interface" type="interface" identity="TriggerExecution" parent="~/.framework/src/pages/admin/TriggersPage.tsx"]
66
- // CIL[DOC-MACRO purpose="Define the data shape for a trigger execution record"]
67
- // CIL[DOC-RESPONSIBILITY responsibility="Provide TypeScript typings for individual trigger executions"]
68
- // CIL[DOC-CONTEXT module="admin" layer="presentation" related_files=".framework/src/components/admin/AdminListPage.tsx,.framework/src/components/admin/SortableTableHeader.tsx,.framework/src/components/ui/LoadingSpinner.tsx,.framework/src/components/ui/Modal.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/TriggersPage.tsx"]
69
- // CIL[DOC-CONTRACT inputs="none" outputs="TriggerExecution type definition" errors="none" side_effects="none"]
70
- // CIL[DOC-MICRO logic_summary="Describes execution status, timing, payload, and optional error for a single run" notable_decisions="[]"]
71
- // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
72
- // CIL[DOC-STABILITY stability="stable"]
102
+ /**
103
+ * The TriggerExecution interface defines the structure for tracking the execution status of triggers within the system. It captures essential details such as the trigger's ID, execution status, timestamps, and any associated data or errors.
104
+ *
105
+ * @sideEffects none
106
+ * @stability stable
107
+ * @cil-generated
108
+ */
73
109
  interface TriggerExecution {
74
110
  id: string
75
111
  trigger_id: string
@@ -80,24 +116,40 @@ interface TriggerExecution {
80
116
  result?: Record<string, any>
81
117
  error?: string
82
118
  }
83
- // CIL[DOC-VECTOR type="context" content="purpose='Define the data shape for a trigger execution record'; No verified external callers; imports: .framework/src/hooks/useApi.ts,.framework/src/lib/api.ts,.framework/src/components/ui/LoadingSpinner.tsx"]
84
- // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
85
- // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
86
- // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
87
- // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
88
- // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
89
119
  // CIL[END stable_id="~/.framework/src/pages/admin/TriggersPage.tsx:TriggerExecution:interface"]
90
120
 
121
+
122
+
123
+
124
+
125
+
126
+
127
+
128
+
129
+
130
+
131
+
132
+
133
+
134
+
135
+
136
+
137
+
91
138
  // CIL[BEGIN stable_id="~/.framework/src/pages/admin/TriggersPage.tsx:TriggersPage:component" type="component" identity="TriggersPage" parent="~/.framework/src/pages/admin/TriggersPage.tsx"]
92
- // CIL[DOC-MACRO purpose="Render the admin triggers list page with filtering, sorting, and navigation"]
93
- // CIL[DOC-RESPONSIBILITY responsibility="Fetch and display triggers; provide status/type filters, sorting, and row actions"]
94
- // CIL[DOC-CONTEXT module="admin" layer="presentation" related_files=".framework/src/components/admin/AdminListPage.tsx,.framework/src/components/admin/SortableTableHeader.tsx,.framework/src/components/ui/LoadingSpinner.tsx,.framework/src/components/ui/Modal.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/TriggersPage.tsx"]
95
- // CIL[DOC-CONTRACT inputs="none" outputs="JSX for the admin triggers list" errors="Failed to fetch triggers" side_effects="navigates to trigger create, edit, and execution routes; calls toggle/execute/row click handlers"]
96
- // CIL[DOC-MICRO logic_summary="Uses useApi to load triggers, filters and sorts them, then renders an AdminListPage with a data table" notable_decisions="[]"]
97
- // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
98
- // CIL[DOC-STABILITY stability="stable"]
139
+ /**
140
+ * The TriggersPage component manages the display and filtering of trigger events in the admin interface. It allows users to search, sort, and filter triggers based on type and status.
141
+ *
142
+ * @macro User interface component for managing trigger events.
143
+ * @micro Utilizes state management and API calls to fetch and filter trigger data dynamically.
144
+ * @outputSpec JSX.Element — renders the triggers page UI.
145
+ * @throws Error — if the API response is not ok
146
+ * @sideEffects API call to '/api/triggers?action=list'
147
+ * @stability stable
148
+ * @calls apiFetch
149
+ * @errorHandling throws an error if the API response is not ok
150
+ * @cil-generated
151
+ */
99
152
  export function TriggersPage() {
100
- console.log('TriggersPage rendering...')
101
153
  const navigate = useNavigate()
102
154
  const [searchTerm, setSearchTerm] = useState('')
103
155
  const [selectedType, setSelectedType] = useState('all')
@@ -107,28 +159,10 @@ export function TriggersPage() {
107
159
 
108
160
  const { data: triggers, loading, error, refetch } = useApi<Trigger[]>(
109
161
  async ({ signal }: { signal?: AbortSignal }) => {
110
- try {
111
- console.log('Fetching triggers...')
112
-
113
- const response = await apiFetch('/api/triggers?action=list', { signal })
114
- console.log('Response status:', response.status)
115
-
116
- if (!response.ok) {
117
- console.error('Response not ok:', response.statusText)
118
- throw new Error(`Failed to fetch triggers: ${response.statusText}`)
119
- }
120
-
121
- const result = await response.json()
122
- console.log('Raw API result:', result)
123
-
124
- const triggers = result.data || result
125
- console.log('Triggers after processing:', triggers)
126
-
127
- return triggers
128
- } catch (error) {
129
- console.error('Error in TriggersPage:', error)
130
- throw error
131
- }
162
+ const response = await apiFetch('/api/triggers?action=list', { signal })
163
+ if (!response.ok) throw new Error('Failed to fetch triggers')
164
+ const result = await response.json()
165
+ return result.data || result
132
166
  },
133
167
  { immediate: true }
134
168
  )
@@ -177,9 +211,6 @@ export function TriggersPage() {
177
211
  return 0
178
212
  })
179
213
 
180
- console.log('TriggersPage - triggers:', triggers)
181
- console.log('TriggersPage - filteredTriggers:', filteredTriggers)
182
-
183
214
  const getTriggerIcon = (triggerType: string) => {
184
215
  switch (triggerType) {
185
216
  case 'item_created':
@@ -222,14 +253,6 @@ export function TriggersPage() {
222
253
  return isActive ? 'bg-green-100 text-green-800' : 'bg-slate-100 text-slate-800'
223
254
  }
224
255
 
225
- const handleToggleTrigger = (trigger: Trigger) => {
226
- console.log('Toggle trigger:', trigger.id)
227
- }
228
-
229
- const handleExecuteTrigger = (trigger: Trigger) => {
230
- console.log('Execute trigger:', trigger.id)
231
- }
232
-
233
256
  const handleViewExecutions = (trigger: Trigger) => {
234
257
  navigate(`/spine-framework/admin/configs/triggers/${trigger.id}/executions`)
235
258
  }
@@ -271,8 +294,8 @@ export function TriggersPage() {
271
294
  iconColor: "text-green-600"
272
295
  },
273
296
  {
274
- title: "Executions Today",
275
- value: "47",
297
+ title: "Total Fires",
298
+ value: (triggers || []).reduce((sum, t) => sum + (t.trigger_count || 0), 0),
276
299
  icon: Clock,
277
300
  iconColor: "text-orange-600"
278
301
  }
@@ -340,15 +363,15 @@ export function TriggersPage() {
340
363
  onSort={handleSort}
341
364
  />
342
365
  <SortableTableHeader
343
- title="Executions"
344
- sortKey="execution_count"
366
+ title="Fires"
367
+ sortKey="trigger_count"
345
368
  currentSortKey={sortKey}
346
369
  currentSortDirection={sortDirection}
347
370
  onSort={handleSort}
348
371
  />
349
372
  <SortableTableHeader
350
- title="Last Run"
351
- sortKey="last_execution"
373
+ title="Last Fired"
374
+ sortKey="last_triggered"
352
375
  currentSortKey={sortKey}
353
376
  currentSortDirection={sortDirection}
354
377
  onSort={handleSort}
@@ -387,10 +410,10 @@ export function TriggersPage() {
387
410
  </Badge>
388
411
  </td>
389
412
  <td className="px-6 py-4 whitespace-nowrap text-sm text-slate-900">
390
- {trigger.execution_count}
413
+ {trigger.trigger_count ?? 0}
391
414
  </td>
392
415
  <td className="px-6 py-4 whitespace-nowrap text-sm text-slate-500">
393
- {trigger.last_execution ? formatDateTime(trigger.last_execution) : 'Never'}
416
+ {trigger.last_triggered ? formatDateTime(trigger.last_triggered) : 'Never'}
394
417
  </td>
395
418
  <td className="px-6 py-4 whitespace-nowrap text-right text-sm font-medium">
396
419
  <div className="flex justify-end space-x-2" onClick={(e) => e.stopPropagation()}>
@@ -418,10 +441,12 @@ export function TriggersPage() {
418
441
  </AdminListPage>
419
442
  )
420
443
  }
421
- // CIL[DOC-VECTOR type="context" content="purpose='Render the admin triggers list page with filtering, sorting, and navigation'; No verified external callers; imports: .framework/src/hooks/useApi.ts,.framework/src/lib/api.ts,.framework/src/components/ui/LoadingSpinner.tsx"]
422
- // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
423
- // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
424
- // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
425
- // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
426
- // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
427
444
  // CIL[END stable_id="~/.framework/src/pages/admin/TriggersPage.tsx:TriggersPage:component"]
445
+
446
+
447
+
448
+
449
+
450
+
451
+
452
+