spine-framework 0.3.144 → 0.4.0

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 (451) hide show
  1. package/.env.example +76 -0
  2. package/.framework/.spine-manifest.json +19 -0
  3. package/.framework/cli/commands/agents.ts +61 -33
  4. package/.framework/cli/commands/auth.ts +60 -28
  5. package/.framework/cli/commands/create-app.ts +212 -80
  6. package/.framework/cli/commands/dev.ts +184 -68
  7. package/.framework/cli/commands/doctor.ts +324 -152
  8. package/.framework/cli/commands/generate.ts +119 -68
  9. package/.framework/cli/commands/init.ts +141 -242
  10. package/.framework/cli/commands/install-app.ts +1336 -314
  11. package/.framework/cli/commands/items.ts +31 -29
  12. package/.framework/cli/commands/migrate.ts +299 -156
  13. package/.framework/cli/commands/migrations.ts +62 -30
  14. package/.framework/cli/commands/pipelines.ts +31 -29
  15. package/.framework/cli/commands/status.ts +105 -45
  16. package/.framework/cli/commands/system.ts +47 -42
  17. package/.framework/cli/commands/test.ts +161 -102
  18. package/.framework/cli/commands/upgrade.ts +260 -0
  19. package/.framework/cli/commands/validate-app.ts +517 -161
  20. package/.framework/cli/context.ts +117 -85
  21. package/.framework/cli/env-loader.ts +74 -43
  22. package/.framework/cli/index.ts +70 -46
  23. package/.framework/cli/lib/project-files.ts +404 -0
  24. package/.framework/docs/guides/testing-guide.md +1 -1
  25. package/.framework/docs/runtime-types.md +72 -72
  26. package/.framework/functions/_shared/access.ts +84 -0
  27. package/.framework/functions/_shared/agent-runner.ts +5051 -1026
  28. package/.framework/functions/_shared/app-manifest.ts +214 -94
  29. package/.framework/functions/_shared/ast.ts +214 -0
  30. package/.framework/functions/_shared/audit.ts +91 -55
  31. package/.framework/functions/_shared/cil.ts +368 -127
  32. package/.framework/functions/_shared/db.ts +337 -68
  33. package/.framework/functions/_shared/funnel.ts +228 -0
  34. package/.framework/functions/_shared/geo.ts +105 -0
  35. package/.framework/functions/_shared/hash-api-key.ts +94 -17
  36. package/.framework/functions/_shared/index.ts +22 -224
  37. package/.framework/functions/_shared/kb.ts +832 -58
  38. package/.framework/functions/_shared/llm.ts +118 -18
  39. package/.framework/functions/_shared/logging.ts +317 -19
  40. package/.framework/functions/_shared/middleware.ts +701 -131
  41. package/.framework/functions/_shared/notify.ts +70 -0
  42. package/.framework/functions/_shared/outcomes.ts +34 -19
  43. package/.framework/functions/_shared/permissions.ts +501 -315
  44. package/.framework/functions/_shared/pipeline-runner.ts +704 -155
  45. package/.framework/functions/_shared/principal.ts +436 -263
  46. package/.framework/functions/_shared/rate-limit.ts +233 -0
  47. package/.framework/functions/_shared/resolve-credentials.ts +86 -19
  48. package/.framework/functions/_shared/resolve-ids.ts +203 -139
  49. package/.framework/functions/_shared/retry-deliveries.ts +51 -16
  50. package/.framework/functions/_shared/schema-utils.ts +602 -521
  51. package/.framework/functions/_shared/security.ts +345 -0
  52. package/.framework/functions/_shared/testing.ts +197 -172
  53. package/.framework/functions/_shared/tracing.ts +351 -21
  54. package/.framework/functions/_shared/trigger-engine.ts +425 -136
  55. package/.framework/functions/_shared/webhook-registration.ts +71 -70
  56. package/.framework/functions/_shared/webhook-registry.ts +126 -83
  57. package/.framework/functions/account-nodes.ts +30 -30
  58. package/.framework/functions/adapters/generic-webhook-inbound.ts +49 -16
  59. package/.framework/functions/adapters/generic-webhook-outbound.ts +17 -17
  60. package/.framework/functions/adapters/openai-outbound.ts +15 -16
  61. package/.framework/functions/admin-data.ts +596 -173
  62. package/.framework/functions/admin-funnel.ts +64 -60
  63. package/.framework/functions/admin-install-funnel.ts +84 -66
  64. package/.framework/functions/admin-signals.ts +69 -51
  65. package/.framework/functions/ai-agents.ts +431 -106
  66. package/.framework/functions/ai-interactions.ts +186 -112
  67. package/.framework/functions/api-keys.ts +107 -107
  68. package/.framework/functions/apps.ts +154 -136
  69. package/.framework/functions/auth.ts +83 -65
  70. package/.framework/functions/cil-agent-ingest.ts +189 -232
  71. package/.framework/functions/cil-agent.ts +433 -177
  72. package/.framework/functions/cil-callmap.ts +642 -430
  73. package/.framework/functions/cil-config.ts +139 -135
  74. package/.framework/functions/cil-context.ts +214 -127
  75. package/.framework/functions/cil-doc.ts +587 -458
  76. package/.framework/functions/cil-embeddings.ts +453 -364
  77. package/.framework/functions/cil-graph.ts +427 -142
  78. package/.framework/functions/cil-ingest.ts +1418 -1154
  79. package/.framework/functions/cil-pipeline.ts +276 -21
  80. package/.framework/functions/cil-project.ts +659 -132
  81. package/.framework/functions/cil-validate.ts +198 -164
  82. package/.framework/functions/debug-auth.ts +57 -55
  83. package/.framework/functions/deliveries.ts +80 -21
  84. package/.framework/functions/embeddings.ts +1023 -318
  85. package/.framework/functions/eval-harness.ts +146 -108
  86. package/.framework/functions/integration-outbound.ts +205 -75
  87. package/.framework/functions/integration-routes.ts +128 -23
  88. package/.framework/functions/integrations.ts +125 -100
  89. package/.framework/functions/invites.ts +1095 -460
  90. package/.framework/functions/item-progress.ts +158 -102
  91. package/.framework/functions/kb.ts +34 -10
  92. package/.framework/functions/logs.ts +133 -133
  93. package/.framework/functions/observability.ts +152 -122
  94. package/.framework/functions/pipeline-executions.ts +147 -132
  95. package/.framework/functions/pipelines.ts +134 -119
  96. package/.framework/functions/prompt-configs.ts +96 -80
  97. package/.framework/functions/roles.ts +112 -82
  98. package/.framework/functions/security.ts +450 -0
  99. package/.framework/functions/system-cron.ts +117 -80
  100. package/.framework/functions/system.ts +158 -98
  101. package/.framework/functions/tests.ts +29 -29
  102. package/.framework/functions/timers.ts +94 -95
  103. package/.framework/functions/trigger-scheduler.ts +10 -0
  104. package/.framework/functions/triggers.ts +179 -149
  105. package/.framework/functions/types.ts +137 -125
  106. package/.framework/mcp/index.ts +133 -0
  107. package/.framework/mcp/load-env.ts +60 -0
  108. package/.framework/mcp/shared/app-manifest.ts +275 -0
  109. package/.framework/mcp/shared/db.ts +477 -0
  110. package/.framework/mcp/shared/kb.ts +118 -0
  111. package/.framework/mcp/tools/architect.ts +431 -0
  112. package/.framework/mcp/tools/cil/context.ts +345 -0
  113. package/.framework/mcp/tools/cil/graph.ts +242 -0
  114. package/.framework/mcp/tools/cil/ingest.ts +1217 -0
  115. package/.framework/mcp/tools/cil/pipeline-orchestrator.ts +693 -0
  116. package/.framework/mcp/tools/cil/pipeline.ts +767 -0
  117. package/.framework/mcp/tools/cil/project.ts +791 -0
  118. package/.framework/mcp/tools/cil/retrieval.ts +336 -0
  119. package/.framework/mcp/tools/cil/search-core.ts +454 -0
  120. package/.framework/mcp/tools/cil/search.ts +97 -0
  121. package/.framework/mcp/tools/cil/suggest.ts +186 -0
  122. package/.framework/mcp/tools/cil/validate.ts +1369 -0
  123. package/.framework/mcp/tools/kb/delete.ts +139 -0
  124. package/.framework/mcp/tools/kb/index.ts +52 -0
  125. package/.framework/mcp/tools/kb/ingest.ts +84 -0
  126. package/.framework/mcp/tools/kb/list-types.ts +102 -0
  127. package/.framework/mcp/tools/kb/publish.ts +100 -0
  128. package/.framework/mcp/tools/kb/reindex.ts +86 -0
  129. package/.framework/mcp/tools/kb/revoke.ts +85 -0
  130. package/.framework/mcp/tools/kb/search.ts +101 -0
  131. package/.framework/mcp/tools/kb/upsert.ts +125 -0
  132. package/.framework/mcp/tools/observability.ts +510 -0
  133. package/.framework/migrations/001_core_schema.sql +15 -0
  134. package/.framework/migrations/002_core_rls_and_functions.sql +15 -0
  135. package/.framework/migrations/003_core_system_data.sql +16 -1
  136. package/.framework/migrations/004_core_rpc_and_broker.sql +17 -1
  137. package/.framework/migrations/005_core_observability.sql +17 -1
  138. package/.framework/migrations/006_security_hardening_rls.sql +15 -0
  139. package/.framework/migrations/007_kb_article_list.sql +17 -1
  140. package/.framework/migrations/008_items_target.sql +15 -0
  141. package/.framework/migrations/009_roles_slug_unique.sql +15 -0
  142. package/.framework/migrations/010_auth_user_trigger.sql +15 -0
  143. package/.framework/migrations/011_spine_system_account.sql +16 -0
  144. package/.framework/migrations/012_service_role_grants.sql +16 -0
  145. package/.framework/migrations/013_get_account_apps_role_filter.sql +15 -0
  146. package/.framework/migrations/014_apps_required_roles.sql +16 -0
  147. package/.framework/migrations/015_types_kind_slug_unique.sql +20 -0
  148. package/.framework/migrations/016_cil_types.sql +281 -0
  149. package/.framework/migrations/017_cil_stable_ids.sql +37 -0
  150. package/.framework/migrations/018_runtime_tables.sql +129 -0
  151. package/.framework/migrations/019_agent_prompt_columns.sql +56 -0
  152. package/.framework/migrations/020_schema_reconciliation.sql +67 -0
  153. package/.framework/migrations/021_kb_embedding_lifecycle.sql +31 -0
  154. package/.framework/migrations/032_cil_status_migration.sql +73 -0
  155. package/.framework/migrations/033_cil_versioning.sql +73 -0
  156. package/.framework/migrations/034_match_embeddings_knn.sql +115 -0
  157. package/.framework/migrations/035_rate_limits.sql +55 -0
  158. package/.framework/migrations/036_demo_record_flags.sql +72 -0
  159. package/.framework/migrations/037_kb_types_canonical.sql +244 -0
  160. package/.framework/migrations/038_drop_demo_record_flags.sql +38 -0
  161. package/.framework/migrations/042_registration_hierarchy.sql +309 -0
  162. package/.framework/migrations/043_policy_actor_cleanup.sql +39 -0
  163. package/.framework/migrations/044_match_embeddings_filtered_knn.sql +151 -0
  164. package/.framework/migrations/045_security_critical_rls.sql +139 -0
  165. package/.framework/migrations/046_security_missing_rls.sql +79 -0
  166. package/.framework/migrations/047_people_updated_by.sql +27 -0
  167. package/.framework/migrations/048_watcher_last_seen_at.sql +24 -0
  168. package/.framework/migrations/049_security_blocklist.sql +148 -0
  169. package/.framework/migrations/050_notifications.sql +49 -0
  170. package/.framework/migrations/051_message_agent_fields.sql +74 -0
  171. package/.framework/migrations/052_registration_security.sql +421 -0
  172. package/.framework/migrations/053_builtin_action_seeds.sql +66 -0
  173. package/.framework/migrations/054_kb_ingest_lease.sql +157 -0
  174. package/.framework/migrations/055_type_id_drift_reconciliation.sql +33 -0
  175. package/.framework/migrations/056_slug_column_reconciliation.sql +38 -0
  176. package/.framework/migrations/057_pipelines_slug_identity.sql +14 -0
  177. package/.framework/migrations/058_account_data_field_declarations.sql +53 -0
  178. package/.framework/migrations/059_registration_placement_fixes.sql +269 -0
  179. package/.framework/migrations/060_account_person_record_permissions.sql +38 -0
  180. package/.framework/migrations/061_fk_dedup.sql +32 -0
  181. package/.framework/public/spine-logo.svg +10 -3
  182. package/.framework/scripts/app-install-cli.ts +190 -93
  183. package/.framework/scripts/assemble-frontend.sh +127 -44
  184. package/.framework/scripts/assemble-functions.sh +128 -30
  185. package/.framework/scripts/boundary-check.sh +6 -2
  186. package/.framework/scripts/build-manifest.sh +24 -68
  187. package/.framework/scripts/check-core-integrity.sh +15 -76
  188. package/.framework/scripts/checksum-manifest.mts +343 -0
  189. package/.framework/scripts/cil-migrate-markers.ts +403 -0
  190. package/.framework/scripts/fix-cil-markers.mjs +176 -0
  191. package/.framework/scripts/verify-integrity.sh +21 -57
  192. package/.framework/scripts/verify-manifest.mts +305 -0
  193. package/.framework/seeds/types/funnel_signal_use.json +74 -21
  194. package/.framework/seeds/types/spine_instance.json +73 -21
  195. package/.framework/src/App.tsx +118 -72
  196. package/.framework/src/apps/admin/index.tsx +855 -58
  197. package/.framework/src/components/AppWrapper.tsx +43 -45
  198. package/.framework/src/components/CustomAppLoader.tsx +160 -116
  199. package/.framework/src/components/admin/AdminListPage.tsx +46 -44
  200. package/.framework/src/components/admin/AdminSidebar.tsx +57 -47
  201. package/.framework/src/components/admin/AdminStatsCard.tsx +46 -44
  202. package/.framework/src/components/admin/PageInstructions.tsx +98 -2
  203. package/.framework/src/components/admin/SortableTableHeader.tsx +44 -45
  204. package/.framework/src/components/app-shell/GenericAppShell.tsx +64 -65
  205. package/.framework/src/components/app-shell/GenericDetailPage.tsx +44 -47
  206. package/.framework/src/components/app-shell/GenericListPage.tsx +45 -49
  207. package/.framework/src/components/app-sidebar.tsx +42 -45
  208. package/.framework/src/components/auth/ProtectedRoute.tsx +48 -41
  209. package/.framework/src/components/auth/TurnstileWidget.tsx +27 -0
  210. package/.framework/src/components/kb/KBArticleEditor.tsx +231 -22
  211. package/.framework/src/components/kb/KBArticleList.tsx +251 -10
  212. package/.framework/src/components/layout/AppShell.tsx +51 -45
  213. package/.framework/src/components/layout/Header.tsx +42 -43
  214. package/.framework/src/components/layout/Layout.tsx +46 -46
  215. package/.framework/src/components/layout/Sidebar.tsx +196 -96
  216. package/.framework/src/components/runtime/DataDetailHeader.tsx +55 -30
  217. package/.framework/src/components/runtime/DataDetailPage.tsx +31 -269
  218. package/.framework/src/components/runtime/DataFilters.tsx +49 -74
  219. package/.framework/src/components/runtime/DataHeader.tsx +53 -32
  220. package/.framework/src/components/runtime/DataListPage.tsx +51 -155
  221. package/.framework/src/components/runtime/DataStats.tsx +66 -44
  222. package/.framework/src/components/runtime/DataTable.tsx +49 -149
  223. package/.framework/src/components/runtime/SchemaDetailForm.tsx +45 -75
  224. package/.framework/src/components/runtime/index.ts +119 -16
  225. package/.framework/src/components/search-form.tsx +46 -29
  226. package/.framework/src/components/shared/AgentView.tsx +65 -48
  227. package/.framework/src/components/shared/FieldRenderer.tsx +144 -50
  228. package/.framework/src/components/shared/InviteManager.tsx +207 -97
  229. package/.framework/src/components/shared/MemberList.tsx +97 -0
  230. package/.framework/src/components/shared/SchemaFields.tsx +107 -86
  231. package/.framework/src/components/ui/DataTable.tsx +80 -68
  232. package/.framework/src/components/ui/Form.tsx +157 -146
  233. package/.framework/src/components/ui/ItemCard.tsx +74 -67
  234. package/.framework/src/components/ui/ItemListView.tsx +73 -68
  235. package/.framework/src/components/ui/LoadingSpinner.tsx +43 -48
  236. package/.framework/src/components/ui/Modal.tsx +78 -68
  237. package/.framework/src/components/ui/RichTextEditor.tsx +89 -69
  238. package/.framework/src/components/ui/accordion.tsx +85 -86
  239. package/.framework/src/components/ui/alert-dialog.tsx +197 -184
  240. package/.framework/src/components/ui/alert.tsx +105 -94
  241. package/.framework/src/components/ui/aspect-ratio.tsx +57 -43
  242. package/.framework/src/components/ui/avatar.tsx +122 -107
  243. package/.framework/src/components/ui/badge.tsx +60 -55
  244. package/.framework/src/components/ui/breadcrumb.tsx +127 -128
  245. package/.framework/src/components/ui/button-group.tsx +86 -72
  246. package/.framework/src/components/ui/button.tsx +71 -50
  247. package/.framework/src/components/ui/calendar.tsx +72 -57
  248. package/.framework/src/components/ui/card.tsx +136 -129
  249. package/.framework/src/components/ui/carousel.tsx +226 -107
  250. package/.framework/src/components/ui/chart.tsx +252 -147
  251. package/.framework/src/components/ui/checkbox.tsx +43 -44
  252. package/.framework/src/components/ui/collapsible.tsx +86 -71
  253. package/.framework/src/components/ui/combobox.tsx +282 -249
  254. package/.framework/src/components/ui/command.tsx +158 -146
  255. package/.framework/src/components/ui/context-menu.tsx +239 -240
  256. package/.framework/src/components/ui/dialog.tsx +174 -157
  257. package/.framework/src/components/ui/direction.tsx +72 -56
  258. package/.framework/src/components/ui/drawer.tsx +168 -169
  259. package/.framework/src/components/ui/dropdown-menu.tsx +254 -223
  260. package/.framework/src/components/ui/empty.tsx +131 -120
  261. package/.framework/src/components/ui/field.tsx +205 -173
  262. package/.framework/src/components/ui/hover-card.tsx +71 -72
  263. package/.framework/src/components/ui/input-group.tsx +148 -133
  264. package/.framework/src/components/ui/input-otp.tsx +99 -86
  265. package/.framework/src/components/ui/input.tsx +43 -41
  266. package/.framework/src/components/ui/item.tsx +207 -185
  267. package/.framework/src/components/ui/kbd.tsx +57 -56
  268. package/.framework/src/components/ui/label.tsx +45 -41
  269. package/.framework/src/components/ui/menubar.tsx +268 -236
  270. package/.framework/src/components/ui/native-select.tsx +85 -86
  271. package/.framework/src/components/ui/navigation-menu.tsx +166 -156
  272. package/.framework/src/components/ui/pagination.tsx +131 -141
  273. package/.framework/src/components/ui/popover.tsx +125 -128
  274. package/.framework/src/components/ui/progress.tsx +47 -44
  275. package/.framework/src/components/ui/radio-group.tsx +60 -55
  276. package/.framework/src/components/ui/resizable.tsx +85 -72
  277. package/.framework/src/components/ui/scroll-area.tsx +57 -58
  278. package/.framework/src/components/ui/select.tsx +182 -169
  279. package/.framework/src/components/ui/separator.tsx +42 -43
  280. package/.framework/src/components/ui/sheet.tsx +170 -159
  281. package/.framework/src/components/ui/sidebar.tsx +395 -398
  282. package/.framework/src/components/ui/skeleton.tsx +42 -43
  283. package/.framework/src/components/ui/slider.tsx +61 -44
  284. package/.framework/src/components/ui/sonner.tsx +44 -44
  285. package/.framework/src/components/ui/spinner.tsx +47 -42
  286. package/.framework/src/components/ui/switch.tsx +56 -42
  287. package/.framework/src/components/ui/table-primitives.tsx +272 -132
  288. package/.framework/src/components/ui/table.tsx +140 -142
  289. package/.framework/src/components/ui/tabs.tsx +110 -93
  290. package/.framework/src/components/ui/textarea.tsx +43 -44
  291. package/.framework/src/components/ui/toggle-group.tsx +87 -71
  292. package/.framework/src/components/ui/toggle.tsx +56 -56
  293. package/.framework/src/components/ui/tooltip.tsx +99 -85
  294. package/.framework/src/contexts/AppContext.tsx +166 -114
  295. package/.framework/src/contexts/AuthContext.tsx +232 -137
  296. package/.framework/src/hooks/use-mobile.ts +43 -44
  297. package/.framework/src/hooks/useApi.ts +185 -172
  298. package/.framework/src/hooks/useAppPath.ts +31 -29
  299. package/.framework/src/hooks/useApps.ts +77 -42
  300. package/.framework/src/hooks/useEntityList.ts +66 -29
  301. package/.framework/src/hooks/useEntityRecord.ts +76 -32
  302. package/.framework/src/hooks/useForm.ts +62 -30
  303. package/.framework/src/hooks/useListSchema.ts +60 -43
  304. package/.framework/src/hooks/useSchemaRecord.ts +115 -95
  305. package/.framework/src/lib/api.ts +258 -134
  306. package/.framework/src/lib/registration.ts +181 -0
  307. package/.framework/src/lib/supabase.ts +118 -81
  308. package/.framework/src/lib/utils.ts +266 -266
  309. package/.framework/src/main.tsx +43 -44
  310. package/.framework/src/pages/DashboardPage.tsx +44 -43
  311. package/.framework/src/pages/NoAppPage.tsx +50 -0
  312. package/.framework/src/pages/NotFoundPage.tsx +32 -29
  313. package/.framework/src/pages/SetupPage.tsx +34 -33
  314. package/.framework/src/pages/admin/AIAgentDetailPage.tsx +69 -58
  315. package/.framework/src/pages/admin/AIAgentsPage.tsx +43 -40
  316. package/.framework/src/pages/admin/APIKeyDetailPage.tsx +63 -55
  317. package/.framework/src/pages/admin/APIKeysPage.tsx +44 -42
  318. package/.framework/src/pages/admin/AlertsConfigPage.tsx +117 -94
  319. package/.framework/src/pages/admin/AppDetailPage.tsx +48 -42
  320. package/.framework/src/pages/admin/AppsPage.tsx +45 -42
  321. package/.framework/src/pages/admin/DeliveriesPage.tsx +49 -17
  322. package/.framework/src/pages/admin/DesignedPage.tsx +31 -30
  323. package/.framework/src/pages/admin/EmbeddingDetailPage.tsx +58 -0
  324. package/.framework/src/pages/admin/EmbeddingsPage.tsx +49 -0
  325. package/.framework/src/pages/admin/ExtendedShadcnTestPage.tsx +31 -29
  326. package/.framework/src/pages/admin/IncrementalShadcnTestPage.tsx +46 -29
  327. package/.framework/src/pages/admin/IntegratedDashboard.tsx +32 -29
  328. package/.framework/src/pages/admin/IntegrationDetailPage.tsx +68 -55
  329. package/.framework/src/pages/admin/IntegrationsPage.tsx +45 -42
  330. package/.framework/src/pages/admin/InvitesPage.tsx +60 -44
  331. package/.framework/src/pages/admin/LogsPage.tsx +87 -137
  332. package/.framework/src/pages/admin/MinimalShadcnTestPage.tsx +31 -29
  333. package/.framework/src/pages/admin/ObservabilityDashboard.tsx +150 -89
  334. package/.framework/src/pages/admin/PipelineDetailPage.tsx +77 -104
  335. package/.framework/src/pages/admin/PipelineExecutionsPage.tsx +44 -43
  336. package/.framework/src/pages/admin/PipelinesPage.tsx +59 -145
  337. package/.framework/src/pages/admin/PromptConfigDetailPage.tsx +53 -42
  338. package/.framework/src/pages/admin/PromptConfigsPage.tsx +47 -117
  339. package/.framework/src/pages/admin/ProperlyDesignedPage.tsx +31 -44
  340. package/.framework/src/pages/admin/RoleDetailPage.tsx +49 -92
  341. package/.framework/src/pages/admin/RolesPage.tsx +47 -164
  342. package/.framework/src/pages/admin/SecurityPage.tsx +310 -0
  343. package/.framework/src/pages/admin/SelectTestPage.tsx +30 -32
  344. package/.framework/src/pages/admin/ShadcnTestPage.tsx +37 -44
  345. package/.framework/src/pages/admin/SimpleDashboard.tsx +32 -44
  346. package/.framework/src/pages/admin/TestRunDetailPage.tsx +97 -44
  347. package/.framework/src/pages/admin/TestingDashboard.tsx +126 -71
  348. package/.framework/src/pages/admin/TimerDetailPage.tsx +67 -55
  349. package/.framework/src/pages/admin/TimersPage.tsx +44 -42
  350. package/.framework/src/pages/admin/TriggerDetailPage.tsx +47 -42
  351. package/.framework/src/pages/admin/TriggersPage.tsx +58 -57
  352. package/.framework/src/pages/admin/TypeDetailPage.tsx +91 -55
  353. package/.framework/src/pages/admin/TypesPage.tsx +45 -42
  354. package/.framework/src/pages/admin/cil/CILAgentPage.tsx +258 -128
  355. package/.framework/src/pages/admin/cil/CILChunkDetailPage.tsx +127 -123
  356. package/.framework/src/pages/admin/cil/CILDashboardPage.tsx +308 -235
  357. package/.framework/src/pages/admin/cil/CILFileListPage.tsx +159 -110
  358. package/.framework/src/pages/admin/cil/CILFileSelectPage.tsx +432 -0
  359. package/.framework/src/pages/admin/cil/CILGraphPage.tsx +200 -178
  360. package/.framework/src/pages/admin/cil/CILIngestionPage.tsx +286 -239
  361. package/.framework/src/pages/admin/cil/CILProjectsPage.tsx +211 -90
  362. package/.framework/src/pages/admin/cil/CILSearchPage.tsx +156 -143
  363. package/.framework/src/pages/admin/cil/CILSuggestionsPage.tsx +379 -0
  364. package/.framework/src/pages/admin/cil/CILVersionsPage.tsx +337 -0
  365. package/.framework/src/pages/admin/cil/FlexiblePipelinePage.tsx +219 -214
  366. package/.framework/src/pages/admin/kb/KBAdminPage.tsx +64 -0
  367. package/.framework/src/pages/auth/AuthConfirmPage.tsx +135 -65
  368. package/.framework/src/pages/auth/ForgotPasswordPage.tsx +39 -31
  369. package/.framework/src/pages/auth/LoginPage.tsx +38 -32
  370. package/.framework/src/pages/auth/PendingApprovalPage.tsx +31 -28
  371. package/.framework/src/pages/auth/RegisterPage.tsx +429 -155
  372. package/.framework/src/pages/spine-framework/APIPage.tsx +33 -30
  373. package/.framework/src/pages/spine-framework/CLIPage.tsx +32 -30
  374. package/.framework/src/types/auth.ts +101 -93
  375. package/.framework/src/types/types.ts +283 -262
  376. package/.framework/templates/project.json +87 -0
  377. package/.framework/templates/spine.config.neutral.json +7 -0
  378. package/.framework/tests/api/api-surface.test.ts +381 -0
  379. package/.framework/tests/fixtures/seed.ts +427 -0
  380. package/.framework/tests/fixtures/teardown.ts +228 -0
  381. package/.framework/tests/reporter.ts +351 -0
  382. package/.framework/tests/setup.ts +135 -0
  383. package/.framework/tests/ui/ui-sweep.ts +278 -0
  384. package/.framework/tests/unit/admin-data-logger.test.ts +310 -0
  385. package/.framework/tests/unit/agent-runner.test.ts +2389 -0
  386. package/.framework/tests/unit/ai-interactions.test.ts +81 -0
  387. package/.framework/tests/unit/app-manifest.test.ts +359 -0
  388. package/.framework/tests/unit/assembly-scripts.test.ts +172 -0
  389. package/.framework/tests/unit/cil-determinism.test.ts +85 -0
  390. package/.framework/tests/unit/core-isolation.test.ts +153 -0
  391. package/.framework/tests/unit/funnel-signals.test.ts +135 -0
  392. package/.framework/tests/unit/install-app.test.ts +1759 -0
  393. package/.framework/tests/unit/invites-security.test.ts +572 -0
  394. package/.framework/tests/unit/kb-ingest-lease.test.ts +287 -0
  395. package/.framework/tests/unit/kb-search.test.ts +119 -0
  396. package/.framework/tests/unit/migrate.test.ts +509 -0
  397. package/.framework/tests/unit/notify.test.ts +136 -0
  398. package/.framework/tests/unit/permissions.test.ts +269 -0
  399. package/.framework/tests/unit/pipeline-runner.test.ts +755 -0
  400. package/.framework/tests/unit/principal-cache.test.ts +138 -0
  401. package/.framework/tests/unit/retrieval-golden.test.ts +520 -0
  402. package/.framework/tests/unit/runtime-isolation.test.ts +642 -0
  403. package/.framework/tests/unit/schema-utils.test.ts +225 -0
  404. package/.framework/tests/unit/trigger-engine.test.ts +513 -0
  405. package/.framework/tests/unit/validate-app.test.ts +527 -0
  406. package/README.md +34 -3
  407. package/bin/spine-framework.cjs +1 -0
  408. package/config/tailwind.config.cjs +7 -0
  409. package/config/tsconfig.functions.json +42 -0
  410. package/config/tsconfig.json +37 -9
  411. package/config/vite.config.ts +31 -2
  412. package/netlify.toml +31 -3
  413. package/package.json +46 -29
  414. package/scripts/assemble-frontend.sh +127 -44
  415. package/scripts/assemble-functions.sh +127 -29
  416. package/scripts/boundary-check.sh +6 -2
  417. package/scripts/build-manifest.sh +24 -68
  418. package/scripts/checksum-manifest.mts +345 -0
  419. package/scripts/dev-clean.sh +86 -0
  420. package/scripts/dev-netlify.sh +49 -0
  421. package/scripts/netlify-dev-wrapper.sh +2 -0
  422. package/scripts/verify-install.ts +358 -0
  423. package/scripts/verify-integrity.sh +21 -57
  424. package/scripts/verify-manifest.mts +305 -0
  425. package/templates/project/gitignore +45 -0
  426. package/{config → templates/project}/package-lock.json +22335 -9366
  427. package/vitest.config.ts +46 -0
  428. package/.framework/public/spine.config.json +0 -91
  429. package/config/deno.lock +0 -108
  430. package/config/tsconfig.node.tsbuildinfo +0 -1
  431. package/config/tsconfig.tsbuildinfo +0 -1
  432. package/config/vite.config.d.ts +0 -2
  433. package/custom/.devin/AGENT.md +0 -357
  434. package/custom/.devin/skills/install-app/SKILL.md +0 -39
  435. package/custom/.devin/skills/spine-workbench-discovery/SKILL.md +0 -39
  436. package/custom/.devin/skills/spine-workbench-idea/SKILL.md +0 -36
  437. package/custom/.devin/skills/spine-workbench-implement/SKILL.md +0 -46
  438. package/custom/.devin/skills/spine-workbench-initiative/SKILL.md +0 -28
  439. package/custom/.devin/skills/spine-workbench-plan/SKILL.md +0 -38
  440. package/custom/.devin/workflows/app-install.yaml +0 -83
  441. package/custom/README.md +0 -79
  442. package/docs/README.md +0 -15
  443. package/scripts/app-install-cli.ts +0 -286
  444. package/scripts/check-core-integrity.sh +0 -82
  445. package/scripts/ingest-chunks.cjs +0 -202
  446. package/scripts/kb-chunk-parser.cjs +0 -312
  447. package/scripts/kb-chunk-parser.ts +0 -330
  448. package/scripts/kb-ingest-docs.ts +0 -203
  449. package/scripts/load-test-app-install.ts +0 -484
  450. package/scripts/test-login.js +0 -33
  451. package/spine.config.json +0 -91
