spine-framework 0.3.124 → 0.3.126

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (319) hide show
  1. package/.framework/cli/commands/agents.ts +35 -37
  2. package/.framework/cli/commands/auth.ts +35 -34
  3. package/.framework/cli/commands/create-app.ts +104 -40
  4. package/.framework/cli/commands/dev.ts +104 -69
  5. package/.framework/cli/commands/doctor.ts +179 -69
  6. package/.framework/cli/commands/generate.ts +83 -143
  7. package/.framework/cli/commands/init.ts +72 -34
  8. package/.framework/cli/commands/install-app.ts +260 -125
  9. package/.framework/cli/commands/items.ts +33 -44
  10. package/.framework/cli/commands/migrate.ts +122 -40
  11. package/.framework/cli/commands/migrations.ts +33 -40
  12. package/.framework/cli/commands/pipelines.ts +31 -39
  13. package/.framework/cli/commands/status.ts +47 -23
  14. package/.framework/cli/commands/system.ts +47 -37
  15. package/.framework/cli/commands/test.ts +112 -68
  16. package/.framework/cli/commands/validate-app.ts +215 -121
  17. package/.framework/cli/context.ts +112 -130
  18. package/.framework/cli/env-loader.ts +47 -18
  19. package/.framework/cli/index.ts +81 -42
  20. package/.framework/docs/runtime-types.md +1024 -0
  21. package/.framework/functions/_shared/agent-runner.ts +1296 -961
  22. package/.framework/functions/_shared/app-manifest.ts +82 -68
  23. package/.framework/functions/_shared/audit.ts +135 -83
  24. package/.framework/functions/_shared/{cil-state.ts → cil.ts} +158 -56
  25. package/.framework/functions/_shared/db.ts +80 -126
  26. package/.framework/functions/_shared/hash-api-key.ts +63 -0
  27. package/.framework/functions/_shared/index.ts +224 -335
  28. package/.framework/functions/_shared/kb.ts +319 -0
  29. package/.framework/functions/_shared/llm.ts +92 -0
  30. package/.framework/functions/_shared/logging.ts +288 -0
  31. package/.framework/functions/_shared/middleware.ts +329 -365
  32. package/.framework/functions/_shared/outcomes.ts +36 -0
  33. package/.framework/functions/_shared/permissions.ts +359 -643
  34. package/.framework/functions/_shared/pipeline-runner.ts +243 -316
  35. package/.framework/functions/_shared/principal.ts +376 -468
  36. package/.framework/functions/_shared/resolve-credentials.ts +102 -0
  37. package/.framework/functions/_shared/resolve-ids.ts +188 -16
  38. package/.framework/functions/_shared/retry-deliveries.ts +104 -0
  39. package/.framework/functions/_shared/schema-utils.ts +611 -373
  40. package/.framework/functions/_shared/testing.ts +207 -137
  41. package/.framework/functions/_shared/tracing.ts +276 -0
  42. package/.framework/functions/_shared/trigger-engine.ts +159 -211
  43. package/.framework/functions/_shared/webhook-registration.ts +95 -81
  44. package/.framework/functions/_shared/webhook-registry.ts +153 -75
  45. package/.framework/functions/account-nodes.ts +31 -53
  46. package/.framework/functions/adapters/generic-webhook-inbound.ts +56 -0
  47. package/.framework/functions/adapters/generic-webhook-outbound.ts +43 -0
  48. package/.framework/functions/adapters/openai-outbound.ts +40 -0
  49. package/.framework/functions/admin-data.ts +685 -537
  50. package/.framework/functions/admin-funnel.ts +31 -20
  51. package/.framework/functions/admin-install-funnel.ts +47 -28
  52. package/.framework/functions/admin-signals.ts +47 -29
  53. package/.framework/functions/ai-agents.ts +122 -147
  54. package/.framework/functions/ai-interactions.ts +180 -90
  55. package/.framework/functions/api-keys.ts +250 -192
  56. package/.framework/functions/apps.ts +203 -197
  57. package/.framework/functions/auth.ts +98 -91
  58. package/.framework/functions/cil-agent-ingest.ts +773 -0
  59. package/.framework/functions/cil-agent.ts +592 -0
  60. package/.framework/functions/cil-callmap.ts +1227 -0
  61. package/.framework/functions/cil-config.ts +583 -0
  62. package/.framework/functions/cil-context.ts +445 -0
  63. package/.framework/functions/cil-doc.ts +1752 -0
  64. package/.framework/functions/cil-embeddings.ts +1202 -0
  65. package/.framework/functions/cil-graph.ts +585 -0
  66. package/.framework/functions/cil-ingest.ts +2416 -0
  67. package/.framework/functions/cil-pipeline.ts +318 -0
  68. package/.framework/functions/cil-project.ts +499 -0
  69. package/.framework/functions/cil-validate.ts +469 -0
  70. package/.framework/functions/debug-auth.ts +73 -53
  71. package/.framework/functions/deliveries.ts +117 -0
  72. package/.framework/functions/embeddings.ts +528 -516
  73. package/.framework/functions/eval-harness.ts +158 -106
  74. package/.framework/functions/integration-outbound.ts +311 -0
  75. package/.framework/functions/integration-routes.ts +240 -466
  76. package/.framework/functions/integrations.ts +132 -140
  77. package/.framework/functions/invites.ts +401 -201
  78. package/.framework/functions/item-progress.ts +113 -53
  79. package/.framework/functions/kb.ts +28 -0
  80. package/.framework/functions/logs.ts +239 -222
  81. package/.framework/functions/observability.ts +308 -259
  82. package/.framework/functions/pipeline-executions.ts +179 -235
  83. package/.framework/functions/pipelines.ts +163 -205
  84. package/.framework/functions/prompt-configs.ts +109 -156
  85. package/.framework/functions/roles.ts +97 -147
  86. package/.framework/functions/system-cron.ts +132 -218
  87. package/.framework/functions/system.ts +112 -52
  88. package/.framework/functions/tests.ts +32 -28
  89. package/.framework/functions/timers.ts +162 -210
  90. package/.framework/functions/triggers.ts +282 -346
  91. package/.framework/functions/types.ts +283 -400
  92. package/.framework/migrations/001_core_schema.sql +630 -0
  93. package/.framework/migrations/002_core_rls_and_functions.sql +532 -0
  94. package/.framework/migrations/{003_system_data.sql → 003_core_system_data.sql} +26 -153
  95. package/.framework/migrations/004_core_rpc_and_broker.sql +421 -0
  96. package/.framework/migrations/005_core_observability.sql +598 -0
  97. package/.framework/migrations/006_security_hardening_rls.sql +97 -0
  98. package/.framework/migrations/007_kb_article_list.sql +237 -0
  99. package/.framework/migrations/008_items_target.sql +8 -0
  100. package/.framework/migrations/009_roles_slug_unique.sql +11 -0
  101. package/.framework/public/spine.config.json +91 -0
  102. package/.framework/scripts/app-install-cli.ts +112 -98
  103. package/.framework/src/App.tsx +67 -20
  104. package/.framework/src/apps/admin/index.tsx +97 -27
  105. package/.framework/src/components/AppWrapper.tsx +50 -11
  106. package/.framework/src/components/CustomAppLoader.tsx +131 -22
  107. package/.framework/src/components/admin/AdminListPage.tsx +75 -8
  108. package/.framework/src/components/admin/AdminSidebar.tsx +148 -36
  109. package/.framework/src/components/admin/AdminStatsCard.tsx +48 -29
  110. package/.framework/src/components/admin/PageInstructions.tsx +49 -0
  111. package/.framework/src/components/admin/SortableTableHeader.tsx +49 -2
  112. package/.framework/src/components/app-shell/GenericAppShell.tsx +69 -11
  113. package/.framework/src/components/app-shell/GenericDetailPage.tsx +55 -10
  114. package/.framework/src/components/app-shell/GenericListPage.tsx +76 -9
  115. package/.framework/src/components/app-sidebar.tsx +50 -3
  116. package/.framework/src/components/auth/ProtectedRoute.tsx +53 -45
  117. package/.framework/src/components/kb/KBArticleEditor.tsx +409 -0
  118. package/.framework/src/components/kb/KBArticleList.tsx +557 -0
  119. package/.framework/src/components/layout/AppShell.tsx +54 -16
  120. package/.framework/src/components/layout/Header.tsx +50 -38
  121. package/.framework/src/components/layout/Layout.tsx +48 -32
  122. package/.framework/src/components/layout/Sidebar.tsx +167 -16
  123. package/.framework/src/components/runtime/DataDetailHeader.tsx +33 -1
  124. package/.framework/src/components/runtime/DataDetailPage.tsx +289 -4
  125. package/.framework/src/components/runtime/DataFilters.tsx +78 -1
  126. package/.framework/src/components/runtime/DataHeader.tsx +32 -29
  127. package/.framework/src/components/runtime/DataListPage.tsx +161 -2
  128. package/.framework/src/components/runtime/DataStats.tsx +48 -1
  129. package/.framework/src/components/runtime/DataTable.tsx +153 -1
  130. package/.framework/src/components/runtime/SchemaDetailForm.tsx +77 -46
  131. package/.framework/src/components/runtime/index.ts +16 -9
  132. package/.framework/src/components/search-form.tsx +33 -1
  133. package/.framework/src/components/shared/AgentView.tsx +48 -51
  134. package/.framework/src/components/shared/FieldRenderer.tsx +84 -67
  135. package/.framework/src/components/shared/InviteManager.tsx +113 -52
  136. package/.framework/src/components/shared/MemberList.tsx +182 -0
  137. package/.framework/src/components/shared/SchemaFields.tsx +96 -78
  138. package/.framework/src/components/ui/DataTable.tsx +86 -56
  139. package/.framework/src/components/ui/Form.tsx +188 -109
  140. package/.framework/src/components/ui/ItemCard.tsx +86 -58
  141. package/.framework/src/components/ui/ItemListView.tsx +88 -61
  142. package/.framework/src/components/ui/LoadingSpinner.tsx +52 -27
  143. package/.framework/src/components/ui/Modal.tsx +81 -4
  144. package/.framework/src/components/ui/RichTextEditor.tsx +101 -9
  145. package/.framework/src/components/ui/accordion.tsx +97 -5
  146. package/.framework/src/components/ui/alert-dialog.tsx +225 -13
  147. package/.framework/src/components/ui/alert.tsx +113 -6
  148. package/.framework/src/components/ui/aspect-ratio.tsx +49 -2
  149. package/.framework/src/components/ui/avatar.tsx +129 -7
  150. package/.framework/src/components/ui/badge.tsx +65 -3
  151. package/.framework/src/components/ui/breadcrumb.tsx +145 -8
  152. package/.framework/src/components/ui/button-group.tsx +81 -4
  153. package/.framework/src/components/ui/button.tsx +49 -2
  154. package/.framework/src/components/ui/calendar.tsx +65 -3
  155. package/.framework/src/components/ui/card.tsx +145 -8
  156. package/.framework/src/components/ui/carousel.tsx +129 -7
  157. package/.framework/src/components/ui/chart.tsx +161 -10
  158. package/.framework/src/components/ui/checkbox.tsx +49 -2
  159. package/.framework/src/components/ui/collapsible.tsx +81 -5
  160. package/.framework/src/components/ui/combobox.tsx +305 -20
  161. package/.framework/src/components/ui/command.tsx +177 -11
  162. package/.framework/src/components/ui/context-menu.tsx +273 -17
  163. package/.framework/src/components/ui/dialog.tsx +209 -27
  164. package/.framework/src/components/ui/direction.tsx +64 -4
  165. package/.framework/src/components/ui/drawer.tsx +193 -12
  166. package/.framework/src/components/ui/dropdown-menu.tsx +273 -18
  167. package/.framework/src/components/ui/empty.tsx +145 -9
  168. package/.framework/src/components/ui/field.tsx +209 -14
  169. package/.framework/src/components/ui/hover-card.tsx +81 -4
  170. package/.framework/src/components/ui/input-group.tsx +162 -10
  171. package/.framework/src/components/ui/input-otp.tsx +98 -5
  172. package/.framework/src/components/ui/input.tsx +49 -2
  173. package/.framework/src/components/ui/item.tsx +225 -13
  174. package/.framework/src/components/ui/kbd.tsx +65 -3
  175. package/.framework/src/components/ui/label.tsx +49 -2
  176. package/.framework/src/components/ui/menubar.tsx +289 -17
  177. package/.framework/src/components/ui/native-select.tsx +97 -5
  178. package/.framework/src/components/ui/navigation-menu.tsx +177 -10
  179. package/.framework/src/components/ui/pagination.tsx +161 -9
  180. package/.framework/src/components/ui/popover.tsx +145 -8
  181. package/.framework/src/components/ui/progress.tsx +49 -2
  182. package/.framework/src/components/ui/radio-group.tsx +65 -3
  183. package/.framework/src/components/ui/resizable.tsx +82 -4
  184. package/.framework/src/components/ui/scroll-area.tsx +65 -3
  185. package/.framework/src/components/ui/select.tsx +193 -11
  186. package/.framework/src/components/ui/separator.tsx +49 -2
  187. package/.framework/src/components/ui/sheet.tsx +193 -11
  188. package/.framework/src/components/ui/sidebar.tsx +481 -38
  189. package/.framework/src/components/ui/skeleton.tsx +49 -2
  190. package/.framework/src/components/ui/slider.tsx +49 -2
  191. package/.framework/src/components/ui/sonner.tsx +49 -2
  192. package/.framework/src/components/ui/spinner.tsx +49 -2
  193. package/.framework/src/components/ui/switch.tsx +49 -2
  194. package/.framework/src/components/ui/table-primitives.tsx +160 -33
  195. package/.framework/src/components/ui/table.tsx +161 -9
  196. package/.framework/src/components/ui/tabs.tsx +113 -6
  197. package/.framework/src/components/ui/textarea.tsx +49 -2
  198. package/.framework/src/components/ui/toggle-group.tsx +81 -4
  199. package/.framework/src/components/ui/toggle.tsx +65 -3
  200. package/.framework/src/components/ui/tooltip.tsx +97 -5
  201. package/.framework/src/contexts/AppContext.tsx +129 -45
  202. package/.framework/src/contexts/AuthContext.tsx +187 -144
  203. package/.framework/src/hooks/use-mobile.ts +48 -2
  204. package/.framework/src/hooks/useApi.ts +208 -159
  205. package/.framework/src/hooks/useAppPath.ts +32 -23
  206. package/.framework/src/hooks/useApps.ts +51 -20
  207. package/.framework/src/hooks/useEntityList.ts +32 -78
  208. package/.framework/src/hooks/useEntityRecord.ts +35 -96
  209. package/.framework/src/hooks/useForm.ts +32 -92
  210. package/.framework/src/hooks/useListSchema.ts +49 -78
  211. package/.framework/src/hooks/useSchemaRecord.ts +114 -105
  212. package/.framework/src/lib/api.ts +195 -116
  213. package/.framework/src/lib/supabase.ts +98 -64
  214. package/.framework/src/lib/utils.ts +287 -151
  215. package/.framework/src/main.tsx +49 -3
  216. package/.framework/src/pages/DashboardPage.tsx +52 -29
  217. package/.framework/src/pages/NotFoundPage.tsx +32 -10
  218. package/.framework/src/pages/SetupPage.tsx +32 -12
  219. package/.framework/src/pages/admin/AIAgentDetailPage.tsx +119 -10
  220. package/.framework/src/pages/admin/AIAgentsPage.tsx +48 -19
  221. package/.framework/src/pages/admin/APIKeyDetailPage.tsx +187 -17
  222. package/.framework/src/pages/admin/APIKeysPage.tsx +98 -22
  223. package/.framework/src/pages/admin/AlertsConfigPage.tsx +113 -26
  224. package/.framework/src/pages/admin/AppDetailPage.tsx +125 -8
  225. package/.framework/src/pages/admin/AppsPage.tsx +49 -2
  226. package/.framework/src/pages/admin/DeliveriesPage.tsx +196 -0
  227. package/.framework/src/pages/admin/DesignedPage.tsx +32 -18
  228. package/.framework/src/pages/admin/EmbeddingDetailPage.tsx +215 -484
  229. package/.framework/src/pages/admin/EmbeddingsPage.tsx +116 -319
  230. package/.framework/src/pages/admin/ExtendedShadcnTestPage.tsx +34 -9
  231. package/.framework/src/pages/admin/IncrementalShadcnTestPage.tsx +34 -9
  232. package/.framework/src/pages/admin/IntegratedDashboard.tsx +32 -16
  233. package/.framework/src/pages/admin/IntegrationDetailPage.tsx +183 -26
  234. package/.framework/src/pages/admin/IntegrationsPage.tsx +48 -19
  235. package/.framework/src/pages/admin/InvitesPage.tsx +48 -14
  236. package/.framework/src/pages/admin/LogsPage.tsx +422 -75
  237. package/.framework/src/pages/admin/MinimalShadcnTestPage.tsx +34 -9
  238. package/.framework/src/pages/admin/ObservabilityDashboard.tsx +113 -24
  239. package/.framework/src/pages/admin/PipelineDetailPage.tsx +206 -34
  240. package/.framework/src/pages/admin/PipelineExecutionsPage.tsx +50 -17
  241. package/.framework/src/pages/admin/PipelinesPage.tsx +160 -21
  242. package/.framework/src/pages/admin/PromptConfigDetailPage.tsx +378 -88
  243. package/.framework/src/pages/admin/PromptConfigsPage.tsx +125 -16
  244. package/.framework/src/pages/admin/ProperlyDesignedPage.tsx +49 -10
  245. package/.framework/src/pages/admin/RoleDetailPage.tsx +130 -10
  246. package/.framework/src/pages/admin/RolesPage.tsx +171 -18
  247. package/.framework/src/pages/admin/SelectTestPage.tsx +34 -9
  248. package/.framework/src/pages/admin/ShadcnTestPage.tsx +49 -11
  249. package/.framework/src/pages/admin/SimpleDashboard.tsx +49 -10
  250. package/.framework/src/pages/admin/TestRunDetailPage.tsx +49 -4
  251. package/.framework/src/pages/admin/TestingDashboard.tsx +98 -28
  252. package/.framework/src/pages/admin/TimerDetailPage.tsx +143 -33
  253. package/.framework/src/pages/admin/TimersPage.tsx +48 -20
  254. package/.framework/src/pages/admin/TriggerDetailPage.tsx +118 -30
  255. package/.framework/src/pages/admin/TriggersPage.tsx +64 -19
  256. package/.framework/src/pages/admin/TypeDetailPage.tsx +138 -15
  257. package/.framework/src/pages/admin/TypesPage.tsx +48 -20
  258. package/.framework/src/pages/admin/cil/CILAgentPage.tsx +465 -0
  259. package/.framework/src/pages/admin/cil/CILChunkDetailPage.tsx +787 -0
  260. package/.framework/src/pages/admin/cil/CILDashboardPage.tsx +699 -0
  261. package/.framework/src/pages/admin/cil/CILFileListPage.tsx +647 -0
  262. package/.framework/src/pages/admin/cil/CILGraphPage.tsx +616 -0
  263. package/.framework/src/pages/admin/cil/CILIngestionPage.tsx +1402 -0
  264. package/.framework/src/pages/admin/cil/CILProjectsPage.tsx +614 -0
  265. package/.framework/src/pages/admin/cil/CILSearchPage.tsx +571 -0
  266. package/.framework/src/pages/admin/cil/FlexiblePipelinePage.tsx +731 -0
  267. package/.framework/src/pages/admin/kb/KBAdminPage.tsx +64 -0
  268. package/.framework/src/pages/auth/AuthConfirmPage.tsx +52 -51
  269. package/.framework/src/pages/auth/ForgotPasswordPage.tsx +31 -22
  270. package/.framework/src/pages/auth/LoginPage.tsx +50 -23
  271. package/.framework/src/pages/auth/PendingApprovalPage.tsx +31 -15
  272. package/.framework/src/pages/auth/RegisterPage.tsx +281 -317
  273. package/.framework/src/pages/spine-framework/APIPage.tsx +33 -0
  274. package/.framework/src/pages/spine-framework/CLIPage.tsx +33 -0
  275. package/.framework/src/types/auth.ts +128 -71
  276. package/.framework/src/types/types.ts +373 -157
  277. package/custom/.devin/skills/spine-workbench-discovery/SKILL.md +39 -0
  278. package/custom/.devin/skills/spine-workbench-idea/SKILL.md +36 -0
  279. package/custom/.devin/skills/spine-workbench-implement/SKILL.md +46 -0
  280. package/custom/.devin/skills/spine-workbench-initiative/SKILL.md +28 -0
  281. package/custom/.devin/skills/spine-workbench-plan/SKILL.md +38 -0
  282. package/docs/README.md +9 -130
  283. package/netlify.toml +5 -2
  284. package/package.json +13 -25
  285. package/scripts/kb-ingest-docs.ts +203 -0
  286. package/spine.config.json +65 -4
  287. package/.framework/migrations/001_schema.sql +0 -425
  288. package/.framework/migrations/002_rls_and_functions.sql +0 -763
  289. package/.framework/migrations/004_enhancements.sql +0 -43
  290. package/.framework/migrations/005_auth_user_trigger.sql +0 -105
  291. package/.framework/migrations/006_fix_current_actor_id.sql +0 -21
  292. package/.framework/migrations/016_invites.sql +0 -27
  293. package/.framework/migrations/017_fix_get_account_apps.sql +0 -78
  294. package/.framework/migrations/018_apps_required_roles.sql +0 -17
  295. package/.framework/migrations/019_triggers_unique_constraint.sql +0 -13
  296. package/.framework/migrations/020_get_account_apps_role_filter.sql +0 -117
  297. package/.framework/migrations/021_app_domains.sql +0 -112
  298. package/.framework/migrations/022_route_prefix_domain_unique.sql +0 -21
  299. package/.framework/migrations/023_match_embeddings_rpc.sql +0 -78
  300. package/.framework/migrations/024_messages_account_id.sql +0 -9
  301. package/.framework/migrations/025_retype_threads_messages.sql +0 -240
  302. package/.framework/migrations/026_fix_rls_policies.sql +0 -47
  303. package/.framework/migrations/027_embedding_lifecycle.sql +0 -176
  304. package/.framework/migrations/028_fix_message_data_permissions.sql +0 -49
  305. package/.framework/migrations/029_tighten_support_triage_prompt.sql +0 -41
  306. package/.framework/migrations/030_messages_updated_by.sql +0 -6
  307. package/.framework/migrations/031_seed_upsert_constraints.sql +0 -35
  308. package/docs/APPS.md +0 -232
  309. package/docs/ARCHITECTURE.md +0 -246
  310. package/docs/INSTALL.md +0 -155
  311. package/docs/design-schema-spec.md +0 -1837
  312. package/docs/dev-guides/01-create-an-app.md +0 -183
  313. package/docs/dev-guides/02-create-a-function.md +0 -178
  314. package/docs/dev-guides/03-create-a-component.md +0 -178
  315. package/docs/dev-guides/04-webhook-handlers.md +0 -129
  316. package/docs/dev-guides/05-testing.md +0 -168
  317. package/docs/dev-guides/README.md +0 -40
  318. package/docs/npm-packages-plan.md +0 -288
  319. package/docs/spine-core--api-reference.md +0 -822
