spine-framework 0.3.124 → 0.3.126

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (319) hide show
  1. package/.framework/cli/commands/agents.ts +35 -37
  2. package/.framework/cli/commands/auth.ts +35 -34
  3. package/.framework/cli/commands/create-app.ts +104 -40
  4. package/.framework/cli/commands/dev.ts +104 -69
  5. package/.framework/cli/commands/doctor.ts +179 -69
  6. package/.framework/cli/commands/generate.ts +83 -143
  7. package/.framework/cli/commands/init.ts +72 -34
  8. package/.framework/cli/commands/install-app.ts +260 -125
  9. package/.framework/cli/commands/items.ts +33 -44
  10. package/.framework/cli/commands/migrate.ts +122 -40
  11. package/.framework/cli/commands/migrations.ts +33 -40
  12. package/.framework/cli/commands/pipelines.ts +31 -39
  13. package/.framework/cli/commands/status.ts +47 -23
  14. package/.framework/cli/commands/system.ts +47 -37
  15. package/.framework/cli/commands/test.ts +112 -68
  16. package/.framework/cli/commands/validate-app.ts +215 -121
  17. package/.framework/cli/context.ts +112 -130
  18. package/.framework/cli/env-loader.ts +47 -18
  19. package/.framework/cli/index.ts +81 -42
  20. package/.framework/docs/runtime-types.md +1024 -0
  21. package/.framework/functions/_shared/agent-runner.ts +1296 -961
  22. package/.framework/functions/_shared/app-manifest.ts +82 -68
  23. package/.framework/functions/_shared/audit.ts +135 -83
  24. package/.framework/functions/_shared/{cil-state.ts → cil.ts} +158 -56
  25. package/.framework/functions/_shared/db.ts +80 -126
  26. package/.framework/functions/_shared/hash-api-key.ts +63 -0
  27. package/.framework/functions/_shared/index.ts +224 -335
  28. package/.framework/functions/_shared/kb.ts +319 -0
  29. package/.framework/functions/_shared/llm.ts +92 -0
  30. package/.framework/functions/_shared/logging.ts +288 -0
  31. package/.framework/functions/_shared/middleware.ts +329 -365
  32. package/.framework/functions/_shared/outcomes.ts +36 -0
  33. package/.framework/functions/_shared/permissions.ts +359 -643
  34. package/.framework/functions/_shared/pipeline-runner.ts +243 -316
  35. package/.framework/functions/_shared/principal.ts +376 -468
  36. package/.framework/functions/_shared/resolve-credentials.ts +102 -0
  37. package/.framework/functions/_shared/resolve-ids.ts +188 -16
  38. package/.framework/functions/_shared/retry-deliveries.ts +104 -0
  39. package/.framework/functions/_shared/schema-utils.ts +611 -373
  40. package/.framework/functions/_shared/testing.ts +207 -137
  41. package/.framework/functions/_shared/tracing.ts +276 -0
  42. package/.framework/functions/_shared/trigger-engine.ts +159 -211
  43. package/.framework/functions/_shared/webhook-registration.ts +95 -81
  44. package/.framework/functions/_shared/webhook-registry.ts +153 -75
  45. package/.framework/functions/account-nodes.ts +31 -53
  46. package/.framework/functions/adapters/generic-webhook-inbound.ts +56 -0
  47. package/.framework/functions/adapters/generic-webhook-outbound.ts +43 -0
  48. package/.framework/functions/adapters/openai-outbound.ts +40 -0
  49. package/.framework/functions/admin-data.ts +685 -537
  50. package/.framework/functions/admin-funnel.ts +31 -20
  51. package/.framework/functions/admin-install-funnel.ts +47 -28
  52. package/.framework/functions/admin-signals.ts +47 -29
  53. package/.framework/functions/ai-agents.ts +122 -147
  54. package/.framework/functions/ai-interactions.ts +180 -90
  55. package/.framework/functions/api-keys.ts +250 -192
  56. package/.framework/functions/apps.ts +203 -197
  57. package/.framework/functions/auth.ts +98 -91
  58. package/.framework/functions/cil-agent-ingest.ts +773 -0
  59. package/.framework/functions/cil-agent.ts +592 -0
  60. package/.framework/functions/cil-callmap.ts +1227 -0
  61. package/.framework/functions/cil-config.ts +583 -0
  62. package/.framework/functions/cil-context.ts +445 -0
  63. package/.framework/functions/cil-doc.ts +1752 -0
  64. package/.framework/functions/cil-embeddings.ts +1202 -0
  65. package/.framework/functions/cil-graph.ts +585 -0
  66. package/.framework/functions/cil-ingest.ts +2416 -0
  67. package/.framework/functions/cil-pipeline.ts +318 -0
  68. package/.framework/functions/cil-project.ts +499 -0
  69. package/.framework/functions/cil-validate.ts +469 -0
  70. package/.framework/functions/debug-auth.ts +73 -53
  71. package/.framework/functions/deliveries.ts +117 -0
  72. package/.framework/functions/embeddings.ts +528 -516
  73. package/.framework/functions/eval-harness.ts +158 -106
  74. package/.framework/functions/integration-outbound.ts +311 -0
  75. package/.framework/functions/integration-routes.ts +240 -466
  76. package/.framework/functions/integrations.ts +132 -140
  77. package/.framework/functions/invites.ts +401 -201
  78. package/.framework/functions/item-progress.ts +113 -53
  79. package/.framework/functions/kb.ts +28 -0
  80. package/.framework/functions/logs.ts +239 -222
  81. package/.framework/functions/observability.ts +308 -259
  82. package/.framework/functions/pipeline-executions.ts +179 -235
  83. package/.framework/functions/pipelines.ts +163 -205
  84. package/.framework/functions/prompt-configs.ts +109 -156
  85. package/.framework/functions/roles.ts +97 -147
  86. package/.framework/functions/system-cron.ts +132 -218
  87. package/.framework/functions/system.ts +112 -52
  88. package/.framework/functions/tests.ts +32 -28
  89. package/.framework/functions/timers.ts +162 -210
  90. package/.framework/functions/triggers.ts +282 -346
  91. package/.framework/functions/types.ts +283 -400
  92. package/.framework/migrations/001_core_schema.sql +630 -0
  93. package/.framework/migrations/002_core_rls_and_functions.sql +532 -0
  94. package/.framework/migrations/{003_system_data.sql → 003_core_system_data.sql} +26 -153
  95. package/.framework/migrations/004_core_rpc_and_broker.sql +421 -0
  96. package/.framework/migrations/005_core_observability.sql +598 -0
  97. package/.framework/migrations/006_security_hardening_rls.sql +97 -0
  98. package/.framework/migrations/007_kb_article_list.sql +237 -0
  99. package/.framework/migrations/008_items_target.sql +8 -0
  100. package/.framework/migrations/009_roles_slug_unique.sql +11 -0
  101. package/.framework/public/spine.config.json +91 -0
  102. package/.framework/scripts/app-install-cli.ts +112 -98
  103. package/.framework/src/App.tsx +67 -20
  104. package/.framework/src/apps/admin/index.tsx +97 -27
  105. package/.framework/src/components/AppWrapper.tsx +50 -11
  106. package/.framework/src/components/CustomAppLoader.tsx +131 -22
  107. package/.framework/src/components/admin/AdminListPage.tsx +75 -8
  108. package/.framework/src/components/admin/AdminSidebar.tsx +148 -36
  109. package/.framework/src/components/admin/AdminStatsCard.tsx +48 -29
  110. package/.framework/src/components/admin/PageInstructions.tsx +49 -0
  111. package/.framework/src/components/admin/SortableTableHeader.tsx +49 -2
  112. package/.framework/src/components/app-shell/GenericAppShell.tsx +69 -11
  113. package/.framework/src/components/app-shell/GenericDetailPage.tsx +55 -10
  114. package/.framework/src/components/app-shell/GenericListPage.tsx +76 -9
  115. package/.framework/src/components/app-sidebar.tsx +50 -3
  116. package/.framework/src/components/auth/ProtectedRoute.tsx +53 -45
  117. package/.framework/src/components/kb/KBArticleEditor.tsx +409 -0
  118. package/.framework/src/components/kb/KBArticleList.tsx +557 -0
  119. package/.framework/src/components/layout/AppShell.tsx +54 -16
  120. package/.framework/src/components/layout/Header.tsx +50 -38
  121. package/.framework/src/components/layout/Layout.tsx +48 -32
  122. package/.framework/src/components/layout/Sidebar.tsx +167 -16
  123. package/.framework/src/components/runtime/DataDetailHeader.tsx +33 -1
  124. package/.framework/src/components/runtime/DataDetailPage.tsx +289 -4
  125. package/.framework/src/components/runtime/DataFilters.tsx +78 -1
  126. package/.framework/src/components/runtime/DataHeader.tsx +32 -29
  127. package/.framework/src/components/runtime/DataListPage.tsx +161 -2
  128. package/.framework/src/components/runtime/DataStats.tsx +48 -1
  129. package/.framework/src/components/runtime/DataTable.tsx +153 -1
  130. package/.framework/src/components/runtime/SchemaDetailForm.tsx +77 -46
  131. package/.framework/src/components/runtime/index.ts +16 -9
  132. package/.framework/src/components/search-form.tsx +33 -1
  133. package/.framework/src/components/shared/AgentView.tsx +48 -51
  134. package/.framework/src/components/shared/FieldRenderer.tsx +84 -67
  135. package/.framework/src/components/shared/InviteManager.tsx +113 -52
  136. package/.framework/src/components/shared/MemberList.tsx +182 -0
  137. package/.framework/src/components/shared/SchemaFields.tsx +96 -78
  138. package/.framework/src/components/ui/DataTable.tsx +86 -56
  139. package/.framework/src/components/ui/Form.tsx +188 -109
  140. package/.framework/src/components/ui/ItemCard.tsx +86 -58
  141. package/.framework/src/components/ui/ItemListView.tsx +88 -61
  142. package/.framework/src/components/ui/LoadingSpinner.tsx +52 -27
  143. package/.framework/src/components/ui/Modal.tsx +81 -4
  144. package/.framework/src/components/ui/RichTextEditor.tsx +101 -9
  145. package/.framework/src/components/ui/accordion.tsx +97 -5
  146. package/.framework/src/components/ui/alert-dialog.tsx +225 -13
  147. package/.framework/src/components/ui/alert.tsx +113 -6
  148. package/.framework/src/components/ui/aspect-ratio.tsx +49 -2
  149. package/.framework/src/components/ui/avatar.tsx +129 -7
  150. package/.framework/src/components/ui/badge.tsx +65 -3
  151. package/.framework/src/components/ui/breadcrumb.tsx +145 -8
  152. package/.framework/src/components/ui/button-group.tsx +81 -4
  153. package/.framework/src/components/ui/button.tsx +49 -2
  154. package/.framework/src/components/ui/calendar.tsx +65 -3
  155. package/.framework/src/components/ui/card.tsx +145 -8
  156. package/.framework/src/components/ui/carousel.tsx +129 -7
  157. package/.framework/src/components/ui/chart.tsx +161 -10
  158. package/.framework/src/components/ui/checkbox.tsx +49 -2
  159. package/.framework/src/components/ui/collapsible.tsx +81 -5
  160. package/.framework/src/components/ui/combobox.tsx +305 -20
  161. package/.framework/src/components/ui/command.tsx +177 -11
  162. package/.framework/src/components/ui/context-menu.tsx +273 -17
  163. package/.framework/src/components/ui/dialog.tsx +209 -27
  164. package/.framework/src/components/ui/direction.tsx +64 -4
  165. package/.framework/src/components/ui/drawer.tsx +193 -12
  166. package/.framework/src/components/ui/dropdown-menu.tsx +273 -18
  167. package/.framework/src/components/ui/empty.tsx +145 -9
  168. package/.framework/src/components/ui/field.tsx +209 -14
  169. package/.framework/src/components/ui/hover-card.tsx +81 -4
  170. package/.framework/src/components/ui/input-group.tsx +162 -10
  171. package/.framework/src/components/ui/input-otp.tsx +98 -5
  172. package/.framework/src/components/ui/input.tsx +49 -2
  173. package/.framework/src/components/ui/item.tsx +225 -13
  174. package/.framework/src/components/ui/kbd.tsx +65 -3
  175. package/.framework/src/components/ui/label.tsx +49 -2
  176. package/.framework/src/components/ui/menubar.tsx +289 -17
  177. package/.framework/src/components/ui/native-select.tsx +97 -5
  178. package/.framework/src/components/ui/navigation-menu.tsx +177 -10
  179. package/.framework/src/components/ui/pagination.tsx +161 -9
  180. package/.framework/src/components/ui/popover.tsx +145 -8
  181. package/.framework/src/components/ui/progress.tsx +49 -2
  182. package/.framework/src/components/ui/radio-group.tsx +65 -3
  183. package/.framework/src/components/ui/resizable.tsx +82 -4
  184. package/.framework/src/components/ui/scroll-area.tsx +65 -3
  185. package/.framework/src/components/ui/select.tsx +193 -11
  186. package/.framework/src/components/ui/separator.tsx +49 -2
  187. package/.framework/src/components/ui/sheet.tsx +193 -11
  188. package/.framework/src/components/ui/sidebar.tsx +481 -38
  189. package/.framework/src/components/ui/skeleton.tsx +49 -2
  190. package/.framework/src/components/ui/slider.tsx +49 -2
  191. package/.framework/src/components/ui/sonner.tsx +49 -2
  192. package/.framework/src/components/ui/spinner.tsx +49 -2
  193. package/.framework/src/components/ui/switch.tsx +49 -2
  194. package/.framework/src/components/ui/table-primitives.tsx +160 -33
  195. package/.framework/src/components/ui/table.tsx +161 -9
  196. package/.framework/src/components/ui/tabs.tsx +113 -6
  197. package/.framework/src/components/ui/textarea.tsx +49 -2
  198. package/.framework/src/components/ui/toggle-group.tsx +81 -4
  199. package/.framework/src/components/ui/toggle.tsx +65 -3
  200. package/.framework/src/components/ui/tooltip.tsx +97 -5
  201. package/.framework/src/contexts/AppContext.tsx +129 -45
  202. package/.framework/src/contexts/AuthContext.tsx +187 -144
  203. package/.framework/src/hooks/use-mobile.ts +48 -2
  204. package/.framework/src/hooks/useApi.ts +208 -159
  205. package/.framework/src/hooks/useAppPath.ts +32 -23
  206. package/.framework/src/hooks/useApps.ts +51 -20
  207. package/.framework/src/hooks/useEntityList.ts +32 -78
  208. package/.framework/src/hooks/useEntityRecord.ts +35 -96
  209. package/.framework/src/hooks/useForm.ts +32 -92
  210. package/.framework/src/hooks/useListSchema.ts +49 -78
  211. package/.framework/src/hooks/useSchemaRecord.ts +114 -105
  212. package/.framework/src/lib/api.ts +195 -116
  213. package/.framework/src/lib/supabase.ts +98 -64
  214. package/.framework/src/lib/utils.ts +287 -151
  215. package/.framework/src/main.tsx +49 -3
  216. package/.framework/src/pages/DashboardPage.tsx +52 -29
  217. package/.framework/src/pages/NotFoundPage.tsx +32 -10
  218. package/.framework/src/pages/SetupPage.tsx +32 -12
  219. package/.framework/src/pages/admin/AIAgentDetailPage.tsx +119 -10
  220. package/.framework/src/pages/admin/AIAgentsPage.tsx +48 -19
  221. package/.framework/src/pages/admin/APIKeyDetailPage.tsx +187 -17
  222. package/.framework/src/pages/admin/APIKeysPage.tsx +98 -22
  223. package/.framework/src/pages/admin/AlertsConfigPage.tsx +113 -26
  224. package/.framework/src/pages/admin/AppDetailPage.tsx +125 -8
  225. package/.framework/src/pages/admin/AppsPage.tsx +49 -2
  226. package/.framework/src/pages/admin/DeliveriesPage.tsx +196 -0
  227. package/.framework/src/pages/admin/DesignedPage.tsx +32 -18
  228. package/.framework/src/pages/admin/EmbeddingDetailPage.tsx +215 -484
  229. package/.framework/src/pages/admin/EmbeddingsPage.tsx +116 -319
  230. package/.framework/src/pages/admin/ExtendedShadcnTestPage.tsx +34 -9
  231. package/.framework/src/pages/admin/IncrementalShadcnTestPage.tsx +34 -9
  232. package/.framework/src/pages/admin/IntegratedDashboard.tsx +32 -16
  233. package/.framework/src/pages/admin/IntegrationDetailPage.tsx +183 -26
  234. package/.framework/src/pages/admin/IntegrationsPage.tsx +48 -19
  235. package/.framework/src/pages/admin/InvitesPage.tsx +48 -14
  236. package/.framework/src/pages/admin/LogsPage.tsx +422 -75
  237. package/.framework/src/pages/admin/MinimalShadcnTestPage.tsx +34 -9
  238. package/.framework/src/pages/admin/ObservabilityDashboard.tsx +113 -24
  239. package/.framework/src/pages/admin/PipelineDetailPage.tsx +206 -34
  240. package/.framework/src/pages/admin/PipelineExecutionsPage.tsx +50 -17
  241. package/.framework/src/pages/admin/PipelinesPage.tsx +160 -21
  242. package/.framework/src/pages/admin/PromptConfigDetailPage.tsx +378 -88
  243. package/.framework/src/pages/admin/PromptConfigsPage.tsx +125 -16
  244. package/.framework/src/pages/admin/ProperlyDesignedPage.tsx +49 -10
  245. package/.framework/src/pages/admin/RoleDetailPage.tsx +130 -10
  246. package/.framework/src/pages/admin/RolesPage.tsx +171 -18
  247. package/.framework/src/pages/admin/SelectTestPage.tsx +34 -9
  248. package/.framework/src/pages/admin/ShadcnTestPage.tsx +49 -11
  249. package/.framework/src/pages/admin/SimpleDashboard.tsx +49 -10
  250. package/.framework/src/pages/admin/TestRunDetailPage.tsx +49 -4
  251. package/.framework/src/pages/admin/TestingDashboard.tsx +98 -28
  252. package/.framework/src/pages/admin/TimerDetailPage.tsx +143 -33
  253. package/.framework/src/pages/admin/TimersPage.tsx +48 -20
  254. package/.framework/src/pages/admin/TriggerDetailPage.tsx +118 -30
  255. package/.framework/src/pages/admin/TriggersPage.tsx +64 -19
  256. package/.framework/src/pages/admin/TypeDetailPage.tsx +138 -15
  257. package/.framework/src/pages/admin/TypesPage.tsx +48 -20
  258. package/.framework/src/pages/admin/cil/CILAgentPage.tsx +465 -0
  259. package/.framework/src/pages/admin/cil/CILChunkDetailPage.tsx +787 -0
  260. package/.framework/src/pages/admin/cil/CILDashboardPage.tsx +699 -0
  261. package/.framework/src/pages/admin/cil/CILFileListPage.tsx +647 -0
  262. package/.framework/src/pages/admin/cil/CILGraphPage.tsx +616 -0
  263. package/.framework/src/pages/admin/cil/CILIngestionPage.tsx +1402 -0
  264. package/.framework/src/pages/admin/cil/CILProjectsPage.tsx +614 -0
  265. package/.framework/src/pages/admin/cil/CILSearchPage.tsx +571 -0
  266. package/.framework/src/pages/admin/cil/FlexiblePipelinePage.tsx +731 -0
  267. package/.framework/src/pages/admin/kb/KBAdminPage.tsx +64 -0
  268. package/.framework/src/pages/auth/AuthConfirmPage.tsx +52 -51
  269. package/.framework/src/pages/auth/ForgotPasswordPage.tsx +31 -22
  270. package/.framework/src/pages/auth/LoginPage.tsx +50 -23
  271. package/.framework/src/pages/auth/PendingApprovalPage.tsx +31 -15
  272. package/.framework/src/pages/auth/RegisterPage.tsx +281 -317
  273. package/.framework/src/pages/spine-framework/APIPage.tsx +33 -0
  274. package/.framework/src/pages/spine-framework/CLIPage.tsx +33 -0
  275. package/.framework/src/types/auth.ts +128 -71
  276. package/.framework/src/types/types.ts +373 -157
  277. package/custom/.devin/skills/spine-workbench-discovery/SKILL.md +39 -0
  278. package/custom/.devin/skills/spine-workbench-idea/SKILL.md +36 -0
  279. package/custom/.devin/skills/spine-workbench-implement/SKILL.md +46 -0
  280. package/custom/.devin/skills/spine-workbench-initiative/SKILL.md +28 -0
  281. package/custom/.devin/skills/spine-workbench-plan/SKILL.md +38 -0
  282. package/docs/README.md +9 -130
  283. package/netlify.toml +5 -2
  284. package/package.json +13 -25
  285. package/scripts/kb-ingest-docs.ts +203 -0
  286. package/spine.config.json +65 -4
  287. package/.framework/migrations/001_schema.sql +0 -425
  288. package/.framework/migrations/002_rls_and_functions.sql +0 -763
  289. package/.framework/migrations/004_enhancements.sql +0 -43
  290. package/.framework/migrations/005_auth_user_trigger.sql +0 -105
  291. package/.framework/migrations/006_fix_current_actor_id.sql +0 -21
  292. package/.framework/migrations/016_invites.sql +0 -27
  293. package/.framework/migrations/017_fix_get_account_apps.sql +0 -78
  294. package/.framework/migrations/018_apps_required_roles.sql +0 -17
  295. package/.framework/migrations/019_triggers_unique_constraint.sql +0 -13
  296. package/.framework/migrations/020_get_account_apps_role_filter.sql +0 -117
  297. package/.framework/migrations/021_app_domains.sql +0 -112
  298. package/.framework/migrations/022_route_prefix_domain_unique.sql +0 -21
  299. package/.framework/migrations/023_match_embeddings_rpc.sql +0 -78
  300. package/.framework/migrations/024_messages_account_id.sql +0 -9
  301. package/.framework/migrations/025_retype_threads_messages.sql +0 -240
  302. package/.framework/migrations/026_fix_rls_policies.sql +0 -47
  303. package/.framework/migrations/027_embedding_lifecycle.sql +0 -176
  304. package/.framework/migrations/028_fix_message_data_permissions.sql +0 -49
  305. package/.framework/migrations/029_tighten_support_triage_prompt.sql +0 -41
  306. package/.framework/migrations/030_messages_updated_by.sql +0 -6
  307. package/.framework/migrations/031_seed_upsert_constraints.sql +0 -35
  308. package/docs/APPS.md +0 -232
  309. package/docs/ARCHITECTURE.md +0 -246
  310. package/docs/INSTALL.md +0 -155
  311. package/docs/design-schema-spec.md +0 -1837
  312. package/docs/dev-guides/01-create-an-app.md +0 -183
  313. package/docs/dev-guides/02-create-a-function.md +0 -178
  314. package/docs/dev-guides/03-create-a-component.md +0 -178
  315. package/docs/dev-guides/04-webhook-handlers.md +0 -129
  316. package/docs/dev-guides/05-testing.md +0 -168
  317. package/docs/dev-guides/README.md +0 -40
  318. package/docs/npm-packages-plan.md +0 -288
  319. package/docs/spine-core--api-reference.md +0 -822
