spine-framework 0.3.145 → 0.4.0

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 (451) hide show
  1. package/.env.example +76 -0
  2. package/.framework/.spine-manifest.json +19 -0
  3. package/.framework/cli/commands/agents.ts +61 -33
  4. package/.framework/cli/commands/auth.ts +60 -28
  5. package/.framework/cli/commands/create-app.ts +212 -80
  6. package/.framework/cli/commands/dev.ts +184 -68
  7. package/.framework/cli/commands/doctor.ts +324 -152
  8. package/.framework/cli/commands/generate.ts +119 -68
  9. package/.framework/cli/commands/init.ts +141 -242
  10. package/.framework/cli/commands/install-app.ts +1336 -314
  11. package/.framework/cli/commands/items.ts +31 -29
  12. package/.framework/cli/commands/migrate.ts +299 -156
  13. package/.framework/cli/commands/migrations.ts +62 -30
  14. package/.framework/cli/commands/pipelines.ts +31 -29
  15. package/.framework/cli/commands/status.ts +105 -45
  16. package/.framework/cli/commands/system.ts +47 -42
  17. package/.framework/cli/commands/test.ts +161 -102
  18. package/.framework/cli/commands/upgrade.ts +260 -0
  19. package/.framework/cli/commands/validate-app.ts +517 -161
  20. package/.framework/cli/context.ts +117 -85
  21. package/.framework/cli/env-loader.ts +74 -43
  22. package/.framework/cli/index.ts +70 -46
  23. package/.framework/cli/lib/project-files.ts +404 -0
  24. package/.framework/docs/guides/testing-guide.md +1 -1
  25. package/.framework/docs/runtime-types.md +72 -72
  26. package/.framework/functions/_shared/access.ts +84 -0
  27. package/.framework/functions/_shared/agent-runner.ts +5051 -1026
  28. package/.framework/functions/_shared/app-manifest.ts +214 -94
  29. package/.framework/functions/_shared/ast.ts +214 -0
  30. package/.framework/functions/_shared/audit.ts +91 -55
  31. package/.framework/functions/_shared/cil.ts +368 -127
  32. package/.framework/functions/_shared/db.ts +337 -68
  33. package/.framework/functions/_shared/funnel.ts +228 -0
  34. package/.framework/functions/_shared/geo.ts +105 -0
  35. package/.framework/functions/_shared/hash-api-key.ts +94 -17
  36. package/.framework/functions/_shared/index.ts +22 -224
  37. package/.framework/functions/_shared/kb.ts +832 -58
  38. package/.framework/functions/_shared/llm.ts +118 -18
  39. package/.framework/functions/_shared/logging.ts +317 -19
  40. package/.framework/functions/_shared/middleware.ts +701 -131
  41. package/.framework/functions/_shared/notify.ts +70 -0
  42. package/.framework/functions/_shared/outcomes.ts +34 -19
  43. package/.framework/functions/_shared/permissions.ts +501 -315
  44. package/.framework/functions/_shared/pipeline-runner.ts +704 -155
  45. package/.framework/functions/_shared/principal.ts +436 -263
  46. package/.framework/functions/_shared/rate-limit.ts +233 -0
  47. package/.framework/functions/_shared/resolve-credentials.ts +86 -19
  48. package/.framework/functions/_shared/resolve-ids.ts +203 -139
  49. package/.framework/functions/_shared/retry-deliveries.ts +51 -16
  50. package/.framework/functions/_shared/schema-utils.ts +602 -521
  51. package/.framework/functions/_shared/security.ts +345 -0
  52. package/.framework/functions/_shared/testing.ts +197 -172
  53. package/.framework/functions/_shared/tracing.ts +351 -21
  54. package/.framework/functions/_shared/trigger-engine.ts +425 -136
  55. package/.framework/functions/_shared/webhook-registration.ts +71 -70
  56. package/.framework/functions/_shared/webhook-registry.ts +126 -83
  57. package/.framework/functions/account-nodes.ts +30 -30
  58. package/.framework/functions/adapters/generic-webhook-inbound.ts +49 -16
  59. package/.framework/functions/adapters/generic-webhook-outbound.ts +17 -17
  60. package/.framework/functions/adapters/openai-outbound.ts +15 -16
  61. package/.framework/functions/admin-data.ts +596 -173
  62. package/.framework/functions/admin-funnel.ts +64 -60
  63. package/.framework/functions/admin-install-funnel.ts +84 -66
  64. package/.framework/functions/admin-signals.ts +69 -51
  65. package/.framework/functions/ai-agents.ts +431 -106
  66. package/.framework/functions/ai-interactions.ts +186 -112
  67. package/.framework/functions/api-keys.ts +107 -107
  68. package/.framework/functions/apps.ts +154 -136
  69. package/.framework/functions/auth.ts +83 -65
  70. package/.framework/functions/cil-agent-ingest.ts +189 -232
  71. package/.framework/functions/cil-agent.ts +433 -177
  72. package/.framework/functions/cil-callmap.ts +642 -430
  73. package/.framework/functions/cil-config.ts +139 -135
  74. package/.framework/functions/cil-context.ts +214 -127
  75. package/.framework/functions/cil-doc.ts +587 -458
  76. package/.framework/functions/cil-embeddings.ts +453 -364
  77. package/.framework/functions/cil-graph.ts +427 -142
  78. package/.framework/functions/cil-ingest.ts +1418 -1154
  79. package/.framework/functions/cil-pipeline.ts +276 -21
  80. package/.framework/functions/cil-project.ts +659 -132
  81. package/.framework/functions/cil-validate.ts +198 -164
  82. package/.framework/functions/debug-auth.ts +57 -55
  83. package/.framework/functions/deliveries.ts +80 -21
  84. package/.framework/functions/embeddings.ts +1023 -318
  85. package/.framework/functions/eval-harness.ts +146 -108
  86. package/.framework/functions/integration-outbound.ts +205 -75
  87. package/.framework/functions/integration-routes.ts +128 -23
  88. package/.framework/functions/integrations.ts +125 -100
  89. package/.framework/functions/invites.ts +1095 -460
  90. package/.framework/functions/item-progress.ts +158 -102
  91. package/.framework/functions/kb.ts +34 -10
  92. package/.framework/functions/logs.ts +133 -133
  93. package/.framework/functions/observability.ts +152 -122
  94. package/.framework/functions/pipeline-executions.ts +147 -132
  95. package/.framework/functions/pipelines.ts +134 -119
  96. package/.framework/functions/prompt-configs.ts +96 -80
  97. package/.framework/functions/roles.ts +112 -82
  98. package/.framework/functions/security.ts +450 -0
  99. package/.framework/functions/system-cron.ts +117 -80
  100. package/.framework/functions/system.ts +158 -98
  101. package/.framework/functions/tests.ts +29 -29
  102. package/.framework/functions/timers.ts +94 -95
  103. package/.framework/functions/trigger-scheduler.ts +10 -0
  104. package/.framework/functions/triggers.ts +179 -149
  105. package/.framework/functions/types.ts +137 -125
  106. package/.framework/mcp/index.ts +133 -0
  107. package/.framework/mcp/load-env.ts +60 -0
  108. package/.framework/mcp/shared/app-manifest.ts +275 -0
  109. package/.framework/mcp/shared/db.ts +477 -0
  110. package/.framework/mcp/shared/kb.ts +118 -0
  111. package/.framework/mcp/tools/architect.ts +431 -0
  112. package/.framework/mcp/tools/cil/context.ts +345 -0
  113. package/.framework/mcp/tools/cil/graph.ts +242 -0
  114. package/.framework/mcp/tools/cil/ingest.ts +1217 -0
  115. package/.framework/mcp/tools/cil/pipeline-orchestrator.ts +693 -0
  116. package/.framework/mcp/tools/cil/pipeline.ts +767 -0
  117. package/.framework/mcp/tools/cil/project.ts +791 -0
  118. package/.framework/mcp/tools/cil/retrieval.ts +336 -0
  119. package/.framework/mcp/tools/cil/search-core.ts +454 -0
  120. package/.framework/mcp/tools/cil/search.ts +97 -0
  121. package/.framework/mcp/tools/cil/suggest.ts +186 -0
  122. package/.framework/mcp/tools/cil/validate.ts +1369 -0
  123. package/.framework/mcp/tools/kb/delete.ts +139 -0
  124. package/.framework/mcp/tools/kb/index.ts +52 -0
  125. package/.framework/mcp/tools/kb/ingest.ts +84 -0
  126. package/.framework/mcp/tools/kb/list-types.ts +102 -0
  127. package/.framework/mcp/tools/kb/publish.ts +100 -0
  128. package/.framework/mcp/tools/kb/reindex.ts +86 -0
  129. package/.framework/mcp/tools/kb/revoke.ts +85 -0
  130. package/.framework/mcp/tools/kb/search.ts +101 -0
  131. package/.framework/mcp/tools/kb/upsert.ts +125 -0
  132. package/.framework/mcp/tools/observability.ts +510 -0
  133. package/.framework/migrations/001_core_schema.sql +15 -0
  134. package/.framework/migrations/002_core_rls_and_functions.sql +15 -0
  135. package/.framework/migrations/003_core_system_data.sql +16 -1
  136. package/.framework/migrations/004_core_rpc_and_broker.sql +17 -1
  137. package/.framework/migrations/005_core_observability.sql +17 -1
  138. package/.framework/migrations/006_security_hardening_rls.sql +15 -0
  139. package/.framework/migrations/007_kb_article_list.sql +17 -1
  140. package/.framework/migrations/008_items_target.sql +15 -0
  141. package/.framework/migrations/009_roles_slug_unique.sql +15 -0
  142. package/.framework/migrations/010_auth_user_trigger.sql +15 -0
  143. package/.framework/migrations/011_spine_system_account.sql +16 -0
  144. package/.framework/migrations/012_service_role_grants.sql +16 -0
  145. package/.framework/migrations/013_get_account_apps_role_filter.sql +15 -0
  146. package/.framework/migrations/014_apps_required_roles.sql +16 -0
  147. package/.framework/migrations/015_types_kind_slug_unique.sql +15 -0
  148. package/.framework/migrations/016_cil_types.sql +281 -0
  149. package/.framework/migrations/017_cil_stable_ids.sql +37 -0
  150. package/.framework/migrations/018_runtime_tables.sql +129 -0
  151. package/.framework/migrations/019_agent_prompt_columns.sql +56 -0
  152. package/.framework/migrations/020_schema_reconciliation.sql +67 -0
  153. package/.framework/migrations/021_kb_embedding_lifecycle.sql +31 -0
  154. package/.framework/migrations/032_cil_status_migration.sql +73 -0
  155. package/.framework/migrations/033_cil_versioning.sql +73 -0
  156. package/.framework/migrations/034_match_embeddings_knn.sql +115 -0
  157. package/.framework/migrations/035_rate_limits.sql +55 -0
  158. package/.framework/migrations/036_demo_record_flags.sql +72 -0
  159. package/.framework/migrations/037_kb_types_canonical.sql +244 -0
  160. package/.framework/migrations/038_drop_demo_record_flags.sql +38 -0
  161. package/.framework/migrations/042_registration_hierarchy.sql +309 -0
  162. package/.framework/migrations/043_policy_actor_cleanup.sql +39 -0
  163. package/.framework/migrations/044_match_embeddings_filtered_knn.sql +151 -0
  164. package/.framework/migrations/045_security_critical_rls.sql +139 -0
  165. package/.framework/migrations/046_security_missing_rls.sql +79 -0
  166. package/.framework/migrations/047_people_updated_by.sql +27 -0
  167. package/.framework/migrations/048_watcher_last_seen_at.sql +24 -0
  168. package/.framework/migrations/049_security_blocklist.sql +148 -0
  169. package/.framework/migrations/050_notifications.sql +49 -0
  170. package/.framework/migrations/051_message_agent_fields.sql +74 -0
  171. package/.framework/migrations/052_registration_security.sql +421 -0
  172. package/.framework/migrations/053_builtin_action_seeds.sql +66 -0
  173. package/.framework/migrations/054_kb_ingest_lease.sql +157 -0
  174. package/.framework/migrations/055_type_id_drift_reconciliation.sql +33 -0
  175. package/.framework/migrations/056_slug_column_reconciliation.sql +38 -0
  176. package/.framework/migrations/057_pipelines_slug_identity.sql +14 -0
  177. package/.framework/migrations/058_account_data_field_declarations.sql +53 -0
  178. package/.framework/migrations/059_registration_placement_fixes.sql +269 -0
  179. package/.framework/migrations/060_account_person_record_permissions.sql +38 -0
  180. package/.framework/migrations/061_fk_dedup.sql +32 -0
  181. package/.framework/public/spine-logo.svg +10 -3
  182. package/.framework/scripts/app-install-cli.ts +190 -93
  183. package/.framework/scripts/assemble-frontend.sh +127 -44
  184. package/.framework/scripts/assemble-functions.sh +128 -30
  185. package/.framework/scripts/boundary-check.sh +6 -2
  186. package/.framework/scripts/build-manifest.sh +24 -68
  187. package/.framework/scripts/check-core-integrity.sh +15 -76
  188. package/.framework/scripts/checksum-manifest.mts +343 -0
  189. package/.framework/scripts/cil-migrate-markers.ts +403 -0
  190. package/.framework/scripts/fix-cil-markers.mjs +176 -0
  191. package/.framework/scripts/verify-integrity.sh +21 -57
  192. package/.framework/scripts/verify-manifest.mts +305 -0
  193. package/.framework/seeds/types/funnel_signal_use.json +74 -21
  194. package/.framework/seeds/types/spine_instance.json +73 -21
  195. package/.framework/src/App.tsx +118 -72
  196. package/.framework/src/apps/admin/index.tsx +855 -58
  197. package/.framework/src/components/AppWrapper.tsx +43 -45
  198. package/.framework/src/components/CustomAppLoader.tsx +160 -116
  199. package/.framework/src/components/admin/AdminListPage.tsx +46 -44
  200. package/.framework/src/components/admin/AdminSidebar.tsx +57 -47
  201. package/.framework/src/components/admin/AdminStatsCard.tsx +46 -44
  202. package/.framework/src/components/admin/PageInstructions.tsx +98 -2
  203. package/.framework/src/components/admin/SortableTableHeader.tsx +44 -45
  204. package/.framework/src/components/app-shell/GenericAppShell.tsx +64 -65
  205. package/.framework/src/components/app-shell/GenericDetailPage.tsx +44 -47
  206. package/.framework/src/components/app-shell/GenericListPage.tsx +45 -49
  207. package/.framework/src/components/app-sidebar.tsx +42 -45
  208. package/.framework/src/components/auth/ProtectedRoute.tsx +48 -41
  209. package/.framework/src/components/auth/TurnstileWidget.tsx +27 -0
  210. package/.framework/src/components/kb/KBArticleEditor.tsx +231 -22
  211. package/.framework/src/components/kb/KBArticleList.tsx +251 -10
  212. package/.framework/src/components/layout/AppShell.tsx +51 -45
  213. package/.framework/src/components/layout/Header.tsx +42 -43
  214. package/.framework/src/components/layout/Layout.tsx +46 -46
  215. package/.framework/src/components/layout/Sidebar.tsx +196 -96
  216. package/.framework/src/components/runtime/DataDetailHeader.tsx +55 -30
  217. package/.framework/src/components/runtime/DataDetailPage.tsx +31 -269
  218. package/.framework/src/components/runtime/DataFilters.tsx +49 -74
  219. package/.framework/src/components/runtime/DataHeader.tsx +53 -32
  220. package/.framework/src/components/runtime/DataListPage.tsx +51 -155
  221. package/.framework/src/components/runtime/DataStats.tsx +66 -44
  222. package/.framework/src/components/runtime/DataTable.tsx +49 -149
  223. package/.framework/src/components/runtime/SchemaDetailForm.tsx +45 -75
  224. package/.framework/src/components/runtime/index.ts +119 -16
  225. package/.framework/src/components/search-form.tsx +46 -29
  226. package/.framework/src/components/shared/AgentView.tsx +65 -48
  227. package/.framework/src/components/shared/FieldRenderer.tsx +144 -50
  228. package/.framework/src/components/shared/InviteManager.tsx +207 -97
  229. package/.framework/src/components/shared/MemberList.tsx +97 -0
  230. package/.framework/src/components/shared/SchemaFields.tsx +107 -86
  231. package/.framework/src/components/ui/DataTable.tsx +80 -68
  232. package/.framework/src/components/ui/Form.tsx +157 -146
  233. package/.framework/src/components/ui/ItemCard.tsx +74 -67
  234. package/.framework/src/components/ui/ItemListView.tsx +73 -68
  235. package/.framework/src/components/ui/LoadingSpinner.tsx +43 -48
  236. package/.framework/src/components/ui/Modal.tsx +78 -68
  237. package/.framework/src/components/ui/RichTextEditor.tsx +89 -69
  238. package/.framework/src/components/ui/accordion.tsx +85 -86
  239. package/.framework/src/components/ui/alert-dialog.tsx +197 -184
  240. package/.framework/src/components/ui/alert.tsx +105 -94
  241. package/.framework/src/components/ui/aspect-ratio.tsx +57 -43
  242. package/.framework/src/components/ui/avatar.tsx +122 -107
  243. package/.framework/src/components/ui/badge.tsx +60 -55
  244. package/.framework/src/components/ui/breadcrumb.tsx +127 -128
  245. package/.framework/src/components/ui/button-group.tsx +86 -72
  246. package/.framework/src/components/ui/button.tsx +71 -50
  247. package/.framework/src/components/ui/calendar.tsx +72 -57
  248. package/.framework/src/components/ui/card.tsx +136 -129
  249. package/.framework/src/components/ui/carousel.tsx +226 -107
  250. package/.framework/src/components/ui/chart.tsx +252 -147
  251. package/.framework/src/components/ui/checkbox.tsx +43 -44
  252. package/.framework/src/components/ui/collapsible.tsx +86 -71
  253. package/.framework/src/components/ui/combobox.tsx +282 -249
  254. package/.framework/src/components/ui/command.tsx +158 -146
  255. package/.framework/src/components/ui/context-menu.tsx +239 -240
  256. package/.framework/src/components/ui/dialog.tsx +174 -157
  257. package/.framework/src/components/ui/direction.tsx +72 -56
  258. package/.framework/src/components/ui/drawer.tsx +168 -169
  259. package/.framework/src/components/ui/dropdown-menu.tsx +254 -223
  260. package/.framework/src/components/ui/empty.tsx +131 -120
  261. package/.framework/src/components/ui/field.tsx +205 -173
  262. package/.framework/src/components/ui/hover-card.tsx +71 -72
  263. package/.framework/src/components/ui/input-group.tsx +148 -133
  264. package/.framework/src/components/ui/input-otp.tsx +99 -86
  265. package/.framework/src/components/ui/input.tsx +43 -41
  266. package/.framework/src/components/ui/item.tsx +207 -185
  267. package/.framework/src/components/ui/kbd.tsx +57 -56
  268. package/.framework/src/components/ui/label.tsx +45 -41
  269. package/.framework/src/components/ui/menubar.tsx +268 -236
  270. package/.framework/src/components/ui/native-select.tsx +85 -86
  271. package/.framework/src/components/ui/navigation-menu.tsx +166 -156
  272. package/.framework/src/components/ui/pagination.tsx +131 -141
  273. package/.framework/src/components/ui/popover.tsx +125 -128
  274. package/.framework/src/components/ui/progress.tsx +47 -44
  275. package/.framework/src/components/ui/radio-group.tsx +60 -55
  276. package/.framework/src/components/ui/resizable.tsx +85 -72
  277. package/.framework/src/components/ui/scroll-area.tsx +57 -58
  278. package/.framework/src/components/ui/select.tsx +182 -169
  279. package/.framework/src/components/ui/separator.tsx +42 -43
  280. package/.framework/src/components/ui/sheet.tsx +170 -159
  281. package/.framework/src/components/ui/sidebar.tsx +395 -398
  282. package/.framework/src/components/ui/skeleton.tsx +42 -43
  283. package/.framework/src/components/ui/slider.tsx +61 -44
  284. package/.framework/src/components/ui/sonner.tsx +44 -44
  285. package/.framework/src/components/ui/spinner.tsx +47 -42
  286. package/.framework/src/components/ui/switch.tsx +56 -42
  287. package/.framework/src/components/ui/table-primitives.tsx +272 -132
  288. package/.framework/src/components/ui/table.tsx +140 -142
  289. package/.framework/src/components/ui/tabs.tsx +110 -93
  290. package/.framework/src/components/ui/textarea.tsx +43 -44
  291. package/.framework/src/components/ui/toggle-group.tsx +87 -71
  292. package/.framework/src/components/ui/toggle.tsx +56 -56
  293. package/.framework/src/components/ui/tooltip.tsx +99 -85
  294. package/.framework/src/contexts/AppContext.tsx +166 -114
  295. package/.framework/src/contexts/AuthContext.tsx +232 -137
  296. package/.framework/src/hooks/use-mobile.ts +43 -44
  297. package/.framework/src/hooks/useApi.ts +185 -172
  298. package/.framework/src/hooks/useAppPath.ts +31 -29
  299. package/.framework/src/hooks/useApps.ts +77 -42
  300. package/.framework/src/hooks/useEntityList.ts +66 -29
  301. package/.framework/src/hooks/useEntityRecord.ts +76 -32
  302. package/.framework/src/hooks/useForm.ts +62 -30
  303. package/.framework/src/hooks/useListSchema.ts +60 -43
  304. package/.framework/src/hooks/useSchemaRecord.ts +115 -95
  305. package/.framework/src/lib/api.ts +258 -134
  306. package/.framework/src/lib/registration.ts +181 -0
  307. package/.framework/src/lib/supabase.ts +118 -81
  308. package/.framework/src/lib/utils.ts +266 -266
  309. package/.framework/src/main.tsx +43 -44
  310. package/.framework/src/pages/DashboardPage.tsx +44 -43
  311. package/.framework/src/pages/NoAppPage.tsx +50 -0
  312. package/.framework/src/pages/NotFoundPage.tsx +32 -29
  313. package/.framework/src/pages/SetupPage.tsx +34 -33
  314. package/.framework/src/pages/admin/AIAgentDetailPage.tsx +69 -58
  315. package/.framework/src/pages/admin/AIAgentsPage.tsx +43 -40
  316. package/.framework/src/pages/admin/APIKeyDetailPage.tsx +63 -55
  317. package/.framework/src/pages/admin/APIKeysPage.tsx +44 -42
  318. package/.framework/src/pages/admin/AlertsConfigPage.tsx +117 -94
  319. package/.framework/src/pages/admin/AppDetailPage.tsx +48 -42
  320. package/.framework/src/pages/admin/AppsPage.tsx +45 -42
  321. package/.framework/src/pages/admin/DeliveriesPage.tsx +49 -17
  322. package/.framework/src/pages/admin/DesignedPage.tsx +31 -30
  323. package/.framework/src/pages/admin/EmbeddingDetailPage.tsx +58 -0
  324. package/.framework/src/pages/admin/EmbeddingsPage.tsx +49 -0
  325. package/.framework/src/pages/admin/ExtendedShadcnTestPage.tsx +31 -29
  326. package/.framework/src/pages/admin/IncrementalShadcnTestPage.tsx +46 -29
  327. package/.framework/src/pages/admin/IntegratedDashboard.tsx +32 -29
  328. package/.framework/src/pages/admin/IntegrationDetailPage.tsx +68 -55
  329. package/.framework/src/pages/admin/IntegrationsPage.tsx +45 -42
  330. package/.framework/src/pages/admin/InvitesPage.tsx +60 -44
  331. package/.framework/src/pages/admin/LogsPage.tsx +87 -137
  332. package/.framework/src/pages/admin/MinimalShadcnTestPage.tsx +31 -29
  333. package/.framework/src/pages/admin/ObservabilityDashboard.tsx +150 -89
  334. package/.framework/src/pages/admin/PipelineDetailPage.tsx +77 -104
  335. package/.framework/src/pages/admin/PipelineExecutionsPage.tsx +44 -43
  336. package/.framework/src/pages/admin/PipelinesPage.tsx +59 -145
  337. package/.framework/src/pages/admin/PromptConfigDetailPage.tsx +53 -42
  338. package/.framework/src/pages/admin/PromptConfigsPage.tsx +47 -117
  339. package/.framework/src/pages/admin/ProperlyDesignedPage.tsx +31 -44
  340. package/.framework/src/pages/admin/RoleDetailPage.tsx +49 -92
  341. package/.framework/src/pages/admin/RolesPage.tsx +47 -164
  342. package/.framework/src/pages/admin/SecurityPage.tsx +310 -0
  343. package/.framework/src/pages/admin/SelectTestPage.tsx +30 -32
  344. package/.framework/src/pages/admin/ShadcnTestPage.tsx +37 -44
  345. package/.framework/src/pages/admin/SimpleDashboard.tsx +32 -44
  346. package/.framework/src/pages/admin/TestRunDetailPage.tsx +97 -44
  347. package/.framework/src/pages/admin/TestingDashboard.tsx +126 -71
  348. package/.framework/src/pages/admin/TimerDetailPage.tsx +67 -55
  349. package/.framework/src/pages/admin/TimersPage.tsx +44 -42
  350. package/.framework/src/pages/admin/TriggerDetailPage.tsx +47 -42
  351. package/.framework/src/pages/admin/TriggersPage.tsx +58 -57
  352. package/.framework/src/pages/admin/TypeDetailPage.tsx +91 -55
  353. package/.framework/src/pages/admin/TypesPage.tsx +45 -42
  354. package/.framework/src/pages/admin/cil/CILAgentPage.tsx +258 -128
  355. package/.framework/src/pages/admin/cil/CILChunkDetailPage.tsx +127 -123
  356. package/.framework/src/pages/admin/cil/CILDashboardPage.tsx +308 -235
  357. package/.framework/src/pages/admin/cil/CILFileListPage.tsx +159 -110
  358. package/.framework/src/pages/admin/cil/CILFileSelectPage.tsx +432 -0
  359. package/.framework/src/pages/admin/cil/CILGraphPage.tsx +200 -178
  360. package/.framework/src/pages/admin/cil/CILIngestionPage.tsx +286 -239
  361. package/.framework/src/pages/admin/cil/CILProjectsPage.tsx +211 -90
  362. package/.framework/src/pages/admin/cil/CILSearchPage.tsx +156 -143
  363. package/.framework/src/pages/admin/cil/CILSuggestionsPage.tsx +379 -0
  364. package/.framework/src/pages/admin/cil/CILVersionsPage.tsx +337 -0
  365. package/.framework/src/pages/admin/cil/FlexiblePipelinePage.tsx +219 -214
  366. package/.framework/src/pages/admin/kb/KBAdminPage.tsx +64 -0
  367. package/.framework/src/pages/auth/AuthConfirmPage.tsx +135 -65
  368. package/.framework/src/pages/auth/ForgotPasswordPage.tsx +39 -31
  369. package/.framework/src/pages/auth/LoginPage.tsx +38 -32
  370. package/.framework/src/pages/auth/PendingApprovalPage.tsx +31 -28
  371. package/.framework/src/pages/auth/RegisterPage.tsx +429 -155
  372. package/.framework/src/pages/spine-framework/APIPage.tsx +33 -30
  373. package/.framework/src/pages/spine-framework/CLIPage.tsx +32 -30
  374. package/.framework/src/types/auth.ts +101 -93
  375. package/.framework/src/types/types.ts +283 -262
  376. package/.framework/templates/project.json +87 -0
  377. package/.framework/templates/spine.config.neutral.json +7 -0
  378. package/.framework/tests/api/api-surface.test.ts +381 -0
  379. package/.framework/tests/fixtures/seed.ts +427 -0
  380. package/.framework/tests/fixtures/teardown.ts +228 -0
  381. package/.framework/tests/reporter.ts +351 -0
  382. package/.framework/tests/setup.ts +135 -0
  383. package/.framework/tests/ui/ui-sweep.ts +278 -0
  384. package/.framework/tests/unit/admin-data-logger.test.ts +310 -0
  385. package/.framework/tests/unit/agent-runner.test.ts +2389 -0
  386. package/.framework/tests/unit/ai-interactions.test.ts +81 -0
  387. package/.framework/tests/unit/app-manifest.test.ts +359 -0
  388. package/.framework/tests/unit/assembly-scripts.test.ts +172 -0
  389. package/.framework/tests/unit/cil-determinism.test.ts +85 -0
  390. package/.framework/tests/unit/core-isolation.test.ts +153 -0
  391. package/.framework/tests/unit/funnel-signals.test.ts +135 -0
  392. package/.framework/tests/unit/install-app.test.ts +1759 -0
  393. package/.framework/tests/unit/invites-security.test.ts +572 -0
  394. package/.framework/tests/unit/kb-ingest-lease.test.ts +287 -0
  395. package/.framework/tests/unit/kb-search.test.ts +119 -0
  396. package/.framework/tests/unit/migrate.test.ts +509 -0
  397. package/.framework/tests/unit/notify.test.ts +136 -0
  398. package/.framework/tests/unit/permissions.test.ts +269 -0
  399. package/.framework/tests/unit/pipeline-runner.test.ts +755 -0
  400. package/.framework/tests/unit/principal-cache.test.ts +138 -0
  401. package/.framework/tests/unit/retrieval-golden.test.ts +520 -0
  402. package/.framework/tests/unit/runtime-isolation.test.ts +642 -0
  403. package/.framework/tests/unit/schema-utils.test.ts +225 -0
  404. package/.framework/tests/unit/trigger-engine.test.ts +513 -0
  405. package/.framework/tests/unit/validate-app.test.ts +527 -0
  406. package/README.md +34 -3
  407. package/bin/spine-framework.cjs +1 -0
  408. package/config/tailwind.config.cjs +7 -0
  409. package/config/tsconfig.functions.json +42 -0
  410. package/config/tsconfig.json +37 -9
  411. package/config/vite.config.ts +31 -2
  412. package/netlify.toml +31 -3
  413. package/package.json +46 -29
  414. package/scripts/assemble-frontend.sh +127 -44
  415. package/scripts/assemble-functions.sh +127 -29
  416. package/scripts/boundary-check.sh +6 -2
  417. package/scripts/build-manifest.sh +24 -68
  418. package/scripts/checksum-manifest.mts +345 -0
  419. package/scripts/dev-clean.sh +86 -0
  420. package/scripts/dev-netlify.sh +49 -0
  421. package/scripts/netlify-dev-wrapper.sh +2 -0
  422. package/scripts/verify-install.ts +358 -0
  423. package/scripts/verify-integrity.sh +21 -57
  424. package/scripts/verify-manifest.mts +305 -0
  425. package/templates/project/gitignore +45 -0
  426. package/{config → templates/project}/package-lock.json +22335 -9366
  427. package/vitest.config.ts +46 -0
  428. package/.framework/public/spine.config.json +0 -91
  429. package/config/deno.lock +0 -108
  430. package/config/tsconfig.node.tsbuildinfo +0 -1
  431. package/config/tsconfig.tsbuildinfo +0 -1
  432. package/config/vite.config.d.ts +0 -2
  433. package/custom/.devin/AGENT.md +0 -357
  434. package/custom/.devin/skills/install-app/SKILL.md +0 -39
  435. package/custom/.devin/skills/spine-workbench-discovery/SKILL.md +0 -39
  436. package/custom/.devin/skills/spine-workbench-idea/SKILL.md +0 -36
  437. package/custom/.devin/skills/spine-workbench-implement/SKILL.md +0 -46
  438. package/custom/.devin/skills/spine-workbench-initiative/SKILL.md +0 -28
  439. package/custom/.devin/skills/spine-workbench-plan/SKILL.md +0 -38
  440. package/custom/.devin/workflows/app-install.yaml +0 -83
  441. package/custom/README.md +0 -79
  442. package/docs/README.md +0 -15
  443. package/scripts/app-install-cli.ts +0 -286
  444. package/scripts/check-core-integrity.sh +0 -82
  445. package/scripts/ingest-chunks.cjs +0 -202
  446. package/scripts/kb-chunk-parser.cjs +0 -312
  447. package/scripts/kb-chunk-parser.ts +0 -330
  448. package/scripts/kb-ingest-docs.ts +0 -203
  449. package/scripts/load-test-app-install.ts +0 -484
  450. package/scripts/test-login.js +0 -33
  451. package/spine.config.json +0 -91
