spine-framework 0.4.3 → 0.5.0-rc.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (320) hide show
  1. package/.env.example +13 -3
  2. package/.framework/cli/commands/bootstrap.ts +392 -0
  3. package/.framework/cli/commands/dev.ts +91 -218
  4. package/.framework/cli/commands/doctor.ts +132 -26
  5. package/.framework/cli/commands/generate.ts +38 -298
  6. package/.framework/cli/commands/init.ts +20 -1
  7. package/.framework/cli/commands/migrate.ts +36 -30
  8. package/.framework/cli/commands/migrations.ts +16 -56
  9. package/.framework/cli/commands/upgrade.ts +35 -0
  10. package/.framework/cli/commands/validate-schema.ts +147 -0
  11. package/.framework/cli/context.ts +223 -110
  12. package/.framework/cli/index.ts +6 -0
  13. package/.framework/cli/lib/project-files.ts +241 -1
  14. package/.framework/functions/_shared/agent-runner.ts +1000 -81
  15. package/.framework/functions/_shared/cil.ts +2 -1
  16. package/.framework/functions/_shared/db.ts +3 -6
  17. package/.framework/functions/_shared/hash-api-key.ts +183 -79
  18. package/.framework/functions/_shared/kb.ts +61 -7
  19. package/.framework/functions/_shared/logging.ts +562 -224
  20. package/.framework/functions/_shared/message-sequence.ts +53 -0
  21. package/.framework/functions/_shared/middleware.ts +47 -44
  22. package/.framework/functions/_shared/pipeline-runner.ts +150 -37
  23. package/.framework/functions/_shared/principal.ts +9 -6
  24. package/.framework/functions/_shared/trigger-engine.ts +149 -40
  25. package/.framework/functions/admin-data.ts +48 -31
  26. package/.framework/functions/ai-agents.ts +103 -33
  27. package/.framework/functions/api-keys.ts +301 -122
  28. package/.framework/functions/apps.ts +43 -26
  29. package/.framework/functions/cil-ingest.ts +48 -15
  30. package/.framework/functions/debug-auth.ts +14 -8
  31. package/.framework/functions/deliveries.ts +39 -12
  32. package/.framework/functions/embeddings.ts +145 -76
  33. package/.framework/functions/integration-outbound.ts +67 -27
  34. package/.framework/functions/integrations.ts +254 -127
  35. package/.framework/functions/logs.ts +273 -133
  36. package/.framework/functions/observability.ts +277 -147
  37. package/.framework/functions/pipeline-executions.ts +1 -1
  38. package/.framework/functions/pipeline-runner-background.ts +120 -0
  39. package/.framework/functions/pipelines.ts +14 -9
  40. package/.framework/functions/prompt-configs.ts +7 -4
  41. package/.framework/functions/roles.ts +8 -5
  42. package/.framework/functions/security.ts +30 -17
  43. package/.framework/functions/system-cron.ts +250 -128
  44. package/.framework/functions/tests.ts +7 -6
  45. package/.framework/functions/timers.ts +310 -107
  46. package/.framework/functions/trigger-scheduler.ts +65 -5
  47. package/.framework/functions/triggers.ts +28 -13
  48. package/.framework/functions/types.ts +13 -10
  49. package/.framework/migrations/064_episode_leases.sql +196 -0
  50. package/.framework/migrations/065_execution_tables_updated_at.sql +20 -0
  51. package/.framework/migrations/066_episode_steal_thread_merge.sql +148 -0
  52. package/.framework/migrations/067_episode_lease_stale_steal.sql +93 -0
  53. package/.framework/migrations/068_cron_schedule_timer_rpcs.sql +251 -0
  54. package/.framework/migrations/069_log_stats_window.sql +54 -0
  55. package/.framework/migrations/070_app_type_schema_rpcs.sql +166 -0
  56. package/.framework/migrations/071_timer_interval_keys.sql +96 -0
  57. package/.framework/migrations/072_slug_autofill.sql +77 -0
  58. package/.framework/migrations/073_seed_member_roles.sql +26 -0
  59. package/.framework/schemas/spine.config.schema.json +62 -0
  60. package/.framework/src/App.tsx +3 -1
  61. package/.framework/src/apps/admin/index.tsx +1141 -775
  62. package/.framework/src/components/ErrorBoundary.tsx +136 -0
  63. package/.framework/src/components/admin/AdminListPage.tsx +81 -73
  64. package/.framework/src/components/admin/AdminSidebar.tsx +92 -81
  65. package/.framework/src/components/admin/EntitySelect.tsx +181 -0
  66. package/.framework/src/components/admin/PageInstructions.tsx +86 -127
  67. package/.framework/src/components/app-shell/GenericAppShell.tsx +3 -1
  68. package/.framework/src/components/app-shell/GenericDetailPage.tsx +37 -13
  69. package/.framework/src/components/app-shell/GenericListPage.tsx +28 -32
  70. package/.framework/src/components/auth/TurnstileWidget.tsx +9 -6
  71. package/.framework/src/components/kb/KBArticleEditor.tsx +49 -6
  72. package/.framework/src/components/layout/Layout.tsx +4 -2
  73. package/.framework/src/components/layout/Sidebar.tsx +304 -179
  74. package/.framework/src/components/runtime/DataDetailPage.tsx +67 -35
  75. package/.framework/src/components/runtime/DataHeader.tsx +96 -48
  76. package/.framework/src/components/runtime/DataListPage.tsx +3 -26
  77. package/.framework/src/components/runtime/DataStats.tsx +10 -10
  78. package/.framework/src/components/runtime/DataTable.tsx +12 -10
  79. package/.framework/src/components/ui/sheet.tsx +24 -26
  80. package/.framework/src/components/ui/textarea.tsx +74 -48
  81. package/.framework/src/hooks/useBranding.ts +47 -0
  82. package/.framework/src/hooks/useEntityList.ts +12 -9
  83. package/.framework/src/hooks/useListSchema.ts +108 -58
  84. package/.framework/src/instructions/README.md +57 -0
  85. package/.framework/src/instructions/ai-agents.md +69 -0
  86. package/.framework/src/instructions/alerts.md +80 -0
  87. package/.framework/src/instructions/api-keys.md +87 -0
  88. package/.framework/src/instructions/apps.md +77 -0
  89. package/.framework/src/instructions/concepts/ai-and-prompts.md +150 -0
  90. package/.framework/src/instructions/concepts/apps-and-renderers.md +162 -0
  91. package/.framework/src/instructions/concepts/auth-and-api-keys.md +133 -0
  92. package/.framework/src/instructions/concepts/automation.md +186 -0
  93. package/.framework/src/instructions/concepts/concurrency-and-idempotency.md +125 -0
  94. package/.framework/src/instructions/concepts/core-vs-custom.md +124 -0
  95. package/.framework/src/instructions/concepts/design-schema.md +152 -0
  96. package/.framework/src/instructions/concepts/integrations-and-webhooks.md +127 -0
  97. package/.framework/src/instructions/concepts/observability.md +116 -0
  98. package/.framework/src/instructions/concepts/permissions.md +150 -0
  99. package/.framework/src/instructions/concepts/runtime-records.md +111 -0
  100. package/.framework/src/instructions/concepts/scope-and-accounts.md +112 -0
  101. package/.framework/src/instructions/concepts/spine-way.md +172 -0
  102. package/.framework/src/instructions/deliveries.md +59 -0
  103. package/.framework/src/instructions/guide/00-orientation.md +106 -0
  104. package/.framework/src/instructions/guide/01-install-and-first-run.md +253 -0
  105. package/.framework/src/instructions/guide/02-project-map.md +147 -0
  106. package/.framework/src/instructions/guide/03-domain-model.md +223 -0
  107. package/.framework/src/instructions/guide/04-first-app.md +227 -0
  108. package/.framework/src/instructions/guide/05-glossary.md +183 -0
  109. package/.framework/src/instructions/integrations.md +96 -0
  110. package/.framework/src/instructions/internal/cil-markers.md +83 -0
  111. package/.framework/src/instructions/invites.md +60 -0
  112. package/.framework/src/instructions/kb.md +80 -0
  113. package/.framework/src/instructions/logs.md +77 -0
  114. package/.framework/src/instructions/observability.md +61 -0
  115. package/.framework/src/instructions/operations/deployment.md +115 -0
  116. package/.framework/src/instructions/operations/migrations.md +125 -0
  117. package/.framework/src/instructions/operations/security-checklist.md +148 -0
  118. package/.framework/src/instructions/operations/troubleshooting.md +170 -0
  119. package/.framework/src/instructions/operations/upgrade.md +116 -0
  120. package/.framework/src/instructions/pipeline-executions.md +62 -0
  121. package/.framework/src/instructions/pipelines.md +78 -0
  122. package/.framework/src/instructions/prompts.md +95 -0
  123. package/.framework/src/instructions/reference/api/admin-data.md +162 -0
  124. package/.framework/src/instructions/reference/api/auth.md +113 -0
  125. package/.framework/src/instructions/reference/api/errors-and-envelopes.md +113 -0
  126. package/.framework/src/instructions/reference/app-manifest.md +150 -0
  127. package/.framework/src/instructions/reference/cli.md +124 -0
  128. package/.framework/src/instructions/reference/database.md +132 -0
  129. package/.framework/src/instructions/reference/design-schema.md +280 -0
  130. package/.framework/src/instructions/reference/env-vars.md +133 -0
  131. package/.framework/src/instructions/reference/functions/account-nodes.md +75 -0
  132. package/.framework/src/instructions/reference/functions/admin-data.md +195 -0
  133. package/.framework/src/instructions/reference/functions/admin-funnel.md +90 -0
  134. package/.framework/src/instructions/reference/functions/admin-install-funnel.md +107 -0
  135. package/.framework/src/instructions/reference/functions/admin-signals.md +102 -0
  136. package/.framework/src/instructions/reference/functions/ai-agents.md +148 -0
  137. package/.framework/src/instructions/reference/functions/ai-interactions.md +156 -0
  138. package/.framework/src/instructions/reference/functions/api-keys.md +130 -0
  139. package/.framework/src/instructions/reference/functions/apps.md +140 -0
  140. package/.framework/src/instructions/reference/functions/auth.md +99 -0
  141. package/.framework/src/instructions/reference/functions/debug-auth.md +91 -0
  142. package/.framework/src/instructions/reference/functions/deliveries.md +110 -0
  143. package/.framework/src/instructions/reference/functions/embeddings.md +166 -0
  144. package/.framework/src/instructions/reference/functions/eval-harness.md +149 -0
  145. package/.framework/src/instructions/reference/functions/index.md +103 -0
  146. package/.framework/src/instructions/reference/functions/integration-outbound.md +200 -0
  147. package/.framework/src/instructions/reference/functions/integration-routes.md +151 -0
  148. package/.framework/src/instructions/reference/functions/integrations.md +130 -0
  149. package/.framework/src/instructions/reference/functions/invites.md +182 -0
  150. package/.framework/src/instructions/reference/functions/item-progress.md +107 -0
  151. package/.framework/src/instructions/reference/functions/kb.md +166 -0
  152. package/.framework/src/instructions/reference/functions/logs.md +141 -0
  153. package/.framework/src/instructions/reference/functions/observability.md +105 -0
  154. package/.framework/src/instructions/reference/functions/pipeline-executions.md +132 -0
  155. package/.framework/src/instructions/reference/functions/pipeline-runner-background.md +121 -0
  156. package/.framework/src/instructions/reference/functions/pipelines.md +136 -0
  157. package/.framework/src/instructions/reference/functions/prompt-configs.md +121 -0
  158. package/.framework/src/instructions/reference/functions/roles.md +121 -0
  159. package/.framework/src/instructions/reference/functions/security.md +140 -0
  160. package/.framework/src/instructions/reference/functions/system-cron.md +136 -0
  161. package/.framework/src/instructions/reference/functions/system.md +106 -0
  162. package/.framework/src/instructions/reference/functions/tests.md +97 -0
  163. package/.framework/src/instructions/reference/functions/timers.md +117 -0
  164. package/.framework/src/instructions/reference/functions/trigger-scheduler.md +102 -0
  165. package/.framework/src/instructions/reference/functions/triggers.md +140 -0
  166. package/.framework/src/instructions/reference/functions/types.md +146 -0
  167. package/.framework/src/instructions/reference/seeds.md +126 -0
  168. package/.framework/src/instructions/reference/shared-modules.md +127 -0
  169. package/.framework/src/instructions/reference/spine-config.md +114 -0
  170. package/.framework/src/instructions/roles.md +80 -0
  171. package/.framework/src/instructions/runtime-detail.md +70 -0
  172. package/.framework/src/instructions/runtime-list.md +77 -0
  173. package/.framework/src/instructions/security.md +67 -0
  174. package/.framework/src/instructions/tasks/add-a-pipeline.md +110 -0
  175. package/.framework/src/instructions/tasks/add-a-role.md +96 -0
  176. package/.framework/src/instructions/tasks/add-a-timer.md +114 -0
  177. package/.framework/src/instructions/tasks/add-a-trigger.md +106 -0
  178. package/.framework/src/instructions/tasks/add-a-type.md +151 -0
  179. package/.framework/src/instructions/tasks/add-a-webhook.md +108 -0
  180. package/.framework/src/instructions/tasks/add-an-ai-agent.md +108 -0
  181. package/.framework/src/instructions/tasks/add-an-integration.md +124 -0
  182. package/.framework/src/instructions/tasks/build-a-custom-page.md +118 -0
  183. package/.framework/src/instructions/tasks/package-and-install-an-app.md +127 -0
  184. package/.framework/src/instructions/tasks/test-your-code.md +108 -0
  185. package/.framework/src/instructions/tasks/write-a-function.md +132 -0
  186. package/.framework/src/instructions/tasks/write-a-migration.md +110 -0
  187. package/.framework/src/instructions/testing.md +59 -0
  188. package/.framework/src/instructions/timers.md +82 -0
  189. package/.framework/src/instructions/triggers.md +69 -0
  190. package/.framework/src/instructions/types.md +93 -0
  191. package/.framework/src/lib/branding.ts +128 -0
  192. package/.framework/src/pages/NoAppPage.tsx +3 -1
  193. package/.framework/src/pages/NotFoundPage.tsx +62 -31
  194. package/.framework/src/pages/SetupPage.tsx +5 -2
  195. package/.framework/src/pages/admin/AIAgentDetailPage.tsx +117 -106
  196. package/.framework/src/pages/admin/AIAgentsPage.tsx +86 -48
  197. package/.framework/src/pages/admin/APIKeyDetailPage.tsx +153 -152
  198. package/.framework/src/pages/admin/APIKeysPage.tsx +91 -90
  199. package/.framework/src/pages/admin/AlertsConfigPage.tsx +29 -18
  200. package/.framework/src/pages/admin/AppDetailPage.tsx +6 -60
  201. package/.framework/src/pages/admin/AppsPage.tsx +104 -66
  202. package/.framework/src/pages/admin/DeliveriesPage.tsx +5 -5
  203. package/.framework/src/pages/admin/EmbeddingDetailPage.tsx +5 -23
  204. package/.framework/src/pages/admin/EmbeddingsPage.tsx +5 -26
  205. package/.framework/src/pages/admin/IntegrationDetailPage.tsx +7 -7
  206. package/.framework/src/pages/admin/IntegrationsPage.tsx +85 -43
  207. package/.framework/src/pages/admin/LogsPage.tsx +144 -76
  208. package/.framework/src/pages/admin/ObservabilityDashboard.tsx +223 -140
  209. package/.framework/src/pages/admin/PipelineDetailPage.tsx +134 -113
  210. package/.framework/src/pages/admin/PipelineExecutionsPage.tsx +108 -45
  211. package/.framework/src/pages/admin/PipelinesPage.tsx +160 -115
  212. package/.framework/src/pages/admin/PromptConfigDetailPage.tsx +96 -98
  213. package/.framework/src/pages/admin/PromptConfigsPage.tsx +101 -59
  214. package/.framework/src/pages/admin/RoleDetailPage.tsx +90 -79
  215. package/.framework/src/pages/admin/RolesPage.tsx +86 -43
  216. package/.framework/src/pages/admin/SecurityPage.tsx +1 -1
  217. package/.framework/src/pages/admin/TestingDashboard.tsx +16 -28
  218. package/.framework/src/pages/admin/TimerDetailPage.tsx +117 -100
  219. package/.framework/src/pages/admin/TimersPage.tsx +90 -62
  220. package/.framework/src/pages/admin/TriggerDetailPage.tsx +90 -83
  221. package/.framework/src/pages/admin/TriggersPage.tsx +124 -99
  222. package/.framework/src/pages/admin/TypeDetailPage.tsx +152 -138
  223. package/.framework/src/pages/admin/TypesPage.tsx +90 -48
  224. package/.framework/src/pages/admin/cil/CILAgentPage.tsx +17 -25
  225. package/.framework/src/pages/admin/cil/CILChunkDetailPage.tsx +17 -27
  226. package/.framework/src/pages/admin/cil/CILDashboardPage.tsx +72 -40
  227. package/.framework/src/pages/admin/cil/CILFileListPage.tsx +321 -129
  228. package/.framework/src/pages/admin/cil/CILFileSelectPage.tsx +18 -29
  229. package/.framework/src/pages/admin/cil/CILGraphPage.tsx +26 -38
  230. package/.framework/src/pages/admin/cil/CILIngestionPage.tsx +34 -46
  231. package/.framework/src/pages/admin/cil/CILProjectsPage.tsx +189 -103
  232. package/.framework/src/pages/admin/cil/CILSearchPage.tsx +246 -136
  233. package/.framework/src/pages/admin/cil/CILSuggestionsPage.tsx +11 -22
  234. package/.framework/src/pages/admin/cil/CILVersionsPage.tsx +9 -20
  235. package/.framework/src/pages/admin/cil/FlexiblePipelinePage.tsx +26 -38
  236. package/.framework/src/pages/admin/kb/KBAdminPage.tsx +7 -26
  237. package/.framework/src/pages/auth/AuthConfirmPage.tsx +3 -1
  238. package/.framework/src/pages/auth/ForgotPasswordPage.tsx +3 -1
  239. package/.framework/src/pages/auth/LoginPage.tsx +4 -2
  240. package/.framework/src/pages/auth/RegisterPage.tsx +3 -1
  241. package/.framework/templates/agent/AGENTS.md +150 -0
  242. package/.framework/templates/agent/skills/spine-add-ai-agent/SKILL.md +58 -0
  243. package/.framework/templates/agent/skills/spine-add-automation/SKILL.md +62 -0
  244. package/.framework/templates/agent/skills/spine-add-integration/SKILL.md +63 -0
  245. package/.framework/templates/agent/skills/spine-architect/SKILL.md +86 -0
  246. package/.framework/templates/agent/skills/spine-install-app/SKILL.md +72 -0
  247. package/.framework/templates/agent/skills/spine-migration/SKILL.md +75 -0
  248. package/.framework/templates/agent/skills/spine-new-app/SKILL.md +67 -0
  249. package/.framework/templates/agent/skills/spine-new-function/SKILL.md +65 -0
  250. package/.framework/templates/agent/skills/spine-new-type/SKILL.md +65 -0
  251. package/.framework/templates/agent/skills/spine-schema/SKILL.md +77 -0
  252. package/.framework/templates/agent/skills/spine-test/SKILL.md +67 -0
  253. package/.framework/templates/agent/skills/spine-troubleshoot/SKILL.md +74 -0
  254. package/.framework/templates/agent/skills/spine-upgrade/SKILL.md +69 -0
  255. package/.framework/templates/project.json +5 -1
  256. package/.framework/tests/unit/account-scoping-gates.test.ts +392 -0
  257. package/.framework/tests/unit/agent-files.test.ts +355 -0
  258. package/.framework/tests/unit/agent-runner.test.ts +496 -47
  259. package/.framework/tests/unit/api-keys-create-scope-gate.test.ts +160 -0
  260. package/.framework/tests/unit/api-keys-omit-secret-fields.test.ts +38 -0
  261. package/.framework/tests/unit/bootstrap.test.ts +242 -0
  262. package/.framework/tests/unit/cli-context-api-key.test.ts +114 -0
  263. package/.framework/tests/unit/debug-auth.test.ts +38 -0
  264. package/.framework/tests/unit/deliveries-account-scoping.test.ts +185 -0
  265. package/.framework/tests/unit/episode-lease.test.ts +695 -0
  266. package/.framework/tests/unit/integration-outbound-credentials.test.ts +167 -0
  267. package/.framework/tests/unit/integrations-audit-redaction.test.ts +130 -0
  268. package/.framework/tests/unit/kb-ingest-lease.test.ts +19 -0
  269. package/.framework/tests/unit/logging-app-id.test.ts +75 -0
  270. package/.framework/tests/unit/pipeline-runner-background.test.ts +120 -0
  271. package/.framework/tests/unit/pipeline-runner.test.ts +153 -1
  272. package/.framework/tests/unit/principal-cache.test.ts +15 -0
  273. package/.framework/tests/unit/system-context-denial.test.ts +145 -0
  274. package/.framework/tests/unit/system-cron.test.ts +240 -0
  275. package/.framework/tests/unit/timers.test.ts +159 -0
  276. package/.framework/tests/unit/trigger-engine.test.ts +278 -91
  277. package/.framework/tests/unit/trigger-scheduler.test.ts +78 -0
  278. package/README.md +125 -166
  279. package/config/tsconfig.cli.json +2 -2
  280. package/netlify.toml +5 -0
  281. package/package.json +15 -4
  282. package/templates/project/package-lock.json +2 -2
  283. package/.framework/docs/admin-routes.md +0 -76
  284. package/.framework/docs/api-docs-progress.md +0 -38
  285. package/.framework/docs/api-governance.md +0 -146
  286. package/.framework/docs/api-testing-results.md +0 -212
  287. package/.framework/docs/assembly-launch-guide.md +0 -138
  288. package/.framework/docs/audit-results.md +0 -590
  289. package/.framework/docs/db-api-inventory.md +0 -95
  290. package/.framework/docs/gap-remediation-backlog.md +0 -103
  291. package/.framework/docs/ui-adoption-verification.md +0 -111
  292. package/.framework/docs/ui-api-coverage.md +0 -84
  293. package/.framework/docs/v2-compatibility-audit.md +0 -228
  294. package/.framework/mcp/index.ts +0 -133
  295. package/.framework/mcp/load-env.ts +0 -60
  296. package/.framework/mcp/shared/app-manifest.ts +0 -275
  297. package/.framework/mcp/shared/db.ts +0 -477
  298. package/.framework/mcp/shared/kb.ts +0 -118
  299. package/.framework/mcp/tools/architect.ts +0 -431
  300. package/.framework/mcp/tools/cil/context.ts +0 -345
  301. package/.framework/mcp/tools/cil/graph.ts +0 -242
  302. package/.framework/mcp/tools/cil/ingest.ts +0 -1217
  303. package/.framework/mcp/tools/cil/pipeline-orchestrator.ts +0 -693
  304. package/.framework/mcp/tools/cil/pipeline.ts +0 -767
  305. package/.framework/mcp/tools/cil/project.ts +0 -791
  306. package/.framework/mcp/tools/cil/retrieval.ts +0 -336
  307. package/.framework/mcp/tools/cil/search-core.ts +0 -454
  308. package/.framework/mcp/tools/cil/search.ts +0 -97
  309. package/.framework/mcp/tools/cil/suggest.ts +0 -186
  310. package/.framework/mcp/tools/cil/validate.ts +0 -1369
  311. package/.framework/mcp/tools/kb/delete.ts +0 -139
  312. package/.framework/mcp/tools/kb/index.ts +0 -52
  313. package/.framework/mcp/tools/kb/ingest.ts +0 -84
  314. package/.framework/mcp/tools/kb/list-types.ts +0 -102
  315. package/.framework/mcp/tools/kb/publish.ts +0 -100
  316. package/.framework/mcp/tools/kb/reindex.ts +0 -86
  317. package/.framework/mcp/tools/kb/revoke.ts +0 -85
  318. package/.framework/mcp/tools/kb/search.ts +0 -101
  319. package/.framework/mcp/tools/kb/upsert.ts +0 -125
  320. package/.framework/mcp/tools/observability.ts +0 -510