@@ -1,25 +1,27 @@
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"]
1
+ // CIL[BEGIN stable_id="~/.framework/functions/cil-context.ts:module_header:module_header" type="module_header" identity="module_header" parent="~/.framework/functions/cil-context.ts"]
2
+ // CIL[DOC-MACRO purpose="Netlify function handler for CIL context lookup, edit-safety briefing, and post-edit next steps"]
3
+ // CIL[DOC-RESPONSIBILITY responsibility="Expose /api/cil-context endpoint that dispatches get_context, find_context, and post_edit actions"]
4
+ // CIL[DOC-CONTEXT module="functions/cil" layer="api" related_files=".framework/functions/_shared/cil.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/resolve-ids.ts"]
5
+ // CIL[DOC-CONTRACT inputs="ctx.query/body: action, stable_id, version_id, project_id, chunk_id, chunk_name, max_depth" outputs="JSON { ok, brief } or { ok, error, hint }" errors="Invalid stable_id; missing version_id or chunk_id; chunk not found; unknown action" side_effects="Reads items and links tables; resolves link type IDs"]
6
+ // CIL[DOC-MICRO logic_summary="Routes requests to buildBrief or post-edit helpers and returns a structured response" notable_decisions=""]
7
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
8
+ // CIL[DOC-STABILITY stability="experimental"]
9
+ // CIL[DOC-AUDIENCE audience="developer, ai, runtime"]
16
10
 