@@ -1,3 +1,29 @@
1
+ /**
2
+ * @module pipeline-runner
3
+ * @audience internal
4
+ * @layer shared-core
5
+ * @stability stable
6
+ *
7
+ * This module serves as a pipeline runner that orchestrates the execution of various tasks within the system. It integrates with middleware, database operations, and auditing mechanisms to ensure a cohesive flow of operations. The module is designed to handle multi-step processes, ensuring that each step is executed in the correct order and context.
8
+ *
9
+ * INVARIANT: The CoreContext must always be provided to maintain the integrity of the operations.
10
+ *
11
+ * @seeAlso middleware (provides context for operations).
12
+ * @seeAlso db (handles database interactions).
13
+ * @seeAlso audit (manages auditing of operations).
14
+ * @seeAlso integration-outbound (executes outbound integrations).
15
+ *
16
+ * @cil-generated
17
+ */
18
+ // CIL[BEGIN stable_id="~/.framework/functions/_shared/pipeline-runner.ts:module_header:module_header" type="module_header" identity="module_header" parent="~/.framework/functions/_shared/pipeline-runner.ts"]
19
+ // CIL[DOC-MACRO purpose="This module serves as a pipeline runner that orchestrates the execution of various tasks within the system."]
20
+ // CIL[DOC-RESPONSIBILITY responsibility="This module serves as a pipeline runner that orchestrates the execution of various tasks within the system. It integrates with middleware, database operations, and auditing mechanisms to ensure a cohesive flow of operations. The module is designed to handle multi-step processes, ensuring that each step is executed in the correct order and context. INVARIANT: The CoreContext must always be provided to maintain the integrity of the operations."]
21
+ // CIL[DOC-CONTEXT module="pipeline-runner" layer="shared-core" related_files="middleware (provides context for operations).,db (handles database interactions).,audit (manages auditing of operations).,integration-outbound (executes outbound integrations)."]
22
+ // CIL[DOC-CONTRACT inputs="none" outputs="none" errors="none" side_effects="none"]
23
+ // CIL[DOC-MICRO logic_summary="This module serves as a pipeline runner that orchestrates the execution of various tasks within the system. It integrates with middleware, database operations, and auditing mechanisms to ensure a cohesive flow of operations. The module is designed to handle multi-step processes, ensuring that each step is executed in the correct order and context. INVARIANT: The CoreContext must always be provided to maintain the integrity of the operations." notable_decisions="none"]
24
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
25
+ // CIL[DOC-STABILITY stability="stable"]
26
+ // CIL[DOC-AUDIENCE audience="internal"]
1
27
 
