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,499 @@
1
+ // CIL[BEGIN chunk_id="custom_apps_cortex_functions_custom_cil_project_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-project"]
3
+ // CIL[DOC-RESPONSIBILITY responsibility="Own module-level imports, exports, and configuration for cortex.functions.custom_cil-project"]
4
+ // CIL[DOC-CONTEXT module="cortex.functions.custom_cil-project" 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-project" 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
+ import { createHandler } from './_shared/middleware'
19
+ import { adminDb } from './_shared/db'
20
+ import { resolveTypeId } from './_shared/resolve-ids'
21
+ import { create as adminCreate, update as adminUpdate, remove as adminRemove } from './admin-data'
22
+
23
+
24
+
25
+
26
+
27
+
28
+
29
+ // CIL[END chunk_id="custom_apps_cortex_functions_custom_cil_project_module_header_1784235266"]
30
+ // CIL[BEGIN chunk_id="custom_apps_cortex_functions_custom_cil_project_default_globs_1784235266" type="variable" identity="default_globs" parent="none"]
31
+ // CIL[DOC-MACRO purpose="Defines default_globs configuration or state in cortex.functions.custom_cil-project"]
32
+ // CIL[DOC-RESPONSIBILITY responsibility="Hold the value and default configuration for default_globs"]
33
+ // CIL[DOC-CONTEXT module="cortex.functions.custom_cil-project" layer="function" related_files="[\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/functions/_shared/principal.ts\",\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\"\\\"]"]
34
+ // CIL[DOC-CONTRACT inputs="none" outputs="value of default_globs" errors="none" side_effects="none"]
35
+ // CIL[DOC-MICRO logic_summary="Declares default_globs with initial value or constant binding used by cortex.functions.custom_cil-project" notable_decisions="[]"]
36
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
37
+ // CIL[DOC-STABILITY stability="stable"]
38
+ // CIL[DOC-VECTOR type="context" content="Layer: function. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/TypeDetailPage.tsx, .framework/functions/_shared/principal.ts, custom/apps/cortex/functions/custom_cil-embeddings.ts, .framework/src/pages/admin/IntegrationsPage.tsx, custom/apps/portal/pages/ContentPage.tsx, \."]
39
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
40
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
41
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
42
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
43
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
44
+ const DEFAULT_GLOBS = ['**/*.ts', '**/*.tsx', '**/*.sql']
45
+
46
+
47
+
48
+
49
+ // CIL[END chunk_id="custom_apps_cortex_functions_custom_cil_project_default_globs_1784235266"]
50
+ // CIL[BEGIN chunk_id="custom_apps_cortex_functions_custom_cil_project_default_exclude_globs_1784235266" type="variable" identity="default_exclude_globs" parent="none"]
51
+ // CIL[DOC-MACRO purpose="Defines default_exclude_globs configuration or state in cortex.functions.custom_cil-project"]
52
+ // CIL[DOC-RESPONSIBILITY responsibility="Hold the value and default configuration for default_exclude_globs"]
53
+ // CIL[DOC-CONTEXT module="cortex.functions.custom_cil-project" layer="function" related_files="[\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/functions/_shared/principal.ts\",\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\"\\\"]"]
54
+ // CIL[DOC-CONTRACT inputs="none" outputs="value of default_exclude_globs" errors="none" side_effects="none"]
55
+ // CIL[DOC-MICRO logic_summary="Declares default_exclude_globs with initial value or constant binding used by cortex.functions.custom_cil-project" notable_decisions="[]"]
56
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
57
+ // CIL[DOC-STABILITY stability="stable"]
58
+ // CIL[DOC-VECTOR type="context" content="Layer: function. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/TypeDetailPage.tsx, .framework/functions/_shared/principal.ts, custom/apps/cortex/functions/custom_cil-embeddings.ts, .framework/src/pages/admin/IntegrationsPage.tsx, custom/apps/portal/pages/ContentPage.tsx, \."]
59
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
60
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
61
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
62
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
63
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
64
+ const DEFAULT_EXCLUDE_GLOBS = ['node_modules/**', '.git/**', 'dist/**', 'build/**', '.netlify/**', '**/*.min.js', '**/*.d.ts']
65
+
66
+
67
+
68
+
69
+
70
+ // CIL[END chunk_id="custom_apps_cortex_functions_custom_cil_project_default_exclude_globs_1784235266"]
71
+ // CIL[BEGIN chunk_id="custom_apps_cortex_functions_custom_cil_project_sourceset_1784235266" type="interface" identity="sourceset" parent="none"]
72
+ // CIL[DOC-MACRO purpose="Defines the sourceset type contract in cortex.functions.custom_cil-project"]
73
+ // CIL[DOC-RESPONSIBILITY responsibility="Describe the shape and allowed fields for sourceset"]
74
+ // CIL[DOC-CONTEXT module="cortex.functions.custom_cil-project" layer="function" related_files="[\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\".framework/migrations/015_simplify_apps_table.sql\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"\\\"]"]
75
+ // CIL[DOC-CONTRACT inputs="none" outputs="type definition for sourceset" errors="none" side_effects="none"]
76
+ // CIL[DOC-MICRO logic_summary="Declares TypeScript type/interface sourceset with member definitions" notable_decisions="[]"]
77
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
78
+ // CIL[DOC-STABILITY stability="stable"]
79
+ // CIL[DOC-VECTOR type="context" content="Layer: function. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/TypeDetailPage.tsx, .framework/functions/_shared/principal.ts, .framework/src/pages/admin/IntegrationsPage.tsx, .framework/migrations/015_simplify_apps_table.sql, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, \."]
80
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
81
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
82
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
83
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
84
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
85
+ interface SourceSet {
86
+ id: string
87
+ name: string
88
+ base_path: string
89
+ globs?: string[]
90
+ exclude_globs?: string[]
91
+ layer?: string
92
+ }
93
+
94
+
95
+
96
+
97
+
98
+ // CIL[END chunk_id="custom_apps_cortex_functions_custom_cil_project_sourceset_1784235266"]
99
+ // CIL[BEGIN chunk_id="custom_apps_cortex_functions_custom_cil_project_createprojectrequest_1784235266" type="interface" identity="createprojectrequest" parent="none"]
100
+ // CIL[DOC-MACRO purpose="Defines the createprojectrequest type contract in cortex.functions.custom_cil-project"]
101
+ // CIL[DOC-RESPONSIBILITY responsibility="Describe the shape and allowed fields for createprojectrequest"]
102
+ // CIL[DOC-CONTEXT module="cortex.functions.custom_cil-project" layer="function" related_files="[\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\".framework/migrations/015_simplify_apps_table.sql\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"\\\"]"]
103
+ // CIL[DOC-CONTRACT inputs="none" outputs="type definition for createprojectrequest" errors="none" side_effects="none"]
104
+ // CIL[DOC-MICRO logic_summary="Declares TypeScript type/interface createprojectrequest with member definitions" notable_decisions="[]"]
105
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
106
+ // CIL[DOC-STABILITY stability="stable"]
107
+ // CIL[DOC-VECTOR type="context" content="Layer: function. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/TypeDetailPage.tsx, .framework/functions/_shared/principal.ts, .framework/src/pages/admin/IntegrationsPage.tsx, .framework/migrations/015_simplify_apps_table.sql, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, \."]
108
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
109
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
110
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
111
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
112
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
113
+ interface CreateProjectRequest {
114
+ name: string
115
+ description?: string
116
+ repo_path: string
117
+ language_mix?: string
118
+ globs?: string[]
119
+ exclude_globs?: string[]
120
+ source_sets?: SourceSet[]
121
+ dependencies?: string[]
122
+ }
123
+
124
+
125
+
126
+
127
+
128
+ // CIL[END chunk_id="custom_apps_cortex_functions_custom_cil_project_createprojectrequest_1784235266"]
129
+ // CIL[BEGIN chunk_id="custom_apps_cortex_functions_custom_cil_project_projectstats_1784235266" type="interface" identity="projectstats" parent="none"]
130
+ // CIL[DOC-MACRO purpose="Defines the projectstats type contract in cortex.functions.custom_cil-project"]
131
+ // CIL[DOC-RESPONSIBILITY responsibility="Describe the shape and allowed fields for projectstats"]
132
+ // CIL[DOC-CONTEXT module="cortex.functions.custom_cil-project" layer="function" related_files="[]"]
133
+ // CIL[DOC-CONTRACT inputs="none" outputs="type definition for projectstats" errors="none" side_effects="none"]
134
+ // CIL[DOC-MICRO logic_summary="Declares TypeScript type/interface projectstats with member definitions" notable_decisions="[]"]
135
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
136
+ // CIL[DOC-STABILITY stability="stable"]
137
+ // CIL[DOC-VECTOR type="context" content="Layer: function. Direct callers: 0. Direct calls: 0. Related files: none."]
138
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
139
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
140
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
141
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
142
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
143
+ interface ProjectStats {
144
+ file_count: number
145
+ chunk_count: number
146
+ proposal_count: number
147
+ approved_count: number
148
+ pending_review_count: number
149
+ dead_code_count: number
150
+ doc_verified_count: number
151
+ doc_ai_count: number
152
+ }
153
+
154
+
155
+
156
+
157
+
158
+
159
+
160
+ // CIL[END chunk_id="custom_apps_cortex_functions_custom_cil_project_projectstats_1784235266"]
161
+ // CIL[BEGIN chunk_id="custom_apps_cortex_functions_custom_cil_project_getprojectstats_1784235266" type="function" identity="getprojectstats" parent="none"]
162
+ // CIL[DOC-MACRO purpose="Implements getprojectstats logic in cortex.functions.custom_cil-project"]
163
+ // CIL[DOC-RESPONSIBILITY responsibility="Execute getprojectstats and return its computed result"]
164
+ // CIL[DOC-CONTEXT module="cortex.functions.custom_cil-project" layer="function" related_files="[]"]
165
+ // CIL[DOC-CONTRACT inputs="none" outputs="return value from function execution" errors="throws on invalid input or runtime failure" side_effects="none"]
166
+ // CIL[DOC-MICRO logic_summary="Provides getprojectstats with getProjectStats(projectId: string inputs, handling internal flow and returning a result" notable_decisions="[]"]
167
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
168
+ // CIL[DOC-STABILITY stability="stable"]
169
+ // CIL[DOC-VECTOR type="context" content="Layer: function. Direct callers: 0. Direct calls: 0. Related files: none."]
170
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
171
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
172
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
173
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
174
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
175
+ async function getProjectStats(projectId: string): Promise<ProjectStats> {
176
+ const [filesResult, chunksResult, proposalsResult] = await Promise.all([
177
+ adminDb.from('items').select('id, data', { count: 'exact' })
178
+ .filter('data->>kb_type', 'eq', 'cil_file')
179
+ .filter('data->>project_id', 'eq', projectId)
180
+ .eq('is_active', true),
181
+ adminDb.from('items').select('id, data', { count: 'exact' })
182
+ .filter('data->>kb_type', 'eq', 'cil_chunk')
183
+ .filter('data->>project_id', 'eq', projectId)
184
+ .eq('is_active', true),
185
+ adminDb.from('items').select('id, data', { count: 'exact' })
186
+ .filter('data->>kb_type', 'eq', 'cil_chunk_proposal')
187
+ .filter('data->>project_id', 'eq', projectId)
188
+ .eq('is_active', true),
189
+ ])
190
+
191
+ const chunks = chunksResult.data || []
192
+ const proposals = proposalsResult.data || []
193
+
194
+ return {
195
+ file_count: filesResult.count || 0,
196
+ chunk_count: chunksResult.count || 0,
197
+ proposal_count: proposalsResult.count || 0,
198
+ approved_count: chunks.filter(c => c.data?.review_status === 'approved').length,
199
+ pending_review_count: proposals.filter(p => p.data?.review_status === 'pending_review').length,
200
+ dead_code_count: chunks.filter(c => c.data?.is_dead_code === true).length,
201
+ doc_verified_count: chunks.filter(c => c.data?.doc_confidence === 'human_verified').length,
202
+ doc_ai_count: chunks.filter(c => c.data?.doc_confidence === 'ai_generated').length,
203
+ }
204
+ }
205
+
206
+
207
+
208
+
209
+
210
+
211
+ // CIL[END chunk_id="custom_apps_cortex_functions_custom_cil_project_getprojectstats_1784235266"]
212
+ // CIL[BEGIN chunk_id="custom_apps_cortex_functions_custom_cil_project_bulkadminremove_1784235266" type="function" identity="bulkadminremove" parent="none"]
213
+ // CIL[DOC-MACRO purpose="Implements bulkadminremove logic in cortex.functions.custom_cil-project"]
214
+ // CIL[DOC-RESPONSIBILITY responsibility="Execute bulkadminremove and return its computed result"]
215
+ // CIL[DOC-CONTEXT module="cortex.functions.custom_cil-project" layer="function" related_files="[]"]
216
+ // CIL[DOC-CONTRACT inputs="none" outputs="return value from function execution" errors="throws on invalid input or runtime failure" side_effects="none"]
217
+ // CIL[DOC-MICRO logic_summary="Provides bulkadminremove with bulkAdminRemove(ctx: any, entity: string, ids: string[] inputs, handling internal flow and returning a result" notable_decisions="[]"]
218
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
219
+ // CIL[DOC-STABILITY stability="stable"]
220
+ // CIL[DOC-VECTOR type="context" content="Layer: function. Direct callers: 0. Direct calls: 0. Related files: none."]
221
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
222
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
223
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
224
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
225
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
226
+ async function bulkAdminRemove(ctx: any, entity: string, ids: string[]): Promise<number> {
227
+ const results = await Promise.all(ids.map(id =>
228
+ adminRemove({ ...ctx, query: { ...(ctx.query || {}), entity, id, soft: 'false' } } as any).catch((e: any) => {
229
+ console.error(`bulkAdminRemove failed: ${entity}/${id}`, e.message || e)
230
+ return null
231
+ })
232
+ ))
233
+ return results.filter(r => r !== null).length
234
+ }
235
+
236
+
237
+
238
+
239
+
240
+ // CIL[END chunk_id="custom_apps_cortex_functions_custom_cil_project_bulkadminremove_1784235266"]
241
+ // CIL[BEGIN chunk_id="custom_apps_cortex_functions_custom_cil_project_handler_1784235266" type="variable" identity="handler" parent="none"]
242
+ // CIL[DOC-MACRO purpose="Defines handler configuration or state in cortex.functions.custom_cil-project"]
243
+ // CIL[DOC-RESPONSIBILITY responsibility="Hold the value and default configuration for handler"]
244
+ // CIL[DOC-CONTEXT module="cortex.functions.custom_cil-project" layer="function" related_files="[]"]
245
+ // CIL[DOC-CONTRACT inputs="none" outputs="value of handler" errors="none" side_effects="none"]
246
+ // CIL[DOC-MICRO logic_summary="Declares handler with initial value or constant binding used by cortex.functions.custom_cil-project" notable_decisions="[]"]
247
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
248
+ // CIL[DOC-STABILITY stability="stable"]
249
+ // CIL[DOC-VECTOR type="context" content="Layer: function. Direct callers: 0. Direct calls: 0. Related files: none."]
250
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
251
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
252
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
253
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
254
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
255
+ export const handler = createHandler(async (ctx, body) => {
256
+ const action = ctx.query?.action
257
+ const method = (ctx as any).method || (body ? 'POST' : 'GET')
258
+
259
+
260
+ if (action === 'list_proposals') {
261
+ const id = ctx.query?.id
262
+ if (!id) throw new Error('id is required')
263
+ const status = ctx.query?.status || 'pending_review'
264
+ const limit = parseInt(ctx.query?.limit || '1000', 10)
265
+
266
+ const proposalTypeId = await resolveTypeId('item', 'cil_chunk_proposal')
267
+ const { data, error } = await adminDb
268
+ .from('items')
269
+ .select('id, title, data, created_at')
270
+ .eq('type_id', proposalTypeId)
271
+ .eq('is_active', true)
272
+ .filter('data->>project_id', 'eq', id)
273
+ .filter('data->>review_status', 'eq', status)
274
+ .order('created_at', { ascending: true })
275
+ .limit(limit)
276
+
277
+ if (error) throw new Error(`Failed to list proposals: ${error.message}`)
278
+ return { proposals: data || [], total: data?.length || 0 }
279
+ }
280
+
281
+
282
+ if (action === 'list' || (!action && method === 'GET' && !ctx.query?.id)) {
283
+ const typeId = await resolveTypeId('item', 'cil_project')
284
+ const { data, error } = await adminDb
285
+ .from('items')
286
+ .select('id, title, description, status, data, created_at, updated_at')
287
+ .eq('type_id', typeId)
288
+ .eq('is_active', true)
289
+ .order('created_at', { ascending: false })
290
+
291
+ if (error) throw new Error(`Failed to list projects: ${error.message}`)
292
+ return { projects: data || [] }
293
+ }
294
+
295
+
296
+ if (action === 'get' || (method === 'GET' && ctx.query?.id)) {
297
+ const id = ctx.query?.id
298
+ if (!id) throw new Error('id is required')
299
+
300
+ const { data, error } = await adminDb
301
+ .from('items')
302
+ .select('id, title, description, status, data, created_at, updated_at')
303
+ .eq('id', id)
304
+ .single()
305
+
306
+ if (error || !data) throw new Error(`Project not found: ${id}`)
307
+
308
+ const stats = await getProjectStats(id)
309
+ return { project: { ...data, stats } }
310
+ }
311
+
312
+
313
+ if (action === 'create' || (!action && method === 'POST')) {
314
+ const req = body as CreateProjectRequest
315
+ if (!req?.name) throw new Error('name is required')
316
+ if (!req?.repo_path) throw new Error('repo_path is required')
317
+
318
+ const result = await adminCreate(ctx, {
319
+ entity: 'items',
320
+ type_slug: 'cil_project',
321
+ title: req.name,
322
+ description: req.description || '',
323
+ status: 'active',
324
+ data: {
325
+ kb_type: 'cil_project',
326
+ repo_path: req.repo_path,
327
+ language_mix: req.language_mix || '',
328
+ ingestion_status: 'not_started',
329
+ file_count: 0,
330
+ chunk_count: 0,
331
+ total_ingestion_cost_usd: 0,
332
+ last_ingested_at: null,
333
+ globs: req.globs || DEFAULT_GLOBS,
334
+ exclude_globs: req.exclude_globs || DEFAULT_EXCLUDE_GLOBS,
335
+ source_sets: req.source_sets || [],
336
+ dependencies: req.dependencies || [],
337
+ }
338
+ })
339
+
340
+ return { project: result }
341
+ }
342
+
343
+
344
+ if (action === 'update' || (!action && method === 'PATCH')) {
345
+ const id = ctx.query?.id || body?.id
346
+ if (!id) throw new Error('id is required')
347
+
348
+
349
+ const { data: current, error: fetchErr } = await adminDb
350
+ .from('items').select('data').eq('id', id).maybeSingle()
351
+ if (fetchErr || !current) throw new Error(`Project not found: ${id}`)
352
+
353
+ const mergedData = { ...(current.data || {}), ...(body?.data || {}) }
354
+
355
+ const updateCtx = { ...ctx, query: { ...ctx.query, entity: 'items', id } }
356
+ const result = await adminUpdate(updateCtx, {
357
+ data: mergedData,
358
+ ...(body?.status ? { status: body.status } : {}),
359
+ ...(body?.title ? { title: body.title } : {}),
360
+ })
361
+
362
+ return { project: result }
363
+ }
364
+
365
+
366
+
367
+ if (action === 'delete' || method === 'DELETE') {
368
+ const id = ctx.query?.id || body?.id
369
+ if (!id) throw new Error('id is required')
370
+
371
+
372
+ const { data: projectItem } = await adminDb
373
+ .from('items')
374
+ .select('id, title, data')
375
+ .eq('id', id)
376
+ .maybeSingle()
377
+
378
+ if (!projectItem) throw new Error(`Project not found: ${id}`)
379
+
380
+ const deletedCounts: Record<string, number> = {}
381
+
382
+
383
+ const { data: fileItems } = await adminDb
384
+ .from('items')
385
+ .select('id')
386
+ .filter('data->>project_id', 'eq', id)
387
+ .filter('data->>kb_type', 'eq', 'cil_file')
388
+
389
+ const fileIds = (fileItems || []).map((f: any) => f.id)
390
+
391
+
392
+ const { data: chunkItems } = await adminDb
393
+ .from('items')
394
+ .select('id')
395
+ .filter('data->>project_id', 'eq', id)
396
+ .filter('data->>kb_type', 'eq', 'cil_chunk')
397
+
398
+ const chunkIds = (chunkItems || []).map((c: any) => c.id)
399
+
400
+
401
+ if (fileIds.length > 0 || chunkIds.length > 0) {
402
+ const allIds = [...fileIds, ...chunkIds]
403
+ const IN_LIMIT = 500
404
+ const linkIdsToDelete: string[] = []
405
+ for (let i = 0; i < allIds.length; i += IN_LIMIT) {
406
+ const batch = allIds.slice(i, i + IN_LIMIT)
407
+ const [{ data: sourceLinks }, { data: targetLinks }] = await Promise.all([
408
+ adminDb.from('links').select('id').in('source_id', batch),
409
+ adminDb.from('links').select('id').in('target_id', batch),
410
+ ])
411
+ for (const l of sourceLinks || []) linkIdsToDelete.push(l.id)
412
+ for (const l of targetLinks || []) linkIdsToDelete.push(l.id)
413
+ }
414
+ deletedCounts.links = await bulkAdminRemove(ctx, 'links', [...new Set(linkIdsToDelete)])
415
+ }
416
+
417
+
418
+ if (chunkIds.length > 0) {
419
+ const CHUNK_SIZE = 50
420
+ let embeddingsDeleted = 0
421
+ for (let i = 0; i < chunkIds.length; i += CHUNK_SIZE) {
422
+ const batch = chunkIds.slice(i, i + CHUNK_SIZE)
423
+ const { count } = await adminDb
424
+ .from('embeddings')
425
+ .delete({ count: 'exact' })
426
+ .in('document_id', batch)
427
+ embeddingsDeleted += count || 0
428
+ }
429
+ deletedCounts.embeddings = embeddingsDeleted
430
+ }
431
+
432
+
433
+ for (const kbType of ['cil_chunk', 'cil_chunk_proposal', 'cil_file', 'cil_config']) {
434
+ const { data: itemsToDelete } = await adminDb
435
+ .from('items')
436
+ .select('id')
437
+ .filter('data->>project_id', 'eq', id)
438
+ .filter('data->>kb_type', 'eq', kbType)
439
+ deletedCounts[kbType] = await bulkAdminRemove(ctx, 'items', (itemsToDelete || []).map((i: any) => i.id))
440
+ }
441
+
442
+
443
+ await adminRemove({ ...ctx, query: { ...(ctx.query || {}), entity: 'items', id, soft: 'false' } } as any)
444
+ deletedCounts.project = 1
445
+
446
+ return {
447
+ deleted: true,
448
+ project_id: id,
449
+ project_title: projectItem.title,
450
+ deleted_counts: deletedCounts,
451
+ }
452
+ }
453
+
454
+
455
+ if (action === 'pipeline_progress') {
456
+ const id = ctx.query?.id
457
+ if (!id) throw new Error('id is required')
458
+
459
+ const { data, error } = await adminDb
460
+ .from('items')
461
+ .select('data')
462
+ .eq('id', id)
463
+ .maybeSingle()
464
+
465
+ if (error || !data) throw new Error(`Project not found: ${id}`)
466
+
467
+ const fileStatuses: Record<string, string> = data.data?.file_statuses || {}
468
+ const selectedPaths: string[] = data.data?.selected_paths || []
469
+
470
+
471
+ const by_status: Record<string, number> = {}
472
+ for (const [key, val] of Object.entries(fileStatuses)) {
473
+ if (key.endsWith('_updated')) continue
474
+ by_status[val] = (by_status[val] || 0) + 1
475
+ }
476
+
477
+
478
+ const { count: total_chunks } = await adminDb.from('items')
479
+ .select('*', { count: 'exact', head: true })
480
+ .filter('data->>kb_type', 'eq', 'cil_chunk')
481
+ .filter('data->>project_id', 'eq', id)
482
+ .eq('is_active', true)
483
+
484
+ return {
485
+ progress: {
486
+ total_selected: selectedPaths.length,
487
+ by_status,
488
+ file_statuses: fileStatuses,
489
+ total_chunks: total_chunks || 0,
490
+ },
491
+ }
492
+ }
493
+
494
+ throw new Error(`Unknown action: ${action}. Valid: list, get, create, update, delete, pipeline_progress`)
495
+ })
496
+
497
+
498
+
499
+ // CIL[END chunk_id="custom_apps_cortex_functions_custom_cil_project_handler_1784235266"]