@@ -1,54 +1,46 @@
1
- /**
2
- * @module trigger-engine
3
- * @audience both
4
- * @layer shared-core
5
- * @stability stable
6
- *
7
- * Event-driven trigger dispatch system. API handlers call `fire*Triggers` after
8
- * a successful write to check whether any active triggers should fire. Matching
9
- * triggers cause `runPipeline` to be invoked with structured `triggerData`.
10
- *
11
- * Public surface:
12
- * - `checkAndFireTriggers` — full trigger evaluation and firing loop
13
- * - `fireCreateTriggers` — convenience wrapper for `*_created` events
14
- * - `fireUpdateTriggers` — convenience wrapper for `*_updated` events
15
- * - `fireDeleteTriggers` — convenience wrapper for `*_deleted` events
16
- *
17
- * Trigger condition evaluation (in order, all must pass):
18
- * 1. `config.entity_type` — exact match on entityType param
19
- * 2. `config.type_slug` — match on `entityData.type_slug` (items only)
20
- * 3. `config.filters` — field-level predicates with operators
21
- * (`$eq`, `$ne`, `$gt`, `$gte`, `$lt`, `$lte`, `$in`, `$nin`, `$exists`)
22
- *
23
- * INVARIANT: trigger evaluation and firing errors are caught per-trigger —
24
- * a single failing trigger never prevents other triggers from firing.
25
- * INVARIANT: `checkAndFireTriggers` never throws — all errors are caught
26
- * and logged. Callers do not need to wrap in try/catch.
27
- * INVARIANT: `adminDb` (service role) is used for trigger lookups and stats
28
- * updates; `runPipeline` then uses the passed `ctx` for stage execution.
29
- *
30
- * @seeAlso pipeline-runner.ts (runPipeline — called when a trigger fires)
31
- * @seeAlso audit.ts (emitAudit for trigger.fired / trigger.failed)
32
- * @seeAlso index.ts (fire*Triggers re-exported for v2-custom/ and CLI)
33
- */
34
1
 