2
28
 
3
29
 
@@ -7,45 +33,125 @@
7
33
 
8
34
 
9
35
 
10
- // CIL[BEGIN chunk_id="pipelinerunner_imports_1784020784" type="module_header" identity="imports" parent="none"]
11
- // CIL[DOC-MACRO purpose="Import dependencies for pipeline execution"]
12
- // CIL[DOC-RESPONSIBILITY responsibility="Import context, database, and audit modules"]
13
- // CIL[DOC-CONTEXT module="pipeline-runner" 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="v" outputs="CoreContext, adminDb, emitAudit, UUID utilities" errors="none" side_effects="none"]
15
- // CIL[DOC-MICRO logic_summary="Import required modules and UUID validation utilities" 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"]
25
36
  import { CoreContext } from './middleware'
26
37
  import { adminDb } from './db'
27
38
  import { emitAudit, emitSpan } from './audit'
28
39
  import { emitOutcome } from './outcomes'
29
40
  import { withSpan } from './tracing'
30
- import { execute as executeOutbound } from '../integration-outbound'
31
-
41
+ import { resolveKnowledgeScope, knowledgeRowAllowed } from './kb'
42
+ import { resolveNotificationRecipients } from './notify'
43
+ // integration-outbound is imported lazily — a static edge closes the cycle
44
+ // middleware → security → rate-limit → funnel → trigger-engine →
45
+ // pipeline-runner → integration-outbound → middleware, leaving createHandler
46
+ // undefined during module evaluation.
47
+ const executeOutbound = async (ctx: CoreContext, args: any) =>
48
+ (await import('../integration-outbound')).execute(ctx, args)
49
+ // CIL[END stable_id="~/.framework/functions/_shared/pipeline-runner.ts:module_header:module_header"]
50
+ // CIL[DOC-VECTOR type="context" content="purpose='This module serves as a pipeline runner that orchestrates the execution of various tasks within the system.'; No verified external callers" status="ready"]
51
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only" status="ready"]
52
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified" status="ready"]
53
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented" status="ready"]
54
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
55
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
56
+ // CIL[DOC-MACRO purpose="UUID_RE is a regular expression that validates the format of UUIDs."]
57
+ // CIL[DOC-RESPONSIBILITY responsibility="UUID_RE is a regular expression that validates the format of UUIDs. It exists to ensure that any UUIDs processed in this module conform to the standard UUID format."]
58
+ // CIL[DOC-CONTEXT module="pipeline-runner" layer="app-specific" related_files=".framework/functions/_shared/middleware,.framework/functions/_shared/db,.framework/functions/_shared/audit,.framework/functions/_shared/outcomes,.framework/functions/_shared/tracing,.framework/functions/integration-outbound"]
59
+ // CIL[DOC-CONTRACT inputs="none" outputs="none" errors="none" side_effects="none"]
60
+ // CIL[DOC-MICRO logic_summary="UUID_RE is a regular expression that validates the format of UUIDs. It exists to ensure that any UUIDs processed in this module conform to the standard UUID format." notable_decisions="none"]
61
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
62
+ // CIL[DOC-STABILITY stability="stable"]
63
+ /**
64
+ * UUID_RE is a regular expression that validates the format of UUIDs. It exists to ensure that any UUIDs processed in this module conform to the standard UUID format.
65
+ *
66
+ * @sideEffects none
67
+ * @stability stable
68
+ * @cil-generated
69
+ */
70
+ // CIL[BEGIN stable_id="~/.framework/functions/_shared/pipeline-runner.ts:uuid_re:constant" type="constant" identity="UUID_RE" parent="~/.framework/functions/_shared/pipeline-runner.ts"]
71
+ // CIL[DOC-MACRO purpose="UUID_RE constant"]
72
+ // CIL[DOC-RESPONSIBILITY responsibility="Implements the UUID_RE constant."]
73
+ // CIL[DOC-CONTEXT module=".framework/functions/_shared/pipeline-runner.ts" layer="app-specific" related_files=""]
74
+ // CIL[DOC-CONTRACT inputs="none" outputs="none" errors="none" side_effects="none"]
75
+ // CIL[DOC-MICRO logic_summary="Implements the UUID_RE constant." notable_decisions="[]"]
76
+ // CIL[DOC-CONFIDENCE pass="first" score="0.8" flags="none"]
77
+ // CIL[DOC-STABILITY stability="stable"]
32
78
  const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i
79
+ // CIL[END stable_id="~/.framework/functions/_shared/pipeline-runner.ts:uuid_re:constant"]
80
+ // CIL[DOC-MACRO purpose="UUID_RE constant"]
81
+ // CIL[DOC-RESPONSIBILITY responsibility="Implements the UUID_RE constant."]
82
+ // CIL[DOC-CONTEXT module=".framework/functions/_shared/pipeline-runner.ts" layer="app-specific" related_files=""]
83
+ // CIL[DOC-CONTRACT inputs="none" outputs="none" errors="none" side_effects="none"]
84
+ // CIL[DOC-MICRO logic_summary="Implements the UUID_RE constant." notable_decisions="[]"]
85
+ // CIL[DOC-CONFIDENCE pass="first" score="0.8" flags="none"]
86
+ // CIL[DOC-STABILITY stability="stable"]
87
+ // CIL[DOC-VECTOR type="context" content="purpose='UUID_RE is a regular expression that validates the format of UUIDs.'; No verified external callers" status="ready"]
88
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only" status="ready"]
89
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified" status="ready"]
90
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented" status="ready"]
91
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
92
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
93
+ // CIL[DOC-MACRO purpose="Validates whether a given string is a properly formatted UUID."]
94
+ // CIL[DOC-RESPONSIBILITY responsibility="Validates whether a given string is a properly formatted UUID. This function is essential for ensuring that UUIDs are correctly identified in the pipeline processing."]
95
+ // CIL[DOC-CONTEXT module="pipeline-runner" layer="app-specific" related_files=".framework/functions/_shared/middleware,.framework/functions/_shared/db,.framework/functions/_shared/audit,.framework/functions/_shared/outcomes,.framework/functions/_shared/tracing,.framework/functions/integration-outbound"]
96
+ // CIL[DOC-CONTRACT inputs="- v: string (optional|nullable) — the value to be checked for UUID format." outputs="v is string — returns true if v is a valid UUID, otherwise false." errors="none" side_effects="none"]
97
+ // CIL[DOC-MICRO logic_summary="Validates whether a given string is a properly formatted UUID. This function is essential for ensuring that UUIDs are correctly identified in the pipeline processing." notable_decisions="none"]
98
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
99
+ // CIL[DOC-STABILITY stability="stable"]
100
+ /**
101
+ * Validates whether a given string is a properly formatted UUID. This function is essential for ensuring that UUIDs are correctly identified in the pipeline processing.
102
+ *
103
+ * @inputSpec
104
+ * - v: string (optional|nullable) — the value to be checked for UUID format.
105
+ * @outputSpec v is string — returns true if v is a valid UUID, otherwise false.
106
+ * @sideEffects none
107
+ * @stability stable
108
+ * @cil-generated
109
+ */
110
+ // CIL[BEGIN stable_id="~/.framework/functions/_shared/pipeline-runner.ts:isuuid:function" type="function" identity="isUuid" parent="~/.framework/functions/_shared/pipeline-runner.ts"]
111
+ // CIL[DOC-MACRO purpose="isUuid function"]
112
+ // CIL[DOC-RESPONSIBILITY responsibility="Implements the isUuid function."]
113
+ // CIL[DOC-CONTEXT module=".framework/functions/_shared/pipeline-runner.ts" layer="app-specific" related_files=""]
114
+ // CIL[DOC-CONTRACT inputs="none" outputs="none" errors="none" side_effects="none"]
115
+ // CIL[DOC-MICRO logic_summary="Implements the isUuid function." notable_decisions="[]"]
116
+ // CIL[DOC-CONFIDENCE pass="first" score="0.8" flags="none"]
117
+ // CIL[DOC-STABILITY stability="stable"]
33
118
  function isUuid(v: string | undefined | null): v is string { return !!v && UUID_RE.test(v) }
