spine-framework 0.3.124 → 0.3.126

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (319) hide show
  1. package/.framework/cli/commands/agents.ts +35 -37
  2. package/.framework/cli/commands/auth.ts +35 -34
  3. package/.framework/cli/commands/create-app.ts +104 -40
  4. package/.framework/cli/commands/dev.ts +104 -69
  5. package/.framework/cli/commands/doctor.ts +179 -69
  6. package/.framework/cli/commands/generate.ts +83 -143
  7. package/.framework/cli/commands/init.ts +72 -34
  8. package/.framework/cli/commands/install-app.ts +260 -125
  9. package/.framework/cli/commands/items.ts +33 -44
  10. package/.framework/cli/commands/migrate.ts +122 -40
  11. package/.framework/cli/commands/migrations.ts +33 -40
  12. package/.framework/cli/commands/pipelines.ts +31 -39
  13. package/.framework/cli/commands/status.ts +47 -23
  14. package/.framework/cli/commands/system.ts +47 -37
  15. package/.framework/cli/commands/test.ts +112 -68
  16. package/.framework/cli/commands/validate-app.ts +215 -121
  17. package/.framework/cli/context.ts +112 -130
  18. package/.framework/cli/env-loader.ts +47 -18
  19. package/.framework/cli/index.ts +81 -42
  20. package/.framework/docs/runtime-types.md +1024 -0
  21. package/.framework/functions/_shared/agent-runner.ts +1296 -961
  22. package/.framework/functions/_shared/app-manifest.ts +82 -68
  23. package/.framework/functions/_shared/audit.ts +135 -83
  24. package/.framework/functions/_shared/{cil-state.ts → cil.ts} +158 -56
  25. package/.framework/functions/_shared/db.ts +80 -126
  26. package/.framework/functions/_shared/hash-api-key.ts +63 -0
  27. package/.framework/functions/_shared/index.ts +224 -335
  28. package/.framework/functions/_shared/kb.ts +319 -0
  29. package/.framework/functions/_shared/llm.ts +92 -0
  30. package/.framework/functions/_shared/logging.ts +288 -0
  31. package/.framework/functions/_shared/middleware.ts +329 -365
  32. package/.framework/functions/_shared/outcomes.ts +36 -0
  33. package/.framework/functions/_shared/permissions.ts +359 -643
  34. package/.framework/functions/_shared/pipeline-runner.ts +243 -316
  35. package/.framework/functions/_shared/principal.ts +376 -468
  36. package/.framework/functions/_shared/resolve-credentials.ts +102 -0
  37. package/.framework/functions/_shared/resolve-ids.ts +188 -16
  38. package/.framework/functions/_shared/retry-deliveries.ts +104 -0
  39. package/.framework/functions/_shared/schema-utils.ts +611 -373
  40. package/.framework/functions/_shared/testing.ts +207 -137
  41. package/.framework/functions/_shared/tracing.ts +276 -0
  42. package/.framework/functions/_shared/trigger-engine.ts +159 -211
  43. package/.framework/functions/_shared/webhook-registration.ts +95 -81
  44. package/.framework/functions/_shared/webhook-registry.ts +153 -75
  45. package/.framework/functions/account-nodes.ts +31 -53
  46. package/.framework/functions/adapters/generic-webhook-inbound.ts +56 -0
  47. package/.framework/functions/adapters/generic-webhook-outbound.ts +43 -0
  48. package/.framework/functions/adapters/openai-outbound.ts +40 -0
  49. package/.framework/functions/admin-data.ts +685 -537
  50. package/.framework/functions/admin-funnel.ts +31 -20
  51. package/.framework/functions/admin-install-funnel.ts +47 -28
  52. package/.framework/functions/admin-signals.ts +47 -29
  53. package/.framework/functions/ai-agents.ts +122 -147
  54. package/.framework/functions/ai-interactions.ts +180 -90
  55. package/.framework/functions/api-keys.ts +250 -192
  56. package/.framework/functions/apps.ts +203 -197
  57. package/.framework/functions/auth.ts +98 -91
  58. package/.framework/functions/cil-agent-ingest.ts +773 -0
  59. package/.framework/functions/cil-agent.ts +592 -0
  60. package/.framework/functions/cil-callmap.ts +1227 -0
  61. package/.framework/functions/cil-config.ts +583 -0
  62. package/.framework/functions/cil-context.ts +445 -0
  63. package/.framework/functions/cil-doc.ts +1752 -0
  64. package/.framework/functions/cil-embeddings.ts +1202 -0
  65. package/.framework/functions/cil-graph.ts +585 -0
  66. package/.framework/functions/cil-ingest.ts +2416 -0
  67. package/.framework/functions/cil-pipeline.ts +318 -0
  68. package/.framework/functions/cil-project.ts +499 -0
  69. package/.framework/functions/cil-validate.ts +469 -0
  70. package/.framework/functions/debug-auth.ts +73 -53
  71. package/.framework/functions/deliveries.ts +117 -0
  72. package/.framework/functions/embeddings.ts +528 -516
  73. package/.framework/functions/eval-harness.ts +158 -106
  74. package/.framework/functions/integration-outbound.ts +311 -0
  75. package/.framework/functions/integration-routes.ts +240 -466
  76. package/.framework/functions/integrations.ts +132 -140
  77. package/.framework/functions/invites.ts +401 -201
  78. package/.framework/functions/item-progress.ts +113 -53
  79. package/.framework/functions/kb.ts +28 -0
  80. package/.framework/functions/logs.ts +239 -222
  81. package/.framework/functions/observability.ts +308 -259
  82. package/.framework/functions/pipeline-executions.ts +179 -235
  83. package/.framework/functions/pipelines.ts +163 -205
  84. package/.framework/functions/prompt-configs.ts +109 -156
  85. package/.framework/functions/roles.ts +97 -147
  86. package/.framework/functions/system-cron.ts +132 -218
  87. package/.framework/functions/system.ts +112 -52
  88. package/.framework/functions/tests.ts +32 -28
  89. package/.framework/functions/timers.ts +162 -210
  90. package/.framework/functions/triggers.ts +282 -346
  91. package/.framework/functions/types.ts +283 -400
  92. package/.framework/migrations/001_core_schema.sql +630 -0
  93. package/.framework/migrations/002_core_rls_and_functions.sql +532 -0
  94. package/.framework/migrations/{003_system_data.sql → 003_core_system_data.sql} +26 -153
  95. package/.framework/migrations/004_core_rpc_and_broker.sql +421 -0
  96. package/.framework/migrations/005_core_observability.sql +598 -0
  97. package/.framework/migrations/006_security_hardening_rls.sql +97 -0
  98. package/.framework/migrations/007_kb_article_list.sql +237 -0
  99. package/.framework/migrations/008_items_target.sql +8 -0
  100. package/.framework/migrations/009_roles_slug_unique.sql +11 -0
  101. package/.framework/public/spine.config.json +91 -0
  102. package/.framework/scripts/app-install-cli.ts +112 -98
  103. package/.framework/src/App.tsx +67 -20
  104. package/.framework/src/apps/admin/index.tsx +97 -27
  105. package/.framework/src/components/AppWrapper.tsx +50 -11
  106. package/.framework/src/components/CustomAppLoader.tsx +131 -22
  107. package/.framework/src/components/admin/AdminListPage.tsx +75 -8
  108. package/.framework/src/components/admin/AdminSidebar.tsx +148 -36
  109. package/.framework/src/components/admin/AdminStatsCard.tsx +48 -29
  110. package/.framework/src/components/admin/PageInstructions.tsx +49 -0
  111. package/.framework/src/components/admin/SortableTableHeader.tsx +49 -2
  112. package/.framework/src/components/app-shell/GenericAppShell.tsx +69 -11
  113. package/.framework/src/components/app-shell/GenericDetailPage.tsx +55 -10
  114. package/.framework/src/components/app-shell/GenericListPage.tsx +76 -9
  115. package/.framework/src/components/app-sidebar.tsx +50 -3
  116. package/.framework/src/components/auth/ProtectedRoute.tsx +53 -45
  117. package/.framework/src/components/kb/KBArticleEditor.tsx +409 -0
  118. package/.framework/src/components/kb/KBArticleList.tsx +557 -0
  119. package/.framework/src/components/layout/AppShell.tsx +54 -16
  120. package/.framework/src/components/layout/Header.tsx +50 -38
  121. package/.framework/src/components/layout/Layout.tsx +48 -32
  122. package/.framework/src/components/layout/Sidebar.tsx +167 -16
  123. package/.framework/src/components/runtime/DataDetailHeader.tsx +33 -1
  124. package/.framework/src/components/runtime/DataDetailPage.tsx +289 -4
  125. package/.framework/src/components/runtime/DataFilters.tsx +78 -1
  126. package/.framework/src/components/runtime/DataHeader.tsx +32 -29
  127. package/.framework/src/components/runtime/DataListPage.tsx +161 -2
  128. package/.framework/src/components/runtime/DataStats.tsx +48 -1
  129. package/.framework/src/components/runtime/DataTable.tsx +153 -1
  130. package/.framework/src/components/runtime/SchemaDetailForm.tsx +77 -46
  131. package/.framework/src/components/runtime/index.ts +16 -9
  132. package/.framework/src/components/search-form.tsx +33 -1
  133. package/.framework/src/components/shared/AgentView.tsx +48 -51
  134. package/.framework/src/components/shared/FieldRenderer.tsx +84 -67
  135. package/.framework/src/components/shared/InviteManager.tsx +113 -52
  136. package/.framework/src/components/shared/MemberList.tsx +182 -0
  137. package/.framework/src/components/shared/SchemaFields.tsx +96 -78
  138. package/.framework/src/components/ui/DataTable.tsx +86 -56
  139. package/.framework/src/components/ui/Form.tsx +188 -109
  140. package/.framework/src/components/ui/ItemCard.tsx +86 -58
  141. package/.framework/src/components/ui/ItemListView.tsx +88 -61
  142. package/.framework/src/components/ui/LoadingSpinner.tsx +52 -27
  143. package/.framework/src/components/ui/Modal.tsx +81 -4
  144. package/.framework/src/components/ui/RichTextEditor.tsx +101 -9
  145. package/.framework/src/components/ui/accordion.tsx +97 -5
  146. package/.framework/src/components/ui/alert-dialog.tsx +225 -13
  147. package/.framework/src/components/ui/alert.tsx +113 -6
  148. package/.framework/src/components/ui/aspect-ratio.tsx +49 -2
  149. package/.framework/src/components/ui/avatar.tsx +129 -7
  150. package/.framework/src/components/ui/badge.tsx +65 -3
  151. package/.framework/src/components/ui/breadcrumb.tsx +145 -8
  152. package/.framework/src/components/ui/button-group.tsx +81 -4
  153. package/.framework/src/components/ui/button.tsx +49 -2
  154. package/.framework/src/components/ui/calendar.tsx +65 -3
  155. package/.framework/src/components/ui/card.tsx +145 -8
  156. package/.framework/src/components/ui/carousel.tsx +129 -7
  157. package/.framework/src/components/ui/chart.tsx +161 -10
  158. package/.framework/src/components/ui/checkbox.tsx +49 -2
  159. package/.framework/src/components/ui/collapsible.tsx +81 -5
  160. package/.framework/src/components/ui/combobox.tsx +305 -20
  161. package/.framework/src/components/ui/command.tsx +177 -11
  162. package/.framework/src/components/ui/context-menu.tsx +273 -17
  163. package/.framework/src/components/ui/dialog.tsx +209 -27
  164. package/.framework/src/components/ui/direction.tsx +64 -4
  165. package/.framework/src/components/ui/drawer.tsx +193 -12
  166. package/.framework/src/components/ui/dropdown-menu.tsx +273 -18
  167. package/.framework/src/components/ui/empty.tsx +145 -9
  168. package/.framework/src/components/ui/field.tsx +209 -14
  169. package/.framework/src/components/ui/hover-card.tsx +81 -4
  170. package/.framework/src/components/ui/input-group.tsx +162 -10
  171. package/.framework/src/components/ui/input-otp.tsx +98 -5
  172. package/.framework/src/components/ui/input.tsx +49 -2
  173. package/.framework/src/components/ui/item.tsx +225 -13
  174. package/.framework/src/components/ui/kbd.tsx +65 -3
  175. package/.framework/src/components/ui/label.tsx +49 -2
  176. package/.framework/src/components/ui/menubar.tsx +289 -17
  177. package/.framework/src/components/ui/native-select.tsx +97 -5
  178. package/.framework/src/components/ui/navigation-menu.tsx +177 -10
  179. package/.framework/src/components/ui/pagination.tsx +161 -9
  180. package/.framework/src/components/ui/popover.tsx +145 -8
  181. package/.framework/src/components/ui/progress.tsx +49 -2
  182. package/.framework/src/components/ui/radio-group.tsx +65 -3
  183. package/.framework/src/components/ui/resizable.tsx +82 -4
  184. package/.framework/src/components/ui/scroll-area.tsx +65 -3
  185. package/.framework/src/components/ui/select.tsx +193 -11
  186. package/.framework/src/components/ui/separator.tsx +49 -2
  187. package/.framework/src/components/ui/sheet.tsx +193 -11
  188. package/.framework/src/components/ui/sidebar.tsx +481 -38
  189. package/.framework/src/components/ui/skeleton.tsx +49 -2
  190. package/.framework/src/components/ui/slider.tsx +49 -2
  191. package/.framework/src/components/ui/sonner.tsx +49 -2
  192. package/.framework/src/components/ui/spinner.tsx +49 -2
  193. package/.framework/src/components/ui/switch.tsx +49 -2
  194. package/.framework/src/components/ui/table-primitives.tsx +160 -33
  195. package/.framework/src/components/ui/table.tsx +161 -9
  196. package/.framework/src/components/ui/tabs.tsx +113 -6
  197. package/.framework/src/components/ui/textarea.tsx +49 -2
  198. package/.framework/src/components/ui/toggle-group.tsx +81 -4
  199. package/.framework/src/components/ui/toggle.tsx +65 -3
  200. package/.framework/src/components/ui/tooltip.tsx +97 -5
  201. package/.framework/src/contexts/AppContext.tsx +129 -45
  202. package/.framework/src/contexts/AuthContext.tsx +187 -144
  203. package/.framework/src/hooks/use-mobile.ts +48 -2
  204. package/.framework/src/hooks/useApi.ts +208 -159
  205. package/.framework/src/hooks/useAppPath.ts +32 -23
  206. package/.framework/src/hooks/useApps.ts +51 -20
  207. package/.framework/src/hooks/useEntityList.ts +32 -78
  208. package/.framework/src/hooks/useEntityRecord.ts +35 -96
  209. package/.framework/src/hooks/useForm.ts +32 -92
  210. package/.framework/src/hooks/useListSchema.ts +49 -78
  211. package/.framework/src/hooks/useSchemaRecord.ts +114 -105
  212. package/.framework/src/lib/api.ts +195 -116
  213. package/.framework/src/lib/supabase.ts +98 -64
  214. package/.framework/src/lib/utils.ts +287 -151
  215. package/.framework/src/main.tsx +49 -3
  216. package/.framework/src/pages/DashboardPage.tsx +52 -29
  217. package/.framework/src/pages/NotFoundPage.tsx +32 -10
  218. package/.framework/src/pages/SetupPage.tsx +32 -12
  219. package/.framework/src/pages/admin/AIAgentDetailPage.tsx +119 -10
  220. package/.framework/src/pages/admin/AIAgentsPage.tsx +48 -19
  221. package/.framework/src/pages/admin/APIKeyDetailPage.tsx +187 -17
  222. package/.framework/src/pages/admin/APIKeysPage.tsx +98 -22
  223. package/.framework/src/pages/admin/AlertsConfigPage.tsx +113 -26
  224. package/.framework/src/pages/admin/AppDetailPage.tsx +125 -8
  225. package/.framework/src/pages/admin/AppsPage.tsx +49 -2
  226. package/.framework/src/pages/admin/DeliveriesPage.tsx +196 -0
  227. package/.framework/src/pages/admin/DesignedPage.tsx +32 -18
  228. package/.framework/src/pages/admin/EmbeddingDetailPage.tsx +215 -484
  229. package/.framework/src/pages/admin/EmbeddingsPage.tsx +116 -319
  230. package/.framework/src/pages/admin/ExtendedShadcnTestPage.tsx +34 -9
  231. package/.framework/src/pages/admin/IncrementalShadcnTestPage.tsx +34 -9
  232. package/.framework/src/pages/admin/IntegratedDashboard.tsx +32 -16
  233. package/.framework/src/pages/admin/IntegrationDetailPage.tsx +183 -26
  234. package/.framework/src/pages/admin/IntegrationsPage.tsx +48 -19
  235. package/.framework/src/pages/admin/InvitesPage.tsx +48 -14
  236. package/.framework/src/pages/admin/LogsPage.tsx +422 -75
  237. package/.framework/src/pages/admin/MinimalShadcnTestPage.tsx +34 -9
  238. package/.framework/src/pages/admin/ObservabilityDashboard.tsx +113 -24
  239. package/.framework/src/pages/admin/PipelineDetailPage.tsx +206 -34
  240. package/.framework/src/pages/admin/PipelineExecutionsPage.tsx +50 -17
  241. package/.framework/src/pages/admin/PipelinesPage.tsx +160 -21
  242. package/.framework/src/pages/admin/PromptConfigDetailPage.tsx +378 -88
  243. package/.framework/src/pages/admin/PromptConfigsPage.tsx +125 -16
  244. package/.framework/src/pages/admin/ProperlyDesignedPage.tsx +49 -10
  245. package/.framework/src/pages/admin/RoleDetailPage.tsx +130 -10
  246. package/.framework/src/pages/admin/RolesPage.tsx +171 -18
  247. package/.framework/src/pages/admin/SelectTestPage.tsx +34 -9
  248. package/.framework/src/pages/admin/ShadcnTestPage.tsx +49 -11
  249. package/.framework/src/pages/admin/SimpleDashboard.tsx +49 -10
  250. package/.framework/src/pages/admin/TestRunDetailPage.tsx +49 -4
  251. package/.framework/src/pages/admin/TestingDashboard.tsx +98 -28
  252. package/.framework/src/pages/admin/TimerDetailPage.tsx +143 -33
  253. package/.framework/src/pages/admin/TimersPage.tsx +48 -20
  254. package/.framework/src/pages/admin/TriggerDetailPage.tsx +118 -30
  255. package/.framework/src/pages/admin/TriggersPage.tsx +64 -19
  256. package/.framework/src/pages/admin/TypeDetailPage.tsx +138 -15
  257. package/.framework/src/pages/admin/TypesPage.tsx +48 -20
  258. package/.framework/src/pages/admin/cil/CILAgentPage.tsx +465 -0
  259. package/.framework/src/pages/admin/cil/CILChunkDetailPage.tsx +787 -0
  260. package/.framework/src/pages/admin/cil/CILDashboardPage.tsx +699 -0
  261. package/.framework/src/pages/admin/cil/CILFileListPage.tsx +647 -0
  262. package/.framework/src/pages/admin/cil/CILGraphPage.tsx +616 -0
  263. package/.framework/src/pages/admin/cil/CILIngestionPage.tsx +1402 -0
  264. package/.framework/src/pages/admin/cil/CILProjectsPage.tsx +614 -0
  265. package/.framework/src/pages/admin/cil/CILSearchPage.tsx +571 -0
  266. package/.framework/src/pages/admin/cil/FlexiblePipelinePage.tsx +731 -0
  267. package/.framework/src/pages/admin/kb/KBAdminPage.tsx +64 -0
  268. package/.framework/src/pages/auth/AuthConfirmPage.tsx +52 -51
  269. package/.framework/src/pages/auth/ForgotPasswordPage.tsx +31 -22
  270. package/.framework/src/pages/auth/LoginPage.tsx +50 -23
  271. package/.framework/src/pages/auth/PendingApprovalPage.tsx +31 -15
  272. package/.framework/src/pages/auth/RegisterPage.tsx +281 -317
  273. package/.framework/src/pages/spine-framework/APIPage.tsx +33 -0
  274. package/.framework/src/pages/spine-framework/CLIPage.tsx +33 -0
  275. package/.framework/src/types/auth.ts +128 -71
  276. package/.framework/src/types/types.ts +373 -157
  277. package/custom/.devin/skills/spine-workbench-discovery/SKILL.md +39 -0
  278. package/custom/.devin/skills/spine-workbench-idea/SKILL.md +36 -0
  279. package/custom/.devin/skills/spine-workbench-implement/SKILL.md +46 -0
  280. package/custom/.devin/skills/spine-workbench-initiative/SKILL.md +28 -0
  281. package/custom/.devin/skills/spine-workbench-plan/SKILL.md +38 -0
  282. package/docs/README.md +9 -130
  283. package/netlify.toml +5 -2
  284. package/package.json +13 -25
  285. package/scripts/kb-ingest-docs.ts +203 -0
  286. package/spine.config.json +65 -4
  287. package/.framework/migrations/001_schema.sql +0 -425
  288. package/.framework/migrations/002_rls_and_functions.sql +0 -763
  289. package/.framework/migrations/004_enhancements.sql +0 -43
  290. package/.framework/migrations/005_auth_user_trigger.sql +0 -105
  291. package/.framework/migrations/006_fix_current_actor_id.sql +0 -21
  292. package/.framework/migrations/016_invites.sql +0 -27
  293. package/.framework/migrations/017_fix_get_account_apps.sql +0 -78
  294. package/.framework/migrations/018_apps_required_roles.sql +0 -17
  295. package/.framework/migrations/019_triggers_unique_constraint.sql +0 -13
  296. package/.framework/migrations/020_get_account_apps_role_filter.sql +0 -117
  297. package/.framework/migrations/021_app_domains.sql +0 -112
  298. package/.framework/migrations/022_route_prefix_domain_unique.sql +0 -21
  299. package/.framework/migrations/023_match_embeddings_rpc.sql +0 -78
  300. package/.framework/migrations/024_messages_account_id.sql +0 -9
  301. package/.framework/migrations/025_retype_threads_messages.sql +0 -240
  302. package/.framework/migrations/026_fix_rls_policies.sql +0 -47
  303. package/.framework/migrations/027_embedding_lifecycle.sql +0 -176
  304. package/.framework/migrations/028_fix_message_data_permissions.sql +0 -49
  305. package/.framework/migrations/029_tighten_support_triage_prompt.sql +0 -41
  306. package/.framework/migrations/030_messages_updated_by.sql +0 -6
  307. package/.framework/migrations/031_seed_upsert_constraints.sql +0 -35
  308. package/docs/APPS.md +0 -232
  309. package/docs/ARCHITECTURE.md +0 -246
  310. package/docs/INSTALL.md +0 -155
  311. package/docs/design-schema-spec.md +0 -1837
  312. package/docs/dev-guides/01-create-an-app.md +0 -183
  313. package/docs/dev-guides/02-create-a-function.md +0 -178
  314. package/docs/dev-guides/03-create-a-component.md +0 -178
  315. package/docs/dev-guides/04-webhook-handlers.md +0 -129
  316. package/docs/dev-guides/05-testing.md +0 -168
  317. package/docs/dev-guides/README.md +0 -40
  318. package/docs/npm-packages-plan.md +0 -288
  319. package/docs/spine-core--api-reference.md +0 -822