@@ -11,20 +11,20 @@
11
11
  import { createHandler, CoreContext } from './_shared/middleware'
12
12
  import { adminDb } from './_shared/db'
13
13
  import { emitLog } from './_shared/audit'
14
- import { resolveCredential } from './_shared/resolve-credentials'
14
+ import { resolveCredential, ResolvedCredential } from './_shared/resolve-credentials'
15
+ import { isSystemAdmin } from './_shared/principal'
15
16
  import { get as adminDataGet, update as adminDataUpdate } from './admin-data'
16
17
  import * as openaiOutbound from './adapters/openai-outbound'
17
18
  import * as genericWebhookOutbound from './adapters/generic-webhook-outbound'
18
19
  import * as resendOutbound from './adapters/resend-outbound'
20
+ // CIL[END stable_id="~/.framework/functions/integration-outbound.ts:module_header:module_header"]
19
21
  // CIL[DOC-VECTOR type="context" content="purpose='Module header: imports and adapter registration for outbound integration delivery'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/audit.ts"]
20
22
  // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
21
23
  // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
22
24
  // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
23
25
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
24
26
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
25
- // CIL[END stable_id="~/.framework/functions/integration-outbound.ts:module_header:module_header"]
26
27
 
27
- // CIL[BEGIN stable_id="~/.framework/functions/integration-outbound.ts:OutboundRequest:interface" type="interface" identity="OutboundRequest" parent="~/.framework/functions/integration-outbound.ts"]
28
28
  // CIL[DOC-MACRO purpose="Shape of an outbound HTTP request produced by an adapter"]