34
- // CIL[END chunk_id="pipelinerunner_imports_1784020784"]
35
- // CIL[BEGIN chunk_id="pipelinerunner_stageresult_1784020784" type="interface" identity="StageResult" parent="none"]
36
- // CIL[DOC-MACRO purpose="Define stage execution result interface"]
37
- // CIL[DOC-RESPONSIBILITY responsibility="Structure pipeline stage execution data"]
38
- // CIL[DOC-CONTEXT module="pipeline-runner" layer="shared" related_files="[\".framework/functions/_shared/schema-utils.ts\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\".framework/functions/_shared/principal.ts\",\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\"\\\"]"]
39
- // CIL[DOC-CONTRACT inputs="none" outputs="StageResult interface" errors="none" side_effects="none"]
40
- // CIL[DOC-MICRO logic_summary="Interface for tracking individual pipeline stage execution status" notable_decisions="[]"]
41
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
119
+ // CIL[END stable_id="~/.framework/functions/_shared/pipeline-runner.ts:isuuid:function"]
120
+ // CIL[DOC-MACRO purpose="isUuid function"]
121
+ // CIL[DOC-RESPONSIBILITY responsibility="Implements the isUuid function."]
122
+ // CIL[DOC-CONTEXT module=".framework/functions/_shared/pipeline-runner.ts" layer="app-specific" related_files=""]
123
+ // CIL[DOC-CONTRACT inputs="none" outputs="none" errors="none" side_effects="none"]
124
+ // CIL[DOC-MICRO logic_summary="Implements the isUuid function." notable_decisions="[]"]
125
+ // CIL[DOC-CONFIDENCE pass="first" score="0.8" flags="none"]
42
126
  // CIL[DOC-STABILITY stability="stable"]
43
- // CIL[DOC-VECTOR type="context" content="Layer: shared. Direct callers: 0. Direct calls: 0. Related files: .framework/functions/_shared/schema-utils.ts, .framework/src/pages/admin/IntegrationsPage.tsx, .framework/functions/_shared/principal.ts, custom/apps/cortex/functions/custom_cil-embeddings.ts, \."]
44
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
45
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
46
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
127
+ // CIL[DOC-VECTOR type="context" content="purpose='Validates whether a given string is a properly formatted UUID.'; No verified external callers" status="ready"]
128
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only" status="ready"]
129
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified" status="ready"]
130
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented" status="ready"]
47
131
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
48
132
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
133
+ // CIL[DOC-MACRO purpose="The StageResult interface defines the structure of the result produced by a stage in a pipeline execution."]
134
+ // CIL[DOC-RESPONSIBILITY responsibility="The StageResult interface defines the structure of the result produced by a stage in a pipeline execution. It captures essential information about the stage's execution status, output, and duration."]
135
+ // CIL[DOC-CONTEXT module="pipeline-runner" layer="app-specific" related_files=".framework/functions/_shared/middleware,.framework/functions/_shared/db,.framework/functions/_shared/audit,.framework/functions/_shared/outcomes,.framework/functions/_shared/tracing,.framework/functions/integration-outbound"]
136
+ // CIL[DOC-CONTRACT inputs="none" outputs="none" errors="none" side_effects="none"]
137
+ // CIL[DOC-MICRO logic_summary="The StageResult interface defines the structure of the result produced by a stage in a pipeline execution. It captures essential information about the stage's execution status, output, and duration." notable_decisions="none"]
138
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
139
+ // CIL[DOC-STABILITY stability="stable"]
140
+ /**
141
+ * The StageResult interface defines the structure of the result produced by a stage in a pipeline execution. It captures essential information about the stage's execution status, output, and duration.
142
+ *
143
+ * @sideEffects none
144
+ * @stability stable
145
+ * @cil-generated
146
+ */
147
+ // CIL[BEGIN stable_id="~/.framework/functions/_shared/pipeline-runner.ts:stageresult:interface" type="interface" identity="StageResult" parent="~/.framework/functions/_shared/pipeline-runner.ts"]
148
+ // CIL[DOC-MACRO purpose="StageResult interface"]
149
+ // CIL[DOC-RESPONSIBILITY responsibility="Implements the StageResult interface."]
150
+ // CIL[DOC-CONTEXT module=".framework/functions/_shared/pipeline-runner.ts" layer="app-specific" related_files=""]
151
+ // CIL[DOC-CONTRACT inputs="none" outputs="none" errors="none" side_effects="none"]
152
+ // CIL[DOC-MICRO logic_summary="Implements the StageResult interface." notable_decisions="[]"]
153
+ // CIL[DOC-CONFIDENCE pass="first" score="0.8" flags="none"]
154
+ // CIL[DOC-STABILITY stability="stable"]
49
155
  export interface StageResult {
50
156
  stageIndex: number
51
157
  stageType: string
@@ -54,21 +160,35 @@ export interface StageResult {
54
160
  error?: string
55
161
  durationMs: number
56
162
  }
57
- // CIL[END chunk_id="pipelinerunner_stageresult_1784020784"]
58
- // CIL[BEGIN chunk_id="pipelinerunner_executionresult_1784020784" type="interface" identity="ExecutionResult" parent="none"]
59
- // CIL[DOC-MACRO purpose="Define pipeline execution result interface"]
60
- // CIL[DOC-RESPONSIBILITY responsibility="Structure complete pipeline execution data"]
61
- // CIL[DOC-CONTEXT module="pipeline-runner" layer="shared" related_files="[\".framework/functions/_shared/schema-utils.ts\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\".framework/functions/_shared/principal.ts\",\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\"\\\"]"]
62
- // CIL[DOC-CONTRACT inputs="none" outputs="ExecutionResult interface" errors="none" side_effects="none"]
63
- // CIL[DOC-MICRO logic_summary="Interface for tracking overall pipeline execution with all stages" notable_decisions="[]"]
64
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
65
- // CIL[DOC-STABILITY stability="stable"]
66
- // CIL[DOC-VECTOR type="context" content="Layer: shared. Direct callers: 0. Direct calls: 0. Related files: .framework/functions/_shared/schema-utils.ts, .framework/src/pages/admin/IntegrationsPage.tsx, .framework/functions/_shared/principal.ts, custom/apps/cortex/functions/custom_cil-embeddings.ts, \."]
67
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
68
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
69
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
163
+ // CIL[END stable_id="~/.framework/functions/_shared/pipeline-runner.ts:stageresult:interface"]
164
+ // CIL[DOC-VECTOR type="context" content="purpose='The StageResult interface defines the structure of the result produced by a stage in a pipeline execution.'; No verified external callers" status="ready"]
165
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only" status="ready"]
166
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified" status="ready"]
167
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented" status="ready"]
70
168
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
71
169
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
170
+ // CIL[DOC-MACRO purpose="The ExecutionResult interface defines the structure of the result returned after executing a pipeline, including its status and duration."]
171
+ // CIL[DOC-RESPONSIBILITY responsibility="The ExecutionResult interface defines the structure of the result returned after executing a pipeline, including its status and duration. It is essential for tracking the outcome of pipeline executions in the system."]
172
+ // CIL[DOC-CONTEXT module="pipeline-runner" layer="app-specific" related_files=".framework/functions/_shared/middleware,.framework/functions/_shared/db,.framework/functions/_shared/audit,.framework/functions/_shared/outcomes,.framework/functions/_shared/tracing,.framework/functions/integration-outbound"]
173
+ // CIL[DOC-CONTRACT inputs="none" outputs="none" errors="none" side_effects="none"]
174
+ // CIL[DOC-MICRO logic_summary="The ExecutionResult interface defines the structure of the result returned after executing a pipeline, including its status and duration. It is essential for tracking the outcome of pipeline executions in the system." notable_decisions="none"]
175
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
176
+ // CIL[DOC-STABILITY stability="stable"]
177
+ /**
178
+ * The ExecutionResult interface defines the structure of the result returned after executing a pipeline, including its status and duration. It is essential for tracking the outcome of pipeline executions in the system.
179
+ *
180
+ * @sideEffects none
181
+ * @stability stable
182
+ * @cil-generated
183
+ */
184
+ // CIL[BEGIN stable_id="~/.framework/functions/_shared/pipeline-runner.ts:executionresult:interface" type="interface" identity="ExecutionResult" parent="~/.framework/functions/_shared/pipeline-runner.ts"]
185
+ // CIL[DOC-MACRO purpose="ExecutionResult interface"]
186
+ // CIL[DOC-RESPONSIBILITY responsibility="Implements the ExecutionResult interface."]
187
+ // CIL[DOC-CONTEXT module=".framework/functions/_shared/pipeline-runner.ts" layer="app-specific" related_files=""]
188
+ // CIL[DOC-CONTRACT inputs="none" outputs="none" errors="none" side_effects="none"]
189
+ // CIL[DOC-MICRO logic_summary="Implements the ExecutionResult interface." notable_decisions="[]"]
190
+ // CIL[DOC-CONFIDENCE pass="first" score="0.8" flags="none"]
191
+ // CIL[DOC-STABILITY stability="stable"]
72
192
  export interface ExecutionResult {
73
193
  executionId: string
74
194
  pipelineId: string
@@ -77,41 +197,79 @@ export interface ExecutionResult {
77
197
  durationMs: number
78
198
  error?: string
79
199
  }
80
- // CIL[END chunk_id="pipelinerunner_executionresult_1784020784"]
81
- // CIL[BEGIN chunk_id="pipelinerunner_pipelinestage_1784020784" type="interface" identity="PipelineStage" parent="none"]
82
- // CIL[DOC-MACRO purpose="Define pipeline stage configuration interface"]
83
- // CIL[DOC-RESPONSIBILITY responsibility="Structure individual pipeline stage definition"]
84
- // CIL[DOC-CONTEXT module="pipeline-runner" layer="shared" related_files="[\".framework/functions/_shared/schema-utils.ts\",\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\".framework/functions/_shared/principal.ts\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"\\\"]"]
85
- // CIL[DOC-CONTRACT inputs="none" outputs="PipelineStage interface" errors="none" side_effects="none"]
86
- // CIL[DOC-MICRO logic_summary="Interface for defining pipeline stage type and configuration" notable_decisions="[]"]
87
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
88
- // CIL[DOC-STABILITY stability="stable"]
89
- // CIL[DOC-VECTOR type="context" content="Layer: shared. Direct callers: 0. Direct calls: 0. Related files: .framework/functions/_shared/schema-utils.ts, custom/apps/cortex/functions/custom_cil-embeddings.ts, .framework/src/pages/admin/IntegrationsPage.tsx, .framework/functions/_shared/principal.ts, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, \."]
90
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
91
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
92
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
200
+ // CIL[END stable_id="~/.framework/functions/_shared/pipeline-runner.ts:executionresult:interface"]
201
+ // CIL[DOC-VECTOR type="context" content="purpose='The ExecutionResult interface defines the structure of the result returned after executing a pipeline, including its status and duration.'; No verified external callers" status="ready"]
202
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only" status="ready"]
203
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified" status="ready"]
204
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented" status="ready"]
93
205
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
94
206
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
207
+ // CIL[DOC-MACRO purpose="The PipelineStage interface defines the structure for a stage in a data processing pipeline, specifying the type of stage and its configuration options."]
208
+ // CIL[DOC-RESPONSIBILITY responsibility="The PipelineStage interface defines the structure for a stage in a data processing pipeline, specifying the type of stage and its configuration options. It allows for flexible error handling and configuration management within the pipeline execution."]
209
+ // CIL[DOC-CONTEXT module="pipeline-runner" layer="app-specific" related_files=".framework/functions/_shared/middleware,.framework/functions/_shared/db,.framework/functions/_shared/audit,.framework/functions/_shared/outcomes,.framework/functions/_shared/tracing,.framework/functions/integration-outbound"]
210
+ // CIL[DOC-CONTRACT inputs="none" outputs="none" errors="none" side_effects="none"]
211
+ // CIL[DOC-MICRO logic_summary="The PipelineStage interface defines the structure for a stage in a data processing pipeline, specifying the type of stage and its configuration options. It allows for flexible error handling and configuration management within the pipeline execution." notable_decisions="none"]
212
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
213
+ // CIL[DOC-STABILITY stability="stable"]
214
+ /**
215
+ * The PipelineStage interface defines the structure for a stage in a data processing pipeline, specifying the type of stage and its configuration options. It allows for flexible error handling and configuration management within the pipeline execution.
216
+ *
217
+ * @sideEffects none
218
+ * @stability stable
219
+ * @cil-generated
220
+ */
221
+ // CIL[BEGIN stable_id="~/.framework/functions/_shared/pipeline-runner.ts:pipelinestage:interface" type="interface" identity="PipelineStage" parent="~/.framework/functions/_shared/pipeline-runner.ts"]
222
+ // CIL[DOC-MACRO purpose="PipelineStage interface"]
223
+ // CIL[DOC-RESPONSIBILITY responsibility="Implements the PipelineStage interface."]
224
+ // CIL[DOC-CONTEXT module=".framework/functions/_shared/pipeline-runner.ts" layer="app-specific" related_files=""]
225
+ // CIL[DOC-CONTRACT inputs="none" outputs="none" errors="none" side_effects="none"]
226
+ // CIL[DOC-MICRO logic_summary="Implements the PipelineStage interface." notable_decisions="[]"]
227
+ // CIL[DOC-CONFIDENCE pass="first" score="0.8" flags="none"]
228
+ // CIL[DOC-STABILITY stability="stable"]
95
229
  interface PipelineStage {
96
230
  stage_type: string
97
231
  config?: Record<string, any>
98
232
  continue_on_error?: boolean
99
233
  }
100
- // CIL[END chunk_id="pipelinerunner_pipelinestage_1784020784"]
101
- // CIL[BEGIN chunk_id="pipelinerunner_runpipeline_1784020784" type="function" identity="runPipeline" parent="none"]
102
- // CIL[DOC-MACRO purpose="Execute complete pipeline with all stages"]
103
- // CIL[DOC-RESPONSIBILITY responsibility="Orchestrate pipeline execution and error handling"]
104
- // CIL[DOC-CONTEXT module="pipeline-runner" layer="shared" related_files="[\".framework/src/pages/admin/IntegrationsPage.tsx\",\".framework/functions/_shared/schema-utils.ts\",\".framework/src/pages/admin/RolesPage.tsx\",\".framework/src/components/ui/dialog.tsx\"]"]
105
- // CIL[DOC-CONTRACT inputs="none" outputs="ExecutionResult" errors="Pipeline not found, execution failed" side_effects="Database updates, audit events"]
106
- // CIL[DOC-MICRO logic_summary="Main pipeline executor handling stages, errors, and database tracking" notable_decisions="[]"]
107
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
108
- // CIL[DOC-STABILITY stability="stable"]
109
- // 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/src/pages/admin/RolesPage.tsx, .framework/src/components/ui/dialog.tsx."]
110
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
111
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
112
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
234
+ // CIL[END stable_id="~/.framework/functions/_shared/pipeline-runner.ts:pipelinestage:interface"]
235
+ // CIL[DOC-VECTOR type="context" content="purpose='The PipelineStage interface defines the structure for a stage in a data processing pipeline, specifying the type of stage and its configuration options.'; No verified external callers" status="ready"]
236
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only" status="ready"]
237
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified" status="ready"]
238
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented" status="ready"]
113
239
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
114
240
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
241
+ // CIL[DOC-MACRO purpose="Pipeline execution orchestrator that manages stage processing and error handling."]
242
+ // CIL[DOC-RESPONSIBILITY responsibility="Runs a specified pipeline by executing its stages in sequence, tracking their results and handling errors. This function manages the lifecycle of a pipeline execution, including logging and database updates."]
243
+ // CIL[DOC-CONTEXT module="pipeline-runner" layer="app-specific" related_files=".framework/functions/_shared/middleware,.framework/functions/_shared/db,.framework/functions/_shared/audit,.framework/functions/_shared/outcomes,.framework/functions/_shared/tracing,.framework/functions/integration-outbound"]
244
+ // CIL[DOC-CONTRACT inputs="pipelineId: string (required) — The unique identifier of the pipeline to run.\\ntriggerData: any (optional) — Data to trigger the pipeline execution.\\nctx: CoreContext (required) — The context containing execution metadata and user information." outputs="Promise<ExecutionResult> — Returns the result of the pipeline execution, including stage results." errors="Error — Pipeline not found or inactive: {pipelineId}, Error — Failed to create execution: {execError?.message}, Error — Action not found for stage type: {stage.stage_type}, Error — Stage {i} ({stage.stage_type}) failed: {errorMessage}" side_effects="Writes to 'pipeline_executions' table, emits audit events. dependencies="adminDb.from('pipelines'), adminDb.from('pipeline_executions'), adminDb.from('actions'), executeStage, emitAudit"]
245
+ // CIL[DOC-MICRO logic_summary="Iterates through pipeline stages, executing each stage while capturing results and handling potential errors based on stage configuration." notable_decisions="Handles errors at each stage and decides whether to continue based on stage configuration."]
246
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
247
+ // CIL[DOC-STABILITY stability="stable"]
248
+ /**
249
+ * Runs a specified pipeline by executing its stages in sequence, tracking their results and handling errors. This function manages the lifecycle of a pipeline execution, including logging and database updates.
250
+ *
251
+ * @macro Pipeline execution orchestrator that manages stage processing and error handling.
252
+ * @micro Iterates through pipeline stages, executing each stage while capturing results and handling potential errors based on stage configuration.
253
+ * @inputSpec
254
+ * pipelineId: string (required) — The unique identifier of the pipeline to run.
255
+ * triggerData: any (optional) — Data to trigger the pipeline execution.
256
+ * ctx: CoreContext (required) — The context containing execution metadata and user information.
257
+ * @outputSpec Promise<ExecutionResult> — Returns the result of the pipeline execution, including stage results.
258
+ * @throws Error — Pipeline not found or inactive: {pipelineId}, Error — Failed to create execution: {execError?.message}, Error — Action not found for stage type: {stage.stage_type}, Error — Stage {i} ({stage.stage_type}) failed: {errorMessage}
259
+ * @sideEffects Writes to 'pipeline_executions' table, emits audit events.
260
+ * @stability stable
261
+ * @calls adminDb.from('pipelines'), adminDb.from('pipeline_executions'), adminDb.from('actions'), executeStage, emitAudit
262
+ * @errorHandling Handles errors at each stage and decides whether to continue based on stage configuration.
263
+ * @cil-generated
264
+ */
265
+ // CIL[BEGIN stable_id="~/.framework/functions/_shared/pipeline-runner.ts:runpipeline:function" type="function" identity="runPipeline" parent="~/.framework/functions/_shared/pipeline-runner.ts"]
266
+ // CIL[DOC-MACRO purpose="runPipeline function"]
267
+ // CIL[DOC-RESPONSIBILITY responsibility="Implements the runPipeline function."]
268
+ // CIL[DOC-CONTEXT module=".framework/functions/_shared/pipeline-runner.ts" layer="app-specific" related_files=""]
269
+ // CIL[DOC-CONTRACT inputs="none" outputs="none" errors="none" side_effects="none"]
270
+ // CIL[DOC-MICRO logic_summary="Implements the runPipeline function." notable_decisions="[]"]
271
+ // CIL[DOC-CONFIDENCE pass="first" score="0.8" flags="none"]
272
+ // CIL[DOC-STABILITY stability="stable"]
115
273
  export async function runPipeline(
116
274
  pipelineId: string,
117
275
  triggerData: any,
@@ -282,21 +440,44 @@ export async function runPipeline(
282
440
  }
283
441
  }, { onEnd: emitSpan })
284
442
  }