2
+
3
+
4
+
5
+
6
+
7
+
8
+
9
+
10
+ // CIL[BEGIN chunk_id="triggerengine_imports_1784020784" type="module_header" identity="imports" parent="none"]
11
+ // CIL[DOC-MACRO purpose="Import dependencies for trigger engine functionality"]
12
+ // CIL[DOC-RESPONSIBILITY responsibility="Import context, database, audit, and pipeline modules"]
13
+ // CIL[DOC-CONTEXT module="trigger-engine" layer="shared" related_files="[\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/functions/_shared/schema-utils.ts\",\"custom/apps/portal/pages/ContentPage.tsx\",\"\\\"]"]
14
+ // CIL[DOC-CONTRACT inputs="none" outputs="CoreContext, adminDb, emitAudit, runPipeline" errors="none" side_effects="none"]
15
+ // CIL[DOC-MICRO logic_summary="Import required modules for trigger processing and execution" notable_decisions="[]"]
16
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
17
+ // CIL[DOC-STABILITY stability="stable"]
18
+ // CIL[DOC-AUDIENCE audience="developer"]
19
+ // CIL[DOC-VECTOR type="context" content="Layer: shared. Direct callers: 0. Direct calls: 0. Related files: custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/functions/_shared/principal.ts, .framework/functions/_shared/schema-utils.ts, custom/apps/portal/pages/ContentPage.tsx, \."]
20
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
21
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
22
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
23
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
24
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
35
25
  import { CoreContext } from './middleware'