29
29
  // CIL[DOC-RESPONSIBILITY responsibility="Defines the contract between adapters and the outbound executor"]
30
30
  // CIL[DOC-CONTEXT module="integration-outbound" layer="functions" related_files=".framework/functions/_shared/audit.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/resolve-credentials.ts,.framework/functions/adapters/generic-webhook-outbound.ts,.framework/functions/adapters/openai-outbound.ts,.framework/functions/admin-data.ts,.framework/functions/integration-outbound.ts"]
@@ -32,6 +32,7 @@ import * as resendOutbound from './adapters/resend-outbound'
32
32
  // CIL[DOC-MICRO logic_summary="Describes the fields required for a single outbound HTTP call." notable_decisions="[]"]
33
33
  // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
34
34
  // CIL[DOC-STABILITY stability="stable"]
35
+ // CIL[BEGIN stable_id="~/.framework/functions/integration-outbound.ts:OutboundRequest:interface" type="interface" identity="OutboundRequest" parent="~/.framework/functions/integration-outbound.ts"]
35
36
  interface OutboundRequest {
36
37
  url: string
37
38
  method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE'
@@ -39,15 +40,14 @@ interface OutboundRequest {
39
40
  body?: any
40
41
  external_id?: string
41
42
  }
43
+ // CIL[END stable_id="~/.framework/functions/integration-outbound.ts:OutboundRequest:interface"]
42
44
  // CIL[DOC-VECTOR type="context" content="purpose='Shape of an outbound HTTP request produced by an adapter'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/audit.ts"]
43
45
  // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
44
46
  // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
45
47
  // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
46
48
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
47
49
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
48
- // CIL[END stable_id="~/.framework/functions/integration-outbound.ts:OutboundRequest:interface"]
49
50
 
50
- // CIL[BEGIN stable_id="~/.framework/functions/integration-outbound.ts:OutboundAdapterContext:interface" type="interface" identity="OutboundAdapterContext" parent="~/.framework/functions/integration-outbound.ts"]
51
51
  // CIL[DOC-MACRO purpose="Context object passed to outbound adapters when building a request"]
52
52
  // CIL[DOC-RESPONSIBILITY responsibility="Encapsulates record, integration, resolved credential and runtime identifiers for adapter use"]
53
53
  // CIL[DOC-CONTEXT module="integration-outbound" layer="functions" related_files=".framework/functions/_shared/audit.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/resolve-credentials.ts,.framework/functions/adapters/generic-webhook-outbound.ts,.framework/functions/adapters/openai-outbound.ts,.framework/functions/admin-data.ts,.framework/functions/integration-outbound.ts"]
@@ -55,6 +55,7 @@ interface OutboundRequest {
55
55
  // CIL[DOC-MICRO logic_summary="Provides adapters with all runtime data needed to construct a request." notable_decisions="[]"]
56
56
  // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
57
57
  // CIL[DOC-STABILITY stability="stable"]
58
+ // CIL[BEGIN stable_id="~/.framework/functions/integration-outbound.ts:OutboundAdapterContext:interface" type="interface" identity="OutboundAdapterContext" parent="~/.framework/functions/integration-outbound.ts"]
58
59
  interface OutboundAdapterContext {
59
60
  record: any
60
61
  integration: any
@@ -63,15 +64,14 @@ interface OutboundAdapterContext {
63
64
  appId: string | null
64
65
  actionConfig: any
65
66
  }
67
+ // CIL[END stable_id="~/.framework/functions/integration-outbound.ts:OutboundAdapterContext:interface"]
66
68
  // CIL[DOC-VECTOR type="context" content="purpose='Context object passed to outbound adapters when building a request'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/audit.ts"]
67
69
  // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
68
70
  // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
69
71
  // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
70
72
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
71
73
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
72
- // CIL[END stable_id="~/.framework/functions/integration-outbound.ts:OutboundAdapterContext:interface"]
73
74
 
74
- // CIL[BEGIN stable_id="~/.framework/functions/integration-outbound.ts:computeNextAttempt:function" type="function" identity="computeNextAttempt" parent="~/.framework/functions/integration-outbound.ts"]
75
75
  // CIL[DOC-MACRO purpose="Compute the next retry timestamp for a failed outbound delivery"]
76
76
  // CIL[DOC-RESPONSIBILITY responsibility="Calculate exponential backoff with jitter for delivery retries"]
77
77
  // CIL[DOC-CONTEXT module="integration-outbound" layer="functions" related_files=".framework/functions/_shared/audit.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/resolve-credentials.ts,.framework/functions/adapters/generic-webhook-outbound.ts,.framework/functions/adapters/openai-outbound.ts,.framework/functions/admin-data.ts,.framework/functions/integration-outbound.ts"]
@@ -79,20 +79,20 @@ interface OutboundAdapterContext {
79
79
  // CIL[DOC-MICRO logic_summary="Uses exponential backoff capped by maxDelayMs and adds up to 20% jitter." notable_decisions="[]"]
80
80
  // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
81
81
  // CIL[DOC-STABILITY stability="stable"]
82
+ // CIL[BEGIN stable_id="~/.framework/functions/integration-outbound.ts:computeNextAttempt:function" type="function" identity="computeNextAttempt" parent="~/.framework/functions/integration-outbound.ts"]
82
83
  function computeNextAttempt(attemptCount: number, baseMs = 30000, maxDelayMs = 3600000): Date {
83
84
  const delay = Math.min(baseMs * Math.pow(2, attemptCount), maxDelayMs)
84
85
  const jitter = Math.floor(Math.random() * delay * 0.2)
85
86
  return new Date(Date.now() + delay + jitter)
86
87
  }
88
+ // CIL[END stable_id="~/.framework/functions/integration-outbound.ts:computeNextAttempt:function"]
87
89
  // CIL[DOC-VECTOR type="context" content="purpose='Compute the next retry timestamp for a failed outbound delivery'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/audit.ts"]
88
90
  // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
89
91
  // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
90
92
  // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
91
93
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
92
94
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
93
- // CIL[END stable_id="~/.framework/functions/integration-outbound.ts:computeNextAttempt:function"]
94
95
 
95
- // CIL[BEGIN stable_id="~/.framework/functions/integration-outbound.ts:execute:function" type="function" identity="execute" parent="~/.framework/functions/integration-outbound.ts"]
96
96
  // CIL[DOC-MACRO purpose="Execute an outbound integration webhook request with retries and audit logging"]
97
97
  // CIL[DOC-RESPONSIBILITY responsibility="Resolve the integration, build an outbound request, call the target, and persist delivery status"]
98
98
  // CIL[DOC-CONTEXT module="integration-outbound" layer="functions" related_files=".framework/functions/_shared/audit.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/resolve-credentials.ts,.framework/functions/adapters/generic-webhook-outbound.ts,.framework/functions/adapters/openai-outbound.ts,.framework/functions/admin-data.ts,.framework/functions/integration-outbound.ts"]
@@ -100,13 +100,14 @@ function computeNextAttempt(attemptCount: number, baseMs = 30000, maxDelayMs = 3
100
100
  // CIL[DOC-MICRO logic_summary="Resolves tenant or system integration, creates or reuses a delivery record, loads the configured adapter, builds and executes the HTTP request, updates delivery status, and optionally writes the record." notable_decisions="[]"]
101
101
  // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
102
102
  // CIL[DOC-STABILITY stability="stable"]
103
+ // CIL[BEGIN stable_id="~/.framework/functions/integration-outbound.ts:execute:function" type="function" identity="execute" parent="~/.framework/functions/integration-outbound.ts"]
103
104
  export async function execute(ctx: CoreContext, body: any = {}): Promise<any> {
104
105
  let deliveryId = body?.delivery_id
105
106
  let requestBody = body
106
107
  let isRetry = false
107
108
  let retryDelivery: any = null
108
109
 
109
- if (deliveryId && ctx.principal?.isInternal) {
110
+ if (deliveryId) {
110
111
  const { data: delivery, error: deliveryError } = await adminDb
111
112
  .from('webhook_deliveries')
112
113
  .select('*')
@@ -117,14 +118,29 @@ export async function execute(ctx: CoreContext, body: any = {}): Promise<any> {
117
118
  throw new Error(`Delivery not found: ${deliveryId}`)
118
119
  }
119
120
 
120
- retryDelivery = delivery
121
- requestBody = delivery.payload || {}
122
- isRetry = true
121
+ // A delivery_id replays (internal) or rewrites (non-internal) an existing
122
+ // delivery row that carries its own account_id. Only system-level
123
+ // principals — system_admin role or an unbound internal machine
124
+ // (SYSTEM_PRINCIPAL via INTERNAL_INVOKE_SECRET) — may touch another
125
+ // account's delivery. Account-bound callers must match.
126
+ const isSystem = isSystemAdmin(ctx.principal) ||
127
+ (ctx.principal?.isInternal === true && !ctx.accountId)
128
+ if (!isSystem && delivery.account_id !== ctx.accountId) {
129
+ const e: any = new Error('Delivery belongs to a different account')
130
+ e.statusCode = 403
131
+ throw e
132
+ }
123
133
 
124
- await adminDb
125
- .from('webhook_deliveries')
126
- .update({ status: 'processing', updated_at: new Date().toISOString() })
127
- .eq('id', deliveryId)
134
+ if (ctx.principal?.isInternal) {
135
+ retryDelivery = delivery
136
+ requestBody = delivery.payload || {}
137
+ isRetry = true
138
+
139
+ await adminDb
140
+ .from('webhook_deliveries')
141
+ .update({ status: 'processing', updated_at: new Date().toISOString() })
142
+ .eq('id', deliveryId)
143
+ }
128
144
  }
129
145
 
130
146
  const { integration_slug, record_id, action_config = {} } = requestBody
@@ -220,7 +236,31 @@ export async function execute(ctx: CoreContext, body: any = {}): Promise<any> {
220
236
 
221
237
  try {
222
238
  const credentialField = action_config.credential_field || 'api_token'
223
- const resolved = await resolveCredential(ctx, integration, credentialField)
239
+ // An absent or explicitly-empty credential entry means "call without
240
+ // auth" — generic HTTP/webhook targets often need none, and the stock
241
+ // generic-http seed ships api_token {source:'value',value:''} as a
242
+ // deliberate no-auth marker. The skip is still audited with the same
243
+ // integration.credential_* event resolveCredential would have emitted,
244
+ // marked skipped:true so the non-fatal path is distinguishable. A
245
+ // configured-but-broken credential (env_var name set, variable unset)
246
+ // keeps throwing inside resolveCredential, and adapters that genuinely
247
+ // require a key (openai-outbound, resend-outbound) still fail in
248
+ // buildRequest when apiKey is missing — generic-webhook-outbound only
249
+ // attaches Authorization: Bearer when a credential resolved.
250
+ const credEntry = (integration?.credentials || {})[credentialField]
251
+ const credentialSkipped = !credEntry?.source || (credEntry.source === 'value' && !credEntry.value)
252
+ let resolved: ResolvedCredential | undefined
253
+ if (credentialSkipped) {
254
+ await emitLog(ctx, credEntry?.source === 'value' ? 'integration.credential_empty' : 'integration.credential_missing', { type: 'integration', id: integration.id }, undefined, {
255
+ field: credentialField,
256
+ source: credEntry?.source || null,
257
+ integration_id: integration.id,
258
+ account_id: ctx.accountId,
259
+ skipped: true
260
+ })
261
+ } else {
262
+ resolved = await resolveCredential(ctx, integration, credentialField)
263
+ }
224
264
 
225
265
  const adapterName = action_config.adapter || integration.config?.outbound_adapter
226
266
  if (!adapterName) {
@@ -351,15 +391,14 @@ export async function execute(ctx: CoreContext, body: any = {}): Promise<any> {
351
391
  throw err
352
392
  }
353
393
  }
394
+ // CIL[END stable_id="~/.framework/functions/integration-outbound.ts:execute:function"]
354
395
  // CIL[DOC-VECTOR type="context" content="purpose='Execute an outbound integration webhook request with retries and audit logging'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/audit.ts"]
355
396
  // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
356
397
  // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
357
398
  // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
358
399
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
359
400
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
360
- // CIL[END stable_id="~/.framework/functions/integration-outbound.ts:execute:function"]
361
401
 
362
- // CIL[BEGIN stable_id="~/.framework/functions/integration-outbound.ts:builtInOutboundAdapters:constant" type="constant" identity="builtInOutboundAdapters" parent="~/.framework/functions/integration-outbound.ts"]
363
402
  // CIL[DOC-MACRO purpose="Registry of built-in outbound adapter modules"]
364
403
  // CIL[DOC-RESPONSIBILITY responsibility="Map adapter paths to their module exports"]
365
404
  // CIL[DOC-CONTEXT module="integration-outbound" layer="functions" related_files=".framework/functions/_shared/audit.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/resolve-credentials.ts,.framework/functions/adapters/generic-webhook-outbound.ts,.framework/functions/adapters/openai-outbound.ts,.framework/functions/admin-data.ts,.framework/functions/integration-outbound.ts"]
@@ -367,20 +406,20 @@ export async function execute(ctx: CoreContext, body: any = {}): Promise<any> {
367
406
  // CIL[DOC-MICRO logic_summary="Lists the openai and generic webhook outbound adapter modules." notable_decisions="[]"]
368
407
  // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
369
408
  // CIL[DOC-STABILITY stability="stable"]
409
+ // CIL[BEGIN stable_id="~/.framework/functions/integration-outbound.ts:builtInOutboundAdapters:constant" type="constant" identity="builtInOutboundAdapters" parent="~/.framework/functions/integration-outbound.ts"]
370
410
  const builtInOutboundAdapters: Record<string, any> = {
371
411
  'adapters/openai-outbound': openaiOutbound,
372
412
  'adapters/generic-webhook-outbound': genericWebhookOutbound,
373
413
  'adapters/resend-outbound': resendOutbound
374
414
  }
415
+ // CIL[END stable_id="~/.framework/functions/integration-outbound.ts:builtInOutboundAdapters:constant"]
375
416
  // CIL[DOC-VECTOR type="context" content="purpose='Registry of built-in outbound adapter modules'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/audit.ts"]
376
417
  // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
377
418
  // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
378
419
  // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
379
420
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
380
421
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
381
- // CIL[END stable_id="~/.framework/functions/integration-outbound.ts:builtInOutboundAdapters:constant"]
382
422
 
383
- // CIL[BEGIN stable_id="~/.framework/functions/integration-outbound.ts:loadOutboundAdapter:function" type="function" identity="loadOutboundAdapter" parent="~/.framework/functions/integration-outbound.ts"]
384
423
  // CIL[DOC-MACRO purpose="Load an outbound adapter by name from built-ins or dynamic imports"]
385
424
  // CIL[DOC-RESPONSIBILITY responsibility="Resolve and return an adapter module that exposes buildRequest"]
386
425
  // CIL[DOC-CONTEXT module="integration-outbound" layer="functions" related_files=".framework/functions/_shared/audit.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/resolve-credentials.ts,.framework/functions/adapters/generic-webhook-outbound.ts,.framework/functions/adapters/openai-outbound.ts,.framework/functions/admin-data.ts,.framework/functions/integration-outbound.ts"]
@@ -388,6 +427,7 @@ const builtInOutboundAdapters: Record<string, any> = {
388
427
  // CIL[DOC-MICRO logic_summary="Checks built-in registry first, then dynamically imports the requested adapter and verifies buildRequest exists." notable_decisions="[]"]
389
428
  // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
390
429
  // CIL[DOC-STABILITY stability="stable"]
430
+ // CIL[BEGIN stable_id="~/.framework/functions/integration-outbound.ts:loadOutboundAdapter:function" type="function" identity="loadOutboundAdapter" parent="~/.framework/functions/integration-outbound.ts"]
391
431
  async function loadOutboundAdapter(functionName: string): Promise<any | null> {
392
432
  if (builtInOutboundAdapters[functionName]) {
393
433
  return builtInOutboundAdapters[functionName]
@@ -400,15 +440,14 @@ async function loadOutboundAdapter(functionName: string): Promise<any | null> {
400
440
  return null
401
441
  }
402
442
  }
443
+ // CIL[END stable_id="~/.framework/functions/integration-outbound.ts:loadOutboundAdapter:function"]
403
444
  // CIL[DOC-VECTOR type="context" content="purpose='Load an outbound adapter by name from built-ins or dynamic imports'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/audit.ts"]
404
445
  // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
405
446
  // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
406
447
  // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
407
448
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
408
449
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
409
- // CIL[END stable_id="~/.framework/functions/integration-outbound.ts:loadOutboundAdapter:function"]
410
450
 
411
- // CIL[BEGIN stable_id="~/.framework/functions/integration-outbound.ts:integrationOutbound:constant" type="constant" identity="integrationOutbound" parent="~/.framework/functions/integration-outbound.ts"]
412
451
  // CIL[DOC-MACRO purpose="Handler binding for the outbound integration execute function"]
413
452
  // CIL[DOC-RESPONSIBILITY responsibility="Wrap execute in the shared middleware handler"]
414
453
  // CIL[DOC-CONTEXT module="integration-outbound" layer="functions" related_files=".framework/functions/_shared/audit.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/resolve-credentials.ts,.framework/functions/adapters/generic-webhook-outbound.ts,.framework/functions/adapters/openai-outbound.ts,.framework/functions/admin-data.ts,.framework/functions/integration-outbound.ts"]
@@ -416,15 +455,15 @@ async function loadOutboundAdapter(functionName: string): Promise<any | null> {
416
455
  // CIL[DOC-MICRO logic_summary="Creates the middleware-backed handler from the execute function." notable_decisions="[]"]
417
456
  // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
418
457
  // CIL[DOC-STABILITY stability="stable"]
458
+ // CIL[BEGIN stable_id="~/.framework/functions/integration-outbound.ts:integrationOutbound:constant" type="constant" identity="integrationOutbound" parent="~/.framework/functions/integration-outbound.ts"]
419
459
  const integrationOutbound = createHandler(execute)
460
+ // CIL[END stable_id="~/.framework/functions/integration-outbound.ts:integrationOutbound:constant"]
420
461
  // CIL[DOC-VECTOR type="context" content="purpose='Handler binding for the outbound integration execute function'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/audit.ts"]
421
462
  // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
422
463
  // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
423
464
  // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
424
465
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
425
466
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
426
- // CIL[END stable_id="~/.framework/functions/integration-outbound.ts:integrationOutbound:constant"]
427
- // CIL[BEGIN stable_id="~/.framework/functions/integration-outbound.ts:default:function" type="function" identity="default" parent="~/.framework/functions/integration-outbound.ts"]
428
467
  // CIL[DOC-MACRO purpose="Default export of the integration outbound handler"]
429
468
  // CIL[DOC-RESPONSIBILITY responsibility="Export integrationOutbound as the module default"]
430
469
  // CIL[DOC-CONTEXT module="integration-outbound" layer="functions" related_files=".framework/functions/_shared/audit.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/resolve-credentials.ts,.framework/functions/adapters/generic-webhook-outbound.ts,.framework/functions/adapters/openai-outbound.ts,.framework/functions/admin-data.ts,.framework/functions/integration-outbound.ts"]
@@ -432,12 +471,13 @@ const integrationOutbound = createHandler(execute)
432
471
  // CIL[DOC-MICRO logic_summary="Exports the prebuilt handler as the module default for serverless entry points." notable_decisions="[]"]
433
472
  // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
434
473
  // CIL[DOC-STABILITY stability="stable"]
474
+ // CIL[BEGIN stable_id="~/.framework/functions/integration-outbound.ts:default:function" type="function" identity="default" parent="~/.framework/functions/integration-outbound.ts"]
435
475
  export default integrationOutbound
476
+ // CIL[END stable_id="~/.framework/functions/integration-outbound.ts:default:function"]
436
477
  // CIL[DOC-VECTOR type="context" content="purpose='Default export of the integration outbound handler'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/audit.ts"]
437
478
  // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
438
479
  // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
439
480
  // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
440
481
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
441
482
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
442
- // CIL[END stable_id="~/.framework/functions/integration-outbound.ts:default:function"]
443
483