285
- // CIL[END chunk_id="pipelinerunner_runpipeline_1784020784"]
286
- // CIL[BEGIN chunk_id="pipelinerunner_executestage_1784020784" type="function" identity="executeStage" parent="none"]
287
- // CIL[DOC-MACRO purpose="Route stage execution to appropriate handler"]
288
- // CIL[DOC-RESPONSIBILITY responsibility="Dispatch stage execution based on handler module"]
289
- // CIL[DOC-CONTEXT module="pipeline-runner" layer="shared" related_files="[]"]
290
- // CIL[DOC-CONTRACT inputs="none" outputs="stage execution result" errors="Unknown handler module" side_effects="Handler execution"]
291
- // CIL[DOC-MICRO logic_summary="Stage dispatcher routing to functions, integrations, or webhooks" notable_decisions="[]"]
292
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
293
- // CIL[DOC-STABILITY stability="stable"]
294
- // CIL[DOC-VECTOR type="context" content="Layer: shared. Direct callers: 0. Direct calls: 0. Related files: none."]
295
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
296
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
297
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
443
+ // CIL[END stable_id="~/.framework/functions/_shared/pipeline-runner.ts:runpipeline:function"]
444
+ // CIL[DOC-VECTOR type="context" content="purpose='Runs a specified pipeline by executing its stages in sequence, tracking their results and handling errors.'; No verified external callers" status="ready"]
445
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only" status="ready"]
446
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified" status="ready"]
447
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented" status="ready"]
298
448
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
299
449
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
450
+ // CIL[DOC-MACRO purpose="Async function orchestrating the execution of various pipeline handlers."]
451
+ // CIL[DOC-RESPONSIBILITY responsibility="Executes a specific stage of a pipeline based on the provided action and configuration. It dynamically routes the execution to the appropriate handler based on the action's module type."]
452
+ // CIL[DOC-CONTEXT module="pipeline-runner" layer="app-specific" related_files=".framework/functions/_shared/middleware,.framework/functions/_shared/db,.framework/functions/_shared/audit,.framework/functions/_shared/outcomes,.framework/functions/_shared/tracing,.framework/functions/integration-outbound"]
453
+ // CIL[DOC-CONTRACT inputs="- ctx: CoreContext (required) — the context for the execution.\\n- action: any (required) — the action object containing handler information.\\n- config: any (required) — the configuration object for the handler." outputs="Promise<any> — resolves to the result of the executed handler." errors="Error — unknown handler module." side_effects="none dependencies="withSpan, executeFunctionHandler, executeIntegrationHandler, executeWebhookHandler, emitSpan"]
454
+ // CIL[DOC-MICRO logic_summary="Utilizes a switch statement to determine the handler type and delegates execution to the corresponding handler function." notable_decisions="none"]
455
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
456
+ // CIL[DOC-STABILITY stability="stable"]
457
+ /**
458
+ * Executes a specific stage of a pipeline based on the provided action and configuration. It dynamically routes the execution to the appropriate handler based on the action's module type.
459
+ *
460
+ * @macro Async function orchestrating the execution of various pipeline handlers.
461
+ * @micro Utilizes a switch statement to determine the handler type and delegates execution to the corresponding handler function.
462
+ * @inputSpec
463
+ * - ctx: CoreContext (required) — the context for the execution.
464
+ * - action: any (required) — the action object containing handler information.
465
+ * - config: any (required) — the configuration object for the handler.
466
+ * @outputSpec Promise<any> — resolves to the result of the executed handler.
467
+ * @throws Error — unknown handler module.
468
+ * @sideEffects none
469
+ * @stability stable
470
+ * @calls withSpan, executeFunctionHandler, executeIntegrationHandler, executeWebhookHandler, emitSpan
471
+ * @cil-generated
472
+ */
473
+ // CIL[BEGIN stable_id="~/.framework/functions/_shared/pipeline-runner.ts:executestage:function" type="function" identity="executeStage" parent="~/.framework/functions/_shared/pipeline-runner.ts"]
474
+ // CIL[DOC-MACRO purpose="executeStage function"]
475
+ // CIL[DOC-RESPONSIBILITY responsibility="Implements the executeStage function."]
476
+ // CIL[DOC-CONTEXT module=".framework/functions/_shared/pipeline-runner.ts" layer="app-specific" related_files=""]
477
+ // CIL[DOC-CONTRACT inputs="none" outputs="none" errors="none" side_effects="none"]
478
+ // CIL[DOC-MICRO logic_summary="Implements the executeStage function." notable_decisions="[]"]
479
+ // CIL[DOC-CONFIDENCE pass="first" score="0.8" flags="none"]
480
+ // CIL[DOC-STABILITY stability="stable"]
300
481
  async function executeStage(
301
482
  ctx: CoreContext,
302
483
  action: any,
@@ -321,37 +502,200 @@ async function executeStage(
321
502
  }
322
503
  }, { onEnd: emitSpan })
323
504
  }