17
11
 
18
12
 
19
13
 
20
14
  import { createHandler } from './_shared/middleware'
21
15
  import { adminDb } from './_shared/db'
16
+ import { parseStableId } from './_shared/cil'
22
17
  import { resolveLinkTypeId } from './_shared/resolve-ids'
18
+ // CIL[DOC-VECTOR type="context" content="purpose='Netlify function handler for CIL context lookup, edit-safety briefing, and post-edit next steps'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/cil.ts"]
19
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
20
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
21
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
22
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
23
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
24
+ // CIL[END stable_id="~/.framework/functions/cil-context.ts:module_header:module_header"]
23
25
 
24
26
 
25
27
 
@@ -27,46 +29,39 @@ import { resolveLinkTypeId } from './_shared/resolve-ids'
27
29
 
28
30
 
29
31
 
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"]
32
+ // CIL[BEGIN stable_id="~/.framework/functions/cil-context.ts:getChunkById:function" type="function" identity="getChunkById" parent="~/.framework/functions/cil-context.ts"]
33
+ // CIL[DOC-MACRO purpose="Fetch a single CIL chunk row by item id"]
34
+ // CIL[DOC-RESPONSIBILITY responsibility="Return the items row for a given chunk database id"]
35
+ // CIL[DOC-CONTEXT module="functions/cil" layer="data" related_files=".framework/functions/_shared/cil.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/resolve-ids.ts,.framework/functions/cil-context.ts"]
36
+ // CIL[DOC-CONTRACT inputs="id: string" outputs="item object or null" errors="none" side_effects="Selects id, title, data from items table"]
37
+ // CIL[DOC-MICRO logic_summary="Query adminDb items by id using maybeSingle and return data" notable_decisions=""]
38
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
38
39
  // 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
