spine-framework 0.3.145 → 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 +15 -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,31 +1,226 @@
1
-
2
-
3
-
4
-
5
-
6
-
7
-
8
-
9
-
10
-
11
-
12
-
13
-
14
-
1
+ // CIL[BEGIN stable_id="~/.framework/functions/_shared/cil.ts:module_header:module_header" type="module_header" identity="module_header" parent="~/.framework/functions/_shared/cil.ts"]
2
+ // CIL[DOC-AUDIENCE audience="cil-pipeline, framework-developers"]
3
+ // CIL[DOC-MACRO purpose="Shared CIL utilities for stable IDs, content hashing, and file tree operations"]
4
+ // CIL[DOC-RESPONSIBILITY responsibility="Provide reusable helpers for the CIL pipeline across the framework"]
5
+ // CIL[DOC-CONTEXT module="functions/_shared/cil" layer="shared" related_files=".framework/functions/_shared/db.ts"]
6
+ // CIL[DOC-CONTRACT inputs="none" outputs="module exports" errors="none" side_effects="none"]
7
+ // CIL[DOC-MICRO logic_summary="Imports adminDb and crypto; re-exports helper functions and types" notable_decisions="Uses Node crypto for SHA-256 content hashing"]
8
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
9
+ // CIL[DOC-STABILITY stable]
15
10
 
16
11
  import { adminDb } from './db'
17
-
12
+ import * as crypto from 'crypto'
13
+ // CIL[DOC-VECTOR type="context" content="purpose='Shared CIL utilities for stable IDs, content hashing, and file tree operations'; No verified external callers; imports: .framework/functions/_shared/db.ts"]
14
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
15
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
16
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
17
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
18
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
19
+ // CIL[END stable_id="~/.framework/functions/_shared/cil.ts:module_header:module_header"]
20
+
21
+ // CIL[BEGIN stable_id="~/.framework/functions/_shared/cil.ts:STABLE_ID_PREFIX:constant" type="constant" identity="STABLE_ID_PREFIX" parent="~/.framework/functions/_shared/cil.ts"]
22
+ // CIL[DOC-MACRO purpose="Define the prefix used for canonical file paths"]
23
+ // CIL[DOC-RESPONSIBILITY responsibility="Hold the constant tilde prefix used by stable ID and path helpers"]
24
+ // CIL[DOC-STABILITY stability="internal"]
25
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
26
+ // CIL[DOC-CONTEXT module="functions/_shared/cil" layer="shared" related_files=".framework/functions/_shared/cil.ts,.framework/functions/_shared/db.ts"]
27
+ // CIL[DOC-CONTRACT inputs="none" outputs="string constant STABLE_ID_PREFIX" errors="none" side_effects="none"]
28
+ // CIL[DOC-MICRO logic_summary="Exports a single string literal '~'" notable_decisions=""]
29
+ export const STABLE_ID_PREFIX = '~'
30
+ // CIL[END stable_id="~/.framework/functions/_shared/cil.ts:STABLE_ID_PREFIX:constant"]
31
+
32
+ // CIL[DOC-VECTOR type="context" content="purpose='Define the prefix used for canonical file paths'; No verified external callers; imports: .framework/functions/_shared/db.ts"]
33
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
34
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
35
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
36
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
37
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
38
+ // CIL[BEGIN stable_id="~/.framework/functions/_shared/cil.ts:FileStatus:type" type="type" identity="FileStatus" parent="~/.framework/functions/_shared/cil.ts"]
39
+ // CIL[DOC-MACRO purpose="Enumerate the CIL processing pipeline stages for a file"]
40
+ // CIL[DOC-RESPONSIBILITY responsibility="Type the ordered file lifecycle statuses"]
41
+ // CIL[DOC-CONTEXT module="functions/_shared/cil" layer="shared" related_files=".framework/functions/_shared/cil.ts,.framework/functions/_shared/db.ts"]
42
+ // CIL[DOC-CONTRACT inputs="none" outputs="FileStatus union type" errors="none" side_effects="none"]
43
+ // CIL[DOC-MICRO logic_summary="String-literal union from 0-discovered to 8-published" notable_decisions=""]
44
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
45
+ // CIL[DOC-STABILITY stable]
18
46
  export type FileStatus =
19
47
  | '0-discovered'