36
26
  import { adminDb } from './db'
37
27
  import { emitAudit } from './audit'
38
28
  import { runPipeline } from './pipeline-runner'
39
-
40
- // ─── TYPES ───────────────────────────────────────────────────────────────
41
-
42
- /**
43
- * All entity lifecycle event types that triggers can subscribe to.
44
- *
45
- * Format: `<entity>_<lifecycle>` where entity is one of:
46
- * `item | account | person | thread | message | attachment | link`
47
- * and lifecycle is `created | updated | deleted`.
48
- *
49
- * @calledBy checkAndFireTriggers, fireCreateTriggers, fireUpdateTriggers,
50
- * fireDeleteTriggers, all API handlers that write to these entity tables
51
- */
29
+ // CIL[END chunk_id="triggerengine_imports_1784020784"]
30
+ // CIL[BEGIN chunk_id="triggerengine_eventtype_1784020784" type="type" identity="EventType" parent="none"]
31
+ // CIL[DOC-MACRO purpose="Define event types for trigger system"]
32
+ // CIL[DOC-RESPONSIBILITY responsibility="Provide union type for all triggerable events"]
33
+ // CIL[DOC-CONTEXT module="trigger-engine" layer="shared" related_files="[\".framework/functions/_shared/principal.ts\",\".framework/functions/_shared/schema-utils.ts\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"\\\"]"]
34
+ // CIL[DOC-CONTRACT inputs="none" outputs="EventType union" errors="none" side_effects="none"]
35
+ // CIL[DOC-MICRO logic_summary="Union of entity lifecycle events across different entity types" notable_decisions="[]"]
36
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
37
+ // CIL[DOC-STABILITY stability="stable"]
38
+ // CIL[DOC-VECTOR type="context" content="Layer: shared. Direct callers: 0. Direct calls: 0. Related files: .framework/functions/_shared/principal.ts, .framework/functions/_shared/schema-utils.ts, .framework/src/pages/admin/IntegrationsPage.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, \."]
39
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
40
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
41
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
42
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
43
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
52
44
  export type EventType =