@@ -0,0 +1,102 @@
1
+ // CIL[BEGIN chunk_id="resolve_credentials_module_header_1784200002" type="module_header" identity="imports" parent="none"]
2
+ // CIL[DOC-MACRO purpose="Resolve integration credentials from DB or environment variables"]
3
+ // CIL[DOC-RESPONSIBILITY responsibility="Provide a single, auditable source for external API secrets"]
4
+ // CIL[DOC-CONTEXT module="resolve_credentials" layer="infrastructure" related_files="[".framework/functions/integration-routes.ts",".framework/functions/integration-outbound.ts",".framework/functions/agent-runner.ts",".framework/functions/_shared/audit.ts"]"]
5
+ // CIL[DOC-CONTRACT inputs="ctx, integration record, credential field name" outputs="{ value, source }" errors="missing_credential" side_effects="emits audit log"]
6
+ // CIL[DOC-MICRO logic_summary="Reads integrations.credentials[field]. If source is env_var, reads process.env. Logs the source but never the secret value." notable_decisions="["Never logs the secret value.","Throws if neither DB nor env provides the credential.","Returns source so audit trail can show where the secret came from."]"]
7
+ // CIL[DOC-CONFIDENCE pass="first" score="0.95" flags="none"]
8
+ // CIL[DOC-STABILITY stability="experimental"]
9
+ // CIL[DOC-AUDIENCE audience="developer"]
10
+ // CIL[DOC-VECTOR type="context" content="Layer: infrastructure. Direct callers: 0. Direct calls: 0. Related files: .framework/functions/integration-routes.ts, .framework/functions/integration-outbound.ts, .framework/functions/agent-runner.ts, .framework/functions/_shared/audit.ts."]
11
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
12
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
13
+ // CIL[DOC-VECTOR type="constraint" content="Credential field must be defined in integrations.credentials."]
14
+ // CIL[DOC-VECTOR type="implementation_pattern" content="Helper used by broker and core LLM callers."]
15
+ // CIL[DOC-VECTOR type="user_journey" content="Runtime credential resolution for outbound calls."]
16
+
17
+ import { CoreContext } from './middleware'
18
+ import { emitLog } from './audit'
19
+
20
+ interface CredentialEntry {
21
+ source: 'value' | 'env_var'
22
+ value: string
23
+ }
24
+
25
+ export interface ResolvedCredential {
26
+ value: string
27
+ source: 'value' | 'env_var'
28
+ }
29
+
30
+ export async function resolveCredential(
31
+ ctx: CoreContext,
32
+ integration: any,
33
+ fieldName: string
34
+ ): Promise<ResolvedCredential> {
35
+ const credentials = integration?.credentials || {}
36
+ const entry = credentials[fieldName] as CredentialEntry | undefined
37
+
38
+ if (!entry || !entry.source) {
39
+ await emitLog(ctx, 'integration.credential_missing', { type: 'integration', id: integration?.id }, undefined, {
40
+ field: fieldName,
41
+ integration_id: integration?.id,
42
+ account_id: ctx.accountId
43
+ })
44
+ throw new Error(`Missing credential configuration for ${fieldName} on integration ${integration?.id}`)
45
+ }
46
+
47
+ if (entry.source === 'env_var') {
48
+ const envValue = process.env[entry.value]
49
+ if (!envValue) {
50
+ await emitLog(ctx, 'integration.credential_env_missing', { type: 'integration', id: integration?.id }, undefined, {
51
+ field: fieldName,
52
+ env_var: entry.value,
53
+ integration_id: integration?.id,
54
+ account_id: ctx.accountId
55
+ })
56
+ throw new Error(`Environment variable ${entry.value} for ${fieldName} is not set`)
57
+ }
58
+
59
+ await emitLog(ctx, 'integration.credential_resolved', { type: 'integration', id: integration?.id }, undefined, {
60
+ field: fieldName,
61
+ source: 'env_var',
62
+ env_var: entry.value,
63
+ integration_id: integration?.id,
64
+ account_id: ctx.accountId
65
+ })
66
+
67
+ return { value: envValue, source: 'env_var' }
68
+ }
69
+
70
+ if (!entry.value) {
71
+ await emitLog(ctx, 'integration.credential_empty', { type: 'integration', id: integration?.id }, undefined, {
72
+ field: fieldName,
73
+ source: 'value',
74
+ integration_id: integration?.id,
75
+ account_id: ctx.accountId
76
+ })
77
+ throw new Error(`Credential ${fieldName} on integration ${integration?.id} is empty`)
78
+ }
79
+
80
+ await emitLog(ctx, 'integration.credential_resolved', { type: 'integration', id: integration?.id }, undefined, {
81
+ field: fieldName,
82
+ source: 'value',
83
+ integration_id: integration?.id,
84
+ account_id: ctx.accountId
85
+ })
86
+
87
+ return { value: entry.value, source: 'value' }
88
+ }
89
+
90
+ export async function resolveCredentials(
91
+ ctx: CoreContext,
92
+ integration: any,
93
+ fieldNames: string[]
94
+ ): Promise<Record<string, ResolvedCredential>> {
95
+ const result: Record<string, ResolvedCredential> = {}
96
+ for (const fieldName of fieldNames) {
97
+ result[fieldName] = await resolveCredential(ctx, integration, fieldName)
98
+ }
99
+ return result
100
+ }
101
+
102
+ // CIL[END chunk_id="resolve_credentials_module_header_1784200002"]
@@ -1,10 +1,43 @@
1
- // Slug-based ID resolution utilities
2
- // Custom app code must never hardcode UUIDs — IDs differ on every fresh install.
3
- // All functions that need entity IDs must call resolveIds() at request time.
4
1
 