@@ -1,45 +1,61 @@
1
- /**
2
- * @module eval-harness
3
- * @audience core-contributor
4
- * @layer api-handler
5
- * @stability stable
6
- *
7
- * Evaluation infrastructure for the AI support loop. Provides CRUD for
8
- * `eval_test_case` items and a `run_eval` action that exercises the real
9
- * retrieval + inference pipeline and scores the results.
10
- *
11
- * Build evals before you scale automation. A support AI without evals is a
12
- * demo. With evals it is a product.
13
- *
14
- * **Routed by:** `GET/POST /.netlify/functions/eval-harness`
15
- *
16
- * **Actions:**
17
- * | method | ?action | handler |
18
- * |--------|------------------|-------------------|
19
- * | POST | create_test_case | createTestCase |
20
- * | GET | list_test_cases | listTestCases |
21
- * | POST | run_eval | runEval |
22
- * | GET | get_results | getResults |
23
- * | GET | get_coverage | getCoverage |
24
- *
25
- * INVARIANT: `run_eval` fires the actual retrieval pipeline — not a mock.
26
- * Only run against a non-production Supabase project when making schema changes.
27
- *
28
- * INVARIANT: Eval results are stored as `pipeline_executions` rows so they
29
- * are auditable and time-series comparable.
30
- *
31
- * @seeAlso agent-runner.ts (retrieveKnowledge — what is being tested)
32
- * @seeAlso embeddings.ts (match_embeddings — the retrieval function under test)
33
- */
1
+
2
+
3
+
4
+
5
+
6
+
7
+
8
+
9
+
10
+
11
+
12
+
13
+
14
+
15
+
16
+
17
+
18
+
19
+
20
+
21
+
22
+ // CIL[BEGIN chunk_id="eval-harness_moduleheader_1783969696" type="module_header" identity="imports" parent="none"]
23
+ // CIL[DOC-MACRO purpose="Import dependencies for eval harness module"]
24
+ // CIL[DOC-RESPONSIBILITY responsibility="Import middleware, database, utilities, and audit functions"]
25
+ // CIL[DOC-CONTEXT module="eval-harness" layer="backend_functions" related_files="[\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/migrations/015_simplify_apps_table.sql\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/functions/_shared/schema-utils.ts\",\"\\\"]"]
26
+ // CIL[DOC-CONTRACT inputs="none" outputs="imported_modules" errors="none" side_effects="none"]
27
+ // CIL[DOC-MICRO logic_summary="Import required dependencies for evaluation test harness" notable_decisions="[]"]
28
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
29
+ // CIL[DOC-STABILITY stability="stable"]
30
+ // CIL[DOC-AUDIENCE audience="developer"]
31
+ // CIL[DOC-VECTOR type="context" content="Layer: backend_functions. Direct callers: 0. Direct calls: 0. Related files: custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/migrations/015_simplify_apps_table.sql, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/functions/_shared/principal.ts, .framework/functions/_shared/schema-utils.ts, \."]
32
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
33
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
34
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
35
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
36
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
34
37
 