324
- // CIL[END chunk_id="pipelinerunner_executestage_1784020784"]
325
- // CIL[BEGIN chunk_id="pipelinerunner_stagehandlers_1784020784" type="variable" identity="stageHandlers" parent="none"]
326
- // CIL[DOC-MACRO purpose="Define all available pipeline stage handlers"]
327
- // CIL[DOC-RESPONSIBILITY responsibility="Implement core pipeline stage execution functions"]
328
- // CIL[DOC-CONTEXT module="pipeline-runner" layer="shared" related_files="[]"]
329
- // CIL[DOC-CONTRACT inputs="none" outputs="stageHandlers object" errors="none" side_effects="Database operations, HTTP requests"]
330
- // CIL[DOC-MICRO logic_summary="Collection of handlers for database, HTTP, notification, and AI operations" notable_decisions="[]"]
331
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
505
+ // CIL[END stable_id="~/.framework/functions/_shared/pipeline-runner.ts:executestage:function"]
506
+ // CIL[DOC-VECTOR type="context" content="purpose='Executes a specific stage of a pipeline based on the provided action and configuration.'; No verified external callers" status="ready"]
507
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only" status="ready"]
508
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified" status="ready"]
509
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented" status="ready"]
510
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
511
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
512
+ // Resolves {{trigger.*}} and {{record.*}} placeholders in stage config values.
513
+ // `trigger` is the triggerData envelope; `record` is the entity row that fired
514
+ // it (triggerData.entity.data), so {{record.data.action_type}} reaches into the
515
+ // record's jsonb and {{record.account_id}} gives the emitting account.
516
+ // CIL[DOC-MACRO purpose="Template resolver for dynamic content generation."]
517
+ // CIL[DOC-RESPONSIBILITY responsibility="Resolves template strings by replacing placeholders with corresponding values from the provided trigger data. This function is used to dynamically generate content based on the context of the trigger data."]
518
+ // CIL[DOC-CONTEXT module="pipeline-runner" layer="app-specific" related_files=".framework/functions/_shared/middleware,.framework/functions/_shared/db,.framework/functions/_shared/audit,.framework/functions/_shared/outcomes,.framework/functions/_shared/tracing,.framework/functions/integration-outbound"]
519
+ // CIL[DOC-CONTRACT inputs="- value: any (required) — the input value which may contain template strings, arrays, or objects.\\n- triggerData: any (required) — the data context used for resolving template placeholders." outputs="any — the resolved value with templates replaced or the original value if no templates were found." errors="none" side_effects="none"]
520
+ // CIL[DOC-MICRO logic_summary="Utilizes a recursive approach to handle strings, arrays, and objects for template resolution." notable_decisions="none"]
521
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
522
+ // CIL[DOC-STABILITY stability="stable"]
523
+ /**
524
+ * Resolves template strings by replacing placeholders with corresponding values from the provided trigger data. This function is used to dynamically generate content based on the context of the trigger data.
525
+ *
526
+ * @macro Template resolver for dynamic content generation.
527
+ * @micro Utilizes a recursive approach to handle strings, arrays, and objects for template resolution.
528
+ * @inputSpec
529
+ * - value: any (required) — the input value which may contain template strings, arrays, or objects.
530
+ * - triggerData: any (required) — the data context used for resolving template placeholders.
531
+ * @outputSpec any — the resolved value with templates replaced or the original value if no templates were found.
532
+ * @sideEffects none
533
+ * @stability stable
534
+ * @cil-generated
535
+ */
536
+ // CIL[BEGIN stable_id="~/.framework/functions/_shared/pipeline-runner.ts:resolvetemplates:function" type="function" identity="resolveTemplates" parent="~/.framework/functions/_shared/pipeline-runner.ts"]
537
+ // CIL[DOC-MACRO purpose="resolveTemplates function"]
538
+ // CIL[DOC-RESPONSIBILITY responsibility="Implements the resolveTemplates function."]
539
+ // CIL[DOC-CONTEXT module=".framework/functions/_shared/pipeline-runner.ts" layer="app-specific" related_files=""]
540
+ // CIL[DOC-CONTRACT inputs="none" outputs="none" errors="none" side_effects="none"]
541
+ // CIL[DOC-MICRO logic_summary="Implements the resolveTemplates function." notable_decisions="[]"]
542
+ // CIL[DOC-CONFIDENCE pass="first" score="0.8" flags="none"]
543
+ // CIL[DOC-STABILITY stability="stable"]
544
+ function resolveTemplates(value: any, triggerData: any): any {
545
+ const roots: Record<string, any> = {
546
+ trigger: triggerData,
547
+ record: triggerData?.entity?.data,
548
+ }
549
+ if (typeof value === 'string') {
550
+ if (!value.includes('{{')) return value
551
+ return value.replace(/\{\{\s*([^}]+?)\s*\}\}/g, (match, rawPath) => {
552
+ const parts = String(rawPath).trim().split('.')
553
+ let cur: any = roots[parts[0]]
554
+ if (cur === undefined) return match
555
+ for (const part of parts.slice(1)) {
556
+ if (cur == null) return match
557
+ cur = cur[part]
558
+ }
559
+ return cur == null ? '' : String(cur)
560
+ })
561
+ }
562
+ if (Array.isArray(value)) return value.map(v => resolveTemplates(v, triggerData))
563
+ if (value && typeof value === 'object') {
564
+ const out: Record<string, any> = {}
565
+ for (const [k, v] of Object.entries(value)) out[k] = resolveTemplates(v, triggerData)
566
+ return out
567
+ }
568
+ return value
569
+ }
570
+ // CIL[END stable_id="~/.framework/functions/_shared/pipeline-runner.ts:resolvetemplates:function"]
571
+ // CIL[DOC-VECTOR type="context" content="purpose='Resolves template strings by replacing placeholders with corresponding values from the provided trigger data.'; No verified external callers" status="ready"]
572
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only" status="ready"]
573
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified" status="ready"]
574
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented" status="ready"]
575
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
576
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
577
+
578
+ // CIL[DOC-MACRO purpose="Async function that retrieves account IDs from a database using a slug."]
579
+ // CIL[DOC-RESPONSIBILITY responsibility="Resolves an account ID based on a provided slug. This function exists to facilitate the retrieval of account identifiers in a structured manner."]
580
+ // CIL[DOC-CONTEXT module="pipeline-runner" layer="app-specific" related_files=".framework/functions/_shared/middleware,.framework/functions/_shared/db,.framework/functions/_shared/audit,.framework/functions/_shared/outcomes,.framework/functions/_shared/tracing,.framework/functions/integration-outbound"]
581
+ // CIL[DOC-CONTRACT inputs="ctx: CoreContext (required) — the context object containing necessary execution context.\\nslug: string (required) — the slug used to identify the account." outputs="Promise<string> — resolves to the account ID as a string." errors="Error — if the slug does not resolve to an account." side_effects="none dependencies="adminDb.from('accounts')"]
582
+ // CIL[DOC-MICRO logic_summary="Queries the database for an account ID matching the provided slug and throws an error if not found." notable_decisions="none"]
583
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
584
+ // CIL[DOC-STABILITY stability="stable"]
585
+ /**
586
+ * Resolves an account ID based on a provided slug. This function exists to facilitate the retrieval of account identifiers in a structured manner.
587
+ *
588
+ * @macro Async function that retrieves account IDs from a database using a slug.
589
+ * @micro Queries the database for an account ID matching the provided slug and throws an error if not found.
590
+ * @inputSpec
591
+ * ctx: CoreContext (required) — the context object containing necessary execution context.
592
+ * slug: string (required) — the slug used to identify the account.
593
+ * @outputSpec Promise<string> — resolves to the account ID as a string.
594
+ * @throws Error — if the slug does not resolve to an account.
595
+ * @sideEffects none
596
+ * @stability stable
597
+ * @calls adminDb.from('accounts')
598
+ * @cil-generated
599
+ */
600
+ // CIL[BEGIN stable_id="~/.framework/functions/_shared/pipeline-runner.ts:resolveaccountid:function" type="function" identity="resolveAccountId" parent="~/.framework/functions/_shared/pipeline-runner.ts"]
601
+ // CIL[DOC-MACRO purpose="resolveAccountId function"]
602
+ // CIL[DOC-RESPONSIBILITY responsibility="Implements the resolveAccountId function."]
603
+ // CIL[DOC-CONTEXT module=".framework/functions/_shared/pipeline-runner.ts" layer="app-specific" related_files=""]
604
+ // CIL[DOC-CONTRACT inputs="none" outputs="none" errors="none" side_effects="none"]
605
+ // CIL[DOC-MICRO logic_summary="Implements the resolveAccountId function." notable_decisions="[]"]
606
+ // CIL[DOC-CONFIDENCE pass="first" score="0.8" flags="none"]
332
607
  // CIL[DOC-STABILITY stability="stable"]