5
- import { adminDb } from './db'
6
2
 
7
- // Resolve type IDs by (kind, slug) pairs
3
+
4
+
5
+
6
+
7
+
8
+
9
+
10
+ // CIL[BEGIN chunk_id="resolveids_imports_1784020784" type="module_header" identity="imports" parent="none"]
11
+ // CIL[DOC-MACRO purpose="Import database dependency for ID resolution"]
12
+ // CIL[DOC-RESPONSIBILITY responsibility="Import adminDb for database queries"]
13
+ // CIL[DOC-CONTEXT module="resolve-ids" layer="shared" related_files="[\".framework/functions/_shared/schema-utils.ts\",\".framework/src/components/layout/Sidebar.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/migrations/025_retype_threads_messages.sql\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"\\\"]"]
14
+ // CIL[DOC-CONTRACT inputs="none" outputs="adminDb" errors="none" side_effects="none"]
15
+ // CIL[DOC-MICRO logic_summary="Import database connection for ID resolution 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: .framework/functions/_shared/schema-utils.ts, .framework/src/components/layout/Sidebar.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/migrations/025_retype_threads_messages.sql, .framework/src/pages/admin/TypeDetailPage.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
+ import { adminDb } from './db'
26
+ // CIL[END chunk_id="resolveids_imports_1784020784"]
27
+ // CIL[BEGIN chunk_id="resolveids_resolvetypeids_1784020784" type="function" identity="resolveTypeIds" parent="none"]
28
+ // CIL[DOC-MACRO purpose="Resolve multiple type IDs by kind and slug"]
29
+ // CIL[DOC-RESPONSIBILITY responsibility="Batch resolve type identifiers from database"]
30
+ // CIL[DOC-CONTEXT module="resolve-ids" layer="shared" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/migrations/025_retype_threads_messages.sql\",\".framework/src/pages/admin/RolesPage.tsx\",\"\\\"]"]
31
+ // CIL[DOC-CONTRACT inputs="none" outputs="Record<string, string>" errors="type not found" side_effects="database query"]
32
+ // CIL[DOC-MICRO logic_summary="Batch queries types table, validates all requested types exist" notable_decisions="[]"]
33
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
34
+ // CIL[DOC-STABILITY stability="stable"]
35
+ // CIL[DOC-VECTOR type="context" content="Layer: shared. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/migrations/025_retype_threads_messages.sql, .framework/src/pages/admin/RolesPage.tsx, \."]
36
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
37
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
38
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
39
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
40
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
8
41
  export async function resolveTypeIds(
9
42
  pairs: Array<{ kind: string; slug: string }>
10
43
  ): Promise<Record<string, string>> {
@@ -31,14 +64,100 @@ export async function resolveTypeIds(
31
64
 
32
65
  return result
33
66
  }
34
-
35
- // Resolve a single type ID — throws if not found
67
+ // CIL[END chunk_id="resolveids_resolvetypeids_1784020784"]
68
+ // CIL[BEGIN chunk_id="resolveids_resolvetypeid_1784020784" type="function" identity="resolveTypeId" parent="none"]
69
+ // CIL[DOC-MACRO purpose="Resolve single type ID by kind and slug"]
70
+ // CIL[DOC-RESPONSIBILITY responsibility="Get type identifier from kind and slug"]
71
+ // CIL[DOC-CONTEXT module="resolve-ids" layer="shared" related_files="[\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/migrations/025_retype_threads_messages.sql\",\".framework/functions/_shared/schema-utils.ts\",\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"\\\"]"]
72
+ // CIL[DOC-CONTRACT inputs="none" outputs="type ID" errors="type not found" side_effects="database query"]
73
+ // CIL[DOC-MICRO logic_summary="Convenience wrapper around resolveTypeIds for single type" notable_decisions="[]"]
74
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
75
+ // CIL[DOC-STABILITY stability="stable"]
76
+ // CIL[DOC-VECTOR type="context" content="Layer: shared. Direct callers: 15. Direct calls: 0. Related files: .framework/src/pages/admin/TypeDetailPage.tsx, .framework/migrations/025_retype_threads_messages.sql, .framework/functions/_shared/schema-utils.ts, custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, \."]
77
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 15. Total affected: 15."]
78
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
79
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
80
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
81
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
36
82
  export async function resolveTypeId(kind: string, slug: string): Promise<string> {
37
83
  const ids = await resolveTypeIds([{ kind, slug }])
38
84
  return ids[`${kind}/${slug}`]
39
85
  }
86
+ // CIL[END chunk_id="resolveids_resolvetypeid_1784020784"]
87
+ // CIL[BEGIN chunk_id="resolveids_typerecord_1784020784" type="interface" identity="TypeRecord" parent="none"]
88
+ // CIL[DOC-MACRO purpose="Define type record interface with schemas"]
89
+ // CIL[DOC-RESPONSIBILITY responsibility="Provide structure for type with design and validation schemas"]
90
+ // CIL[DOC-CONTEXT module="resolve-ids" layer="shared" related_files="[\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/functions/_shared/schema-utils.ts\",\".framework/src/components/layout/Sidebar.tsx\",\".framework/migrations/025_retype_threads_messages.sql\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\"\\\"]"]
91
+ // CIL[DOC-CONTRACT inputs="none" outputs="TypeRecord interface" errors="none" side_effects="none"]
92
+ // CIL[DOC-MICRO logic_summary="Interface containing type metadata and schemas" notable_decisions="[]"]
93
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
94
+ // CIL[DOC-STABILITY stability="stable"]
95
+ // CIL[DOC-VECTOR type="context" content="Layer: shared. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/TypeDetailPage.tsx, .framework/functions/_shared/schema-utils.ts, .framework/src/components/layout/Sidebar.tsx, .framework/migrations/025_retype_threads_messages.sql, .framework/src/pages/admin/IntegrationsPage.tsx, \."]
96
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
97
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
98
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
99
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
100
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
101
+ export interface TypeRecord {
102
+ id: string
103
+ slug: string
104
+ kind: string
105
+ design_schema: Record<string, any>
106
+ validation_schema: Record<string, any>
107
+ is_active: boolean
108
+ }
109
+ // CIL[END chunk_id="resolveids_typerecord_1784020784"]
110
+ // CIL[BEGIN chunk_id="resolveids_resolvetyperecord_1784020784" type="function" identity="resolveTypeRecord" parent="none"]
111
+ // CIL[DOC-LEARNING topic="runtime-type:generic/type_resolution" content="resolveTypeRecord fetches a type row by kind and slug or by id, returning the full design_schema and validation_schema. It is used by admin-data create and pipeline.ts to stamp new records."]
112
+ // CIL[DOC-NOTE type="design_schema_caveat" content="If the type slug is not found or is inactive, record creation fails with a 400 error. Always seed types before creating records."]
113
+ // CIL[DOC-MACRO purpose="Resolve complete type record with schemas"]
114
+ // CIL[DOC-RESPONSIBILITY responsibility="Get type metadata and validation schemas"]
115
+ // CIL[DOC-CONTEXT module="resolve-ids" layer="shared" related_files="[\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/migrations/025_retype_threads_messages.sql\",\".framework/functions/_shared/schema-utils.ts\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\"\\\"]"]
116
+ // CIL[DOC-CONTRACT inputs="none" outputs="TypeRecord" errors="type not found/inactive" side_effects="database query"]
117
+ // CIL[DOC-MICRO logic_summary="Queries types table, validates active status, returns full record" notable_decisions="[]"]
118
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
119
+ // CIL[DOC-STABILITY stability="stable"]
120
+ // CIL[DOC-VECTOR type="context" content="Layer: shared. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/TypeDetailPage.tsx, .framework/migrations/025_retype_threads_messages.sql, .framework/functions/_shared/schema-utils.ts, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/IntegrationsPage.tsx, \."]
121
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
122
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
123
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
124
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
125
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
126
+ export async function resolveTypeRecord(kind: string, slug: string): Promise<TypeRecord> {
127
+ const { data, error } = await adminDb
128
+ .from('types')
129
+ .select('id, slug, kind, design_schema, validation_schema, is_active')
130
+ .eq('kind', kind)
131
+ .eq('slug', slug)
132
+ .single()
133
+
134
+ if (error || !data) throw new Error(`Type not found: ${kind}/${slug}`)
135
+ if (!data.is_active) throw new Error(`Type is inactive: ${kind}/${slug}`)
40
136
 
41
- // Resolve link type IDs by slug
137
+ return {
138
+ id: data.id,
139
+ slug: data.slug,
140
+ kind: data.kind,
141
+ design_schema: data.design_schema || {},
142
+ validation_schema: data.validation_schema || {},
143
+ is_active: data.is_active,
144
+ }
145
+ }
146
+ // CIL[END chunk_id="resolveids_resolvetyperecord_1784020784"]
147
+ // CIL[BEGIN chunk_id="resolveids_resolvelinktypeids_1784020784" type="function" identity="resolveLinkTypeIds" parent="none"]
148
+ // CIL[DOC-MACRO purpose="Resolve multiple link type IDs by slug"]
149
+ // CIL[DOC-RESPONSIBILITY responsibility="Batch resolve link type identifiers from database"]
150
+ // CIL[DOC-CONTEXT module="resolve-ids" layer="shared" related_files="[\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/migrations/025_retype_threads_messages.sql\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/functions/_shared/schema-utils.ts\",\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\"\\\"]"]
151
+ // CIL[DOC-CONTRACT inputs="none" outputs="Record<string, string>" errors="link type not found" side_effects="database query"]
152
+ // CIL[DOC-MICRO logic_summary="Batch queries link_types table, validates all requested types exist" notable_decisions="[]"]
153
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
154
+ // CIL[DOC-STABILITY stability="stable"]
155
+ // CIL[DOC-VECTOR type="context" content="Layer: shared. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/TypeDetailPage.tsx, .framework/migrations/025_retype_threads_messages.sql, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/functions/_shared/schema-utils.ts, custom/apps/cortex/functions/custom_cil-embeddings.ts, \."]
156
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
157
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
158
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
159
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
160
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
42
161
  export async function resolveLinkTypeIds(slugs: string[]): Promise<Record<string, string>> {
43
162
  if (slugs.length === 0) return {}
44
163
 
@@ -60,14 +179,40 @@ export async function resolveLinkTypeIds(slugs: string[]): Promise<Record<string
60
179
 
61
180
  return result
62
181
  }
63
-
64
- // Resolve a single link type ID — throws if not found
182
+ // CIL[END chunk_id="resolveids_resolvelinktypeids_1784020784"]
183
+ // CIL[BEGIN chunk_id="resolveids_resolvelinktypeid_1784020784" type="function" identity="resolveLinkTypeId" parent="none"]
184
+ // CIL[DOC-MACRO purpose="Resolve single link type ID by slug"]
185
+ // CIL[DOC-RESPONSIBILITY responsibility="Get link type identifier from slug"]
186
+ // CIL[DOC-CONTEXT module="resolve-ids" layer="shared" related_files="[\".framework/migrations/025_retype_threads_messages.sql\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/functions/_shared/schema-utils.ts\",\".framework/src/components/layout/Sidebar.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"\\\"]"]
187
+ // CIL[DOC-CONTRACT inputs="none" outputs="link type ID" errors="link type not found" side_effects="database query"]
188
+ // CIL[DOC-MICRO logic_summary="Convenience wrapper around resolveLinkTypeIds for single type" notable_decisions="[]"]
189
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
190
+ // CIL[DOC-STABILITY stability="stable"]
191
+ // CIL[DOC-VECTOR type="context" content="Layer: shared. Direct callers: 0. Direct calls: 0. Related files: .framework/migrations/025_retype_threads_messages.sql, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/functions/_shared/schema-utils.ts, .framework/src/components/layout/Sidebar.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, \."]
192
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
193
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
194
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
195
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
196
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
65
197
  export async function resolveLinkTypeId(slug: string): Promise<string> {
66
198
  const ids = await resolveLinkTypeIds([slug])
67
199
  return ids[slug]
68
200
  }
69
-
70
- // Resolve account ID by slug
201
+ // CIL[END chunk_id="resolveids_resolvelinktypeid_1784020784"]
202
+ // CIL[BEGIN chunk_id="resolveids_resolveaccountid_1784020784" type="function" identity="resolveAccountId" parent="none"]
203
+ // CIL[DOC-MACRO purpose="Resolve account ID by slug"]
204
+ // CIL[DOC-RESPONSIBILITY responsibility="Get account identifier from slug"]
205
+ // CIL[DOC-CONTEXT module="resolve-ids" layer="shared" related_files="[\".framework/functions/_shared/schema-utils.ts\",\".framework/src/components/layout/Sidebar.tsx\",\".framework/migrations/025_retype_threads_messages.sql\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"\\\"]"]
206
+ // CIL[DOC-CONTRACT inputs="none" outputs="account ID" errors="account not found" side_effects="database query"]
207
+ // CIL[DOC-MICRO logic_summary="Queries accounts table by slug to get ID" notable_decisions="[]"]
208
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
209
+ // CIL[DOC-STABILITY stability="stable"]
210
+ // CIL[DOC-VECTOR type="context" content="Layer: shared. Direct callers: 0. Direct calls: 0. Related files: .framework/functions/_shared/schema-utils.ts, .framework/src/components/layout/Sidebar.tsx, .framework/migrations/025_retype_threads_messages.sql, .framework/src/pages/admin/TypeDetailPage.tsx, \."]
211
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
212
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
213
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
214
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
215
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
71
216
  export async function resolveAccountId(slug: string): Promise<string> {
72
217
  const { data, error } = await adminDb
73
218
  .from('accounts')
@@ -78,8 +223,21 @@ export async function resolveAccountId(slug: string): Promise<string> {
78
223
  if (error || !data) throw new Error(`Account not found: ${slug}`)
79
224
  return data.id
80
225
  }
81
-
82
- // Resolve AI agent ID by name
226
+ // CIL[END chunk_id="resolveids_resolveaccountid_1784020784"]
227
+ // CIL[BEGIN chunk_id="resolveids_resolveagentid_1784020784" type="function" identity="resolveAgentId" parent="none"]
228
+ // CIL[DOC-MACRO purpose="Resolve AI agent ID by name"]
229
+ // CIL[DOC-RESPONSIBILITY responsibility="Get active AI agent identifier from name"]
230
+ // CIL[DOC-CONTEXT module="resolve-ids" layer="shared" related_files="[\".framework/functions/_shared/schema-utils.ts\",\".framework/src/components/layout/Sidebar.tsx\",\".framework/migrations/025_retype_threads_messages.sql\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"\\\"]"]
231
+ // CIL[DOC-CONTRACT inputs="none" outputs="agent ID" errors="agent not found" side_effects="database query"]
232
+ // CIL[DOC-MICRO logic_summary="Queries ai_agents table by name and active status" notable_decisions="[]"]
233
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
234
+ // CIL[DOC-STABILITY stability="stable"]
235
+ // CIL[DOC-VECTOR type="context" content="Layer: shared. Direct callers: 0. Direct calls: 0. Related files: .framework/functions/_shared/schema-utils.ts, .framework/src/components/layout/Sidebar.tsx, .framework/migrations/025_retype_threads_messages.sql, .framework/src/pages/admin/TypeDetailPage.tsx, \."]
236
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
237
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
238
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
239
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
240
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
83
241
  export async function resolveAgentId(name: string): Promise<string> {
84
242
  const { data, error } = await adminDb
85
243
  .from('ai_agents')
@@ -91,8 +249,21 @@ export async function resolveAgentId(name: string): Promise<string> {
91
249
  if (error || !data) throw new Error(`AI agent not found: ${name}`)
92
250
  return data.id
93
251
  }
94
-
95
- // Resolve prompt config ID by slug
252
+ // CIL[END chunk_id="resolveids_resolveagentid_1784020784"]
253
+ // CIL[BEGIN chunk_id="resolveids_resolvepromptconfigid_1784020784" type="function" identity="resolvePromptConfigId" parent="none"]
254
+ // CIL[DOC-MACRO purpose="Resolve prompt config ID by slug"]
255
+ // CIL[DOC-RESPONSIBILITY responsibility="Get active prompt config identifier from slug"]
256
+ // CIL[DOC-CONTEXT module="resolve-ids" layer="shared" related_files="[\".framework/functions/_shared/schema-utils.ts\",\".framework/src/components/layout/Sidebar.tsx\",\".framework/migrations/025_retype_threads_messages.sql\",\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\"\\\"]"]
257
+ // CIL[DOC-CONTRACT inputs="none" outputs="prompt config ID" errors="prompt config not found" side_effects="database query"]
258
+ // CIL[DOC-MICRO logic_summary="Queries prompt_configs table by slug and active status" notable_decisions="[]"]
259
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
260
+ // CIL[DOC-STABILITY stability="stable"]
261
+ // CIL[DOC-VECTOR type="context" content="Layer: shared. Direct callers: 4. Direct calls: 0. Related files: .framework/functions/_shared/schema-utils.ts, .framework/src/components/layout/Sidebar.tsx, .framework/migrations/025_retype_threads_messages.sql, custom/apps/cortex/functions/custom_cil-embeddings.ts, \."]
262
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 4. Total affected: 4."]
263
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
264
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
265
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
266
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
96
267
  export async function resolvePromptConfigId(slug: string): Promise<string> {
97
268
  const { data, error } = await adminDb
98
269
  .from('prompt_configs')
@@ -104,3 +275,4 @@ export async function resolvePromptConfigId(slug: string): Promise<string> {
104
275
  if (error || !data) throw new Error(`Prompt config not found: ${slug}`)
105
276
  return data.id
106
277
  }
278
+ // CIL[END chunk_id="resolveids_resolvepromptconfigid_1784020784"]
@@ -0,0 +1,104 @@
1
+ // CIL[BEGIN chunk_id="retry_deliveries_module_header_1784200007" type="module_header" identity="imports" parent="none"]
2
+ // CIL[DOC-MACRO purpose="Retry pending webhook deliveries from the shared ledger"]
3
+ // CIL[DOC-RESPONSIBILITY responsibility="Poll webhook_deliveries and re-execute due outbound (and eventually inbound) records"]
4
+ // CIL[DOC-CONTEXT module="retry-deliveries" layer="shared" related_files="[".framework/functions/integration-outbound.ts",".framework/functions/_shared/principal.ts",".framework/migrations/051_integration_broker.sql"]"]
5
+ // CIL[DOC-CONTRACT inputs="ctx" outputs="{ outbound_retried, outbound_succeeded, outbound_failed, errors }" errors="none" side_effects="HTTP calls, webhook_deliveries updates"]
6
+ // CIL[DOC-MICRO logic_summary="Queries pending, due deliveries and calls the corresponding broker action for each." notable_decisions="["Inbound retry is left as a TODO until integration-routes supports delivery_id reuse.","Outbout retries reuse the existing delivery row by passing delivery_id to integration-outbound.execute."]"]
7
+ // CIL[DOC-CONFIDENCE pass="first" score="0.85" flags="none"]
8
+ // CIL[DOC-STABILITY stability="experimental"]
9
+ // CIL[DOC-AUDIENCE audience="developer"]
10
+ // CIL[DOC-VECTOR type="context" content="Layer: shared. Direct callers: 0. Direct calls: 0. Related files: .framework/functions/integration-outbound.ts, .framework/functions/_shared/principal.ts, .framework/migrations/051_integration_broker.sql."]
11
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
12
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
13
+ // CIL[DOC-VECTOR type="constraint" content="Only processes outbound deliveries in this pass."]
14
+ // CIL[DOC-VECTOR type="implementation_pattern" content="Called by system-cron on each tick."]
15
+ // CIL[DOC-VECTOR type="user_journey" content="System automatically retries failed or pending outbound webhook calls."]
16
+
17
+ import { adminDb } from './db'
18
+ import { SYSTEM_PRINCIPAL } from './principal'
19
+ import { execute as executeOutbound } from '../integration-outbound'
20
+
21
+ interface RetrySummary {
22
+ outbound_retried: number
23
+ outbound_succeeded: number
24
+ outbound_failed: number
25
+ inbound_retried: number
26
+ inbound_succeeded: number
27
+ inbound_failed: number
28
+ errors: string[]
29
+ }
30
+
31
+ export async function retryPendingDeliveries(ctx: any): Promise<RetrySummary> {
32
+ const summary: RetrySummary = {
33
+ outbound_retried: 0,
34
+ outbound_succeeded: 0,
35
+ outbound_failed: 0,
36
+ inbound_retried: 0,
37
+ inbound_succeeded: 0,
38
+ inbound_failed: 0,
39
+ errors: []
40
+ }
41
+
42
+ const now = new Date().toISOString()
43
+
44
+ const { data: dueDeliveries, error } = await adminDb
45
+ .from('webhook_deliveries')
46
+ .select('*')
47
+ .eq('status', 'pending')
48
+ .lt('attempt_count', 10)
49
+ .or(`next_attempt_at.is.null,next_attempt_at.lte.${now}`)
50
+ .limit(100)
51
+
52
+ if (error) {
53
+ console.error('[retry-deliveries] Failed to fetch pending deliveries:', error)
54
+ summary.errors.push(error.message)
55
+ return summary
56
+ }
57
+
58
+ if (!dueDeliveries || dueDeliveries.length === 0) {
59
+ return summary
60
+ }
61
+
62
+ const retryCtx = {
63
+ ...ctx,
64
+ db: adminDb,
65
+ accountId: null,
66
+ appId: null,
67
+ principal: SYSTEM_PRINCIPAL,
68
+ query: {}
69
+ }
70
+
71
+ for (const delivery of dueDeliveries) {
72
+ try {
73
+ if (delivery.direction === 'outbound') {
74
+ summary.outbound_retried++
75
+
76
+ retryCtx.accountId = delivery.account_id
77
+
78
+ await executeOutbound(retryCtx, { delivery_id: delivery.id })
79
+
80
+ summary.outbound_succeeded++
81
+ } else {
82
+ // Inbound retry: not yet implemented. Reprocessing requires the
83
+ // original x-api-key or an internal bypass; integration-routes
84
+ // must be updated to accept delivery_id.
85
+ summary.inbound_retried++
86
+ console.warn(`[retry-deliveries] Inbound delivery retry not implemented: ${delivery.id}`)
87
+ summary.inbound_failed++
88
+ }
89
+ } catch (err: any) {
90
+ console.error(`[retry-deliveries] Delivery ${delivery.id} failed:`, err)
91
+ summary.errors.push(`${delivery.id}: ${err.message || String(err)}`)
92
+
93
+ if (delivery.direction === 'outbound') {
94
+ summary.outbound_failed++
95
+ } else {
96
+ summary.inbound_failed++
97
+ }
98
+ }
99
+ }
100
+
101
+ return summary
102
+ }
103
+
104
+ // CIL[END chunk_id="retry_deliveries_module_header_1784200007"]