spine-framework 0.3.125 → 0.3.127

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 -161
  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,445 @@
1
+ // CIL[BEGIN chunk_id="custom_apps_cortex_functions_custom_cil_context_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-context"]
3
+ // CIL[DOC-RESPONSIBILITY responsibility="Own module-level imports, exports, and configuration for cortex.functions.custom_cil-context"]
4
+ // CIL[DOC-CONTEXT module="cortex.functions.custom_cil-context" layer="function" related_files="[\".framework/migrations/015_simplify_apps_table.sql\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/components/ui/table-primitives.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"\\\"]"]
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-context" 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: .framework/migrations/015_simplify_apps_table.sql, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, custom/apps/portal/pages/ContentPage.tsx, .framework/src/components/ui/table-primitives.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, \."]
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 { resolveLinkTypeId } from './_shared/resolve-ids'
23
+
24
+
25
+
26
+
27
+
28
+
29
+
30
+ // CIL[END chunk_id="custom_apps_cortex_functions_custom_cil_context_module_header_1784235266"]
31
+ // CIL[BEGIN chunk_id="custom_apps_cortex_functions_custom_cil_context_getchunkbyid_1784235266" type="function" identity="getchunkbyid" parent="none"]
32
+ // CIL[DOC-MACRO purpose="Implements getchunkbyid logic in cortex.functions.custom_cil-context"]
33
+ // CIL[DOC-RESPONSIBILITY responsibility="Execute getchunkbyid and return its computed result"]
34
+ // CIL[DOC-CONTEXT module="cortex.functions.custom_cil-context" 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\",\".framework/migrations/015_simplify_apps_table.sql\",\"\\\"]"]
35
+ // CIL[DOC-CONTRACT inputs="none" outputs="return value from function execution" errors="throws on invalid input or runtime failure" side_effects="none"]
36
+ // CIL[DOC-MICRO logic_summary="Provides getchunkbyid with getChunkById(id: string inputs, handling internal flow and returning a result" notable_decisions="[]"]
37
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
38
+ // CIL[DOC-STABILITY stability="stable"]
39
+ // 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, .framework/migrations/015_simplify_apps_table.sql, \."]
40
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
41
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
42
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
43
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
44
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
45
+ async function getChunkById(id: string): Promise<any | null> {
46
+ const { data } = await adminDb.from('items').select('id, title, data')
47
+ .eq('id', id).maybeSingle()
48
+ return data
49
+ }
50
+
51
+
52
+
53
+
54
+
55
+ // CIL[END chunk_id="custom_apps_cortex_functions_custom_cil_context_getchunkbyid_1784235266"]
56
+ // CIL[BEGIN chunk_id="custom_apps_cortex_functions_custom_cil_context_findchunkbyname_1784235266" type="function" identity="findchunkbyname" parent="none"]
57
+ // CIL[DOC-MACRO purpose="Implements findchunkbyname logic in cortex.functions.custom_cil-context"]
58
+ // CIL[DOC-RESPONSIBILITY responsibility="Execute findchunkbyname and return its computed result"]
59
+ // CIL[DOC-CONTEXT module="cortex.functions.custom_cil-context" 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\",\".framework/migrations/015_simplify_apps_table.sql\",\"\\\"]"]
60
+ // CIL[DOC-CONTRACT inputs="none" outputs="return value from function execution" errors="throws on invalid input or runtime failure" side_effects="none"]
61
+ // CIL[DOC-MICRO logic_summary="Provides findchunkbyname with findChunkByName(name: string, projectId?: string inputs, handling internal flow and returning a result" notable_decisions="[]"]
62
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
63
+ // CIL[DOC-STABILITY stability="stable"]
64
+ // 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, .framework/migrations/015_simplify_apps_table.sql, \."]
65
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
66
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
67
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
68
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
69
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
70
+ async function findChunkByName(name: string, projectId?: string): Promise<any | null> {
71
+ let q = adminDb.from('items').select('id, title, data')
72
+ .filter('data->>kb_type', 'eq', 'cil_chunk')
73
+ .filter('data->>chunk_name', 'eq', name)
74
+ .eq('is_active', true)
75
+ if (projectId) q = q.filter('data->>project_id', 'eq', projectId)
76
+ const { data } = await q.limit(1).maybeSingle()
77
+ return data
78
+ }
79
+
80
+
81
+
82
+
83
+
84
+
85
+ // CIL[END chunk_id="custom_apps_cortex_functions_custom_cil_context_findchunkbyname_1784235266"]
86
+ // CIL[BEGIN chunk_id="custom_apps_cortex_functions_custom_cil_context_blastradiusbfs_1784235266" type="function" identity="blastradiusbfs" parent="none"]
87
+ // CIL[DOC-MACRO purpose="Implements blastradiusbfs logic in cortex.functions.custom_cil-context"]
88
+ // CIL[DOC-RESPONSIBILITY responsibility="Execute blastradiusbfs and return its computed result"]
89
+ // CIL[DOC-CONTEXT module="cortex.functions.custom_cil-context" 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\",\".framework/migrations/015_simplify_apps_table.sql\",\"\\\"]"]
90
+ // CIL[DOC-CONTRACT inputs="none" outputs="return value from function execution" errors="throws on invalid input or runtime failure" side_effects="none"]
91
+ // CIL[DOC-MICRO logic_summary="Provides blastradiusbfs with blastRadiusBFS( inputs, handling internal flow and returning a result" notable_decisions="[]"]
92
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
93
+ // CIL[DOC-STABILITY stability="stable"]
94
+ // 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, .framework/migrations/015_simplify_apps_table.sql, \."]
95
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
96
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
97
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
98
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
99
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
100
+ async function blastRadiusBFS(
101
+ chunkId: string,
102
+ maxDepth: number,
103
+ callsLinkTypeId: string
104
+ ): Promise<{ chunk_id: string; chunk_name: string; file_path: string; depth: number }[]> {
105
+ const visited = new Set<string>([chunkId])
106
+ const queue: { id: string; depth: number }[] = [{ id: chunkId, depth: 0 }]
107
+ const result: { chunk_id: string; chunk_name: string; file_path: string; depth: number }[] = []
108
+
109
+ while (queue.length > 0) {
110
+ const { id, depth } = queue.shift()!
111
+ if (depth >= maxDepth) continue
112
+
113
+
114
+ const { data: callerLinks } = await adminDb.from('links').select('source_id')
115
+ .eq('link_type_id', callsLinkTypeId)
116
+ .eq('target_id', id)
117
+
118
+ for (const link of callerLinks || []) {
119
+ const callerId = link.source_id
120
+ if (visited.has(callerId)) continue
121
+ visited.add(callerId)
122
+
123
+ const callerChunk = await getChunkById(callerId)
124
+ if (!callerChunk) continue
125
+
126
+ result.push({
127
+ chunk_id: callerId,
128
+ chunk_name: callerChunk.data?.chunk_name || '',
129
+ file_path: callerChunk.data?.file_path || '',
130
+ depth: depth + 1,
131
+ })
132
+ queue.push({ id: callerId, depth: depth + 1 })
133
+ }
134
+ }
135
+
136
+ return result
137
+ }
138
+
139
+
140
+
141
+
142
+
143
+
144
+ // CIL[END chunk_id="custom_apps_cortex_functions_custom_cil_context_blastradiusbfs_1784235266"]
145
+ // CIL[BEGIN chunk_id="custom_apps_cortex_functions_custom_cil_context_getconfigdeps_1784235266" type="function" identity="getconfigdeps" parent="none"]
146
+ // CIL[DOC-MACRO purpose="Implements getconfigdeps logic in cortex.functions.custom_cil-context"]
147
+ // CIL[DOC-RESPONSIBILITY responsibility="Execute getconfigdeps and return its computed result"]
148
+ // CIL[DOC-CONTEXT module="cortex.functions.custom_cil-context" 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\",\".framework/migrations/015_simplify_apps_table.sql\",\"\\\"]"]
149
+ // CIL[DOC-CONTRACT inputs="none" outputs="return value from function execution" errors="throws on invalid input or runtime failure" side_effects="none"]
150
+ // CIL[DOC-MICRO logic_summary="Provides getconfigdeps with getConfigDeps( inputs, handling internal flow and returning a result" notable_decisions="[]"]
151
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
152
+ // CIL[DOC-STABILITY stability="stable"]
153
+ // 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, .framework/migrations/015_simplify_apps_table.sql, \."]
154
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
155
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
156
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
157
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
158
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
159
+ async function getConfigDeps(
160
+ chunkId: string,
161
+ configuresLinkTypeId: string | null
162
+ ): Promise<{ field_name: string; source_file: string; config_id: string }[]> {
163
+ if (!configuresLinkTypeId) return []
164
+
165
+ const { data: configLinks } = await adminDb.from('links').select('source_id, metadata')
166
+ .eq('link_type_id', configuresLinkTypeId)
167
+ .eq('target_id', chunkId)
168
+
169
+ if (!configLinks?.length) return []
170
+
171
+ const results: { field_name: string; source_file: string; config_id: string }[] = []
172
+ for (const link of configLinks) {
173
+ const configItem = await getChunkById(link.source_id)
174
+ if (!configItem) continue
175
+ results.push({
176
+ field_name: configItem.data?.field_name || link.metadata?.field_name || '',
177
+ source_file: configItem.data?.config_table || '',
178
+ config_id: link.source_id,
179
+ })
180
+ }
181
+ return results
182
+ }
183
+
184
+
185
+
186
+
187
+
188
+
189
+ // CIL[END chunk_id="custom_apps_cortex_functions_custom_cil_context_getconfigdeps_1784235266"]
190
+ // CIL[BEGIN chunk_id="custom_apps_cortex_functions_custom_cil_context_safetyverdict_1784235266" type="function" identity="safetyverdict" parent="none"]
191
+ // CIL[DOC-MACRO purpose="Implements safetyverdict logic in cortex.functions.custom_cil-context"]
192
+ // CIL[DOC-RESPONSIBILITY responsibility="Execute safetyverdict and return its computed result"]
193
+ // CIL[DOC-CONTEXT module="cortex.functions.custom_cil-context" layer="function" related_files="[]"]
194
+ // CIL[DOC-CONTRACT inputs="none" outputs="return value from function execution" errors="throws on invalid input or runtime failure" side_effects="none"]
195
+ // CIL[DOC-MICRO logic_summary="Provides safetyverdict with safetyVerdict( inputs, handling internal flow and returning a result" notable_decisions="[]"]
196
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
197
+ // CIL[DOC-STABILITY stability="stable"]
198
+ // CIL[DOC-VECTOR type="context" content="Layer: function. Direct callers: 0. Direct calls: 0. Related files: none."]
199
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
200
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
201
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
202
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
203
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
204
+ function safetyVerdict(
205
+ chunk: any,
206
+ blastRadius: any[],
207
+ driftStatus: 'current' | 'stale' | 'unknown',
208
+ configDeps: any[]
209
+ ): { level: 'safe' | 'caution' | 'risky'; summary: string; flags: string[] } {
210
+ const d = chunk.data || {}
211
+ const flags: string[] = []
212
+
213
+ if (d.stability === 'stable') flags.push('stability=stable: downstream consumers may break on signature changes')
214
+ if (blastRadius.length >= 10) flags.push(`high blast radius: ${blastRadius.length} transitive callers`)
215
+ else if (blastRadius.length >= 3) flags.push(`moderate blast radius: ${blastRadius.length} callers`)
216
+ if (driftStatus === 'stale') flags.push('hash is stale — stored_hash does not match current disk content')
217
+ if (configDeps.length > 0) flags.push(`reads ${configDeps.length} config field(s): ${configDeps.map(c => c.field_name).join(', ')}`)
218
+ if (d.doc_confidence === 'unverified_legacy' || (!d.macro && !d.micro)) flags.push('no contract documentation — behaviour is undocumented')
219
+ if (d.is_dead_code) flags.push('flagged as dead code')
220
+
221
+ const level: 'safe' | 'caution' | 'risky' =
222
+ flags.length === 0 ? 'safe' :
223
+ (d.stability === 'stable' || blastRadius.length >= 10 || driftStatus === 'stale') ? 'risky' :
224
+ 'caution'
225
+
226
+ const summary = level === 'safe'
227
+ ? 'Low risk. Internal chunk, no significant callers, contract is documented.'
228
+ : level === 'caution'
229
+ ? `Moderate risk. ${flags.length} concern(s) — review flags before editing.`
230
+ : `High risk. ${flags.filter(f => f.includes('stable') || f.includes('blast') || f.includes('stale')).join('; ')}`
231
+
232
+ return { level, summary, flags }
233
+ }
234
+
235
+
236
+
237
+
238
+
239
+ // CIL[END chunk_id="custom_apps_cortex_functions_custom_cil_context_safetyverdict_1784235266"]
240
+ // CIL[BEGIN chunk_id="custom_apps_cortex_functions_custom_cil_context_buildbrief_1784235266" type="function" identity="buildbrief" parent="none"]
241
+ // CIL[DOC-MACRO purpose="Implements buildbrief logic in cortex.functions.custom_cil-context"]
242
+ // CIL[DOC-RESPONSIBILITY responsibility="Execute buildbrief and return its computed result"]
243
+ // CIL[DOC-CONTEXT module="cortex.functions.custom_cil-context" layer="function" related_files="[]"]
244
+ // CIL[DOC-CONTRACT inputs="none" outputs="return value from function execution" errors="throws on invalid input or runtime failure" side_effects="none"]
245
+ // CIL[DOC-MICRO logic_summary="Provides buildbrief with buildBrief(chunk: any, maxBlastDepth = 4 inputs, handling internal flow and returning a result" notable_decisions="[]"]
246
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
247
+ // CIL[DOC-STABILITY stability="stable"]
248
+ // CIL[DOC-VECTOR type="context" content="Layer: function. Direct callers: 0. Direct calls: 0. Related files: none."]
249
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
250
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
251
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
252
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
253
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
254
+ async function buildBrief(chunk: any, maxBlastDepth = 4): Promise<Record<string, any>> {
255
+ const d = chunk.data || {}
256
+
257
+
258
+ const [callsLinkTypeId, testedByLinkTypeId, configuresLinkTypeId] = await Promise.all([
259
+ resolveLinkTypeId('cil_calls').catch(() => null),
260
+ resolveLinkTypeId('cil_tested_by').catch(() => null),
261
+ resolveLinkTypeId('cil_configures').catch(() => null),
262
+ ])
263
+
264
+
265
+ const blastRadius = callsLinkTypeId
266
+ ? await blastRadiusBFS(chunk.id, maxBlastDepth, callsLinkTypeId)
267
+ : []
268
+
269
+
270
+ let callees: { chunk_id: string; chunk_name: string; file_path: string }[] = []
271
+ if (callsLinkTypeId) {
272
+ const { data: calleeLinks } = await adminDb.from('links').select('target_id')
273
+ .eq('link_type_id', callsLinkTypeId).eq('source_id', chunk.id)
274
+ for (const l of calleeLinks || []) {
275
+ const callee = await getChunkById(l.target_id)
276
+ if (callee) callees.push({ chunk_id: callee.id, chunk_name: callee.data?.chunk_name || '', file_path: callee.data?.file_path || '' })
277
+ }
278
+ }
279
+
280
+
281
+ let testPaths: { path: string; is_e2e: boolean }[] = []
282
+ if (testedByLinkTypeId) {
283
+ const { data: testLinks } = await adminDb.from('links').select('target_id, metadata')
284
+ .eq('link_type_id', testedByLinkTypeId).eq('source_id', chunk.id)
285
+ for (const l of testLinks || []) {
286
+ testPaths.push({ path: l.metadata?.test_path || '', is_e2e: l.metadata?.is_e2e || false })
287
+ }
288
+ }
289
+
290
+ if (testPaths.length === 0) {
291
+ if (d.test_unit_path) testPaths.push({ path: d.test_unit_path, is_e2e: false })
292
+ if (d.test_e2e_path) testPaths.push({ path: d.test_e2e_path, is_e2e: true })
293
+ }
294
+
295
+
296
+ const configDeps = await getConfigDeps(chunk.id, configuresLinkTypeId)
297
+
298
+
299
+ const driftStatus: 'current' | 'stale' | 'unknown' = d.stored_hash
300
+ ? 'unknown'
301
+ : 'unknown'
302
+
303
+
304
+ const verdict = safetyVerdict(chunk, blastRadius, driftStatus, configDeps)
305
+
306
+ return {
307
+ chunk_id: chunk.id,
308
+ chunk_name: d.chunk_name || '',
309
+ file_path: d.file_path || '',
310
+ line_start: d.line_start || null,
311
+ line_end: d.line_end || null,
312
+ chunk_type: d.chunk_type || '',
313
+
314
+
315
+ contract: {
316
+ macro: d.macro || '',
317
+ micro: d.micro || '',
318
+ input_spec: d.input_spec || '',
319
+ output_spec: d.output_spec || '',
320
+ side_effects: d.side_effects || '',
321
+ stability: d.stability || 'unknown',
322
+ doc_confidence: d.doc_confidence || 'unverified_legacy',
323
+ },
324
+
325
+
326
+ hash: {
327
+ stored_hash: d.stored_hash || null,
328
+ hash_updated_at: d.hash_updated_at || null,
329
+ drift_status: driftStatus,
330
+ },
331
+
332
+
333
+ blast_radius: {
334
+ direct_caller_count: blastRadius.filter(r => r.depth === 1).length,
335
+ total_affected: blastRadius.length,
336
+ max_depth_searched: maxBlastDepth,
337
+ callers: blastRadius,
338
+ },
339
+ calls: callees,
340
+
341
+
342
+ test_paths: testPaths,
343
+
344
+
345
+ config_dependencies: configDeps,
346
+
347
+
348
+ edit_safety: verdict,
349
+ }
350
+ }
351
+
352
+
353
+
354
+
355
+
356
+ // CIL[END chunk_id="custom_apps_cortex_functions_custom_cil_context_buildbrief_1784235266"]
357
+ // CIL[BEGIN chunk_id="custom_apps_cortex_functions_custom_cil_context_handler_1784235266" type="variable" identity="handler" parent="none"]
358
+ // CIL[DOC-MACRO purpose="Defines handler configuration or state in cortex.functions.custom_cil-context"]
359
+ // CIL[DOC-RESPONSIBILITY responsibility="Hold the value and default configuration for handler"]
360
+ // CIL[DOC-CONTEXT module="cortex.functions.custom_cil-context" layer="function" related_files="[]"]
361
+ // CIL[DOC-CONTRACT inputs="none" outputs="value of handler" errors="none" side_effects="none"]
362
+ // CIL[DOC-MICRO logic_summary="Declares handler with initial value or constant binding used by cortex.functions.custom_cil-context" notable_decisions="[]"]
363
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
364
+ // CIL[DOC-STABILITY stability="stable"]
365
+ // CIL[DOC-VECTOR type="context" content="Layer: function. Direct callers: 0. Direct calls: 0. Related files: none."]
366
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
367
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
368
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
369
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
370
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
371
+ export const handler = createHandler(async (ctx, body) => {
372
+ const action = ctx.query?.action || 'get_context'
373
+
374
+
375
+ if (action === 'get_context') {
376
+ const chunkId = ctx.query?.chunk_id || body?.chunk_id
377
+ if (!chunkId) throw new Error('chunk_id is required')
378
+
379
+ const chunk = await getChunkById(chunkId)
380
+ if (!chunk) throw new Error(`Chunk not found: ${chunkId}`)
381
+
382
+ const maxDepth = parseInt(ctx.query?.max_depth || body?.max_depth || '4', 10)
383
+ const brief = await buildBrief(chunk, maxDepth)
384
+
385
+ return { ok: true, brief }
386
+ }
387
+
388
+
389
+ if (action === 'find_context') {
390
+ const chunkName = ctx.query?.chunk_name || body?.chunk_name
391
+ const projectId = ctx.query?.project_id || body?.project_id
392
+ if (!chunkName) throw new Error('chunk_name is required')
393
+
394
+ const chunk = await findChunkByName(chunkName, projectId)
395
+ if (!chunk) {
396
+ return {
397
+ ok: false,
398
+ error: `No chunk named "${chunkName}" found${projectId ? ` in project ${projectId}` : ''}`,
399
+ hint: 'Use custom_cil-graph?action=search to find chunks by description',
400
+ }
401
+ }
402
+
403
+ const maxDepth = parseInt(ctx.query?.max_depth || body?.max_depth || '4', 10)
404
+ const brief = await buildBrief(chunk, maxDepth)
405
+
406
+ return { ok: true, brief }
407
+ }
408
+
409
+
410
+
411
+
412
+ if (action === 'post_edit') {
413
+ const chunkId = ctx.query?.chunk_id || body?.chunk_id
414
+ if (!chunkId) throw new Error('chunk_id is required')
415
+
416
+ const chunk = await getChunkById(chunkId)
417
+ if (!chunk) throw new Error(`Chunk not found: ${chunkId}`)
418
+
419
+ const d = chunk.data || {}
420
+ const hasHash = !!d.stored_hash
421
+
422
+ return {
423
+ ok: true,
424
+ chunk_id: chunkId,
425
+ chunk_name: d.chunk_name || '',
426
+ file_path: d.file_path || '',
427
+ stored_hash: d.stored_hash || null,
428
+ hash_updated_at: d.hash_updated_at || null,
429
+ has_stored_hash: hasHash,
430
+ action_required: hasHash
431
+ ? 'Run custom_cil-ingest?action=reindex_chunk to refresh the stored hash and code_content after your edit, then run custom_cil-validate?action=validate_file to confirm drift is resolved.'
432
+ : 'No stored hash — run Pass 2 (custom_cil-ingest?action=pass2) to generate chunk boundaries and hashes for this file.',
433
+ next_steps: [
434
+ `POST /api/custom_cil-ingest?action=reindex_chunk { "project_id": "${d.project_id || '<project_id>'}", "chunk_id": "${chunkId}", "also_embed": true }`,
435
+ `GET /api/custom_cil-validate?action=validate_file&file_id=${d.file_id || '<file_id>'}`,
436
+ ],
437
+ }
438
+ }
439
+
440
+ throw new Error(`Unknown action: ${action}. Valid: get_context, find_context, post_edit`)
441
+ })
442
+
443
+
444
+
445
+ // CIL[END chunk_id="custom_apps_cortex_functions_custom_cil_context_handler_1784235266"]