35
38
  import { createHandler } from './_shared/middleware'
36
39
  import { adminDb } from './_shared/db'
37
40
  import { resolveTypeId } from './_shared/resolve-ids'
38
41
  import { create } from './admin-data'
39
42
  import { emitLog } from './_shared/audit'
40
-
41
- // ─── TEST CATEGORIES ─────────────────────────────────────────────────────────
42
-
43
+ import { callOpenAIEmbeddings } from './_shared/llm'
44
+ // CIL[END chunk_id="eval-harness_moduleheader_1783969696"]
45
+ // CIL[BEGIN chunk_id="eval-harness_constants_1783969696" type="function" identity="constants" parent="none"]
46
+ // CIL[DOC-MACRO purpose="Define evaluation constants and types"]
47
+ // CIL[DOC-RESPONSIBILITY responsibility="Configure test types and confidence tier thresholds"]
48
+ // CIL[DOC-CONTEXT module="eval-harness" layer="backend_functions" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/functions/_shared/schema-utils.ts\",\"\\\"]"]
49
+ // CIL[DOC-CONTRACT inputs="none" outputs="constants" errors="none" side_effects="none"]
50
+ // CIL[DOC-MICRO logic_summary="Define test categories and confidence score ranges for evaluation" notable_decisions="[]"]
51
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
52
+ // CIL[DOC-STABILITY stability="stable"]
53
+ // CIL[DOC-VECTOR type="context" content="Layer: backend_functions. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/IntegrationsPage.tsx, .framework/functions/_shared/principal.ts, .framework/functions/_shared/schema-utils.ts, \."]
54
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
55
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
56
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
57
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
58
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
43
59
  const TEST_TYPES = ['easy', 'medium', 'hard', 'security', 'hallucination', 'stale', 'account_gating'] as const