40
  async function getChunkById(id: string): Promise<any | null> {
46
41
  const { data } = await adminDb.from('items').select('id, title, data')
47
42
  .eq('id', id).maybeSingle()
48
43
  return data
49
44
  }
45
+ // CIL[DOC-VECTOR type="context" content="purpose='Fetch a single CIL chunk row by item id'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/cil.ts"]
46
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
47
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
48
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
49
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
50
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
51
+ // CIL[END stable_id="~/.framework/functions/cil-context.ts:getChunkById:function"]
50
52
 
51
53
 
52
54
 
53
55
 
54
56
 
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"]
57
+ // CIL[BEGIN stable_id="~/.framework/functions/cil-context.ts:findChunkByName:function" type="function" identity="findChunkByName" parent="~/.framework/functions/cil-context.ts"]
58
+ // CIL[DOC-MACRO purpose="Find an active CIL chunk by its chunk name and optional project"]
59
+ // CIL[DOC-RESPONSIBILITY responsibility="Locate a chunk item using its chunk_name and optional project_id"]
60
+ // CIL[DOC-CONTEXT module="functions/cil" layer="data" related_files=".framework/functions/_shared/cil.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/resolve-ids.ts,.framework/functions/cil-context.ts"]
61
+ // CIL[DOC-CONTRACT inputs="name: string, projectId?: string" outputs="item object or null" errors="none" side_effects="Filters items table by kb_type, chunk_name, is_active, and optional project_id"]
62
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
63
+ // CIL[DOC-MICRO logic_summary="Build a query for cil_chunk items matching name and project, limit 1, and return data" notable_decisions=""]
63
64
  // 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
