spine-framework 0.3.125 → 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 +169 -97
  6. package/.framework/cli/commands/generate.ts +82 -160
  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} +147 -54
  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 +222 -347
  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 +162 -14
  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 +687 -533
  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 +173 -145
  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 +192 -115
  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 +3 -3
  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,5 +1,43 @@
1
- import { adminDb } from './db'
2
1
 
2
+
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"]
3
41
  export async function resolveTypeIds(
4
42
  pairs: Array<{ kind: string; slug: string }>
5
43
  ): Promise<Record<string, string>> {
@@ -26,12 +64,40 @@ export async function resolveTypeIds(
26
64
 
27
65
  return result
28
66
  }
29
-
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"]
30
82
  export async function resolveTypeId(kind: string, slug: string): Promise<string> {
31
83
  const ids = await resolveTypeIds([{ kind, slug }])
32
84
  return ids[`${kind}/${slug}`]
33
85
  }
34
-
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"]
35
101
  export interface TypeRecord {
36
102
  id: string
37
103
  slug: string
@@ -40,12 +106,23 @@ export interface TypeRecord {
40
106
  validation_schema: Record<string, any>
41
107
  is_active: boolean
42
108
  }
43
-
44
- /**
45
- * Resolve a type record by kind + slug in a single query.
46
- * Returns id, design_schema, and validation_schema — everything needed
47
- * to stamp a new item record (mirrors the admin-data.ts create handler pattern).
48
- */
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"]
49
126
  export async function resolveTypeRecord(kind: string, slug: string): Promise<TypeRecord> {
50
127
  const { data, error } = await adminDb
51
128
  .from('types')
@@ -66,7 +143,21 @@ export async function resolveTypeRecord(kind: string, slug: string): Promise<Typ
66
143
  is_active: data.is_active,
67
144
  }
68
145
  }
69
-
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"]
70
161
  export async function resolveLinkTypeIds(slugs: string[]): Promise<Record<string, string>> {
71
162
  if (slugs.length === 0) return {}
72
163
 
@@ -88,12 +179,40 @@ export async function resolveLinkTypeIds(slugs: string[]): Promise<Record<string
88
179
 
89
180
  return result
90
181
  }
91
-
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"]
92
197
  export async function resolveLinkTypeId(slug: string): Promise<string> {
93
198
  const ids = await resolveLinkTypeIds([slug])
94
199
  return ids[slug]
95
200
  }
96
-
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"]
97
216
  export async function resolveAccountId(slug: string): Promise<string> {
98
217
  const { data, error } = await adminDb
99
218
  .from('accounts')
@@ -104,7 +223,21 @@ export async function resolveAccountId(slug: string): Promise<string> {
104
223
  if (error || !data) throw new Error(`Account not found: ${slug}`)
105
224
  return data.id
106
225
  }
107
-
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"]
108
241
  export async function resolveAgentId(name: string): Promise<string> {
109
242
  const { data, error } = await adminDb
110
243
  .from('ai_agents')
@@ -116,7 +249,21 @@ export async function resolveAgentId(name: string): Promise<string> {
116
249
  if (error || !data) throw new Error(`AI agent not found: ${name}`)
117
250
  return data.id
118
251
  }
119
-
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"]
120
267
  export async function resolvePromptConfigId(slug: string): Promise<string> {
121
268
  const { data, error } = await adminDb
122
269
  .from('prompt_configs')
@@ -128,3 +275,4 @@ export async function resolvePromptConfigId(slug: string): Promise<string> {
128
275
  if (error || !data) throw new Error(`Prompt config not found: ${slug}`)
129
276
  return data.id
130
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"]