53
45
  | 'item_created' | 'item_updated' | 'item_deleted'
54
46
  | 'account_created' | 'account_updated' | 'account_deleted'
@@ -57,16 +49,21 @@ export type EventType =
57
49
  | 'message_created' | 'message_updated' | 'message_deleted'
58
50
  | 'attachment_created' | 'attachment_updated' | 'attachment_deleted'
59
51
  | 'link_created' | 'link_updated' | 'link_deleted'
60
-
61
- /**
62
- * Trigger record shape as loaded from the `triggers` table.
63
- *
64
- * @inputSpec event_type: EventType string stored in triggers.event_type
65
- * @inputSpec pipeline_id: UUID — target pipeline to run when this trigger fires
66
- * @inputSpec config.filters: Record<string, any> — field-level predicates
67
- * @inputSpec config.entity_type: string | undefined — entity type filter
68
- * @inputSpec config.type_slug: string | undefined — item type slug filter
69
- */
52
+ // CIL[END chunk_id="triggerengine_eventtype_1784020784"]
53
+ // CIL[BEGIN chunk_id="triggerengine_triggerinterface_1784020784" type="interface" identity="Trigger" parent="none"]
54
+ // CIL[DOC-MACRO purpose="Define trigger interface for event-driven automation"]
55
+ // CIL[DOC-RESPONSIBILITY responsibility="Provide structure for trigger configuration and metadata"]
56
+ // CIL[DOC-CONTEXT module="trigger-engine" layer="shared" related_files="[\".framework/functions/_shared/schema-utils.ts\",\".framework/functions/_shared/principal.ts\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"\\\"]"]
57
+ // CIL[DOC-CONTRACT inputs="none" outputs="Trigger interface" errors="none" side_effects="none"]
58
+ // CIL[DOC-MICRO logic_summary="Interface with trigger metadata, event type, pipeline, and config" notable_decisions="[]"]
59
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
60
+ // CIL[DOC-STABILITY stability="stable"]
61
+ // CIL[DOC-VECTOR type="context" content="Layer: shared. Direct callers: 0. Direct calls: 0. Related files: .framework/functions/_shared/schema-utils.ts, .framework/functions/_shared/principal.ts, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/IntegrationsPage.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, \."]
62
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
63
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
64
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
65
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
66
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
70
67
  interface Trigger {
71
68
  id: string
72
69
  name: string
@@ -79,56 +76,21 @@ interface Trigger {
79
76
  }
80
77
  is_active: boolean
81
78
  }