65
  async function findChunkByName(name: string, projectId?: string): Promise<any | null> {
71
66
  let q = adminDb.from('items').select('id, title, data')
72
67
  .filter('data->>kb_type', 'eq', 'cil_chunk')
@@ -76,27 +71,80 @@ async function findChunkByName(name: string, projectId?: string): Promise<any |
76
71
  const { data } = await q.limit(1).maybeSingle()
77
72
  return data
78
73
  }
74
+ // CIL[END stable_id="~/.framework/functions/cil-context.ts:findChunkByName:function"]
75
+ // CIL[DOC-VECTOR type="context" content="purpose='Find an active CIL chunk by its chunk name and optional project'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/cil.ts"]
76
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
77
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
78
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
79
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
80
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
81
+
82
+ // CIL[DOC-CONTEXT module="unknown" layer="unknown" related_files=".framework/functions/_shared/cil.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/resolve-ids.ts,.framework/functions/cil-context.ts"]
79
83
 
80
84
 
81
85
 
82
86
 
83
87
 
84
88
 
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"]
89
+ // CIL[BEGIN stable_id="~/.framework/functions/cil-context.ts:getProjectActiveVersionId:function" type="function" identity="getProjectActiveVersionId" parent="~/.framework/functions/cil-context.ts"]
90
+ // CIL[DOC-MACRO purpose="Resolve a project's currently active version id"]
91
+ // CIL[DOC-RESPONSIBILITY responsibility="Return the active_version_id stored on a project item"]
92
+ // CIL[DOC-CONTEXT module="functions/cil" layer="data" related_files=".framework/functions/_shared/cil.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/resolve-ids.ts,.framework/functions/cil-context.ts"]
93
+ // CIL[DOC-CONTRACT inputs="projectId: string" outputs="version id string or null" errors="none" side_effects="Selects from items table"]
94
+ // CIL[DOC-MICRO logic_summary="Fetch the project item and return data.active_version_id or null" notable_decisions=""]
95
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
93
96
  // 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."]