333
- // CIL[DOC-VECTOR type="context" content="Layer: shared. Direct callers: 0. Direct calls: 0. Related files: none."]
334
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
335
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
336
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
608
+ async function resolveAccountId(ctx: CoreContext, slug: string): Promise<string> {
609
+ const { data } = await adminDb
610
+ .from('accounts').select('id').eq('slug', slug).maybeSingle()
611
+ if (!data?.id) throw new Error(`account_slug '${slug}' did not resolve to an account`)
612
+ return data.id
613
+ }
614
+ // CIL[END stable_id="~/.framework/functions/_shared/pipeline-runner.ts:resolveaccountid:function"]
615
+ // CIL[DOC-VECTOR type="context" content="purpose='Resolves an account ID based on a provided slug.'; No verified external callers" status="ready"]
616
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only" status="ready"]
617
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified" status="ready"]
618
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented" status="ready"]
337
619
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
338
620
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
621
+
622
+
623
+ // CIL[DOC-MACRO purpose="The stageHandlers constant defines a set of asynchronous functions for handling various stages of a pipeline, specifically for updating and creating records in a database."]
624
+ // CIL[DOC-RESPONSIBILITY responsibility="The stageHandlers constant defines a set of asynchronous functions for handling various stages of a pipeline, specifically for updating and creating records in a database. It ensures that necessary parameters are provided and manages database interactions based on the provided configuration."]
625
+ // CIL[DOC-CONTEXT module="pipeline-runner" layer="app-specific" related_files=".framework/functions/_shared/middleware,.framework/functions/_shared/db,.framework/functions/_shared/audit,.framework/functions/_shared/outcomes,.framework/functions/_shared/tracing,.framework/functions/integration-outbound"]
626
+ // CIL[DOC-CONTRACT inputs="none" outputs="none" errors="Error — entity is required for update_item; Error — record_id missing and match found no record; Error — entity and data are required for create_record; Error — Update failed: {error.message}" side_effects="Database writes for updating or creating records. dependencies="adminDb.from, resolveTemplates, resolveAccountId"]
627
+ // CIL[DOC-MICRO logic_summary="The stageHandlers constant defines a set of asynchronous functions for handling various stages of a pipeline, specifically for updating and creating records in a database. It ensures that necessary parameters are provided and manages database interactions based on the provided configuration." notable_decisions="none"]
628
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
629
+ // CIL[DOC-STABILITY stability="stable"]
630
+ /**
631
+ * The stageHandlers constant defines a set of asynchronous functions for handling various stages of a pipeline, specifically for updating and creating records in a database. It ensures that necessary parameters are provided and manages database interactions based on the provided configuration.
632
+ *
633
+ * @throws Error — entity is required for update_item; Error — record_id missing and match found no record; Error — entity and data are required for create_record; Error — Update failed: {error.message}
634
+ * @sideEffects Database writes for updating or creating records.
635
+ * @stability stable
636
+ * @calls adminDb.from, resolveTemplates, resolveAccountId
637
+ * @cil-generated
638
+ */
639
+ // CIL[BEGIN stable_id="~/.framework/functions/_shared/pipeline-runner.ts:stagehandlers:constant" type="constant" identity="stageHandlers" parent="~/.framework/functions/_shared/pipeline-runner.ts"]
640
+ // CIL[DOC-MACRO purpose="stageHandlers constant — registry of built-in pipeline stage executors keyed by stage_type slug"]
641
+ // CIL[DOC-RESPONSIBILITY responsibility="Implements each built-in stage type: record writes (update_item/create_record), outbound (http_request/send_notification), orchestration (run_pipeline/query_items/agent_inference), knowledge (search_knowledge/generate_embeddings/revoke_embeddings/kb_ingest/kb_revoke), and create_interaction."]
642
+ // CIL[DOC-CONTEXT module=".framework/functions/_shared/pipeline-runner.ts" layer="app-specific" related_files=".framework/functions/_shared/kb.ts,.framework/functions/embeddings.ts,.framework/migrations/053_builtin_action_seeds.sql,.framework/migrations/054_kb_ingest_lease.sql"]
643
+ // CIL[DOC-CONTRACT inputs="ctx: CoreContext, config: stage config (item_id/document_id accept {{trigger.entity_id}}/{{entity_id}} templates)" outputs="stage-specific result object" errors="Error on missing required config keys or unresolved templates" side_effects="DB writes and/or outbound calls per stage type"]
644
+ // CIL[DOC-MICRO logic_summary="Template-bearing id fields resolve against config._triggerData then dynamic-import their engine — kb_ingest/kb_revoke import _shared/kb (canonical typed path with document lease); generate_embeddings/revoke_embeddings import functions/embeddings (legacy engine) and remain for cortex pipelines." notable_decisions="kb_ingest accepts item_id or document_id; kb_revoke accepts document_id or item_id — matching the seeded demo pipeline configs"]
645
+ // CIL[DOC-CONFIDENCE pass="first" score="0.8" flags="none"]
646
+ // CIL[DOC-STABILITY stability="stable"]
339
647
  const stageHandlers: Record<string, Function> = {
340
648
  'update_item': async (ctx: CoreContext, config: any) => {
341
- const { entity, record_id, data } = config
342
-
343
- if (!entity || !record_id) {
344
- throw new Error('entity and record_id are required for update_item')
649
+ const triggerData = config._triggerData || {}
650
+ const { entity } = config
651
+ let recordId = config.record_id ? resolveTemplates(config.record_id, triggerData) : null
652
+
653
+ if (!entity) {
654
+ throw new Error('entity is required for update_item')
655
+ }
656
+
657
+ // Optional record lookup: match finds the target row when the pipeline
658
+ // doesn't know its id (e.g. the deal linked to a prospect account).
659
+ let existing: any = null
660
+ if (!recordId && config.match) {
661
+ const m = resolveTemplates(config.match, triggerData)
662
+ let q = adminDb.from(entity).select('*').limit(1)
663
+ if (m.account_slug) {
664
+ q = q.eq('account_id', await resolveAccountId(ctx, m.account_slug))
665
+ } else if (m.account_id) {
666
+ q = q.eq('account_id', m.account_id)
667
+ } else {
668
+ q = q.eq('account_id', ctx.accountId)
669
+ }
670
+ for (const [key, value] of Object.entries(m.filters || {})) {
671
+ q = q.eq(key, value as any)
672
+ }
673
+ const { data: found } = await q
674
+ existing = found?.[0] || null
675
+ recordId = existing?.id
676
+ }
677
+ if (!recordId) {
678
+ throw new Error('update_item: record_id missing and match found no record')
679
+ }
680
+
681
+ let updateData = resolveTemplates(config.data, triggerData)
682
+ // Merge nested data jsonb — stage configs carry only the keys they change.
683
+ if (updateData?.data) {
684
+ if (!existing) {
685
+ const { data: cur } = await adminDb.from(entity).select('data').eq('id', recordId).single()
686
+ existing = cur
687
+ }
688
+ updateData = { ...updateData, data: { ...(existing?.data || {}), ...updateData.data } }
345
689
  }
346
690
 
347
691
  const { data: result, error } = await adminDb
348
692
  .from(entity)
349
693
  .update({
350
- ...data,
694
+ ...updateData,
351
695
  updated_at: new Date().toISOString(),
352
696
  updated_by: ctx.principal?.id
353
697
  })
354
- .eq('id', record_id)
698
+ .eq('id', recordId)
355
699
  .select()
356
700
  .single()
357
701
 
@@ -360,17 +704,35 @@ const stageHandlers: Record<string, Function> = {
360
704
  },
361
705
 
362
706
  'create_record': async (ctx: CoreContext, config: any) => {
363
- const { entity, data } = config
364
-
707
+ const triggerData = config._triggerData || {}
708
+ const { entity } = config
709
+ const data = resolveTemplates(config.data, triggerData)
710
+
365
711
  if (!entity || !data) {
366
712
  throw new Error('entity and data are required for create_record')
367
713
  }
368
714
 
715
+ // Optional cross-account target (e.g. a record lives in the platform
716
+ // account while the trigger fires in a customer account).
717
+ let accountId = ctx.accountId
718
+ if (config.account_slug) {
719
+ accountId = await resolveAccountId(ctx, resolveTemplates(config.account_slug, triggerData))
720
+ }
721
+
722
+ // Optional idempotency — skip the insert when a matching record exists.
723
+ if (config.dedupe?.field) {
724
+ const value = resolveTemplates(config.dedupe.value, triggerData)
725
+ let q = adminDb.from(entity).select('*').eq(config.dedupe.field, value)
726
+ if (config.dedupe.account_scoped !== false) q = q.eq('account_id', accountId)
727
+ const { data: found } = await q.limit(1)
728
+ if (found?.length) return { success: true, record: found[0], deduped: true }
729
+ }
730
+
369
731
  const { data: result, error } = await adminDb
370
732
  .from(entity)
371
733
  .insert({
372
734
  ...data,
373
- account_id: ctx.accountId,
735
+ account_id: accountId,
374
736
  created_by: isUuid(ctx.principal?.id) ? ctx.principal?.id : null,
375
737
  created_at: new Date().toISOString(),
376
738
  updated_at: new Date().toISOString()
@@ -403,20 +765,25 @@ const stageHandlers: Record<string, Function> = {
403
765
 
404
766
  'send_notification': async (ctx: CoreContext, config: any) => {
405
767
  const { message, entity_type, entity_id, recipients = [] } = config
406
-
407
- const notifications = recipients.map((recipientId: string) => ({
768
+
769
+ // watchers is the subscription table (who follows what) — deliveries go to
770
+ // the notifications table, one row per recipient. Migration 050 adds it.
771
+ // CIL[DOC-NOTE type="behavior" content="Recipients may be person UUIDs or 'role:<slug>' handles — resolveNotificationRecipients maps role slugs to this account's active people ids; a role matching nobody is a valid 0-notification result, not an error."]
772
+ const personIds = await resolveNotificationRecipients(ctx, recipients)
773
+ const notifications = personIds.map((recipientId: string) => ({
408
774
  account_id: ctx.accountId,
409
775
  person_id: recipientId,
410
776
  message,
411
- entity_type: entity_type || 'pipeline_execution',
412
- entity_id: entity_id || ctx.requestId,
777
+ source_type: 'pipeline_execution',
778
+ source_id: entity_id || ctx.requestId,
779
+ target_type: entity_type || null,
780
+ target_id: entity_id && /^[0-9a-f-]{36}$/i.test(entity_id) ? entity_id : null,
413
781
  is_read: false,
414
- created_at: new Date().toISOString()
415
782
  }))
416
783
 
417
784
  if (notifications.length > 0) {
418
785
  const { error } = await adminDb
419
- .from('watchers')
786
+ .from('notifications')
420
787
  .insert(notifications)
421
788
 
422
789
  if (error) throw new Error(`Notification failed: ${error.message}`)
@@ -446,15 +813,37 @@ const stageHandlers: Record<string, Function> = {
446
813
 
447
814
  'search_knowledge': async (ctx: CoreContext, config: any) => {
448
815
  const { query, knowledge_sources, model_id, limit = 5, threshold = 0.7 } = config
449
-
816
+
450
817
  if (!query) {
451
818
  throw new Error('query is required for search_knowledge')
452
819
  }
453
820
 
821
+ // Enforce the app knowledge envelope — the pipeline's owning app is the
822
+ // server-side authority (a client-supplied app hint is only a fallback).
823
+ let appRef: string | null = (ctx as any).appId || null
824
+ if (config._pipelineId) {
825
+ const { data: p } = await adminDb
826
+ .from('pipelines')
827
+ .select('app_id')
828
+ .eq('id', config._pipelineId)
829
+ .maybeSingle()
830
+ if (p?.app_id) appRef = p.app_id
831
+ }
832
+ const scope = await resolveKnowledgeScope(ctx, appRef, {})
833
+ if (!scope.allowed) {
834
+ return {
835
+ results: [],
836
+ count: 0,
837
+ method: 'denied',
838
+ error: `knowledge_denied: ${scope.deniedReason}`,
839
+ query
840
+ }
841
+ }
842
+
454
843
  let dbQuery = adminDb
455
844
  .from('embeddings')
456
845
  .select('*')
457
- .eq('account_id', ctx.accountId)
846
+ .in('account_id', scope.accountIds)
458
847
  .limit(limit)
459
848
 
460
849
  if (knowledge_sources && knowledge_sources.length > 0) {
@@ -468,10 +857,13 @@ const stageHandlers: Record<string, Function> = {
468
857
  const { data: textResults, error: textError } = await dbQuery
469
858
  .textSearch('content', query, { type: 'websearch', config: 'english' })
470
859
 
471
- if (!textError && textResults && textResults.length > 0) {
860
+ const inScope = (rows: any[]) => (rows || []).filter((r: any) => knowledgeRowAllowed(scope, r))
861
+
862
+ if (!textError && textResults && inScope(textResults).length > 0) {
863
+ const rows = inScope(textResults)
472
864
  return {
473
- results: textResults,
474
- count: textResults.length,
865
+ results: rows,
866
+ count: rows.length,
475
867
  method: 'text_search',
476
868
  query
477
869
  }
@@ -484,9 +876,10 @@ const stageHandlers: Record<string, Function> = {
484
876
  throw new Error(`Knowledge search failed: ${fallbackError.message}`)
485
877
  }
486
878
 
879
+ const scopedResults = inScope(fallbackResults || [])
487
880
  return {
488
- results: fallbackResults || [],
489
- count: fallbackResults?.length || 0,
881
+ results: scopedResults,
882
+ count: scopedResults.length,
490
883
  method: 'fallback_ilike',
491
884
  query
492
885
  }
@@ -585,22 +978,129 @@ const stageHandlers: Record<string, Function> = {
585
978
  force_regenerate: config.force_regenerate ?? false,
586
979
  })
587
980
  },
981
+
982
+ 'revoke_embeddings': async (ctx: CoreContext, config: any) => {
983
+ const triggerData = config._triggerData || {}
984
+ let documentId = config.document_id ?? config.item_id
985
+ if (!documentId) throw new Error('document_id is required for revoke_embeddings')
986
+
987
+ if (typeof documentId === 'string' && documentId.includes('{{')) {
988
+ documentId = documentId
989
+ .replace(/\{\{trigger\.entity_id\}\}/g, triggerData?.entity_id || '')
990
+ .replace(/\{\{entity_id\}\}/g, triggerData?.entity_id || '')
991
+ }
992
+
993
+ if (!documentId) throw new Error('revoke_embeddings: could not resolve document_id from trigger data')
994
+
995
+ const { revoke } = await import('../embeddings')
996
+ const genCtx = { ...ctx, query: { ...((ctx as any).query || {}), action: 'revoke' } } as any
997
+ return await revoke(genCtx, { document_id: documentId })
998
+ },
999
+
1000
+ // CIL[DOC-NOTE type="behavior" content="kb_ingest/kb_revoke wrap the canonical typed path in _shared/kb.ts (content-hash lease, declared vector fields, supersede_keys supersession) — unlike generate_embeddings/revoke_embeddings which hit the legacy embeddings engine. Both stage types remain registered; new pipelines should prefer kb_ingest/kb_revoke."]
1001
+ 'kb_ingest': async (ctx: CoreContext, config: any) => {
1002
+ const triggerData = config._triggerData || {}
1003
+ let itemId = config.item_id ?? config.document_id
1004
+ if (!itemId) throw new Error('item_id is required for kb_ingest')
1005
+
1006
+ if (typeof itemId === 'string' && itemId.includes('{{')) {
1007
+ itemId = itemId
1008
+ .replace(/\{\{trigger\.entity_id\}\}/g, triggerData?.entity_id || '')
1009
+ .replace(/\{\{entity_id\}\}/g, triggerData?.entity_id || '')
1010
+ }
1011
+
1012
+ if (!itemId) throw new Error('kb_ingest: could not resolve item_id from trigger data')
1013
+
1014
+ const { kbIngest } = await import('./kb')
1015
+ return await kbIngest(ctx, { id: itemId })
1016
+ },
1017
+
1018
+ 'kb_revoke': async (ctx: CoreContext, config: any) => {
1019
+ const triggerData = config._triggerData || {}
1020
+ let itemId = config.document_id ?? config.item_id
1021
+ if (!itemId) throw new Error('document_id is required for kb_revoke')
1022
+
1023
+ if (typeof itemId === 'string' && itemId.includes('{{')) {
1024
+ itemId = itemId
1025
+ .replace(/\{\{trigger\.entity_id\}\}/g, triggerData?.entity_id || '')
1026
+ .replace(/\{\{entity_id\}\}/g, triggerData?.entity_id || '')
1027
+ }
1028
+
1029
+ if (!itemId) throw new Error('kb_revoke: could not resolve document_id from trigger data')
1030
+
1031
+ const { kbRevoke } = await import('./kb')
1032
+ return await kbRevoke(ctx, { id: itemId })
1033
+ },
1034
+
1035
+ 'create_interaction': async (ctx: CoreContext, config: any) => {
1036
+ const triggerData = config._triggerData || {}
1037
+ const entityData = triggerData?.entity?.data || {}
1038
+ const resolveField = (v: any) => typeof v === 'string'
1039
+ ? v.replace(/\{\{trigger\.entity_id\}\}/g, triggerData?.entity_id || '')
1040
+ .replace(/\{\{entity_id\}\}/g, triggerData?.entity_id || '')
1041
+ .replace(/\{\{trigger\.thread_id\}\}/g, entityData?.thread_id || '')
1042
+ : v
1043
+
1044
+ const aiMessageId = resolveField(config.ai_message_id) || triggerData?.entity_id
1045
+ const threadId = resolveField(config.thread_id) || entityData?.thread_id
1046
+ if (!aiMessageId && !threadId) throw new Error('create_interaction: could not resolve ai_message_id or thread_id from trigger data')
1047
+
1048
+ const { createInteraction } = await import('../ai-interactions')
1049
+ const genCtx = { ...ctx, query: { ...((ctx as any).query || {}), action: 'create_interaction' } } as any
1050
+ // CIL[DOC-NOTE type="behavior" content="config.type_slug passes through to createInteraction (default ai_feedback_record when unset) so apps can record interactions under their own item type, e.g. demo_feedback_record."]
1051
+ return await createInteraction(genCtx, {
1052
+ ai_message_id: aiMessageId,
1053
+ thread_id: threadId,
1054
+ retrieved_sources: config.retrieved_sources ?? entityData?.data?.retrieved_sources,
1055
+ ai_confidence: config.ai_confidence ?? entityData?.data?.confidence,
1056
+ retrieval_confidence: config.retrieval_confidence ?? entityData?.data?.mean_similarity,
1057
+ type_slug: config.type_slug,
1058
+ })
1059
+ },
588
1060
  }
589
- // CIL[END chunk_id="pipelinerunner_stagehandlers_1784020784"]
590
- // CIL[BEGIN chunk_id="pipelinerunner_executefunctionhandler_1784020784" type="function" identity="executeFunctionHandler" parent="none"]
591
- // CIL[DOC-MACRO purpose="Execute built-in function stage handlers"]
592
- // CIL[DOC-RESPONSIBILITY responsibility="Dispatch to internal stage handler functions"]
593
- // CIL[DOC-CONTEXT module="pipeline-runner" layer="shared" related_files="[]"]
594
- // CIL[DOC-CONTRACT inputs="none" outputs="handler execution result" errors="Unknown function handler" side_effects="Handler execution"]
595
- // CIL[DOC-MICRO logic_summary="Lookup and execute built-in stage handler by name" notable_decisions="[]"]
596
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
597
- // CIL[DOC-STABILITY stability="stable"]
598
- // CIL[DOC-VECTOR type="context" content="Layer: shared. Direct callers: 0. Direct calls: 0. Related files: none."]
599
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
600
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
601
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
1061
+ // CIL[END stable_id="~/.framework/functions/_shared/pipeline-runner.ts:stagehandlers:constant"]
1062
+ // CIL[DOC-VECTOR type="context" content="purpose='The stageHandlers constant defines a set of asynchronous functions for handling various stages of a pipeline, specifically for updating and creating records in a database.'; No verified external callers" status="ready"]
1063
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only" status="ready"]
1064
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified" status="ready"]
1065
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented" status="ready"]
602
1066
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
603
1067
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
1068
+
1069
+
1070
+
1071
+
1072
+
1073
+
1074
+ // CIL[DOC-MACRO purpose="Handler executor that dynamically invokes function handlers based on their names."]
1075
+ // CIL[DOC-RESPONSIBILITY responsibility="Executes a specified function handler with the provided context and configuration. This function ensures that the handler exists before attempting to invoke it."]
1076
+ // CIL[DOC-CONTEXT module="pipeline-runner" layer="app-specific" related_files=".framework/functions/_shared/middleware,.framework/functions/_shared/db,.framework/functions/_shared/audit,.framework/functions/_shared/outcomes,.framework/functions/_shared/tracing,.framework/functions/integration-outbound"]
1077
+ // CIL[DOC-CONTRACT inputs="ctx: CoreContext (required) — the context in which the handler is executed.\\nhandlerName: string (required) — the name of the handler to execute.\\nconfig: any (required) — configuration parameters for the handler." outputs="Promise<any> — the result of the handler execution." errors="Error — if the handler name is unknown." side_effects="none"]
1078
+ // CIL[DOC-MICRO logic_summary="Retrieves the handler from a collection and invokes it with the provided context and configuration." notable_decisions="none"]
1079
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
1080
+ // CIL[DOC-STABILITY stability="stable"]
1081
+ /**
1082
+ * Executes a specified function handler with the provided context and configuration. This function ensures that the handler exists before attempting to invoke it.
1083
+ *
1084
+ * @macro Handler executor that dynamically invokes function handlers based on their names.
1085
+ * @micro Retrieves the handler from a collection and invokes it with the provided context and configuration.
1086
+ * @inputSpec
1087
+ * ctx: CoreContext (required) — the context in which the handler is executed.
1088
+ * handlerName: string (required) — the name of the handler to execute.
1089
+ * config: any (required) — configuration parameters for the handler.
1090
+ * @outputSpec Promise<any> — the result of the handler execution.
1091
+ * @throws Error — if the handler name is unknown.
1092
+ * @sideEffects none
1093
+ * @stability stable
1094
+ * @cil-generated
1095
+ */
1096
+ // CIL[BEGIN stable_id="~/.framework/functions/_shared/pipeline-runner.ts:executefunctionhandler:function" type="function" identity="executeFunctionHandler" parent="~/.framework/functions/_shared/pipeline-runner.ts"]
1097
+ // CIL[DOC-MACRO purpose="executeFunctionHandler function"]
1098
+ // CIL[DOC-RESPONSIBILITY responsibility="Implements the executeFunctionHandler function."]
1099
+ // CIL[DOC-CONTEXT module=".framework/functions/_shared/pipeline-runner.ts" layer="app-specific" related_files=""]
1100
+ // CIL[DOC-CONTRACT inputs="none" outputs="none" errors="none" side_effects="none"]
1101
+ // CIL[DOC-MICRO logic_summary="Implements the executeFunctionHandler function." notable_decisions="[]"]
1102
+ // CIL[DOC-CONFIDENCE pass="first" score="0.8" flags="none"]
1103
+ // CIL[DOC-STABILITY stability="stable"]
604
1104
  async function executeFunctionHandler(
605
1105
  ctx: CoreContext,
606
1106
  handlerName: string,
@@ -614,21 +1114,43 @@ async function executeFunctionHandler(
614
1114
 
615
1115
  return await handler(ctx, config)
616
1116
  }
617
- // CIL[END chunk_id="pipelinerunner_executefunctionhandler_1784020784"]
618
- // CIL[BEGIN chunk_id="pipelinerunner_executeintegrationhandler_1784020784" type="function" identity="executeIntegrationHandler" parent="none"]
619
- // CIL[DOC-MACRO purpose="Execute external integration stage handlers"]
620
- // CIL[DOC-RESPONSIBILITY responsibility="Dispatch to configured integration handlers"]
621
- // CIL[DOC-CONTEXT module="pipeline-runner" layer="shared" related_files="[]"]
622
- // CIL[DOC-CONTRACT inputs="none" outputs="integration execution result" errors="Integration not found" side_effects="Integration execution"]
623
- // CIL[DOC-MICRO logic_summary="Lookup integration config and execute external handler" notable_decisions="[]"]
624
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
625
- // CIL[DOC-STABILITY stability="stable"]
626
- // CIL[DOC-VECTOR type="context" content="Layer: shared. Direct callers: 0. Direct calls: 0. Related files: none."]
627
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
628
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
629
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
1117
+ // CIL[END stable_id="~/.framework/functions/_shared/pipeline-runner.ts:executefunctionhandler:function"]
1118
+ // CIL[DOC-VECTOR type="context" content="purpose='Executes a specified function handler with the provided context and configuration.'; No verified external callers" status="ready"]
1119
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only" status="ready"]
1120
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified" status="ready"]
1121
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented" status="ready"]
630
1122
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
631
1123
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
1124
+ // CIL[DOC-MACRO purpose="Async function that triggers integration actions based on provided configuration."]
1125
+ // CIL[DOC-RESPONSIBILITY responsibility="Executes an integration handler by importing the execute function from the integration-outbound module and passing the necessary parameters. This function facilitates the integration process by providing a structured way to handle integration actions."]
1126
+ // CIL[DOC-CONTEXT module="pipeline-runner" layer="app-specific" related_files=".framework/functions/_shared/middleware,.framework/functions/_shared/db,.framework/functions/_shared/audit,.framework/functions/_shared/outcomes,.framework/functions/_shared/tracing,.framework/functions/integration-outbound"]
1127
+ // CIL[DOC-CONTRACT inputs="ctx: CoreContext (required) — the core context for the integration execution.\\nhandlerName: string (required) — the name of the integration handler to execute.\\nconfig: any (required) — configuration object containing integration parameters." outputs="Promise<any> — resolves with the result of the integration execution." errors="none" side_effects="calls external integration service to execute the handler. dependencies="execute"]
1128
+ // CIL[DOC-MICRO logic_summary="Imports the execute function dynamically and invokes it with a context and action configuration." notable_decisions="none"]
1129
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
1130
+ // CIL[DOC-STABILITY stability="stable"]
1131
+ /**
1132
+ * Executes an integration handler by importing the execute function from the integration-outbound module and passing the necessary parameters. This function facilitates the integration process by providing a structured way to handle integration actions.
1133
+ *
1134
+ * @macro Async function that triggers integration actions based on provided configuration.
1135
+ * @micro Imports the execute function dynamically and invokes it with a context and action configuration.
1136
+ * @inputSpec
1137
+ * ctx: CoreContext (required) — the core context for the integration execution.
1138
+ * handlerName: string (required) — the name of the integration handler to execute.
1139
+ * config: any (required) — configuration object containing integration parameters.
1140
+ * @outputSpec Promise<any> — resolves with the result of the integration execution.
1141
+ * @sideEffects calls external integration service to execute the handler.
1142
+ * @stability stable
1143
+ * @calls execute
1144
+ * @cil-generated
1145
+ */
1146
+ // CIL[BEGIN stable_id="~/.framework/functions/_shared/pipeline-runner.ts:executeintegrationhandler:function" type="function" identity="executeIntegrationHandler" parent="~/.framework/functions/_shared/pipeline-runner.ts"]
1147
+ // CIL[DOC-MACRO purpose="executeIntegrationHandler function"]
1148
+ // CIL[DOC-RESPONSIBILITY responsibility="Implements the executeIntegrationHandler function."]
1149
+ // CIL[DOC-CONTEXT module=".framework/functions/_shared/pipeline-runner.ts" layer="app-specific" related_files=""]
1150
+ // CIL[DOC-CONTRACT inputs="none" outputs="none" errors="none" side_effects="none"]
1151
+ // CIL[DOC-MICRO logic_summary="Implements the executeIntegrationHandler function." notable_decisions="[]"]
1152
+ // CIL[DOC-CONFIDENCE pass="first" score="0.8" flags="none"]
1153
+ // CIL[DOC-STABILITY stability="stable"]
632
1154
  async function executeIntegrationHandler(
633
1155
  ctx: CoreContext,
634
1156
  handlerName: string,
@@ -641,21 +1163,42 @@ async function executeIntegrationHandler(
641
1163
  action_config: config
642
1164
  })
643
1165
  }
644
- // CIL[END chunk_id="pipelinerunner_executeintegrationhandler_1784020784"]
645
- // CIL[BEGIN chunk_id="pipelinerunner_executewebhookhandler_1784020784" type="function" identity="executeWebhookHandler" parent="none"]
646
- // CIL[DOC-MACRO purpose="Execute webhook stage handlers via HTTP"]
647
- // CIL[DOC-RESPONSIBILITY responsibility="Send stage execution data to webhook endpoints"]
648
- // CIL[DOC-CONTEXT module="pipeline-runner" layer="shared" related_files="[]"]
649
- // CIL[DOC-CONTRACT inputs="none" outputs="webhook response" errors="Webhook URL not configured" side_effects="HTTP requests"]
650
- // CIL[DOC-MICRO logic_summary="Send configuration data to configured webhook endpoint" notable_decisions="[]"]
651
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
652
- // CIL[DOC-STABILITY stability="stable"]
653
- // CIL[DOC-VECTOR type="context" content="Layer: shared. Direct callers: 0. Direct calls: 0. Related files: none."]
654
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
655
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
656
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
1166
+ // CIL[END stable_id="~/.framework/functions/_shared/pipeline-runner.ts:executeintegrationhandler:function"]
1167
+ // CIL[DOC-VECTOR type="context" content="purpose='Executes an integration handler by importing the execute function from the integration-outbound module and passing the necessary parameters.'; No verified external callers" status="ready"]
1168
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only" status="ready"]
1169
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified" status="ready"]
1170
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented" status="ready"]
657
1171
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
658
1172
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
1173
+ // CIL[DOC-MACRO purpose="Executes a webhook action by sending an HTTP request to a specified URL with the provided configuration."]
1174
+ // CIL[DOC-RESPONSIBILITY responsibility="Executes a webhook action by sending an HTTP request to a specified URL with the provided configuration. This function is designed to facilitate integration with external services via webhooks."]
1175
+ // CIL[DOC-CONTEXT module="pipeline-runner" layer="app-specific" related_files=".framework/functions/_shared/middleware,.framework/functions/_shared/db,.framework/functions/_shared/audit,.framework/functions/_shared/outcomes,.framework/functions/_shared/tracing,.framework/functions/integration-outbound"]
1176
+ // CIL[DOC-CONTRACT inputs="ctx: CoreContext (required) — the context for the execution environment.\\naction: any (required) — the action configuration containing the webhook details.\\nconfig: any (required) — the body content to send with the webhook request." outputs="Promise<any> — resolves to an object containing success status, response status, and response body." errors="Error — Webhook URL not configured in action" side_effects="Makes an external HTTP request to the specified webhook URL. dependencies="execute"]
1177
+ // CIL[DOC-MICRO logic_summary="Executes a webhook action by sending an HTTP request to a specified URL with the provided configuration. This function is designed to facilitate integration with external services via webhooks." notable_decisions="none"]
1178
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
1179
+ // CIL[DOC-STABILITY stability="stable"]
1180
+ /**
1181
+ * Executes a webhook action by sending an HTTP request to a specified URL with the provided configuration. This function is designed to facilitate integration with external services via webhooks.
1182
+ *
1183
+ * @inputSpec
1184
+ * ctx: CoreContext (required) — the context for the execution environment.
1185
+ * action: any (required) — the action configuration containing the webhook details.
1186
+ * config: any (required) — the body content to send with the webhook request.
1187
+ * @outputSpec Promise<any> — resolves to an object containing success status, response status, and response body.
1188
+ * @throws Error — Webhook URL not configured in action
1189
+ * @sideEffects Makes an external HTTP request to the specified webhook URL.
1190
+ * @stability stable
1191
+ * @calls execute
1192
+ * @cil-generated
1193
+ */
1194
+ // CIL[BEGIN stable_id="~/.framework/functions/_shared/pipeline-runner.ts:executewebhookhandler:function" type="function" identity="executeWebhookHandler" parent="~/.framework/functions/_shared/pipeline-runner.ts"]
1195
+ // CIL[DOC-MACRO purpose="executeWebhookHandler function"]
1196
+ // CIL[DOC-RESPONSIBILITY responsibility="Implements the executeWebhookHandler function."]
1197
+ // CIL[DOC-CONTEXT module=".framework/functions/_shared/pipeline-runner.ts" layer="app-specific" related_files=""]
1198
+ // CIL[DOC-CONTRACT inputs="none" outputs="none" errors="none" side_effects="none"]
1199
+ // CIL[DOC-MICRO logic_summary="Implements the executeWebhookHandler function." notable_decisions="[]"]
1200
+ // CIL[DOC-CONFIDENCE pass="first" score="0.8" flags="none"]
1201
+ // CIL[DOC-STABILITY stability="stable"]
659
1202
  async function executeWebhookHandler(
660
1203
  ctx: CoreContext,
661
1204
  action: any,
@@ -685,4 +1228,10 @@ async function executeWebhookHandler(
685
1228
  body: result.response_body
686
1229
  }
687
1230
  }
688
- // CIL[END chunk_id="pipelinerunner_executewebhookhandler_1784020784"]
1231
+ // CIL[END stable_id="~/.framework/functions/_shared/pipeline-runner.ts:executewebhookhandler:function"]
1232
+ // CIL[DOC-VECTOR type="context" content="purpose='Executes a webhook action by sending an HTTP request to a specified URL with the provided configuration.'; No verified external callers" status="ready"]
1233
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only" status="ready"]
1234
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified" status="ready"]
1235
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented" status="ready"]
1236
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
1237
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]