44
60
  type TestType = typeof TEST_TYPES[number]
45
61
 
@@ -48,15 +64,21 @@ const CONFIDENCE_TIERS = {
48
64
  medium: { min: 0.60, max: 0.849 },
49
65
  low: { min: 0.00, max: 0.599 },
50
66
  }
51
-
52
- // ─── CREATE TEST CASE ─────────────────────────────────────────────────────────
53
- /**
54
- * Creates an eval_test_case item.
55
- *
56
- * Body: question (required), expected_tier ('high'|'medium'|'low'),
57
- * expected_escalate (bool), expected_source_ids (string[]),
58
- * excluded_source_ids (string[]), test_type
59
- */
67
+ // CIL[END chunk_id="eval-harness_constants_1783969696"]
68
+ // CIL[BEGIN chunk_id="eval-harness_createtestcase_1783969696" type="function" identity="createTestCase" parent="none"]
69
+ // CIL[DOC-MACRO purpose="Create evaluation test case"]
70
+ // CIL[DOC-RESPONSIBILITY responsibility="Create test case with question and expected outcomes"]
71
+ // CIL[DOC-CONTEXT module="eval-harness" layer="backend_functions" related_files="[\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/src/components/ui/dialog.tsx\",\"\\\"]"]
72
+ // CIL[DOC-CONTRACT inputs="none" outputs="created_test_case" errors="validation_errors,db_errors" side_effects="db_write"]
73
+ // CIL[DOC-MICRO logic_summary="Validate input, resolve type ID, create test case item" notable_decisions="[]"]
74
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
75
+ // CIL[DOC-STABILITY stability="stable"]
76
+ // CIL[DOC-VECTOR type="context" content="Layer: backend_functions. Direct callers: 1. Direct calls: 0. Related files: .framework/src/pages/admin/TypeDetailPage.tsx, .framework/src/components/ui/dialog.tsx, \."]
77
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 1. Total affected: 2."]
78
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
79
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
80
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
81
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
60
82
  export const createTestCase = createHandler(async (ctx, body) => {
61
83
  const {
62
84
  question, expected_tier = 'medium', expected_escalate = false,
@@ -85,12 +107,21 @@ export const createTestCase = createHandler(async (ctx, body) => {
85
107
  },
86
108
  })
87
109
  })