97
+ async function getProjectActiveVersionId(projectId: string): Promise<string | null> {
98
+ const { data } = await adminDb.from('items').select('id, data')
99
+ .eq('id', projectId).maybeSingle()
100
+ return data?.data?.active_version_id || null
101
+ }
102
+ // CIL[DOC-VECTOR type="context" content="purpose='Resolve a project's currently active version id'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/cil.ts"]
103
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
104
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
105
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
106
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
107
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
108
+ // CIL[END stable_id="~/.framework/functions/cil-context.ts:getProjectActiveVersionId:function"]
109
+
110
+ // CIL[BEGIN stable_id="~/.framework/functions/cil-context.ts:findChunkByStableId:function" type="function" identity="findChunkByStableId" parent="~/.framework/functions/cil-context.ts"]
111
+ // CIL[DOC-MACRO purpose="Find a CIL chunk by its stable id within a version and optional project"]
112
+ // CIL[DOC-RESPONSIBILITY responsibility="Return the active chunk matching stable_id and version_id"]
113
+ // CIL[DOC-CONTEXT module="functions/cil" layer="data" related_files=".framework/functions/_shared/cil.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/resolve-ids.ts,.framework/functions/cil-context.ts"]
114
+ // CIL[DOC-CONTRACT inputs="stableId: string, versionId: string, projectId?: string" outputs="item object or null" errors="none" side_effects="Filters items table by kb_type, stable_id, version_id, is_active, and optional project_id"]
115
+ // CIL[DOC-MICRO logic_summary="Query cil_chunk items by stable_id, version, and project, limit 1, and return data" notable_decisions=""]
116
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
117
+ // CIL[DOC-STABILITY stability="stable"]
118
+ async function findChunkByStableId(
119
+ stableId: string,
120
+ versionId: string,
121
+ projectId?: string
122
+ ): Promise<any | null> {
123
+ let q = adminDb.from('items').select('id, title, data')
124
+ .filter('data->>kb_type', 'eq', 'cil_chunk')
125
+ .filter('data->>stable_id', 'eq', stableId)
126
+ .filter('data->>version_id', 'eq', versionId)
127
+ .eq('is_active', true)
128
+ if (projectId) q = q.filter('data->>project_id', 'eq', projectId)
129
+ const { data } = await q.limit(1).maybeSingle()
130
+ return data
131
+ }
132
+ // CIL[DOC-VECTOR type="context" content="purpose='Find a CIL chunk by its stable id within a version and optional project'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/cil.ts"]
133
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
134
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
135
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
98
136
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
99
137
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
138
+ // CIL[END stable_id="~/.framework/functions/cil-context.ts:findChunkByStableId:function"]
139
+
140
+ // CIL[BEGIN stable_id="~/.framework/functions/cil-context.ts:blastRadiusBFS:function" type="function" identity="blastRadiusBFS" parent="~/.framework/functions/cil-context.ts"]
141
+ // CIL[DOC-MACRO purpose="Breadth-first search of transitive callers for a chunk"]
142
+ // CIL[DOC-RESPONSIBILITY responsibility="Collect upstream callers up to maxDepth using cil_calls links"]
143
+ // CIL[DOC-CONTEXT module="functions/cil" layer="analysis" related_files=".framework/functions/_shared/cil.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/resolve-ids.ts,.framework/functions/cil-context.ts"]
144
+ // CIL[DOC-CONTRACT inputs="chunkId: string, maxDepth: number, callsLinkTypeId: string" outputs="Array of { chunk_id, chunk_name, file_path, depth }" errors="none" side_effects="Repeatedly queries links and items tables"]
145
+ // CIL[DOC-MICRO logic_summary="Traverse caller links from target to source, tracking depth and visited set, aggregating chunk metadata" notable_decisions="Uses queue-based BFS; only follows depth hops; populates result with chunk_id, name, path, and depth"]
146
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
147
+ // CIL[DOC-STABILITY stability="stable"]
100
148
  async function blastRadiusBFS(
101
149
  chunkId: string,
102
150
  maxDepth: number,
@@ -135,27 +183,30 @@ async function blastRadiusBFS(
135
183
 
136
184
  return result
137
185
  }
186
+ // CIL[DOC-VECTOR type="context" content="purpose='Breadth-first search of transitive callers for a chunk'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/cil.ts"]
187
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
188
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
189
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
190
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
191
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
192
+ // CIL[END stable_id="~/.framework/functions/cil-context.ts:blastRadiusBFS:function"]
138
193
 
139
194
 
140
195
 
141
196
 
197
+ // CIL[DOC-STABILITY stability="internal"]
198
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
199
+ // CIL[DOC-CONTEXT module="unknown" layer="unknown" related_files=".framework/functions/_shared/cil.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/resolve-ids.ts,.framework/functions/cil-context.ts"]
142
200
 
143
201
 
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"]
202
+ // CIL[BEGIN stable_id="~/.framework/functions/cil-context.ts:getConfigDeps:function" type="function" identity="getConfigDeps" parent="~/.framework/functions/cil-context.ts"]
203
+ // CIL[DOC-MACRO purpose="Find configuration fields that target a chunk"]
204
+ // CIL[DOC-RESPONSIBILITY responsibility="Return config dependencies linked to the chunk via cil_configures"]
205
+ // CIL[DOC-CONTEXT module="functions/cil" layer="analysis" related_files=".framework/functions/_shared/cil.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/resolve-ids.ts,.framework/functions/cil-context.ts"]
206
+ // CIL[DOC-CONTRACT inputs="chunkId: string, configuresLinkTypeId: string | null" outputs="Array of { field_name, source_file, config_id }" errors="none" side_effects="Selects from links and items tables"]
207
+ // CIL[DOC-MICRO logic_summary="Fetch cil_configures links pointing to the chunk, then resolve source item metadata into config dependency records" notable_decisions=""]
208
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
152
209
  // 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
210
  async function getConfigDeps(
160
211
  chunkId: string,
161
212
  configuresLinkTypeId: string | null
@@ -180,27 +231,27 @@ async function getConfigDeps(
180
231
  }
181
232
  return results
182
233
  }
234
+ // CIL[DOC-VECTOR type="context" content="purpose='Find configuration fields that target a chunk'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/cil.ts"]
235
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
236
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
237
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
238
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
239
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
240
+ // CIL[END stable_id="~/.framework/functions/cil-context.ts:getConfigDeps:function"]
183
241
 
184
242
 
185
243
 
186
244
 
187
245
 
188
246
 
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"]
247
+ // CIL[BEGIN stable_id="~/.framework/functions/cil-context.ts:safetyVerdict:function" type="function" identity="safetyVerdict" parent="~/.framework/functions/cil-context.ts"]
248
+ // CIL[DOC-MACRO purpose="Classify edit risk for a chunk based on stability, blast radius, drift, and docs"]
249
+ // CIL[DOC-RESPONSIBILITY responsibility="Compute safe/caution/risky level and a human-readable flag list"]
250
+ // CIL[DOC-CONTEXT module="functions/cil" layer="analysis" related_files=".framework/functions/_shared/cil.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/resolve-ids.ts,.framework/functions/cil-context.ts"]
251
+ // CIL[DOC-CONTRACT inputs="chunk: any, blastRadius: any[], driftStatus: 'current' | 'stale' | 'unknown', configDeps: any[]" outputs="{ level, summary, flags }" errors="none" side_effects="none"]
252
+ // CIL[DOC-MICRO logic_summary="Collect warning flags from chunk data and derived metrics, then choose a level based on flag severity" notable_decisions="Risky if stable, high blast radius, or stale; caution otherwise; safe when no flags"]
253
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
197
254
  // 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
255
  function safetyVerdict(
205
256
  chunk: any,
206
257
  blastRadius: any[],
@@ -231,26 +282,26 @@ function safetyVerdict(
231
282
 
232
283
  return { level, summary, flags }
233
284
  }
285
+ // CIL[DOC-VECTOR type="context" content="purpose='Classify edit risk for a chunk based on stability, blast radius, drift, and docs'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/cil.ts"]
286
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
287
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
288
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
289
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
290
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
291
+ // CIL[END stable_id="~/.framework/functions/cil-context.ts:safetyVerdict:function"]
234
292
 
235
293
 
236
294
 
237
295
 
238
296
 
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"]
297
+ // CIL[BEGIN stable_id="~/.framework/functions/cil-context.ts:buildBrief:function" type="function" identity="buildBrief" parent="~/.framework/functions/cil-context.ts"]
298
+ // CIL[DOC-MACRO purpose="Assemble a complete context brief for a CIL chunk"]
299
+ // CIL[DOC-RESPONSIBILITY responsibility="Return contract, hash status, blast radius, calls, tests, config deps, and edit safety verdict"]
300
+ // CIL[DOC-CONTEXT module="functions/cil" layer="analysis" related_files=".framework/functions/_shared/cil.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/resolve-ids.ts,.framework/functions/cil-context.ts"]
301
+ // CIL[DOC-CONTRACT inputs="chunk: any, maxBlastDepth = 4" outputs="Record<string, any> brief" errors="Resolves link type ids with catch-to-null; drift status defaults to unknown" side_effects="Queries links and items tables multiple times"]
302
+ // CIL[DOC-MICRO logic_summary="Resolve call/test/configure link type IDs, run blast radius BFS, gather callees and test paths, load config dependencies, derive drift status, and compute safety verdict" notable_decisions="Falls back to stored test_unit_path and test_e2e_path when no test links exist; drift status is not currently computed from a hash comparison"]
303
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
304
+ // CIL[DOC-STABILITY stability="experimental"]
254
305
  async function buildBrief(chunk: any, maxBlastDepth = 4): Promise<Record<string, any>> {
255
306
  const d = chunk.data || {}
256
307
 
@@ -306,6 +357,7 @@ async function buildBrief(chunk: any, maxBlastDepth = 4): Promise<Record<string,
306
357
  return {
307
358
  chunk_id: chunk.id,
308
359
  chunk_name: d.chunk_name || '',
360
+ stable_id: d.stable_id || null,
309
361
  file_path: d.file_path || '',
310
362
  line_start: d.line_start || null,
311
363
  line_end: d.line_end || null,
@@ -348,36 +400,48 @@ async function buildBrief(chunk: any, maxBlastDepth = 4): Promise<Record<string,
348
400
  edit_safety: verdict,
349
401
  }
350
402
  }
403
+ // CIL[DOC-VECTOR type="context" content="purpose='Assemble a complete context brief for a CIL chunk'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/cil.ts"]
404
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
405
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
406
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
407
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
408
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
409
+ // CIL[END stable_id="~/.framework/functions/cil-context.ts:buildBrief:function"]
351
410
 
352
411
 
353
412
 
354
413
 
355
414
 
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"]
415
+ // CIL[BEGIN stable_id="~/.framework/functions/cil-context.ts:handler:constant" type="constant" identity="handler" parent="~/.framework/functions/cil-context.ts"]
416
+ // CIL[DOC-MACRO purpose="createHandler wrapper dispatching cil-context API actions"]
417
+ // CIL[DOC-RESPONSIBILITY responsibility="Validate input and call find or build helpers for get_context, find_context, and post_edit"]
418
+ // CIL[DOC-CONTEXT module="functions/cil" layer="api" related_files=".framework/functions/_shared/cil.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/resolve-ids.ts,.framework/functions/cil-context.ts"]
419
+ // CIL[DOC-CONTRACT inputs="ctx and body from createHandler" outputs="JSON response for the selected action" errors="Throws on missing/invalid params or unknown action" side_effects="Calls buildBrief and database helpers"]
420
+ // CIL[DOC-MICRO logic_summary="Select action from query/body, resolve chunk by stable_id, name, or chunk_id, then build and return the brief or post-edit instructions" notable_decisions="get_context requires stable_id or chunk_id; find_context requires stable_id or chunk_name; post_edit requires chunk_id"]
421
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
422
+ // CIL[DOC-STABILITY stability="experimental"]
371
423
  export const handler = createHandler(async (ctx, body) => {
372
424
  const action = ctx.query?.action || 'get_context'
373
425
 
374
426
 
375
427
  if (action === 'get_context') {
428
+ const stableId = ctx.query?.stable_id || body?.stable_id
429
+ const versionId = ctx.query?.version_id || body?.version_id
430
+ const projectId = ctx.query?.project_id || body?.project_id
376
431
  const chunkId = ctx.query?.chunk_id || body?.chunk_id
377
- if (!chunkId) throw new Error('chunk_id is required')
378
432
 
379
- const chunk = await getChunkById(chunkId)
380
- if (!chunk) throw new Error(`Chunk not found: ${chunkId}`)
433
+ let chunk: any | null = null
434
+ if (stableId) {
435
+ if (!parseStableId(stableId)) throw new Error('Invalid stable_id format')
436
+ const effectiveVersionId = versionId || (projectId ? await getProjectActiveVersionId(projectId) : undefined)
437
+ if (!effectiveVersionId) throw new Error('version_id or project_id required when using stable_id')
438
+ chunk = await findChunkByStableId(stableId, effectiveVersionId, projectId)
439
+ if (!chunk) throw new Error(`Chunk not found: stable_id=${stableId}, version_id=${effectiveVersionId}`)
440
+ } else {
441
+ if (!chunkId) throw new Error('chunk_id is required')
442
+ chunk = await getChunkById(chunkId)
443
+ if (!chunk) throw new Error(`Chunk not found: ${chunkId}`)
444
+ }
381
445
 
382
446
  const maxDepth = parseInt(ctx.query?.max_depth || body?.max_depth || '4', 10)
383
447
  const brief = await buildBrief(chunk, maxDepth)
@@ -387,16 +451,33 @@ export const handler = createHandler(async (ctx, body) => {
387
451
 
388
452
 
389
453
  if (action === 'find_context') {
390
- const chunkName = ctx.query?.chunk_name || body?.chunk_name
454
+ const stableId = ctx.query?.stable_id || body?.stable_id
455
+ const versionId = ctx.query?.version_id || body?.version_id
391
456
  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',
457
+ const chunkName = ctx.query?.chunk_name || body?.chunk_name
458
+
459
+ let chunk: any | null = null
460
+ if (stableId) {
461
+ if (!parseStableId(stableId)) throw new Error('Invalid stable_id format')
462
+ const effectiveVersionId = versionId || (projectId ? await getProjectActiveVersionId(projectId) : undefined)
463
+ if (!effectiveVersionId) throw new Error('version_id or project_id required when using stable_id')
464
+ chunk = await findChunkByStableId(stableId, effectiveVersionId, projectId)
465
+ if (!chunk) {
466
+ return {
467
+ ok: false,
468
+ error: `No chunk with stable_id "${stableId}" found for version ${effectiveVersionId}`,
469
+ hint: 'Use custom_cil-graph?action=search to find chunks by description',
470
+ }
471
+ }
472
+ } else {
473
+ if (!chunkName) throw new Error('chunk_name is required')
474
+ chunk = await findChunkByName(chunkName, projectId)
475
+ if (!chunk) {
476
+ return {
477
+ ok: false,
478
+ error: `No chunk named "${chunkName}" found${projectId ? ` in project ${projectId}` : ''}`,
479
+ hint: 'Use custom_cil-graph?action=search to find chunks by description',
480
+ }
400
481
  }
401
482
  }
402
483
 
@@ -423,6 +504,7 @@ export const handler = createHandler(async (ctx, body) => {
423
504
  ok: true,
424
505
  chunk_id: chunkId,
425
506
  chunk_name: d.chunk_name || '',
507
+ stable_id: d.stable_id || null,
426
508
  file_path: d.file_path || '',
427
509
  stored_hash: d.stored_hash || null,
428
510
  hash_updated_at: d.hash_updated_at || null,
@@ -439,7 +521,12 @@ export const handler = createHandler(async (ctx, body) => {
439
521
 
440
522
  throw new Error(`Unknown action: ${action}. Valid: get_context, find_context, post_edit`)
441
523
  })
524
+ // CIL[DOC-VECTOR type="context" content="purpose='createHandler wrapper dispatching cil-context API actions'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/cil.ts"]
525
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
526
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
527
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
528
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
529
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
530
+ // CIL[END stable_id="~/.framework/functions/cil-context.ts:handler:constant"]
442
531
 
443
532
 
444
-
445
- // CIL[END chunk_id="custom_apps_cortex_functions_custom_cil_context_handler_1784235266"]