82
-
83
- // ─── PRIMARY EXPORT ────────────────────────────────────────────────────────────
84
-
85
- /**
86
- * Queries active triggers for `eventType`, evaluates each against the entity
87
- * data, and fires the associated pipeline for every matching trigger.
88
- *
89
- * Execution per trigger:
90
- * 1. `evaluateTriggerConditions` — all conditions must pass
91
- * 2. `runPipeline(trigger.pipeline_id, triggerData, ctx)` — fire pipeline
92
- * 3. Update `triggers.last_triggered` and increment `trigger_count` via RPC
93
- * 4. Emit `trigger.fired` audit log (or `trigger.failed` on error)
94
- *
95
- * `triggerData` passed to the pipeline:
96
- * ```json
97
- * {
98
- * "event": "item_updated",
99
- * "entity": { "type": "item", "id": "<uuid>", "data": {...} },
100
- * "trigger": { "id": "<uuid>", "name": "My Trigger" },
101
- * "fired_at": "2024-01-15T10:00:00.000Z"
102
- * }
103
- * ```
104
- *
105
- * @param eventType - The lifecycle event (e.g. 'item_updated')
106
- * @param entityType - The entity table name (e.g. 'item', 'person')
107
- * @param entityId - UUID of the entity that changed
108
- * @param entityData - Full record data for condition evaluation
109
- * @param ctx - CoreContext with requestId, accountId, and principal
110
- * @returns Promise<void> — always resolves; never throws
111
- * @throws never — all errors are caught per-trigger and logged
112
- * @inputSpec eventType: EventType — must be one of the 21 defined event types
113
- * @inputSpec entityId: string — UUID of the changed entity
114
- * @inputSpec entityData: any — full record (used for condition evaluation)
115
- * @outputSpec void
116
- * @sideEffects DB read: triggers table
117
- * @sideEffects DB write (per matching trigger): triggers.last_triggered, trigger_count
118
- * @sideEffects Calls runPipeline (per matching trigger) — which writes pipeline_executions
119
- * @sideEffects DB write: emitAudit (trigger.fired or trigger.failed per trigger)
120
- * @calledBy All API handlers after successful create/update/delete writes
121
- * @calledBy fireCreateTriggers, fireUpdateTriggers, fireDeleteTriggers
122
- * @calls evaluateTriggerConditions, runPipeline, emitAudit
123
- * @testUnit tests/unit/trigger-engine.test.ts
124
- * @testIntegration tests/integration/trigger-engine.test.ts
125
- *
126
- * @example
127
- * ```ts
128
- * // In an API handler after a successful item update:
129
- * await fireUpdateTriggers('item', updatedItem.id, updatedItem, ctx)
130
- * ```
131
- */
79
+ // CIL[END chunk_id="triggerengine_triggerinterface_1784020784"]
80
+ // CIL[BEGIN chunk_id="triggerengine_checkandfire_1784020784" type="function" identity="checkAndFireTriggers" parent="none"]
81
+ // CIL[DOC-MACRO purpose="Check and fire triggers for entity events"]
82
+ // CIL[DOC-RESPONSIBILITY responsibility="Query active triggers, evaluate conditions, execute pipelines"]
83
+ // CIL[DOC-CONTEXT module="trigger-engine" layer="shared" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/functions/_shared/schema-utils.ts\",\"\\\"]"]
84
+ // CIL[DOC-CONTRACT inputs="none" outputs="void" errors="Database errors, pipeline failures" side_effects="Database updates, audit logs, pipeline execution"]
85
+ // CIL[DOC-MICRO logic_summary="Fetch triggers, evaluate conditions, run pipelines, update trigger stats, emit audit events" notable_decisions="[]"]
86
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
87
+ // CIL[DOC-STABILITY stability="stable"]
88
+ // CIL[DOC-VECTOR type="context" content="Layer: shared. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/functions/_shared/principal.ts, .framework/functions/_shared/schema-utils.ts, \."]
89
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
90
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
91
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
92
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
93
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
132
94
  export async function checkAndFireTriggers(
133
95
  eventType: EventType,
134
96
  entityType: string,
@@ -136,7 +98,6 @@ export async function checkAndFireTriggers(
136
98
  entityData: any,
137
99
  ctx: CoreContext
138
100
  ): Promise<void> {
139
- // Find matching active triggers
140
101
  const { data: triggers, error } = await adminDb
141
102
  .from('triggers')
142
103
  .select('*')
@@ -153,7 +114,6 @@ export async function checkAndFireTriggers(
153
114
  return
154
115
  }
155
116
 
156
- // Evaluate each trigger's conditions
157
117
  for (const trigger of triggers) {
158
118
  try {
159
119
  const shouldFire = evaluateTriggerConditions(trigger, entityType, entityData)
@@ -162,7 +122,6 @@ export async function checkAndFireTriggers(
162
122
  continue
163
123
  }
164
124
 
165
- // Prepare trigger data for pipeline
166
125
  const triggerData = {
167
126
  event: eventType,
168
127
  entity: {
@@ -177,10 +136,8 @@ export async function checkAndFireTriggers(
177
136
  fired_at: new Date().toISOString()
178
137
  }
179
138
 
180
- // Fire the pipeline
181
139
  const result = await runPipeline(trigger.pipeline_id, triggerData, ctx)
182
140
 
183
- // Update trigger statistics
184
141
  await adminDb
185
142
  .from('triggers')
186
143
  .update({
@@ -216,28 +173,21 @@ export async function checkAndFireTriggers(
216
173
  }
217
174
  }
218
175
  }
219
-
220
- // ─── CONDITION EVALUATION ───────────────────────────────────────────────────────────
221
-
222
- /**
223
- * Returns true if all of a trigger's conditions match the entity event.
224
- *
225
- * Condition checks (in order):
226
- * 1. `config.entity_type` must equal `entityType` (if set)
227
- * 2. `config.type_slug` must equal `entityData.type_slug` (if set)
228
- * 3. Each `config.filters` key must match the entity field:
229
- * - Array: value must be in the array
230
- * - Object: `evaluateOperator` checks each `$op: expected` pair
231
- * - Scalar: exact equality
232
- *
233
- * @param trigger - Trigger record with config
234
- * @param entityType - Entity table name from the calling handler
235
- * @param entityData - Full record data for field-level filter checks
236
- * @returns boolean — true if all conditions pass; false to skip this trigger
237
- * @throws never
238
- * @calledBy checkAndFireTriggers (per trigger in the matching set)
239
- * @calls getNestedValue, evaluateOperator
240
- */
176
+ // CIL[END chunk_id="triggerengine_checkandfire_1784020784"]
177
+ // CIL[BEGIN chunk_id="triggerengine_evaluatetriggerconditions_1784020784" type="function" identity="evaluateTriggerConditions" parent="none"]
178
+ // CIL[DOC-MACRO purpose="Evaluate if trigger conditions match entity data"]
179
+ // CIL[DOC-RESPONSIBILITY responsibility="Check entity type, type slug, and filter conditions"]
180
+ // CIL[DOC-CONTEXT module="trigger-engine" layer="shared" related_files="[\".framework/src/pages/admin/IntegrationsPage.tsx\",\".framework/functions/_shared/schema-utils.ts\",\".framework/migrations/025_retype_threads_messages.sql\",\"\\\"]"]
181
+ // CIL[DOC-CONTRACT inputs="none" outputs="boolean" errors="none" side_effects="none"]
182
+ // CIL[DOC-MICRO logic_summary="Validate trigger config against entity data using filters and operators" notable_decisions="[]"]
183
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
184
+ // CIL[DOC-STABILITY stability="stable"]
185
+ // CIL[DOC-VECTOR type="context" content="Layer: shared. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/IntegrationsPage.tsx, .framework/functions/_shared/schema-utils.ts, .framework/migrations/025_retype_threads_messages.sql, \."]
186
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
187
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
188
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
189
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
190
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
241
191
  function evaluateTriggerConditions(
242
192
  trigger: Trigger,
243
193
  entityType: string,
@@ -245,33 +195,27 @@ function evaluateTriggerConditions(
245
195
  ): boolean {
246
196
  const config = trigger.config || {}
247
197
 
248
- // Check entity type filter
249
198
  if (config.entity_type && config.entity_type !== entityType) {
250
199
  return false
251
200
  }
252
201
 
253
- // Check type_slug filter (for items)
254
202
  if (config.type_slug && entityData?.type_slug !== config.type_slug) {
255
203
  return false
256
204
  }
257
205
 
258
- // Check custom filters
259
206
  if (config.filters) {
260
207
  for (const [key, expectedValue] of Object.entries(config.filters)) {
261
208
  const actualValue = getNestedValue(entityData, key)
262
209
 
263
210
  if (Array.isArray(expectedValue)) {
264
- // Array means "any of these values"
265
211
  if (!expectedValue.includes(actualValue)) {
266
212
  return false
267
213
  }
268
214
  } else if (typeof expectedValue === 'object' && expectedValue !== null) {
269
- // Object means operators: { $gt: 5, $lt: 10 }
270
215
  if (!evaluateOperator(actualValue, expectedValue)) {
271
216
  return false
272
217
  }
273
218
  } else {
274
- // Simple equality
275
219
  if (actualValue !== expectedValue) {
276
220
  return false
277
221
  }
@@ -281,35 +225,41 @@ function evaluateTriggerConditions(
281
225
 
282
226
  return true
283
227
  }
284
-
285
- /**
286
- * Extracts a value from a nested object using dot-notation path.
287
- *
288
- * @param obj - Source object
289
- * @param path - Dot-separated key path (e.g. 'data.status', 'type_slug')
290
- * @returns The value at the path, or `undefined` if any segment is missing
291
- * @throws never
292
- * @calledBy evaluateTriggerConditions (filter key resolution)
293
- */
228
+ // CIL[END chunk_id="triggerengine_evaluatetriggerconditions_1784020784"]
229
+ // CIL[BEGIN chunk_id="triggerengine_getnestedvalue_1784020784" type="function" identity="getNestedValue" parent="none"]
230
+ // CIL[DOC-MACRO purpose="Get nested value from object using dot notation"]
231
+ // CIL[DOC-RESPONSIBILITY responsibility="Navigate object hierarchy to retrieve nested property"]
232
+ // CIL[DOC-CONTEXT module="trigger-engine" layer="shared" related_files="[]"]
233
+ // CIL[DOC-CONTRACT inputs="none" outputs="any" errors="none" side_effects="none"]
234
+ // CIL[DOC-MICRO logic_summary="Split path by dots and traverse object to get nested value" notable_decisions="[]"]
235
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
236
+ // CIL[DOC-STABILITY stability="stable"]
237
+ // CIL[DOC-VECTOR type="context" content="Layer: shared. Direct callers: 0. Direct calls: 0. Related files: none."]
238
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
239
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
240
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
241
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
242
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
294
243
  function getNestedValue(obj: any, path: string): any {
295
244
  return path.split('.').reduce((current, key) => {
296
245
  return current?.[key]
297
246
  }, obj)
298
247
  }
299
-
300
- /**
301
- * Evaluates MongoDB-style operator conditions against an actual value.
302
- *
303
- * Supported operators: `$eq`, `$ne`, `$gt`, `$gte`, `$lt`, `$lte`,
304
- * `$in`, `$nin`, `$exists`. Unknown operators return false.
305
- *
306
- * @param actual - Actual field value from the entity
307
- * @param operators - Object of `{ $op: expectedValue }` pairs
308
- * @returns boolean — true only if all operators pass
309
- * @throws never — warns on unknown operators
310
- * @inputSpec operators: Record<string, any> — all keys must start with `$`
311
- * @calledBy evaluateTriggerConditions (object filter branch)
312
- */
248
+ // CIL[END chunk_id="triggerengine_getnestedvalue_1784020784"]
249
+ // CIL[BEGIN chunk_id="triggerengine_evaluateoperator_1784020784" type="function" identity="evaluateOperator" parent="none"]
250
+ // CIL[DOC-MACRO purpose="Evaluate comparison operators for trigger conditions"]
251
+ // CIL[DOC-RESPONSIBILITY responsibility="Process MongoDB-style operators like $eq, $gt, $in"]
252
+ // CIL[DOC-CONTEXT module="trigger-engine" layer="shared" related_files="[]"]
253
+ // CIL[DOC-CONTRACT inputs="none" outputs="boolean" errors="none" side_effects="none"]
254
+ // CIL[DOC-MICRO logic_summary="Evaluate multiple operators against actual value, return false on any failure" notable_decisions="[]"]
255
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
256
+ // CIL[DOC-STABILITY stability="stable"]
257
+ // CIL[DOC-VECTOR type="context" content="Layer: shared. Direct callers: 0. Direct calls: 0. Related files: none."]
258
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
259
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
260
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
261
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
262
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
313
263
  function evaluateOperator(actual: any, operators: Record<string, any>): boolean {
314
264
  for (const [op, expected] of Object.entries(operators)) {
315
265
  switch (op) {
@@ -348,24 +298,21 @@ function evaluateOperator(actual: any, operators: Record<string, any>): boolean
348
298
  }
349
299
  return true
350
300
  }
351
-
352
- // ─── CONVENIENCE HELPERS ────────────────────────────────────────────────────────────
353
-
354
- /**
355
- * Fires `<entityType>_created` triggers. Thin wrapper around
356
- * `checkAndFireTriggers` that constructs the correct EventType.
357
- *
358
- * @param entityType - Entity table name (e.g. 'item', 'person')
359
- * @param entityId - UUID of the newly created entity
360
- * @param entityData - The created record (for condition evaluation)
361
- * @param ctx - CoreContext
362
- * @returns Promise<void> — always resolves
363
- * @throws never
364
- * @sideEffects same as checkAndFireTriggers
365
- * @calledBy Any API handler's create path (e.g. items.ts, people.ts)
366
- * @calls checkAndFireTriggers
367
- * @testUnit tests/unit/trigger-engine.test.ts — 'fireCreateTriggers'
368
- */
301
+ // CIL[END chunk_id="triggerengine_evaluateoperator_1784020784"]
302
+ // CIL[BEGIN chunk_id="triggerengine_firecreate_1784020784" type="function" identity="fireCreateTriggers" parent="none"]
303
+ // CIL[DOC-MACRO purpose="Fire triggers for entity creation events"]
304
+ // CIL[DOC-RESPONSIBILITY responsibility="Trigger event processing pipeline for created entities"]
305
+ // CIL[DOC-CONTEXT module="trigger-engine" layer="shared" related_files="[]"]
306
+ // CIL[DOC-CONTRACT inputs="none" outputs="void" errors="none" side_effects="Pipeline execution, audit logging"]
307
+ // CIL[DOC-MICRO logic_summary="Create event type string and delegate to checkAndFireTriggers" notable_decisions="[]"]
308
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
309
+ // CIL[DOC-STABILITY stability="stable"]
310
+ // CIL[DOC-VECTOR type="context" content="Layer: shared. Direct callers: 0. Direct calls: 0. Related files: none."]
311
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
312
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
313
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
314
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
315
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
369
316
  export async function fireCreateTriggers(
370
317
  entityType: string,
371
318
  entityId: string,
@@ -375,21 +322,21 @@ export async function fireCreateTriggers(
375
322
  const eventType = `${entityType}_created` as EventType
376
323
  await checkAndFireTriggers(eventType, entityType, entityId, entityData, ctx)
377
324
  }
378
-
379
- /**
380
- * Fires `<entityType>_updated` triggers. Thin wrapper around
381
- * `checkAndFireTriggers` that constructs the correct EventType.
382
- *
383
- * @param entityType - Entity table name (e.g. 'item', 'person')
384
- * @param entityId - UUID of the updated entity
385
- * @param entityData - The updated record (for condition evaluation)
386
- * @param ctx - CoreContext
387
- * @returns Promise<void> — always resolves
388
- * @throws never
389
- * @sideEffects same as checkAndFireTriggers
390
- * @calledBy Any API handler's update path
391
- * @calls checkAndFireTriggers
392
- */
325
+ // CIL[END chunk_id="triggerengine_firecreate_1784020784"]
326
+ // CIL[BEGIN chunk_id="triggerengine_fireupdate_1784020784" type="function" identity="fireUpdateTriggers" parent="none"]
327
+ // CIL[DOC-MACRO purpose="Fire triggers for entity update events"]
328
+ // CIL[DOC-RESPONSIBILITY responsibility="Trigger event processing pipeline for updated entities"]
329
+ // CIL[DOC-CONTEXT module="trigger-engine" layer="shared" related_files="[]"]
330
+ // CIL[DOC-CONTRACT inputs="none" outputs="void" errors="none" side_effects="Pipeline execution, audit logging"]
331
+ // CIL[DOC-MICRO logic_summary="Create event type string and delegate to checkAndFireTriggers" notable_decisions="[]"]
332
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
333
+ // CIL[DOC-STABILITY stability="stable"]
334
+ // CIL[DOC-VECTOR type="context" content="Layer: shared. Direct callers: 0. Direct calls: 0. Related files: none."]
335
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
336
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
337
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
338
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
339
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
393
340
  export async function fireUpdateTriggers(
394
341
  entityType: string,
395
342
  entityId: string,
@@ -399,21 +346,21 @@ export async function fireUpdateTriggers(
399
346
  const eventType = `${entityType}_updated` as EventType
400
347
  await checkAndFireTriggers(eventType, entityType, entityId, entityData, ctx)
401
348
  }
402
-
403
- /**
404
- * Fires `<entityType>_deleted` triggers. Thin wrapper around
405
- * `checkAndFireTriggers` that constructs the correct EventType.
406
- *
407
- * @param entityType - Entity table name (e.g. 'item', 'person')
408
- * @param entityId - UUID of the deleted entity
409
- * @param entityData - The record snapshot before deletion (for condition evaluation)
410
- * @param ctx - CoreContext
411
- * @returns Promise<void> — always resolves
412
- * @throws never
413
- * @sideEffects same as checkAndFireTriggers
414
- * @calledBy Any API handler's delete path
415
- * @calls checkAndFireTriggers
416
- */
349
+ // CIL[END chunk_id="triggerengine_fireupdate_1784020784"]
350
+ // CIL[BEGIN chunk_id="triggerengine_firedelete_1784020784" type="function" identity="fireDeleteTriggers" parent="none"]
351
+ // CIL[DOC-MACRO purpose="Fire triggers for entity deletion events"]
352
+ // CIL[DOC-RESPONSIBILITY responsibility="Trigger event processing pipeline for deleted entities"]
353
+ // CIL[DOC-CONTEXT module="trigger-engine" layer="shared" related_files="[]"]
354
+ // CIL[DOC-CONTRACT inputs="none" outputs="void" errors="none" side_effects="Pipeline execution, audit logging"]
355
+ // CIL[DOC-MICRO logic_summary="Create event type string and delegate to checkAndFireTriggers" notable_decisions="[]"]
356
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
357
+ // CIL[DOC-STABILITY stability="stable"]
358
+ // CIL[DOC-VECTOR type="context" content="Layer: shared. Direct callers: 0. Direct calls: 0. Related files: none."]
359
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
360
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
361
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
362
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
363
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
417
364
  export async function fireDeleteTriggers(
418
365
  entityType: string,
419
366
  entityId: string,
@@ -423,3 +370,4 @@ export async function fireDeleteTriggers(
423
370
  const eventType = `${entityType}_deleted` as EventType
424
371
  await checkAndFireTriggers(eventType, entityType, entityId, entityData, ctx)
425
372
  }
373
+ // CIL[END chunk_id="triggerengine_firedelete_1784020784"]