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,592 @@
1
+ // CIL[BEGIN chunk_id="custom_apps_cortex_functions_custom_cil_agent_module_header_1784235266" type="module_header" identity="module_header" parent="none"]
2
+ // CIL[DOC-MACRO purpose="Module header and top-level exports for cortex.functions.custom_cil-agent"]
3
+ // CIL[DOC-RESPONSIBILITY responsibility="Own module-level imports, exports, and configuration for cortex.functions.custom_cil-agent"]
4
+ // CIL[DOC-CONTEXT module="cortex.functions.custom_cil-agent" layer="function" related_files="[\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/functions/_shared/schema-utils.ts\",\"\\\"]"]
5
+ // CIL[DOC-CONTRACT inputs="none" outputs="module exports and side effects" errors="none" side_effects="none"]
6
+ // CIL[DOC-MICRO logic_summary="Declares module scope, imports dependencies, and exports public surface of cortex.functions.custom_cil-agent" notable_decisions="[]"]
7
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
8
+ // CIL[DOC-STABILITY stability="stable"]
9
+ // CIL[DOC-AUDIENCE audience="developer"]
10
+ // CIL[DOC-VECTOR type="context" content="Layer: function. Direct callers: 0. Direct calls: 0. Related files: custom/apps/cortex/pages/operations/OperationsDashboard.tsx, custom/apps/portal/pages/ContentPage.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/functions/_shared/principal.ts, .framework/functions/_shared/schema-utils.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="No test paths identified."]
14
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
15
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
16
+
17
+
18
+
19
+
20
+ import { createHandler } from './_shared/middleware'
21
+ import { adminDb } from './_shared/db'
22
+ import { resolveTypeId } from './_shared/resolve-ids'
23
+ import { create as adminCreate } from './admin-data'
24
+ import { callOpenAIChat, callOpenAIEmbeddings } from './_shared/llm'
25
+
26
+
27
+
28
+
29
+
30
+
31
+
32
+
33
+ // CIL[END chunk_id="custom_apps_cortex_functions_custom_cil_agent_module_header_1784235266"]
34
+ // CIL[BEGIN chunk_id="custom_apps_cortex_functions_custom_cil_agent_cil_tools_1784235266" type="variable" identity="cil_tools" parent="none"]
35
+ // CIL[DOC-MACRO purpose="Defines cil_tools configuration or state in cortex.functions.custom_cil-agent"]
36
+ // CIL[DOC-RESPONSIBILITY responsibility="Hold the value and default configuration for cil_tools"]
37
+ // CIL[DOC-CONTEXT module="cortex.functions.custom_cil-agent" layer="function" related_files="[\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\"\\\"]"]
38
+ // CIL[DOC-CONTRACT inputs="none" outputs="value of cil_tools" errors="none" side_effects="none"]
39
+ // CIL[DOC-MICRO logic_summary="Declares cil_tools with initial value or constant binding used by cortex.functions.custom_cil-agent" notable_decisions="[]"]
40
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
41
+ // CIL[DOC-STABILITY stability="stable"]
42
+ // CIL[DOC-VECTOR type="context" content="Layer: function. Direct callers: 0. Direct calls: 0. Related files: custom/apps/cortex/functions/custom_cil-embeddings.ts, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/functions/_shared/principal.ts, .framework/src/pages/admin/IntegrationsPage.tsx, \."]
43
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
44
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
45
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
46
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
47
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
48
+ const CIL_TOOLS = [
49
+ {
50
+ name: 'chunk_lookup',
51
+ description: 'Search for a chunk by name or purpose. Returns chunk_name, file_path, macro, micro, input_spec, output_spec, side_effects, stability.',
52
+ parameters: {
53
+ type: 'object',
54
+ properties: {
55
+ q: { type: 'string', description: 'Chunk name or description of what you are looking for' },
56
+ project_id: { type: 'string', description: 'Optional: scope to a specific project UUID' },
57
+ },
58
+ required: ['q'],
59
+ },
60
+ },
61
+ {
62
+ name: 'get_contract',
63
+ description: 'Get the full contract for a specific chunk by its ID.',
64
+ parameters: {
65
+ type: 'object',
66
+ properties: {
67
+ chunk_id: { type: 'string', description: 'UUID of the cil_chunk item' },
68
+ },
69
+ required: ['chunk_id'],
70
+ },
71
+ },
72
+ {
73
+ name: 'blast_radius',
74
+ description: 'Find all chunks that call a given chunk (BFS caller traversal). Use before refactoring.',
75
+ parameters: {
76
+ type: 'object',
77
+ properties: {
78
+ chunk_id: { type: 'string', description: 'UUID of the chunk to check callers for' },
79
+ max_depth: { type: 'number', description: 'Maximum traversal depth (default 3)' },
80
+ },
81
+ required: ['chunk_id'],
82
+ },
83
+ },
84
+ {
85
+ name: 'hash_validate',
86
+ description: 'Check whether a chunk\'s stored hash is current or has drifted (code was changed without updating CIL).',
87
+ parameters: {
88
+ type: 'object',
89
+ properties: {
90
+ chunk_id: { type: 'string', description: 'UUID of the chunk to validate' },
91
+ },
92
+ required: ['chunk_id'],
93
+ },
94
+ },
95
+ {
96
+ name: 'doc_gap_report',
97
+ description: 'List undocumented chunks in a project and overall documentation coverage.',
98
+ parameters: {
99
+ type: 'object',
100
+ properties: {
101
+ project_id: { type: 'string', description: 'UUID of the cil_project' },
102
+ },
103
+ required: ['project_id'],
104
+ },
105
+ },
106
+ {
107
+ name: 'project_status',
108
+ description: 'Get the full pipeline status for a project: file count, chunk count, embedding coverage, doc coverage, link counts.',
109
+ parameters: {
110
+ type: 'object',
111
+ properties: {
112
+ project_id: { type: 'string', description: 'UUID of the cil_project' },
113
+ },
114
+ required: ['project_id'],
115
+ },
116
+ },
117
+ ]
118
+
119
+
120
+
121
+
122
+
123
+
124
+
125
+ // CIL[END chunk_id="custom_apps_cortex_functions_custom_cil_agent_cil_tools_1784235266"]
126
+ // CIL[BEGIN chunk_id="custom_apps_cortex_functions_custom_cil_agent_dispatchtool_1784235266" type="function" identity="dispatchtool" parent="none"]
127
+ // CIL[DOC-MACRO purpose="Implements dispatchtool logic in cortex.functions.custom_cil-agent"]
128
+ // CIL[DOC-RESPONSIBILITY responsibility="Execute dispatchtool and return its computed result"]
129
+ // CIL[DOC-CONTEXT module="cortex.functions.custom_cil-agent" layer="function" related_files="[\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\".framework/functions/_shared/principal.ts\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\"\\\"]"]
130
+ // CIL[DOC-CONTRACT inputs="none" outputs="return value from function execution" errors="throws on invalid input or runtime failure" side_effects="none"]
131
+ // CIL[DOC-MICRO logic_summary="Provides dispatchtool with dispatchTool( inputs, handling internal flow and returning a result" notable_decisions="[]"]
132
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
133
+ // CIL[DOC-STABILITY stability="stable"]
134
+ // CIL[DOC-VECTOR type="context" content="Layer: function. Direct callers: 0. Direct calls: 0. Related files: custom/apps/cortex/functions/custom_cil-embeddings.ts, .framework/functions/_shared/principal.ts, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/src/pages/admin/IntegrationsPage.tsx, \."]
135
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
136
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
137
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
138
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
139
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
140
+ async function dispatchTool(
141
+ toolName: string,
142
+ args: Record<string, any>,
143
+ accountId: string
144
+ ): Promise<any> {
145
+ const base = process.env.URL || 'http://localhost:8888'
146
+
147
+ switch (toolName) {
148
+ case 'chunk_lookup': {
149
+ const params = new URLSearchParams({ action: 'search', q: args.q, mode: 'hybrid', limit: '5' })
150
+ if (args.project_id) params.set('project_id', args.project_id)
151
+ const res = await fetch(`${base}/.netlify/functions/cil-graph?${params}`)
152
+ const data: any = await res.json()
153
+ return { results: data?.results || data?.data?.results || [] }
154
+ }
155
+
156
+ case 'get_contract': {
157
+ const res = await fetch(`${base}/.netlify/functions/cil-graph?action=get_chunk_contract&chunk_id=${args.chunk_id}`)
158
+ const data: any = await res.json()
159
+ return data?.contract || data?.data?.contract || {}
160
+ }
161
+
162
+ case 'blast_radius': {
163
+ const depth = args.max_depth || 3
164
+ const res = await fetch(`${base}/.netlify/functions/cil-graph?action=get_blast_radius&chunk_id=${args.chunk_id}&max_depth=${depth}`)
165
+ const data: any = await res.json()
166
+ return { affected: data?.affected || data?.data?.affected || [], depth }
167
+ }
168
+
169
+ case 'hash_validate': {
170
+
171
+ const { data: chunk } = await adminDb
172
+ .from('items').select('id, data').eq('id', args.chunk_id).maybeSingle()
173
+ if (!chunk) return { status: 'not_found', chunk_id: args.chunk_id }
174
+
175
+ const codeContent = chunk.data?.code_content || ''
176
+ if (!codeContent) return { status: 'no_code_content', chunk_id: args.chunk_id }
177
+
178
+ const res = await fetch(`${base}/.netlify/functions/cil-validate?action=validate`, {
179
+ method: 'POST',
180
+ headers: { 'Content-Type': 'application/json' },
181
+ body: JSON.stringify({
182
+ chunks: [{ chunk_id: args.chunk_id, chunk_name: chunk.data?.chunk_name || '', content: codeContent }],
183
+ }),
184
+ })
185
+ const data: any = await res.json()
186
+ const result = (data?.results || data?.data?.results)?.[0]
187
+ return result || { status: 'unknown', chunk_id: args.chunk_id }
188
+ }
189
+
190
+ case 'doc_gap_report': {
191
+ const res = await fetch(`${base}/.netlify/functions/cil-doc?action=gap_report&project_id=${args.project_id}`)
192
+ const data: any = await res.json()
193
+ return data?.data || data
194
+ }
195
+
196
+ case 'project_status': {
197
+ const pid = args.project_id
198
+ const [projectRes, embedRes, callmapRes] = await Promise.allSettled([
199
+ fetch(`${base}/.netlify/functions/cil-project?action=get&id=${pid}`).then(r => r.json()),
200
+ fetch(`${base}/.netlify/functions/cil-embeddings?action=status&project_id=${pid}`).then(r => r.json()),
201
+ fetch(`${base}/.netlify/functions/cil-callmap?action=status&project_id=${pid}`).then(r => r.json()),
202
+ ])
203
+
204
+ const project = projectRes.status === 'fulfilled' ? (projectRes.value?.project || projectRes.value?.data?.project) : null
205
+ const embed = embedRes.status === 'fulfilled' ? (embedRes.value?.data || embedRes.value) : null
206
+ const callmap = callmapRes.status === 'fulfilled' ? (callmapRes.value?.data || callmapRes.value) : null
207
+
208
+ return {
209
+ project_id: pid,
210
+ file_count: project?.data?.file_count || 0,
211
+ chunk_count: project?.data?.chunk_count || 0,
212
+ embedding_coverage_pct: embed?.coverage_pct || 0,
213
+ embedded_chunks: embed?.embedded_chunks || 0,
214
+ import_links: callmap?.import_links || 0,
215
+ call_links: callmap?.call_links || 0,
216
+ total_ingestion_cost_usd: project?.data?.total_ingestion_cost_usd || 0,
217
+ last_ingested_at: project?.data?.last_ingested_at || null,
218
+ }
219
+ }
220
+
221
+ default:
222
+ return { error: `Unknown tool: ${toolName}` }
223
+ }
224
+ }
225
+
226
+
227
+
228
+
229
+
230
+ // CIL[END chunk_id="custom_apps_cortex_functions_custom_cil_agent_dispatchtool_1784235266"]
231
+ // CIL[BEGIN chunk_id="custom_apps_cortex_functions_custom_cil_agent_callllm_1784235266" type="function" identity="callllm" parent="none"]
232
+ // CIL[DOC-MACRO purpose="Implements callllm logic in cortex.functions.custom_cil-agent"]
233
+ // CIL[DOC-RESPONSIBILITY responsibility="Execute callllm and return its computed result"]
234
+ // CIL[DOC-CONTEXT module="cortex.functions.custom_cil-agent" layer="function" related_files="[\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\".framework/functions/_shared/principal.ts\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\"\\\"]"]
235
+ // CIL[DOC-CONTRACT inputs="none" outputs="return value from function execution" errors="throws on invalid input or runtime failure" side_effects="none"]
236
+ // CIL[DOC-MICRO logic_summary="Provides callllm with callLLM( inputs, handling internal flow and returning a result" notable_decisions="[]"]
237
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
238
+ // CIL[DOC-STABILITY stability="stable"]
239
+ // CIL[DOC-VECTOR type="context" content="Layer: function. Direct callers: 0. Direct calls: 0. Related files: custom/apps/cortex/functions/custom_cil-embeddings.ts, .framework/functions/_shared/principal.ts, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/src/pages/admin/IntegrationsPage.tsx, \."]
240
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
241
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
242
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
243
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
244
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
245
+ async function callLLM(
246
+ messages: { role: string; content: string }[],
247
+ tools: any[],
248
+ model: string
249
+ ): Promise<{ content: string; tool_calls?: any[] }> {
250
+ const options: any = { temperature: 0.2, max_tokens: 1500 }
251
+ if (tools.length > 0) {
252
+ options.tools = tools.map(t => ({ type: 'function', function: t }))
253
+ options.tool_choice = 'auto'
254
+ }
255
+ const j = await callOpenAIChat(undefined, messages, model, options)
256
+ const choice = j.choices?.[0]
257
+
258
+ return {
259
+ content: choice?.message?.content || '',
260
+ tool_calls: choice?.message?.tool_calls || undefined,
261
+ }
262
+ }
263
+
264
+
265
+
266
+
267
+
268
+ // CIL[END chunk_id="custom_apps_cortex_functions_custom_cil_agent_callllm_1784235266"]
269
+ // CIL[BEGIN chunk_id="custom_apps_cortex_functions_custom_cil_agent_retrievechunkcontext_1784235266" type="function" identity="retrievechunkcontext" parent="none"]
270
+ // CIL[DOC-MACRO purpose="Implements retrievechunkcontext logic in cortex.functions.custom_cil-agent"]
271
+ // CIL[DOC-RESPONSIBILITY responsibility="Execute retrievechunkcontext and return its computed result"]
272
+ // CIL[DOC-CONTEXT module="cortex.functions.custom_cil-agent" layer="function" related_files="[]"]
273
+ // CIL[DOC-CONTRACT inputs="none" outputs="return value from function execution" errors="throws on invalid input or runtime failure" side_effects="none"]
274
+ // CIL[DOC-MICRO logic_summary="Provides retrievechunkcontext with retrieveChunkContext( inputs, handling internal flow and returning a result" notable_decisions="[]"]
275
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
276
+ // CIL[DOC-STABILITY stability="stable"]
277
+ // CIL[DOC-VECTOR type="context" content="Layer: function. Direct callers: 0. Direct calls: 0. Related files: none."]
278
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
279
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
280
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
281
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
282
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
283
+ async function retrieveChunkContext(
284
+ query: string,
285
+ projectId: string | null,
286
+ accountId: string
287
+ ): Promise<string> {
288
+ try {
289
+ const ej = await callOpenAIEmbeddings(undefined, [query], 'text-embedding-3-small')
290
+ const vec = ej.data?.[0]?.embedding
291
+ if (!vec) return ''
292
+
293
+ const { data: matches } = await adminDb.rpc('match_embeddings', {
294
+ query_embedding: `[${vec.join(',')}]`,
295
+ match_count: 8,
296
+ filter_vector_type: 'semantic',
297
+ similarity_threshold: 0.2,
298
+ filter_item_types: ['cil_chunk'],
299
+ })
300
+
301
+ if (!matches?.length) return ''
302
+
303
+ const chunkIds = [...new Set((matches as any[]).map((m: any) => m.document_id))]
304
+ let chunkQuery = adminDb
305
+ .from('items')
306
+ .select('id, data')
307
+ .in('id', chunkIds)
308
+
309
+ if (projectId) {
310
+ chunkQuery = chunkQuery.filter('data->>project_id', 'eq', projectId)
311
+ }
312
+
313
+ const { data: chunks } = await chunkQuery
314
+ const chunkMap = new Map((chunks || []).map((c: any) => [c.id, c]))
315
+
316
+ const contextParts: string[] = []
317
+ for (const m of (matches as any[])) {
318
+ const chunk = chunkMap.get(m.document_id)
319
+ if (!chunk) continue
320
+ const d = chunk.data || {}
321
+ const parts = [
322
+ `## ${d.chunk_name || 'unknown'} (${d.chunk_type || ''}) — ${d.file_path || ''}`,
323
+ ]
324
+ if (d.macro) parts.push(`Purpose: ${d.macro}`)
325
+ if (d.micro) parts.push(`Detail: ${d.micro}`)
326
+ if (d.input_spec) parts.push(`Inputs: ${d.input_spec}`)
327
+ if (d.output_spec) parts.push(`Returns: ${d.output_spec}`)
328
+ if (d.side_effects) parts.push(`Side effects: ${d.side_effects}`)
329
+ if (d.stability) parts.push(`Stability: ${d.stability}`)
330
+ parts.push(`Similarity: ${(m.similarity * 100).toFixed(0)}%`)
331
+ contextParts.push(parts.join('\n'))
332
+ }
333
+
334
+ return contextParts.join('\n\n')
335
+ } catch {
336
+ return ''
337
+ }
338
+ }
339
+
340
+
341
+
342
+
343
+
344
+ // CIL[END chunk_id="custom_apps_cortex_functions_custom_cil_agent_retrievechunkcontext_1784235266"]
345
+ // CIL[BEGIN chunk_id="custom_apps_cortex_functions_custom_cil_agent_system_prompt_1784235266" type="variable" identity="system_prompt" parent="none"]
346
+ // CIL[DOC-MACRO purpose="Defines system_prompt configuration or state in cortex.functions.custom_cil-agent"]
347
+ // CIL[DOC-RESPONSIBILITY responsibility="Hold the value and default configuration for system_prompt"]
348
+ // CIL[DOC-CONTEXT module="cortex.functions.custom_cil-agent" layer="function" related_files="[]"]
349
+ // CIL[DOC-CONTRACT inputs="none" outputs="value of system_prompt" errors="none" side_effects="none"]
350
+ // CIL[DOC-MICRO logic_summary="Declares system_prompt with initial value or constant binding used by cortex.functions.custom_cil-agent" notable_decisions="[]"]
351
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
352
+ // CIL[DOC-STABILITY stability="stable"]
353
+ // CIL[DOC-VECTOR type="context" content="Layer: function. Direct callers: 0. Direct calls: 0. Related files: none."]
354
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
355
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
356
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
357
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
358
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
359
+ const SYSTEM_PROMPT = `You are a Code Intelligence Layer assistant. You answer questions about this codebase using retrieved chunk contracts.
360
+
361
+ Each chunk record contains: chunk_name, file_path, macro (purpose), micro (implementation detail), input_spec, output_spec, side_effects, and stability.
362
+
363
+ Rules:
364
+ - Ground your answer in the retrieved chunk contracts — do not invent APIs.
365
+ - Cite chunk_name and file_path when referencing a specific function.
366
+ - If no relevant chunk is found, say so explicitly.
367
+ - For refactoring questions, always mention callers / blast radius if relevant.
368
+ - Use the available tools to look up specifics you are not sure about.
369
+ - Keep answers concise. Use markdown code blocks for examples.`
370
+
371
+
372
+
373
+
374
+
375
+ // CIL[END chunk_id="custom_apps_cortex_functions_custom_cil_agent_system_prompt_1784235266"]
376
+ // CIL[BEGIN chunk_id="custom_apps_cortex_functions_custom_cil_agent_runcilinference_1784235266" type="function" identity="runcilinference" parent="none"]
377
+ // CIL[DOC-MACRO purpose="Implements runcilinference logic in cortex.functions.custom_cil-agent"]
378
+ // CIL[DOC-RESPONSIBILITY responsibility="Execute runcilinference and return its computed result"]
379
+ // CIL[DOC-CONTEXT module="cortex.functions.custom_cil-agent" layer="function" related_files="[]"]
380
+ // CIL[DOC-CONTRACT inputs="none" outputs="return value from function execution" errors="throws on invalid input or runtime failure" side_effects="none"]
381
+ // CIL[DOC-MICRO logic_summary="Provides runcilinference with runCilInference( inputs, handling internal flow and returning a result" notable_decisions="[]"]
382
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
383
+ // CIL[DOC-STABILITY stability="stable"]
384
+ // CIL[DOC-VECTOR type="context" content="Layer: function. Direct callers: 0. Direct calls: 0. Related files: none."]
385
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
386
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
387
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
388
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
389
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
390
+ async function runCilInference(
391
+ question: string,
392
+ projectId: string | null,
393
+ history: { role: string; content: string }[],
394
+ accountId: string,
395
+ model = 'gpt-4o-mini'
396
+ ): Promise<{ answer: string; sources: string[]; tool_calls_made: string[] }> {
397
+
398
+ const ragContext = await retrieveChunkContext(question, projectId, accountId)
399
+
400
+ const messages: { role: string; content: string | any[] }[] = [
401
+ { role: 'system', content: SYSTEM_PROMPT },
402
+ ]
403
+
404
+ if (ragContext) {
405
+ messages.push({
406
+ role: 'system',
407
+ content: `## Retrieved Chunk Contracts (from CIL index)\n\n${ragContext}`,
408
+ })
409
+ }
410
+
411
+
412
+ for (const msg of history) {
413
+ messages.push(msg)
414
+ }
415
+
416
+ messages.push({ role: 'user', content: question })
417
+
418
+ const toolCallsMade: string[] = []
419
+ const MAX_TOOL_ITERS = 4
420
+
421
+ for (let iter = 0; iter < MAX_TOOL_ITERS; iter++) {
422
+ const response = await callLLM(messages as any, CIL_TOOLS, model)
423
+
424
+ if (!response.tool_calls?.length) {
425
+
426
+ const sources: string[] = []
427
+ if (ragContext) {
428
+ const nameMatches = ragContext.match(/## (\w[\w.]+)/g) || []
429
+ sources.push(...nameMatches.map(m => m.replace('## ', '')).slice(0, 5))
430
+ }
431
+ return { answer: response.content, sources, tool_calls_made: toolCallsMade }
432
+ }
433
+
434
+
435
+ messages.push({ role: 'assistant', content: response.content || '', ...{ tool_calls: response.tool_calls } } as any)
436
+
437
+ for (const tc of response.tool_calls) {
438
+ const toolName = tc.function?.name || tc.name || ''
439
+ const toolArgs = (() => { try { return JSON.parse(tc.function?.arguments || '{}') } catch { return {} } })()
440
+ toolCallsMade.push(toolName)
441
+
442
+ let result: any
443
+ try {
444
+ result = await dispatchTool(toolName, toolArgs, accountId)
445
+ } catch (err) {
446
+ result = { error: err instanceof Error ? err.message : String(err) }
447
+ }
448
+
449
+ messages.push({
450
+ role: 'tool',
451
+ content: JSON.stringify(result),
452
+ ...({ tool_call_id: tc.id }),
453
+ } as any)
454
+ }
455
+ }
456
+
457
+ return { answer: 'I exhausted my tool call budget. Please try a more specific question.', sources: [], tool_calls_made: toolCallsMade }
458
+ }
459
+
460
+
461
+
462
+
463
+
464
+ // CIL[END chunk_id="custom_apps_cortex_functions_custom_cil_agent_runcilinference_1784235266"]
465
+ // CIL[BEGIN chunk_id="custom_apps_cortex_functions_custom_cil_agent_getplatformaccountid_1784235266" type="function" identity="getplatformaccountid" parent="none"]
466
+ // CIL[DOC-MACRO purpose="Implements getplatformaccountid logic in cortex.functions.custom_cil-agent"]
467
+ // CIL[DOC-RESPONSIBILITY responsibility="Execute getplatformaccountid and return its computed result"]
468
+ // CIL[DOC-CONTEXT module="cortex.functions.custom_cil-agent" layer="function" related_files="[]"]
469
+ // CIL[DOC-CONTRACT inputs="none" outputs="return value from function execution" errors="throws on invalid input or runtime failure" side_effects="none"]
470
+ // CIL[DOC-MICRO logic_summary="Provides getplatformaccountid with getPlatformAccountId( inputs, handling internal flow and returning a result" notable_decisions="[]"]
471
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
472
+ // CIL[DOC-STABILITY stability="stable"]
473
+ // CIL[DOC-VECTOR type="context" content="Layer: function. Direct callers: 0. Direct calls: 0. Related files: none."]
474
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
475
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
476
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
477
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
478
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
479
+ async function getPlatformAccountId(): Promise<string> {
480
+ const { data } = await adminDb.from('accounts').select('id').eq('slug', 'spine-system').maybeSingle()
481
+ return data?.id || ''
482
+ }
483
+
484
+
485
+
486
+
487
+
488
+ // CIL[END chunk_id="custom_apps_cortex_functions_custom_cil_agent_getplatformaccountid_1784235266"]
489
+ // CIL[BEGIN chunk_id="custom_apps_cortex_functions_custom_cil_agent_handler_1784235266" type="variable" identity="handler" parent="none"]
490
+ // CIL[DOC-MACRO purpose="Defines handler configuration or state in cortex.functions.custom_cil-agent"]
491
+ // CIL[DOC-RESPONSIBILITY responsibility="Hold the value and default configuration for handler"]
492
+ // CIL[DOC-CONTEXT module="cortex.functions.custom_cil-agent" layer="function" related_files="[]"]
493
+ // CIL[DOC-CONTRACT inputs="none" outputs="value of handler" errors="none" side_effects="none"]
494
+ // CIL[DOC-MICRO logic_summary="Declares handler with initial value or constant binding used by cortex.functions.custom_cil-agent" notable_decisions="[]"]
495
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
496
+ // CIL[DOC-STABILITY stability="stable"]
497
+ // CIL[DOC-VECTOR type="context" content="Layer: function. Direct callers: 0. Direct calls: 0. Related files: none."]
498
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
499
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
500
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
501
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
502
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
503
+ export const handler = createHandler(async (ctx, body) => {
504
+ const action = ctx.query?.action || 'ask'
505
+ const accountId = ctx.accountId || await getPlatformAccountId()
506
+
507
+
508
+ if (action === 'tools') {
509
+ return { tools: CIL_TOOLS }
510
+ }
511
+
512
+
513
+ if (action === 'tool') {
514
+ const toolName = body?.tool
515
+ const toolArgs = body?.args || {}
516
+ if (!toolName) throw new Error('tool name is required')
517
+ const result = await dispatchTool(toolName, toolArgs, accountId)
518
+ return { tool: toolName, result }
519
+ }
520
+
521
+
522
+ if (action === 'ask') {
523
+ const question = body?.question || body?.q
524
+ const projectId = body?.project_id || ctx.query?.project_id || null
525
+ const model = body?.model || 'gpt-4o-mini'
526
+ if (!question) throw new Error('question is required')
527
+
528
+ const { answer, sources, tool_calls_made } = await runCilInference(
529
+ question, projectId, [], accountId, model
530
+ )
531
+
532
+ return { question, answer, sources, tool_calls_made }
533
+ }
534
+
535
+
536
+ if (action === 'chat') {
537
+ const message = body?.message
538
+ const threadId = body?.thread_id
539
+ const projectId = body?.project_id || null
540
+ const model = body?.model || 'gpt-4o-mini'
541
+ if (!message) throw new Error('message is required')
542
+
543
+
544
+ let history: { role: string; content: string }[] = []
545
+ if (threadId) {
546
+ const { data: messages } = await adminDb
547
+ .from('messages')
548
+ .select('data, content')
549
+ .eq('thread_id', threadId)
550
+ .order('created_at', { ascending: false })
551
+ .limit(10)
552
+
553
+ history = ((messages || []).reverse()).map((m: any) => ({
554
+ role: m.data?.message_type === 'human' ? 'user' : 'assistant',
555
+ content: m.content || '',
556
+ }))
557
+ }
558
+
559
+ const { answer, sources, tool_calls_made } = await runCilInference(
560
+ message, projectId, history, accountId, model
561
+ )
562
+
563
+
564
+ if (threadId) {
565
+ const messageTypeId = await resolveTypeId('message', 'message').catch(() => null)
566
+ if (messageTypeId) {
567
+ await adminCreate(ctx, {
568
+ entity: 'messages',
569
+ type_id: messageTypeId,
570
+ thread_id: threadId,
571
+ content: message,
572
+ data: { message_type: 'human' },
573
+ })
574
+ await adminCreate(ctx, {
575
+ entity: 'messages',
576
+ type_id: messageTypeId,
577
+ thread_id: threadId,
578
+ content: answer,
579
+ data: { message_type: 'agent', sources, tool_calls_made },
580
+ })
581
+ }
582
+ }
583
+
584
+ return { message, answer, sources, tool_calls_made, thread_id: threadId }
585
+ }
586
+
587
+ throw new Error(`Unknown action: ${action}. Valid: ask, chat, tool, tools`)
588
+ })
589
+
590
+
591
+
592
+ // CIL[END chunk_id="custom_apps_cortex_functions_custom_cil_agent_handler_1784235266"]