20
48
  | '1-selected'
21
49
  | '2-chunked'
22
- | '3-first-pass-complete'
23
- | '4-first-pass-embedded'
24
- | '5-first-pass-mapped'
25
- | '6-second-pass-complete'
26
- | '7-second-pass-embedded'
27
- | '8-second-pass-mapped'
28
-
50
+ | '3-documented'
51
+ | '4-chunk-validated'
52
+ | '5-doc-validated'
53
+ | '6-enriched'
54
+ | '7-embedded-mapped'
55
+ | '8-published'
56
+ // CIL[DOC-VECTOR type="context" content="purpose='Enumerate the CIL processing pipeline stages for a file'; No verified external callers; imports: .framework/functions/_shared/db.ts"]
57
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
58
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
59
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
60
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
61
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
62
+ // CIL[END stable_id="~/.framework/functions/_shared/cil.ts:FileStatus:type"]
63
+
64
+ // CIL[BEGIN stable_id="~/.framework/functions/_shared/cil.ts:PIPELINE_STATUS_RANK:constant" type="constant" identity="PIPELINE_STATUS_RANK" parent="~/.framework/functions/_shared/cil.ts"]
65
+ // CIL[DOC-MACRO purpose="Map each FileStatus to a numeric rank for ordering and comparison"]
66
+ // CIL[DOC-RESPONSIBILITY responsibility="Provide a lookup table from status string to rank"]
67
+ // CIL[DOC-STABILITY stability="internal"]
68
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
69
+ // CIL[DOC-CONTEXT module="functions/_shared/cil" layer="shared" related_files=".framework/functions/_shared/cil.ts,.framework/functions/_shared/db.ts"]
70
+ // CIL[DOC-CONTRACT inputs="none" outputs="Record<string, number>" errors="none" side_effects="none"]
71
+ // CIL[DOC-MICRO logic_summary="Object literal mapping status strings to 0-8" notable_decisions=""]
72
+ export const PIPELINE_STATUS_RANK: Record<string, number> = {
73
+ '0-discovered': 0,
74
+ '1-selected': 1,
75
+ '2-chunked': 2,
76
+ '3-documented': 3,
77
+ '4-chunk-validated': 4,
78
+ '5-doc-validated': 5,
79
+ '6-enriched': 6,
80
+ '7-embedded-mapped': 7,
81
+ '8-published': 8,
82
+ }
83
+ // CIL[END stable_id="~/.framework/functions/_shared/cil.ts:PIPELINE_STATUS_RANK:constant"]
84
+
85
+ // CIL[DOC-VECTOR type="context" content="purpose='Map each FileStatus to a numeric rank for ordering and comparison'; No verified external callers; imports: .framework/functions/_shared/db.ts"]
86
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
87
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
88
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
89
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
90
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
91
+ // CIL[DOC-STABILITY stability="internal"]
92
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
93
+ // CIL[DOC-CONTEXT module="unknown" layer="unknown" related_files=".framework/functions/_shared/cil.ts,.framework/functions/_shared/db.ts"]
94
+ // CIL[BEGIN stable_id="~/.framework/functions/_shared/cil.ts:pipelineRank:function" type="function" identity="pipelineRank" parent="~/.framework/functions/_shared/cil.ts"]
95
+ // CIL[DOC-MACRO purpose="Return the numeric rank for a given status string"]
96
+ // CIL[DOC-RESPONSIBILITY responsibility="Convert a status into its rank, defaulting to 0"]
97
+ // CIL[DOC-CONTEXT module="functions/_shared/cil" layer="shared" related_files=".framework/functions/_shared/cil.ts,.framework/functions/_shared/db.ts"]
98
+ // CIL[DOC-CONTRACT inputs="status: string | undefined" outputs="number" errors="none" side_effects="none"]
99
+ // CIL[DOC-MICRO logic_summary="Returns rank if status exists and is in map, otherwise 0" notable_decisions=""]
100
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
101
+ // CIL[DOC-STABILITY stable]
102
+ export function pipelineRank(status: string | undefined): number {
103
+ return status ? PIPELINE_STATUS_RANK[status] || 0 : 0
104
+ }
105
+ // CIL[DOC-VECTOR type="context" content="purpose='Return the numeric rank for a given status string'; No verified external callers; imports: .framework/functions/_shared/db.ts"]
106
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
107
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
108
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
109
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
110
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
111
+ // CIL[END stable_id="~/.framework/functions/_shared/cil.ts:pipelineRank:function"]
112
+
113
+ // CIL[BEGIN stable_id="~/.framework/functions/_shared/cil.ts:toCanonicalPath:function" type="function" identity="toCanonicalPath" parent="~/.framework/functions/_shared/cil.ts"]
114
+ // CIL[DOC-MACRO purpose="Convert an absolute file path into a canonical '~/' path"]
115
+ // CIL[DOC-RESPONSIBILITY responsibility="Normalize and prefix a repository-relative path"]
116
+ // CIL[DOC-CONTEXT module="functions/_shared/cil" layer="shared" related_files=".framework/functions/_shared/cil.ts,.framework/functions/_shared/db.ts"]
117
+ // CIL[DOC-CONTRACT inputs="repoRoot: string, absolutePath: string" outputs="canonical path string" errors="none" side_effects="none"]
118
+ // CIL[DOC-MICRO logic_summary="Strips repo root, backslashes, leading slashes, then prefixes with '~'" notable_decisions="Handles empty relative path as '~/'"]
119
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
120
+ // CIL[DOC-STABILITY stable]
121
+ export function toCanonicalPath(repoRoot: string, absolutePath: string): string {
122
+ const rel = absolutePath.startsWith(repoRoot) ? absolutePath.slice(repoRoot.length) : absolutePath
123
+ const normalized = rel.replace(/\\/g, '/').replace(/^\/+/, '')
124
+ return normalized ? `${STABLE_ID_PREFIX}/${normalized}` : `${STABLE_ID_PREFIX}/`
125
+ }
126
+ // CIL[DOC-VECTOR type="context" content="purpose='Convert an absolute file path into a canonical '~/' path'; No verified external callers; imports: .framework/functions/_shared/db.ts"]
127
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
128
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
129
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
130
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
131
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
132
+ // CIL[END stable_id="~/.framework/functions/_shared/cil.ts:toCanonicalPath:function"]
133
+
134
+ // CIL[BEGIN stable_id="~/.framework/functions/_shared/cil.ts:generateStableId:function" type="function" identity="generateStableId" parent="~/.framework/functions/_shared/cil.ts"]
135
+ // CIL[DOC-MACRO purpose="Build a stable ID from canonical path, identity and type"]
136
+ // CIL[DOC-RESPONSIBILITY responsibility="Concatenate path, identity and type into a colon-delimited stable ID"]
137
+ // CIL[DOC-CONTEXT module="functions/_shared/cil" layer="shared" related_files=".framework/functions/_shared/cil.ts,.framework/functions/_shared/db.ts"]
138
+ // CIL[DOC-CONTRACT inputs="canonicalPath: string, identity: string, type: string" outputs="stable id string" errors="none" side_effects="none"]
139
+ // CIL[DOC-MICRO logic_summary="Returns template literal `${canonicalPath}:${identity}:${type}`" notable_decisions=""]
140
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
141
+ // CIL[DOC-STABILITY stable]
142
+ export function generateStableId(canonicalPath: string, identity: string, type: string): string {
143
+ return `${canonicalPath}:${identity}:${type}`
144
+ }
145
+ // CIL[DOC-VECTOR type="context" content="purpose='Build a stable ID from canonical path, identity and type'; No verified external callers; imports: .framework/functions/_shared/db.ts"]
146
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
147
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
148
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
149
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
150
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
151
+ // CIL[END stable_id="~/.framework/functions/_shared/cil.ts:generateStableId:function"]
152
+
153
+ // CIL[BEGIN stable_id="~/.framework/functions/_shared/cil.ts:parseStableId:function" type="function" identity="parseStableId" parent="~/.framework/functions/_shared/cil.ts"]
154
+ // CIL[DOC-MACRO purpose="Split a stable ID into its path, identity and type components"]
155
+ // CIL[DOC-RESPONSIBILITY responsibility="Parse colon-delimited stable IDs or return null for invalid inputs"]
156
+ // CIL[DOC-CONTEXT module="functions/_shared/cil" layer="shared" related_files=".framework/functions/_shared/cil.ts,.framework/functions/_shared/db.ts"]
157
+ // CIL[DOC-CONTRACT inputs="stableId: string" outputs="{ canonicalPath, identity, type } | null" errors="none" side_effects="none"]
158
+ // CIL[DOC-MICRO logic_summary="Splits on ':', pops last two parts as type and identity, joins remainder" notable_decisions=""]
159
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
160
+ // CIL[DOC-STABILITY stable]
161
+ export function parseStableId(stableId: string): { canonicalPath: string; identity: string; type: string } | null {
162
+ const parts = stableId.split(':')
163
+ if (parts.length < 3) return null
164
+ const type = parts.pop()!
165
+ const identity = parts.pop()!
166
+ const canonicalPath = parts.join(':')
167
+ return { canonicalPath, identity, type }
168
+ }
169
+ // CIL[DOC-VECTOR type="context" content="purpose='Split a stable ID into its path, identity and type components'; No verified external callers; imports: .framework/functions/_shared/db.ts"]
170
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
171
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
172
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
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
+ // CIL[END stable_id="~/.framework/functions/_shared/cil.ts:parseStableId:function"]
176
+
177
+ // CIL[BEGIN stable_id="~/.framework/functions/_shared/cil.ts:computeContentHash:function" type="function" identity="computeContentHash" parent="~/.framework/functions/_shared/cil.ts"]
178
+ // CIL[DOC-MACRO purpose="Compute a 32-character SHA-256 hash of code content ignoring CIL markers and whitespace"]
179
+ // CIL[DOC-RESPONSIBILITY responsibility="Produce a deterministic short hash for chunk content comparison"]
180
+ // CIL[DOC-CONTEXT module="functions/_shared/cil" layer="shared" related_files=".framework/functions/_shared/cil.ts,.framework/functions/_shared/db.ts"]
181
+ // CIL[DOC-CONTRACT inputs="raw: string" outputs="32-char hex string" errors="none" side_effects="none"]
182
+ // CIL[DOC-MICRO logic_summary="Normalises line endings, filters CIL and blank lines, collapses blanks, SHA-256 then slice(0,32)" notable_decisions="CIL marker and doc lines are excluded from hash"]
183
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
184
+ // CIL[DOC-STABILITY stable]
185
+ export function computeContentHash(raw: string): string {
186
+ const lines = raw.replace(/\r\n/g, '\n').split('\n')
187
+ const filtered = lines.filter(line => {
188
+ const trimmed = line.trim()
189
+ return !trimmed.match(/^\/\/\s*CIL\[(BEGIN|END)/) &&
190
+ !trimmed.match(/^\/\*\*?\s*CIL\[(BEGIN|END)/) &&
191
+ !trimmed.match(/^\/\/\s*CIL\[DOC-/) &&
192
+ !trimmed.match(/^\/\*\*?\s*CIL\[DOC-/) &&
193
+ !trimmed.match(/^<!--\s*CIL\[(BEGIN|END)/) &&
194
+ !trimmed.match(/^<!--\s*CIL\[DOC-/) &&
195
+ !trimmed.match(/^#\s*CIL\[(BEGIN|END|DOC-)/)
196
+ })
197
+ const collapsed: string[] = []
198
+ let lastBlank = false
199
+ for (const line of filtered) {
200
+ const isBlank = line.trim() === ''
201
+ if (isBlank && lastBlank) continue
202
+ collapsed.push(line)
203
+ lastBlank = isBlank
204
+ }
205
+ const normalised = collapsed.join('\n').trim()
206
+ return crypto.createHash('sha256').update(normalised).digest('hex').slice(0, 32)
207
+ }
208
+ // CIL[END stable_id="~/.framework/functions/_shared/cil.ts:computeContentHash:function"]
209
+
210
+ // CIL[BEGIN stable_id="~/.framework/functions/_shared/cil.ts:FileTreeNode:interface" type="interface" identity="FileTreeNode" parent="~/.framework/functions/_shared/cil.ts"]
211
+ // CIL[DOC-VECTOR type="context" content="purpose='Compute a 32-character SHA-256 hash of code content ignoring CIL markers and whitespace'; No verified external callers; imports: .framework/functions/_shared/db.ts"]
212
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
213
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
214
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
215
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
216
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
217
+ // CIL[DOC-MACRO purpose="Define the recursive file tree node structure"]
218
+ // CIL[DOC-RESPONSIBILITY responsibility="Type file and directory nodes with status, language and children"]
219
+ // CIL[DOC-CONTEXT module="functions/_shared/cil" layer="shared" related_files=".framework/functions/_shared/cil.ts,.framework/functions/_shared/db.ts"]
220
+ // CIL[DOC-CONTRACT inputs="none" outputs="FileTreeNode interface" errors="none" side_effects="none"]
221
+ // CIL[DOC-MICRO logic_summary="Optional id, required name/path/type, optional extension, language, status, children, selected" notable_decisions=""]
222
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
223
+ // CIL[DOC-STABILITY stable]
29
224
  export interface FileTreeNode {
30
225
  id?: string | null
31
226
  name: string
@@ -37,21 +232,22 @@ export interface FileTreeNode {
37
232
  children?: FileTreeNode[]
38
233
  selected?: boolean
39
234
  }
40
-
41
-
42
-
43
-
44
-
45
-
46
-
47
-
48
-
49
-
50
-
51
-
52
-
53
-
54
-
235
+ // CIL[DOC-VECTOR type="context" content="purpose='Define the recursive file tree node structure'; No verified external callers; imports: .framework/functions/_shared/db.ts"]
236
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
237
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
238
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
239
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
240
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
241
+ // CIL[END stable_id="~/.framework/functions/_shared/cil.ts:FileTreeNode:interface"]
242
+
243
+ // CIL[BEGIN stable_id="~/.framework/functions/_shared/cil.ts:isSelectedPath:function" type="function" identity="isSelectedPath" parent="~/.framework/functions/_shared/cil.ts"]
244
+ // CIL[DOC-MACRO purpose="Check if a file path matches a set of selected paths"]
245
+ // CIL[DOC-RESPONSIBILITY responsibility="Determine inclusion of a path under selection rules"]
246
+ // CIL[DOC-CONTEXT module="functions/_shared/cil" layer="shared" related_files=".framework/functions/_shared/cil.ts,.framework/functions/_shared/db.ts"]
247
+ // CIL[DOC-CONTRACT inputs="filePath: string, selectedPaths: string[]" outputs="boolean" errors="none" side_effects="none"]
248
+ // CIL[DOC-MICRO logic_summary="Empty selection means include all; matches exact path or a path prefix ending with '/'" notable_decisions=""]
249
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
250
+ // CIL[DOC-STABILITY stable]
55
251
  export function isSelectedPath(filePath: string, selectedPaths: string[]): boolean {
56
252
  if (selectedPaths.length === 0) return true
57
253
  return selectedPaths.some(sp => {
@@ -60,39 +256,41 @@ export function isSelectedPath(filePath: string, selectedPaths: string[]): boole
60
256
  return filePath.startsWith(sp + '/')
61
257
  })
62
258
  }
63
-
64
-
65
-
66
-
67
-
68
-
69
-
70
-
71
-
72
-
73
-
74
-
75
-
76
-
77
-
259
+ // CIL[DOC-VECTOR type="context" content="purpose='Check if a file path matches a set of selected paths'; No verified external callers; imports: .framework/functions/_shared/db.ts"]
260
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
261
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
262
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
263
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
264
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
265
+ // CIL[END stable_id="~/.framework/functions/_shared/cil.ts:isSelectedPath:function"]
266
+
267
+ // CIL[BEGIN stable_id="~/.framework/functions/_shared/cil.ts:getFileStatus:function" type="function" identity="getFileStatus" parent="~/.framework/functions/_shared/cil.ts"]
268
+ // CIL[DOC-MACRO purpose="Extract the CIL status from a file item record"]
269
+ // CIL[DOC-RESPONSIBILITY responsibility="Return the status stored in item.data or a default discovered value"]
270
+ // CIL[DOC-CONTEXT module="functions/_shared/cil" layer="shared" related_files=".framework/functions/_shared/cil.ts,.framework/functions/_shared/db.ts"]
271
+ // CIL[DOC-CONTRACT inputs="fileItem: any" outputs="FileStatus" errors="none" side_effects="none"]
272
+ // CIL[DOC-MICRO logic_summary="Returns fileItem.data?.status or '0-discovered'" notable_decisions=""]
273
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
274
+ // CIL[DOC-STABILITY stable]
78
275
  export function getFileStatus(fileItem: any): FileStatus {
79
276
  return fileItem.data?.status || '0-discovered'
80
277
  }
81
-
82
-
83
-
84
-
85
-
86
-
87
-
88
-
89
-
90
-
91
-
92
-
93
-
94
-
95
-
278
+ // CIL[DOC-VECTOR type="context" content="purpose='Extract the CIL status from a file item record'; No verified external callers; imports: .framework/functions/_shared/db.ts"]
279
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
280
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
281
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
282
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
283
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
284
+ // CIL[END stable_id="~/.framework/functions/_shared/cil.ts:getFileStatus:function"]
285
+
286
+ // CIL[BEGIN stable_id="~/.framework/functions/_shared/cil.ts:updateFileStatus:function" type="function" identity="updateFileStatus" parent="~/.framework/functions/_shared/cil.ts"]
287
+ // CIL[DOC-MACRO purpose="Persist an updated CIL status and extra data for a file item"]
288
+ // CIL[DOC-RESPONSIBILITY responsibility="Write the new status and timestamp to the items table"]
289
+ // CIL[DOC-CONTEXT module="functions/_shared/cil" layer="shared" related_files=".framework/functions/_shared/cil.ts,.framework/functions/_shared/db.ts"]
290
+ // CIL[DOC-CONTRACT inputs="_ctx: any, fileItem: any, status: FileStatus, extraData: Record<string, any>" outputs="Promise<void>" errors="database errors" side_effects="updates items row"]
291
+ // CIL[DOC-MICRO logic_summary="Merges fileItem.data and extraData, sets status and last_status_at, then adminDb update by id" notable_decisions=""]
292
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
293
+ // CIL[DOC-STABILITY stable]
96
294
  export async function updateFileStatus(_ctx: any, fileItem: any, status: FileStatus, extraData: Record<string, any> = {}): Promise<void> {
97
295
  await adminDb
98
296
  .from('items')
@@ -106,21 +304,22 @@ export async function updateFileStatus(_ctx: any, fileItem: any, status: FileSta
106
304
  })
107
305
  .eq('id', fileItem.id)
108
306
  }
109
-
110
-
111
-
112
-
113
-
114
-
115
-
116
-
117
-
118
-
119
-
120
-
121
-
122
-
123
-
307
+ // CIL[DOC-VECTOR type="context" content="purpose='Persist an updated CIL status and extra data for a file item'; No verified external callers; imports: .framework/functions/_shared/db.ts"]
308
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
309
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
310
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
311
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
312
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
313
+ // CIL[END stable_id="~/.framework/functions/_shared/cil.ts:updateFileStatus:function"]
314
+
315
+ // CIL[BEGIN stable_id="~/.framework/functions/_shared/cil.ts:buildFileTree:function" type="function" identity="buildFileTree" parent="~/.framework/functions/_shared/cil.ts"]
316
+ // CIL[DOC-MACRO purpose="Construct a hierarchical file tree from flat file records"]
317
+ // CIL[DOC-RESPONSIBILITY responsibility="Group file records into directories and files as a tree"]
318
+ // CIL[DOC-CONTEXT module="functions/_shared/cil" layer="shared" related_files=".framework/functions/_shared/cil.ts,.framework/functions/_shared/db.ts"]
319
+ // CIL[DOC-CONTRACT inputs="fileRecords: { file_path, id?, language, status?, extension }[]" outputs="FileTreeNode" errors="none" side_effects="none"]
320
+ // CIL[DOC-MICRO logic_summary="Creates root, splits paths by '/', builds nested children, attaches file metadata to leaf nodes" notable_decisions=""]
321
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
322
+ // CIL[DOC-STABILITY stable]
124
323
  export function buildFileTree(fileRecords: { file_path: string; id?: string; language: string; status?: FileStatus; extension: string }[]): FileTreeNode {
125
324
  const root: FileTreeNode = { name: 'root', path: '', type: 'directory', children: [] }
126
325
 
@@ -155,21 +354,22 @@ export function buildFileTree(fileRecords: { file_path: string; id?: string; lan
155
354
 
156
355
  return root
157
356
  }
158
-
159
-
160
-
161
-
162
-
163
-
164
-
165
-
166
-
167
-
168
-
169
-
170
-
171
-
172
-
357
+ // CIL[DOC-VECTOR type="context" content="purpose='Construct a hierarchical file tree from flat file records'; No verified external callers; imports: .framework/functions/_shared/db.ts"]
358
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
359
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
360
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
361
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
362
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
363
+ // CIL[END stable_id="~/.framework/functions/_shared/cil.ts:buildFileTree:function"]
364
+
365
+ // CIL[BEGIN stable_id="~/.framework/functions/_shared/cil.ts:updateTreeNodeStatus:function" type="function" identity="updateTreeNodeStatus" parent="~/.framework/functions/_shared/cil.ts"]
366
+ // CIL[DOC-MACRO purpose="Recursively set the status of a tree node by file id"]
367
+ // CIL[DOC-STABILITY stability="internal"]
368
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
369
+ // CIL[DOC-CONTEXT module="cil" layer="functions" related_files=".framework/functions/_shared/cil.ts,.framework/functions/_shared/db.ts"]
370
+ // CIL[DOC-RESPONSIBILITY responsibility="Find a node with matching id and update its status"]
371
+ // CIL[DOC-CONTRACT inputs="tree: FileTreeNode, fileId: string, status: FileStatus" outputs="void" errors="none" side_effects="mutates tree.status"]
372
+ // CIL[DOC-MICRO logic_summary="Sets status if tree.id matches, otherwise recurses over children" notable_decisions=""]
173
373
  export function updateTreeNodeStatus(tree: FileTreeNode, fileId: string, status: FileStatus): void {
174
374
  if (tree.id === fileId) {
175
375
  tree.status = status
@@ -181,21 +381,22 @@ export function updateTreeNodeStatus(tree: FileTreeNode, fileId: string, status:
181
381
  }
182
382
  }
183
383
  }
184
-
185
-
186
-
187
-
188
-
189
-
190
-
191
-
192
-
193
-
194
-
195
-
196
-
197
-
198
-
384
+ // CIL[END stable_id="~/.framework/functions/_shared/cil.ts:updateTreeNodeStatus:function"]
385
+
386
+ // CIL[BEGIN stable_id="~/.framework/functions/_shared/cil.ts:updateTreeNodeByPath:function" type="function" identity="updateTreeNodeByPath" parent="~/.framework/functions/_shared/cil.ts"]
387
+ // CIL[DOC-VECTOR type="context" content="purpose='Recursively set the status of a tree node by file id'; No verified external callers; imports: .framework/functions/_shared/db.ts"]
388
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
389
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
390
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
391
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
392
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
393
+ // CIL[DOC-MACRO purpose="Update id and status of a file node by its path"]
394
+ // CIL[DOC-RESPONSIBILITY responsibility="Locate a file node by exact path and apply updates"]
395
+ // CIL[DOC-CONTEXT module="functions/_shared/cil" layer="shared" related_files=".framework/functions/_shared/cil.ts,.framework/functions/_shared/db.ts"]
396
+ // CIL[DOC-CONTRACT inputs="tree: FileTreeNode, filePath: string, updates: { id?, status? }" outputs="void" errors="none" side_effects="mutates matching tree node fields"]
397
+ // CIL[DOC-MICRO logic_summary="If file node path matches, assigns id and status from updates, then recurses children" notable_decisions=""]
398
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
399
+ // CIL[DOC-STABILITY stable]
199
400
  export function updateTreeNodeByPath(tree: FileTreeNode, filePath: string, updates: { id?: string; status?: FileStatus }): void {
200
401
  if (tree.type === 'file' && tree.path === filePath) {
201
402
  if (updates.id !== undefined) tree.id = updates.id
@@ -208,21 +409,22 @@ export function updateTreeNodeByPath(tree: FileTreeNode, filePath: string, updat
208
409
  }
209
410
  }
210
411
  }
211
-
212
-
213
-
214
-
215
-
216
-
217
-
218
-
219
-
220
-
221
-
222
-
223
-
224
-
225
-
412
+ // CIL[DOC-VECTOR type="context" content="purpose='Update id and status of a file node by its path'; No verified external callers; imports: .framework/functions/_shared/db.ts"]
413
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
414
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
415
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
416
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
417
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
418
+ // CIL[END stable_id="~/.framework/functions/_shared/cil.ts:updateTreeNodeByPath:function"]
419
+
420
+ // CIL[BEGIN stable_id="~/.framework/functions/_shared/cil.ts:saveProjectTree:function" type="function" identity="saveProjectTree" parent="~/.framework/functions/_shared/cil.ts"]
421
+ // CIL[DOC-MACRO purpose="Persist the file tree for a project to the items table"]
422
+ // CIL[DOC-RESPONSIBILITY responsibility="Store a file tree object and metadata inside the project item"]
423
+ // CIL[DOC-CONTEXT module="functions/_shared/cil" layer="shared" related_files=".framework/functions/_shared/cil.ts,.framework/functions/_shared/db.ts"]
424
+ // CIL[DOC-CONTRACT inputs="_ctx: any, projectId: string, tree: FileTreeNode, extraData: Record<string, any>, projectItem?: any" outputs="Promise<void>" errors="database errors" side_effects="updates items row"]
425
+ // CIL[DOC-MICRO logic_summary="Fetches project item if not provided, merges data, writes file_tree and last_tree_update" notable_decisions=""]
426
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
427
+ // CIL[DOC-STABILITY stable]
226
428
  export async function saveProjectTree(
227
429
  _ctx: any,
228
430
  projectId: string,
@@ -248,3 +450,42 @@ export async function saveProjectTree(
248
450
  })
249
451
  .eq('id', projItem.id)
250
452
  }
453
+ // CIL[DOC-VECTOR type="context" content="purpose='Persist the file tree for a project to the items table'; No verified external callers; imports: .framework/functions/_shared/db.ts"]
454
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
455
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
456
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
457
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
458
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
459
+ // CIL[END stable_id="~/.framework/functions/_shared/cil.ts:saveProjectTree:function"]
460
+
461
+
462
+ // CIL[BEGIN stable_id="~/.framework/functions/_shared/cil.ts:stripCilBoilerplate:function" type="function" identity="stripCilBoilerplate" parent="~/.framework/functions/_shared/cil.ts"]
463
+ // CIL[DOC-MACRO purpose="Remove generated CIL placeholder phrases (e.g. 'No verified external callers') from chunk text before it is embedded or shown to the LLM."]
464
+ // CIL[DOC-RESPONSIBILITY responsibility="Define CIL_BOILERPLATE_PHRASES and strip them, plus emptied 'Context:'/'Blast radius:' labels and punctuation debris, from a string."]
465
+ // CIL[DOC-CONTEXT module="cil" layer="functions" related_files=".framework/functions/_shared/cil.ts,.framework/functions/_shared/agent-runner.ts,.framework/functions/cil-embeddings.ts"]
466
+ // CIL[DOC-CONTRACT inputs="text: string" outputs="string" errors="none" side_effects="none"]
467
+ // CIL[DOC-MICRO logic_summary="Case-insensitive removal of each phrase, then regex cleanup of dangling labels and ';;', ';.', '..' and double spaces." notable_decisions="Placeholder metadata was being parroted by the CIL agent as a fact about code usage; stripping at both embed time and context-build time removes it from the evidence path."]
468
+ // CIL[DOC-CONFIDENCE pass="first" score="0.90" flags="none"]
469
+ // CIL[DOC-STABILITY stability="stable"]
470
+ export const CIL_BOILERPLATE_PHRASES = [
471
+ 'No verified external callers',
472
+ 'No direct caller data from CIL graph; local impact only',
473
+ 'No environment or build configuration dependencies identified',
474
+ 'Standard runtime; no special invariants documented',
475
+ ]
476
+
477
+ export function stripCilBoilerplate(text: string): string {
478
+ if (!text) return text
479
+ let out = text
480
+ for (const phrase of CIL_BOILERPLATE_PHRASES) {
481
+ out = out.replace(new RegExp(phrase.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'gi'), '')
482
+ }
483
+ out = out.replace(/\b(?:Blast radius|Context):\s*(?=\.\s|$)/g, '')
484
+ out = out
485
+ .replace(/;\s*;/g, ';')
486
+ .replace(/;\s*\./g, '.')
487
+ .replace(/\.\s*\./g, '.')
488
+ .replace(/ {2,}/g, ' ')
489
+ return out
490
+ }
491
+ // CIL[END stable_id="~/.framework/functions/_shared/cil.ts:stripCilBoilerplate:function"]