88
-
89
- // ─── LIST TEST CASES ──────────────────────────────────────────────────────────
90
- /**
91
- * Lists eval_test_case items. Optionally filter by test_type.
92
- * Query params: test_type, limit (default 200), offset
93
- */
110
+ // CIL[END chunk_id="eval-harness_createtestcase_1783969696"]
111
+ // CIL[BEGIN chunk_id="eval-harness_listtestcases_1783969696" type="function" identity="listTestCases" parent="none"]
112
+ // CIL[DOC-MACRO purpose="List evaluation test cases"]
113
+ // CIL[DOC-RESPONSIBILITY responsibility="Retrieve test cases with optional filtering"]
114
+ // CIL[DOC-CONTEXT module="eval-harness" layer="backend_functions" related_files="[\"\\\"]"]
115
+ // CIL[DOC-CONTRACT inputs="none" outputs="test_cases" errors="db_errors" side_effects="none"]
116
+ // CIL[DOC-MICRO logic_summary="Query test cases by type and test type, return paginated results" notable_decisions="[]"]
117
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
118
+ // CIL[DOC-STABILITY stability="stable"]
119
+ // CIL[DOC-VECTOR type="context" content="Layer: backend_functions. Direct callers: 0. Direct calls: 0. Related files: \."]
120
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
121
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
122
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
123
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
124
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
94
125
  export const listTestCases = createHandler(async (ctx, _body) => {
95
126
  const { test_type, limit = '200', offset = '0' } = ctx.query || {}
96
127
 
@@ -111,35 +142,25 @@ export const listTestCases = createHandler(async (ctx, _body) => {
111
142
  if (error) throw error
112
143
  return data || []
113
144
  })
114
-
115
- // ─── RUN EVAL ─────────────────────────────────────────────────────────────────
116
- /**
117
- * Runs the retrieval pipeline against all active eval_test_case items and
118
- * scores the results. Stores the run summary as a pipeline_executions row.
119
- *
120
- * Scoring per test case:
121
- * - retrieval_recall: expected_source_ids found in top-N results?
122
- * - boundary_safe: excluded_source_ids NOT found in results?
123
- * - tier_correct: mean similarity maps to expected_tier?
124
- *
125
- * Body: test_type (optional, filter), similarity_threshold (default 0.15),
126
- * match_count (default 8)
127
- *
128
- * Returns a summary + per-case results.
129
- *
130
- * NOTE: Does not call the LLM — retrieval only. Full inference eval is a
131
- * future extension.
132
- */
145
+ // CIL[END chunk_id="eval-harness_listtestcases_1783969696"]
146
+ // CIL[BEGIN chunk_id="eval-harness_runeval_1783969696" type="function" identity="runEval" parent="none"]
147
+ // CIL[DOC-MACRO purpose="Run evaluation test suite"]
148
+ // CIL[DOC-RESPONSIBILITY responsibility="Execute test cases and measure retrieval performance"]
149
+ // CIL[DOC-CONTEXT module="eval-harness" layer="backend_functions" related_files="[\"\\\"]"]
150
+ // CIL[DOC-CONTRACT inputs="none" outputs="eval_results" errors="api_errors,db_errors" side_effects="api_calls,db_write,audit_log"]
151
+ // CIL[DOC-MICRO logic_summary="Run embeddings search, evaluate recall and boundary violations, store results" notable_decisions="[]"]
152
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="complex_logic,external_api"]
153
+ // CIL[DOC-STABILITY stability="stable"]
154
+ // CIL[DOC-VECTOR type="context" content="Layer: backend_functions. Direct callers: 0. Direct calls: 0. Related files: \."]
155
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
156
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
157
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
158
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
159
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
133
160
  export const runEval = createHandler(async (ctx, body) => {
134
161
  const { test_type, similarity_threshold = 0.15, match_count = 8 } = body || {}
135
162
  if (!ctx.accountId) throw new Error('Account context required')
136
163
 
137
- const apiKey = process.env.OPENAI_API_KEY || process.env.LLM_API_KEY
138
- if (!apiKey) throw new Error('No OPENAI_API_KEY — cannot run eval (needs embedding API)')
139
-
140
- const baseUrl = process.env.OPENAI_BASE_URL || 'https://api.openai.com/v1'
141
-
142
- // Load test cases
143
164
  const { data: typeRow } = await adminDb
144
165
  .from('types').select('id').eq('slug', 'eval_test_case').eq('kind', 'item').maybeSingle()
145
166
 
@@ -150,13 +171,13 @@ export const runEval = createHandler(async (ctx, body) => {
150
171
  if (tcErr) throw tcErr
151
172
  if (!testCases?.length) return { run_id: null, message: 'No test cases found', total: 0 }
152
173
 
153
- // Resolve platform account for cross-account retrieval
174
+
154
175
  const { data: platformAccount } = await adminDb
155
176
  .from('accounts').select('id').eq('slug', 'spine-system').maybeSingle()
156
177
  const accountIds = [ctx.accountId]
157
178
  if (platformAccount?.id && platformAccount.id !== ctx.accountId) accountIds.push(platformAccount.id)
158
179
 
159
- // Run retrieval for each test case
180
+
160
181
  const results: any[] = []
161
182
  let passed = 0; let failed = 0; let skipped = 0
162
183
 
@@ -167,23 +188,23 @@ export const runEval = createHandler(async (ctx, body) => {
167
188
  const expectedTier = tc.data?.expected_tier || 'medium'
168
189
 
169
190
  try {
170
- // Generate embedding for the question
171
- const embedRes = await fetch(`${baseUrl}/embeddings`, {
172
- method: 'POST',
173
- headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${apiKey}` },
174
- body: JSON.stringify({ model: 'text-embedding-3-small', input: question }),
175
- })
176
- if (!embedRes.ok) { skipped++; results.push({ id: tc.id, status: 'skipped', reason: 'embed_api_error' }); continue }
177
- const embedJson: any = await embedRes.json()
191
+
192
+ let embedJson: any
193
+ try {
194
+ embedJson = await callOpenAIEmbeddings(ctx, [question], 'text-embedding-3-small')
195
+ } catch {
196
+ skipped++; results.push({ id: tc.id, status: 'skipped', reason: 'embed_api_error' }); continue
197
+ }
178
198
  const queryEmbedding: number[] = embedJson.data?.[0]?.embedding || []
179
199
 
180
- // Run retrieval
200
+
181
201
  const { data: matches } = await adminDb.rpc('match_embeddings', {
182
202
  query_embedding: `[${queryEmbedding.join(',')}]`,
183
203
  match_count: match_count * 2,
184
204
  filter_account_ids: accountIds,
185
205
  filter_vector_type: 'semantic',
186
206
  similarity_threshold,
207
+ filter_item_types: null,
187
208
  })
188
209
 
189
210
  const retrievedIds = new Set((matches || []).map((m: any) => m.document_id))
@@ -191,14 +212,14 @@ export const runEval = createHandler(async (ctx, body) => {
191
212
  ? (matches as any[]).reduce((s: number, m: any) => s + m.similarity, 0) / matches.length
192
213
  : 0
193
214
 
194
- // Score
215
+
195
216
  const recallHits = expectedSrcs.filter((id: string) => retrievedIds.has(id)).length
196
217
  const retrievalRecall = expectedSrcs.length > 0 ? recallHits / expectedSrcs.length : null
197
218
 
198
219
  const boundaryViolations = excludedSrcs.filter((id: string) => retrievedIds.has(id))
199
220
  const boundarySafe = boundaryViolations.length === 0
200
221
 
201
- // Tier based on mean similarity (proxy — full LLM confidence would be better)
222
+
202
223
  let inferredTier: string
203
224
  if (meanSim >= CONFIDENCE_TIERS.high.min) inferredTier = 'high'
204
225
  else if (meanSim >= CONFIDENCE_TIERS.medium.min) inferredTier = 'medium'
@@ -241,7 +262,7 @@ export const runEval = createHandler(async (ctx, body) => {
241
262
  account_id: ctx.accountId,
242
263
  }
243
264
 
244
- // Store as pipeline_executions row for audit trail
265
+
245
266
  const { data: execRow } = await adminDb
246
267
  .from('pipeline_executions')
247
268
  .insert({
@@ -250,7 +271,7 @@ export const runEval = createHandler(async (ctx, body) => {
250
271
  status: failed === 0 ? 'completed' : 'failed',
251
272
  trigger_data: { eval_run: true, test_type: test_type || 'all' },
252
273
  result: { summary, results },
253
- started_at: summary.run_at,
274
+ started_at: summary.run_at,
254
275
  completed_at: new Date().toISOString(),
255
276
  duration_ms: 0,
256
277
  })
@@ -264,12 +285,21 @@ export const runEval = createHandler(async (ctx, body) => {
264
285
 
265
286
  return { run_id: execRow?.id || null, summary, results }
266
287
  })
267
-
268
- // ─── GET RESULTS ─────────────────────────────────────────────────────────────
269
- /**
270
- * Returns the most recent eval run summary for this account.
271
- * Query params: limit (default 5) — number of recent runs to return
272
- */
288
+ // CIL[END chunk_id="eval-harness_runeval_1783969696"]
289
+ // CIL[BEGIN chunk_id="eval-harness_getresults_1783969696" type="function" identity="getResults" parent="none"]
290
+ // CIL[DOC-MACRO purpose="Get evaluation run results"]
291
+ // CIL[DOC-RESPONSIBILITY responsibility="Retrieve recent evaluation execution results"]
292
+ // CIL[DOC-CONTEXT module="eval-harness" layer="backend_functions" related_files="[]"]
293
+ // CIL[DOC-CONTRACT inputs="none" outputs="eval_results" errors="auth_errors,db_errors" side_effects="none"]
294
+ // CIL[DOC-MICRO logic_summary="Query pipeline executions for eval runs, return summary and results" notable_decisions="[]"]
295
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
296
+ // CIL[DOC-STABILITY stability="stable"]
297
+ // CIL[DOC-VECTOR type="context" content="Layer: backend_functions. Direct callers: 0. Direct calls: 0. Related files: none."]
298
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
299
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
300
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
301
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
302
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
273
303
  export const getResults = createHandler(async (ctx, _body) => {
274
304
  if (!ctx.accountId) throw new Error('Account context required')
275
305
 
@@ -286,12 +316,21 @@ export const getResults = createHandler(async (ctx, _body) => {
286
316
  if (error) throw error
287
317
  return data || []
288
318
  })
289
-
290
- // ─── GET COVERAGE ────────────────────────────────────────────────────────────
291
- /**
292
- * Returns coverage summary: which test categories have cases, which are empty,
293
- * and the most recent pass rate per category if eval runs exist.
294
- */
319
+ // CIL[END chunk_id="eval-harness_getresults_1783969696"]
320
+ // CIL[BEGIN chunk_id="eval-harness_getcoverage_1783969696" type="function" identity="getCoverage" parent="none"]
321
+ // CIL[DOC-MACRO purpose="Get test case coverage analysis"]
322
+ // CIL[DOC-RESPONSIBILITY responsibility="Analyze test case distribution across types"]
323
+ // CIL[DOC-CONTEXT module="eval-harness" layer="backend_functions" related_files="[]"]
324
+ // CIL[DOC-CONTRACT inputs="none" outputs="coverage_report" errors="db_errors" side_effects="none"]
325
+ // CIL[DOC-MICRO logic_summary="Count test cases by type, identify coverage gaps" notable_decisions="[]"]
326
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
327
+ // CIL[DOC-STABILITY stability="stable"]
328
+ // CIL[DOC-VECTOR type="context" content="Layer: backend_functions. Direct callers: 0. Direct calls: 0. Related files: none."]
329
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
330
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
331
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
332
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
333
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
295
334
  export const getCoverage = createHandler(async (ctx, _body) => {
296
335
  const { data: typeRow } = await adminDb
297
336
  .from('types').select('id').eq('slug', 'eval_test_case').eq('kind', 'item').maybeSingle()
@@ -322,9 +361,21 @@ export const getCoverage = createHandler(async (ctx, _body) => {
322
361
  recommendation: coverage.filter(c => !c.has_cases).map(c => c.test_type),
323
362
  }
324
363
  })
325
-
326
- // ─── HANDLER ─────────────────────────────────────────────────────────────────
327
-
364
+ // CIL[END chunk_id="eval-harness_getcoverage_1783969696"]
365
+ // CIL[BEGIN chunk_id="eval-harness_handler_1783969696" type="function" identity="handler" parent="none"]
366
+ // CIL[DOC-MACRO purpose="Route eval harness HTTP methods"]
367
+ // CIL[DOC-RESPONSIBILITY responsibility="Dispatch requests to evaluation operations"]
368
+ // CIL[DOC-CONTEXT module="eval-harness" layer="backend_functions" related_files="[]"]
369
+ // CIL[DOC-CONTRACT inputs="none" outputs="function_responses" errors="method_errors" side_effects="none"]
370
+ // CIL[DOC-MICRO logic_summary="Route based on action and method to specific eval functions" notable_decisions="[]"]
371
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
372
+ // CIL[DOC-STABILITY stability="stable"]
373
+ // CIL[DOC-VECTOR type="context" content="Layer: backend_functions. Direct callers: 0. Direct calls: 0. Related files: none."]
374
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
375
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
376
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
377
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
378
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
328
379
  export const handler = createHandler(async (ctx, body) => {
329
380
  const { action } = ctx.query || {}
330
381
  const method = ctx.query?.method || 'GET'
@@ -351,3 +402,4 @@ export const handler = createHandler(async (ctx, body) => {
351
402
 
352
403
  throw new Error('Invalid action or method')
353
404
  })
405
+ // CIL[END chunk_id="eval-harness_handler_1783969696"]