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,45 +1,54 @@
1
+ // CIL[BEGIN stable_id="~/.framework/functions/ai-interactions.ts:module_header:module_header" type="module_header" identity="module_header" parent="~/.framework/functions/ai-interactions.ts"]
2
+ // CIL[DOC-MACRO purpose="Defines the ai-interactions Netlify function handlers for AI feedback and CIL learning proposals."]
3
+ // CIL[DOC-RESPONSIBILITY responsibility="Initialize the module, register handler exports, and provide shared imports for the AI interaction function."]
4
+ // CIL[DOC-CONTEXT module="ai-interactions" layer="functions" related_files=".framework/functions/_shared/audit.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/funnel.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/resolve-ids.ts,.framework/functions/admin-data.ts"]
5
+ // CIL[DOC-CONTRACT inputs="none" outputs="none" errors="none" side_effects="none"]
6
+ // CIL[DOC-MICRO logic_summary="Imports shared middleware, database, ID resolution, admin-data helpers, audit logging, and typed signal emission." notable_decisions="[]"]
7
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
8
+ // CIL[DOC-STABILITY stability="stable"]
9
+ // CIL[DOC-AUDIENCE audience="internal"]
1
10
 
2
11
 
3
12
 
4
13
 
5
14
 
6
- // CIL[BEGIN chunk_id="ai-interactions_module_header_1784019432" type="module_header" identity="imports" parent="none"]
7
- // CIL[DOC-MACRO purpose="Import dependencies for AI interaction management"]
8
- // CIL[DOC-RESPONSIBILITY responsibility="Provide middleware, database, type resolution, CRUD, and audit logging"]
9
- // CIL[DOC-CONTEXT module="ai-interactions" layer="api-handler" related_files="[\".framework/src/pages/admin/TypeDetailPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/functions/_shared/schema-utils.ts\",\".framework/functions/_shared/principal.ts\",\"custom/apps/portal/pages/ContentPage.tsx\",\"\\\"]"]
10
- // CIL[DOC-CONTRACT inputs="none" outputs="imported_modules" errors="none" side_effects="none"]
11
- // CIL[DOC-MICRO logic_summary="Imports required modules for AI feedback and interaction tracking" notable_decisions="[]"]
12
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
13
- // CIL[DOC-STABILITY stability="stable"]
14
- // CIL[DOC-AUDIENCE audience="developer"]
15
- // CIL[DOC-VECTOR type="context" content="Layer: api-handler. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/TypeDetailPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/functions/_shared/schema-utils.ts, .framework/functions/_shared/principal.ts, custom/apps/portal/pages/ContentPage.tsx, \."]
16
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
17
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
18
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
19
- // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
20
- // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
21
15
  import { createHandler } from './_shared/middleware'
22
16
  import { adminDb } from './_shared/db'
23
17
  import { resolveTypeId } from './_shared/resolve-ids'
24
18
  import { create, update } from './admin-data'
25
19
  import { emitLog } from './_shared/audit'
26
- // CIL[END chunk_id="ai-interactions_module_header_1784019432"]
27
- // CIL[BEGIN chunk_id="ai-interactions_submitfeedback_1784019432" type="function" identity="submitFeedback" parent="none"]
28
- // CIL[DOC-MACRO purpose="Record customer feedback on AI messages"]
29
- // CIL[DOC-RESPONSIBILITY responsibility="Stamp feedback, escalate tickets, update interaction records"]
30
- // CIL[DOC-CONTEXT module="ai-interactions" layer="api-handler" related_files="[\".framework/functions/_shared/schema-utils.ts\",\".framework/src/components/ui/dialog.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/migrations/015_simplify_apps_table.sql\",\"\\\"]"]
31
- // CIL[DOC-CONTRACT inputs="none" outputs="feedback_confirmation" errors="message_id_required,ticket_id_required,invalid_feedback" side_effects="database_updates,ticket_escalation,audit_logging"]
32
- // CIL[DOC-MICRO logic_summary="Stamps feedback on message, escalates not_helpful to human, updates interaction record" notable_decisions="[]"]
33
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
34
- // CIL[DOC-STABILITY stability="stable"]
35
- // CIL[DOC-VECTOR type="context" content="Layer: api-handler. Direct callers: 0. Direct calls: 0. Related files: .framework/functions/_shared/schema-utils.ts, .framework/src/components/ui/dialog.tsx, custom/apps/portal/pages/ContentPage.tsx, .framework/functions/_shared/principal.ts, .framework/migrations/015_simplify_apps_table.sql, \."]
36
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
37
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
38
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
20
+ import { emitSignal } from './_shared/funnel'
21
+ // CIL[DOC-VECTOR type="context" content="purpose='Defines the ai-interactions Netlify function handlers for AI feedback and CIL learning proposals.'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/resolve-ids.ts"]
22
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
23
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
24
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
39
25
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
40
26
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
27
+ // CIL[END stable_id="~/.framework/functions/ai-interactions.ts:module_header:module_header"]
28
+ // CIL[BEGIN stable_id="~/.framework/functions/ai-interactions.ts:submitFeedback:constant" type="constant" identity="submitFeedback" parent="~/.framework/functions/ai-interactions.ts"]
29
+ // CIL[DOC-MACRO purpose="Record customer thumbs-up/thumbs-down feedback for an AI message and escalate to human if needed."]
30
+ // CIL[DOC-RESPONSIBILITY responsibility="Validate inputs, persist feedback on the message row, update the ticket status on thumbs-down, attach feedback to the ai_interaction record, and emit an audit log."]
31
+ // CIL[DOC-CONTEXT module="ai-interactions" layer="functions" related_files=".framework/functions/_shared/audit.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/resolve-ids.ts,.framework/functions/admin-data.ts,.framework/functions/ai-interactions.ts"]
32
+ // CIL[DOC-CONTRACT inputs="message_id, ticket_id, feedback, reason, msgData" outputs="{message_id, ticket_id, feedback, escalated}" errors="missing fields, invalid feedback value" side_effects="updates messages.data, items status/data, and emits an audit log"]
33
+ // CIL[DOC-MICRO logic_summary="Validate required fields, update the message with feedback, on not_helpful assign the ticket to human (reopening resolved tickets via reopened_at/reopen_reason), on helpful resolve a pending_resolution ticket as ai_confirmed, find the linked ai_interaction and record customer_feedback, then emit a structured log." notable_decisions="thumbs are lifecycle accelerators — thumbs-up confirms a pending AI answer, thumbs-down escalates; resolved_via stamps make the outcome auditable"]
34
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
35
+ // CIL[DOC-STABILITY stability="stable"]
36
+ // Classify why a thumbs-down happened from the message's own evidence trail.
37
+ // Retrieval failure (no usable sources), reasoning failure (sources existed
38
+ // but weren't cited or were ignored), or missing knowledge (nothing to
39
+ // retrieve) each route to a different improvement path downstream.
40
+ function diagnoseFeedback(msgData: any): string {
41
+ const sources = msgData?.retrieved_sources || []
42
+ const cited = msgData?.cited_sources || []
43
+ const meanSim = msgData?.mean_similarity ?? msgData?.retrieval_confidence ?? 0
44
+ if (!sources.length) return 'missing_knowledge'
45
+ if (meanSim < 0.35) return 'retrieval_miss'
46
+ if (!cited.length) return 'reasoning_error'
47
+ return 'wrong_answer'
48
+ }
49
+
41
50
  export const submitFeedback = createHandler(async (ctx, body) => {
42
- const { message_id, ticket_id, feedback } = body || {}
51
+ const { message_id, ticket_id, feedback, reason } = body || {}
43
52
  if (!message_id) throw new Error('message_id is required')
44
53
  if (!ticket_id) throw new Error('ticket_id is required')
45
54
  if (!['helpful', 'not_helpful'].includes(feedback)) {
@@ -48,25 +57,70 @@ export const submitFeedback = createHandler(async (ctx, body) => {
48
57
 
49
58
  const { data: msg } = await adminDb
50
59
  .from('messages').select('data').eq('id', message_id).single()
60
+ const diagnosis = feedback === 'not_helpful' ? diagnoseFeedback(msg?.data) : null
51
61
  if (msg) {
52
62
  await adminDb
53
63
  .from('messages')
54
- .update({ data: { ...(msg.data || {}), feedback } })
64
+ .update({ data: {
65
+ ...(msg.data || {}),
66
+ feedback,
67
+ ...(reason ? { feedback_reason: String(reason).slice(0, 2000) } : {}),
68
+ ...(diagnosis ? { feedback_diagnosis: diagnosis, needs_review: true } : {}),
69
+ } })
55
70
  .eq('id', message_id)
56
71
  }
57
72
 
58
- if (feedback === 'not_helpful' && ticket_id) {
73
+ {
59
74
  const { data: ticket } = await adminDb
60
75
  .from('items').select('status, data').eq('id', ticket_id).single()
61
- if (ticket && ticket.status !== 'human_assigned' && ticket.status !== 'resolved') {
62
- await adminDb
63
- .from('items')
64
- .update({
65
- status: 'human_assigned',
66
- data: { ...(ticket.data || {}), aim_escalation_reason: 'thumbs_down' },
67
- updated_at: new Date().toISOString(),
68
- })
69
- .eq('id', ticket_id)
76
+ if (ticket) {
77
+ const now = new Date().toISOString()
78
+ // Thumbs-down is a definitive negative signal: escalate to a human from
79
+ // any state, and reopen when the ticket was already resolved/closed.
80
+ if (feedback === 'not_helpful' && ticket.status !== 'human_assigned' && ticket.status !== 'in_progress') {
81
+ const wasResolved = ticket.status === 'resolved' || ticket.status === 'closed'
82
+ await adminDb
83
+ .from('items')
84
+ .update({
85
+ status: 'human_assigned',
86
+ data: {
87
+ ...(ticket.data || {}),
88
+ aim_escalation_reason: 'thumbs_down',
89
+ last_activity_at: now,
90
+ ...(wasResolved ? {
91
+ reopened_at: now,
92
+ reopen_reason: 'thumbs_down',
93
+ resolved_at: null,
94
+ resolved_via: null,
95
+ aim_resolved_by_ai: false,
96
+ } : {
97
+ pending_proposed_by: null,
98
+ resolve_pending_since: null,
99
+ }),
100
+ },
101
+ updated_at: now,
102
+ })
103
+ .eq('id', ticket_id)
104
+ }
105
+ // Thumbs-up on a pending-resolution ticket is the explicit customer
106
+ // confirm: close it, attributing the resolution to whoever proposed it.
107
+ if (feedback === 'helpful' && ticket.status === 'pending_resolution') {
108
+ const via = ticket.data?.pending_proposed_by === 'human' ? 'human_confirmed' : 'ai_confirmed'
109
+ await adminDb
110
+ .from('items')
111
+ .update({
112
+ status: 'resolved',
113
+ data: {
114
+ ...(ticket.data || {}),
115
+ resolved_at: now,
116
+ resolved_via: via,
117
+ aim_resolved_by_ai: via === 'ai_confirmed',
118
+ last_activity_at: now,
119
+ },
120
+ updated_at: now,
121
+ })
122
+ .eq('id', ticket_id)
123
+ }
70
124
  }
71
125
  }
72
126
 
@@ -79,32 +133,44 @@ export const submitFeedback = createHandler(async (ctx, body) => {
79
133
  const interaction = interactionRows[0]
80
134
  await adminDb
81
135
  .from('items')
82
- .update({ data: { ...(interaction.data || {}), customer_feedback: feedback } })
136
+ .update({ data: {
137
+ ...(interaction.data || {}),
138
+ customer_feedback: feedback,
139
+ ...(reason ? { feedback_reason: String(reason).slice(0, 2000) } : {}),
140
+ ...(diagnosis ? { feedback_diagnosis: diagnosis, needs_review: true } : {}),
141
+ } })
83
142
  .eq('id', interaction.id)
84
143
  }
85
144
 
86
145
  await emitLog(ctx, 'ai_interaction.feedback_submitted',
87
146
  { type: 'message', id: message_id },
88
- { after: { feedback, ticket_id, escalated: feedback === 'not_helpful' } }
147
+ { after: { feedback, ticket_id, escalated: feedback === 'not_helpful', diagnosis } }
89
148
  )
90
149
 
150
+ // Journey event: a customer submitted feedback through the calling app.
151
+ emitSignal(ctx, {
152
+ type_slug: 'funnel_signal',
153
+ action: 'feedback_submitted',
154
+ data: { ticket_id, feedback, diagnosis, source: ctx.appId ?? 'core' },
155
+ }).catch(() => {})
156
+
91
157
  return { message_id, ticket_id, feedback, escalated: feedback === 'not_helpful' }
92
158
  })
93
- // CIL[END chunk_id="ai-interactions_submitfeedback_1784019432"]
94
- // CIL[BEGIN chunk_id="ai-interactions_createinteraction_1784019432" type="function" identity="createInteraction" parent="none"]
95
- // CIL[DOC-MACRO purpose="Create AI interaction feedback record"]
96
- // CIL[DOC-RESPONSIBILITY responsibility="Create structured record of AI-human exchange"]
97
- // CIL[DOC-CONTEXT module="ai-interactions" layer="api-handler" related_files="[\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/src/components/ui/dialog.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/functions/_shared/schema-utils.ts\",\"\\\"]"]
98
- // CIL[DOC-CONTRACT inputs="none" outputs="created_record_or_skip" errors="thread_or_message_required,type_not_found" side_effects="database_record_creation,type_resolution"]
99
- // CIL[DOC-MICRO logic_summary="Resolves type, creates record with interaction metadata, handles missing type gracefully" notable_decisions="[]"]
100
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="external_symbols_unknown"]
101
- // CIL[DOC-STABILITY stability="stable"]
102
- // CIL[DOC-VECTOR type="context" content="Layer: api-handler. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/TypeDetailPage.tsx, .framework/src/components/ui/dialog.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/functions/_shared/schema-utils.ts, \."]
103
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
104
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
105
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
159
+ // CIL[DOC-VECTOR type="context" content="purpose='Record customer thumbs-up/thumbs-down feedback for an AI message and escalate to human if needed.'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/resolve-ids.ts"]
160
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
161
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
162
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
106
163
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
107
164
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
165
+ // CIL[END stable_id="~/.framework/functions/ai-interactions.ts:submitFeedback:constant"]
166
+ // CIL[BEGIN stable_id="~/.framework/functions/ai-interactions.ts:createInteraction:constant" type="constant" identity="createInteraction" parent="~/.framework/functions/ai-interactions.ts"]
167
+ // CIL[DOC-MACRO purpose="Create a new interaction-feedback item (default ai_feedback_record, overridable via type_slug) that captures per-message interaction metadata."]
168
+ // CIL[DOC-RESPONSIBILITY responsibility="Resolve the caller-declared type_slug (default ai_feedback_record), validate required identifiers, and insert a typed record."]
169
+ // CIL[DOC-CONTEXT module="ai-interactions" layer="functions" related_files=".framework/functions/_shared/audit.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/resolve-ids.ts,.framework/functions/admin-data.ts,.framework/functions/ai-interactions.ts"]
170
+ // CIL[DOC-CONTRACT inputs="thread_id or ai_message_id plus optional metadata and optional type_slug" outputs="record or skipped object" errors="none thrown; returns skipped if type not found" side_effects="creates a row in items"]
171
+ // CIL[DOC-MICRO logic_summary="Require thread_id or ai_message_id, resolve body.type_slug (default ai_feedback_record) via resolveTypeId, call create with default/null fields, and return the record." notable_decisions="type_slug lets app-specific demos record interactions under their own item type without forking this function"]
172
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
173
+ // CIL[DOC-STABILITY stability="stable"]
108
174
  export const createInteraction = createHandler(async (ctx, body) => {
109
175
  const {
110
176
  thread_id, ai_message_id, retrieved_sources = [],
@@ -112,20 +178,22 @@ export const createInteraction = createHandler(async (ctx, body) => {
112
178
  ai_confidence, retrieval_confidence, kb_candidate,
113
179
  answer_quality, assistance_outcome,
114
180
  eval_case_id, cil_learning_proposal_id,
115
- review_notes, reviewed_by, reviewed_at
181
+ review_notes, reviewed_by, reviewed_at,
182
+ type_slug
116
183
  } = body || {}
117
184
 
118
185
  if (!thread_id && !ai_message_id) {
119
186
  throw new Error('thread_id or ai_message_id is required')
120
187
  }
121
188
 
189
+ const resolvedSlug = type_slug || 'ai_feedback_record'
122
190
  let typeId: string | null = null
123
191
  try {
124
- typeId = await resolveTypeId('item', 'ai_feedback_record')
192
+ typeId = await resolveTypeId('item', resolvedSlug)
125
193
  } catch {
126
- return { skipped: true, reason: 'ai_feedback_record type not found' }
194
+ return { skipped: true, reason: `${resolvedSlug} type not found` }
127
195
  }
128
- if (!typeId) return { skipped: true, reason: 'ai_feedback_record type not found' }
196
+ if (!typeId) return { skipped: true, reason: `${resolvedSlug} type not found` }
129
197
 
130
198
  const record = await create(ctx, {
131
199
  entity: 'items',
@@ -157,21 +225,21 @@ export const createInteraction = createHandler(async (ctx, body) => {
157
225
 
158
226
  return record
159
227
  })
160
- // CIL[END chunk_id="ai-interactions_createinteraction_1784019432"]
161
- // CIL[BEGIN chunk_id="ai-interactions_updateinteraction_1784019432" type="function" identity="updateInteraction" parent="none"]
162
- // CIL[DOC-MACRO purpose="Update AI interaction feedback record"]
163
- // CIL[DOC-RESPONSIBILITY responsibility="Patch allowed fields on interaction record"]
164
- // CIL[DOC-CONTEXT module="ai-interactions" layer="api-handler" related_files="[\".framework/src/pages/admin/TypeDetailPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/functions/_shared/schema-utils.ts\",\"\\\"]"]
165
- // CIL[DOC-CONTRACT inputs="none" outputs="updated_record" errors="id_required,no_updatable_fields,record_not_found" side_effects="database_update,data_merging"]
166
- // CIL[DOC-MICRO logic_summary="Filters allowed fields, merges with existing data, updates record" notable_decisions="[]"]
167
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
168
- // CIL[DOC-STABILITY stability="stable"]
169
- // CIL[DOC-VECTOR type="context" content="Layer: api-handler. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/TypeDetailPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/functions/_shared/schema-utils.ts, \."]
170
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
171
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
172
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
228
+ // CIL[DOC-VECTOR type="context" content="purpose='Create a new interaction-feedback item under a caller-declared type_slug (default ai_feedback_record).'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/resolve-ids.ts"]
229
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
230
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
231
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
173
232
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
174
233
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
234
+ // CIL[END stable_id="~/.framework/functions/ai-interactions.ts:createInteraction:constant"]
235
+ // CIL[BEGIN stable_id="~/.framework/functions/ai-interactions.ts:updateInteraction:constant" type="constant" identity="updateInteraction" parent="~/.framework/functions/ai-interactions.ts"]
236
+ // CIL[DOC-MACRO purpose="Update an existing ai_interaction record with allowed fields."]
237
+ // CIL[DOC-RESPONSIBILITY responsibility="Validate id and allowed field list, merge patch into existing data, and delegate to the generic update helper."]
238
+ // CIL[DOC-CONTEXT module="ai-interactions" layer="functions" related_files=".framework/functions/_shared/audit.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/resolve-ids.ts,.framework/functions/admin-data.ts,.framework/functions/ai-interactions.ts"]
239
+ // CIL[DOC-CONTRACT inputs="id and one or more allowed fields" outputs="update result" errors="missing id, no updatable fields, record not found" side_effects="updates items.data"]
240
+ // CIL[DOC-MICRO logic_summary="Validate id, build a patch from the allow-list, fetch existing record data, and call update with merged data." notable_decisions="[]"]
241
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
242
+ // CIL[DOC-STABILITY stability="stable"]
175
243
  export const updateInteraction = createHandler(async (ctx, body) => {
176
244
  const { id, ...fields } = body || {}
177
245
  if (!id) throw new Error('id is required')
@@ -197,21 +265,21 @@ export const updateInteraction = createHandler(async (ctx, body) => {
197
265
  { data: { ...(existing.data || {}), ...patch } }
198
266
  )
199
267
  })
200
- // CIL[END chunk_id="ai-interactions_updateinteraction_1784019432"]
201
- // CIL[BEGIN chunk_id="ai-interactions_createcilproposal_1784019432" type="function" identity="createCilLearningProposal" parent="none"]
202
- // CIL[DOC-MACRO purpose="Queue a CIL learning proposal for developer review"]
203
- // CIL[DOC-RESPONSIBILITY responsibility="Create a cil_learning_proposal item from support case evidence"]
204
- // CIL[DOC-CONTEXT module="ai-interactions" layer="api-handler" related_files="["custom/apps/cortex/seed/types.json", ".framework/functions/admin-data.ts", ".framework/functions/_shared/schema-utils.ts", "\\\"]"]
205
- // CIL[DOC-CONTRACT inputs="ticket_id, thread_id, ai_message_id, proposed_summary, source_*" outputs="created_proposal" errors="missing_summary_or_ticket, type_not_found" side_effects="database_record_creation"]
206
- // CIL[DOC-MICRO logic_summary="Resolves cil_learning_proposal type and creates a draft proposal from support case context" notable_decisions=["Cortex may only create and update proposals; applying them is reserved for the developer workbench."]
207
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="external_symbols_unknown"]
208
- // CIL[DOC-STABILITY stability="experimental"]
209
- // CIL[DOC-VECTOR type="context" content="Layer: api-handler. Direct callers: 0. Direct calls: 0. Related files: custom/apps/cortex/seed/types.json, .framework/functions/admin-data.ts, .framework/functions/_shared/schema-utils.ts, \."]
210
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
211
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
212
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
268
+ // CIL[DOC-VECTOR type="context" content="purpose='Update an existing ai_interaction record with allowed fields.'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/resolve-ids.ts"]
269
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
270
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
271
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
213
272
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
214
273
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
274
+ // CIL[END stable_id="~/.framework/functions/ai-interactions.ts:updateInteraction:constant"]
275
+ // CIL[BEGIN stable_id="~/.framework/functions/ai-interactions.ts:createCilLearningProposal:constant" type="constant" identity="createCilLearningProposal" parent="~/.framework/functions/ai-interactions.ts"]
276
+ // CIL[DOC-MACRO purpose="Create a draft CIL learning proposal from ticket context and source references."]
277
+ // CIL[DOC-RESPONSIBILITY responsibility="Validate ticket_id and proposed_summary, resolve the cil_learning_proposal type, and insert a draft record."]
278
+ // CIL[DOC-CONTEXT module="ai-interactions" layer="functions" related_files=".framework/functions/_shared/audit.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/resolve-ids.ts,.framework/functions/admin-data.ts,.framework/functions/ai-interactions.ts"]
279
+ // CIL[DOC-CONTRACT inputs="ticket_id, proposed_summary, optional thread/message/tags" outputs="record or skipped object" errors="missing ticket_id or summary; returns skipped if type not found" side_effects="creates a draft proposal row in items"]
280
+ // CIL[DOC-MICRO logic_summary="Validate required inputs, resolve the proposal type, build data payload with source references, and create the record." notable_decisions="[]"]
281
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
282
+ // CIL[DOC-STABILITY stability="stable"]
215
283
  export const createCilLearningProposal = createHandler(async (ctx, body) => {
216
284
  const {
217
285
  ticket_id, thread_id, ai_message_id, proposed_summary,
@@ -252,21 +320,21 @@ export const createCilLearningProposal = createHandler(async (ctx, body) => {
252
320
 
253
321
  return record
254
322
  })
255
- // CIL[END chunk_id="ai-interactions_createcilproposal_1784019432"]
256
- // CIL[BEGIN chunk_id="ai-interactions_list_1784019432" type="function" identity="list" parent="none"]
257
- // CIL[DOC-MACRO purpose="List AI interaction records for account"]
258
- // CIL[DOC-RESPONSIBILITY responsibility="Query and filter interaction records with pagination"]
259
- // CIL[DOC-CONTEXT module="ai-interactions" layer="api-handler" related_files="[\".framework/src/pages/admin/TypeDetailPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/functions/_shared/schema-utils.ts\",\".framework/functions/_shared/principal.ts\",\"custom/apps/portal/pages/ContentPage.tsx\"]"]
260
- // CIL[DOC-CONTRACT inputs="none" outputs="interaction_records[]" errors="database_error" side_effects="database_query,rls_filtering"]
261
- // CIL[DOC-MICRO logic_summary="Builds filtered query for ai_feedback_record type with pagination" notable_decisions="[]"]
262
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
263
- // CIL[DOC-STABILITY stability="stable"]
264
- // CIL[DOC-VECTOR type="context" content="Layer: api-handler. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/TypeDetailPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/functions/_shared/schema-utils.ts, .framework/functions/_shared/principal.ts, custom/apps/portal/pages/ContentPage.tsx."]
265
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
266
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
267
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
323
+ // CIL[DOC-VECTOR type="context" content="purpose='Create a draft CIL learning proposal from ticket context and source references.'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/resolve-ids.ts"]
324
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
325
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
326
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
268
327
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
269
328
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
329
+ // CIL[END stable_id="~/.framework/functions/ai-interactions.ts:createCilLearningProposal:constant"]
330
+ // CIL[BEGIN stable_id="~/.framework/functions/ai-interactions.ts:list:constant" type="constant" identity="list" parent="~/.framework/functions/ai-interactions.ts"]
331
+ // CIL[DOC-MACRO purpose="List AI interaction records filtered by feedback and kb_candidate."]
332
+ // CIL[DOC-RESPONSIBILITY responsibility="Build a paged query scoped to the account, apply optional filters, and return matching rows."]
333
+ // CIL[DOC-CONTEXT module="ai-interactions" layer="functions" related_files=".framework/functions/_shared/audit.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/resolve-ids.ts,.framework/functions/admin-data.ts,.framework/functions/ai-interactions.ts"]
334
+ // CIL[DOC-CONTRACT inputs="ctx.query { feedback?, kb_candidate?, limit?, offset? }" outputs="array of records" errors="throws query error" side_effects="none"]
335
+ // CIL[DOC-MICRO logic_summary="Parse query parameters, select from items with account filter and optional data filters, then return data." notable_decisions="[]"]
336
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
337
+ // CIL[DOC-STABILITY stability="stable"]
270
338
  export const list = createHandler(async (ctx, _body) => {
271
339
  const { feedback, kb_candidate, limit = '50', offset = '0' } = ctx.query || {}
272
340
 
@@ -288,21 +356,21 @@ export const list = createHandler(async (ctx, _body) => {
288
356
  if (error) throw error
289
357
  return data || []
290
358
  })
291
- // CIL[END chunk_id="ai-interactions_list_1784019432"]
292
- // CIL[BEGIN chunk_id="ai-interactions_handler_1784019432" type="function" identity="handler" parent="none"]
293
- // CIL[DOC-MACRO purpose="Route AI interaction requests"]
294
- // CIL[DOC-RESPONSIBILITY responsibility="Dispatch requests to appropriate interaction handlers"]
295
- // CIL[DOC-CONTEXT module="ai-interactions" layer="api-handler" related_files="[]"]
296
- // CIL[DOC-CONTRACT inputs="none" outputs="handler_response" errors="invalid_action_or_method" side_effects="delegates_to_interaction_handlers"]
297
- // CIL[DOC-MICRO logic_summary="Routes actions to submit_feedback, create_interaction, update_interaction, list" notable_decisions="[]"]
298
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
299
- // CIL[DOC-STABILITY stability="stable"]
300
- // CIL[DOC-VECTOR type="context" content="Layer: api-handler. Direct callers: 0. Direct calls: 0. Related files: none."]
301
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
302
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
303
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
359
+ // CIL[DOC-VECTOR type="context" content="purpose='List AI interaction records filtered by feedback and kb_candidate.'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/resolve-ids.ts"]
360
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
361
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
362
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
304
363
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
305
364
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
365
+ // CIL[END stable_id="~/.framework/functions/ai-interactions.ts:list:constant"]
366
+ // CIL[BEGIN stable_id="~/.framework/functions/ai-interactions.ts:handler:constant" type="constant" identity="handler" parent="~/.framework/functions/ai-interactions.ts"]
367
+ // CIL[DOC-MACRO purpose="Main request router for the ai-interactions Netlify function."]
368
+ // CIL[DOC-RESPONSIBILITY responsibility="Dispatch incoming requests to the correct action handler based on action and HTTP method."]
369
+ // CIL[DOC-CONTEXT module="ai-interactions" layer="functions" related_files=".framework/functions/_shared/audit.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/resolve-ids.ts,.framework/functions/admin-data.ts,.framework/functions/ai-interactions.ts"]
370
+ // CIL[DOC-CONTRACT inputs="ctx.query { action, method } and body" outputs="handler result" errors="invalid action or method" side_effects="delegates to other handlers"]
371
+ // CIL[DOC-MICRO logic_summary="Switch on action and method, call the appropriate sub-handler, and throw an error for unsupported combinations." notable_decisions="[]"]
372
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
373
+ // CIL[DOC-STABILITY stability="stable"]
306
374
  export const handler = createHandler(async (ctx, body) => {
307
375
  const { action } = ctx.query || {}
308
376
  const method = ctx.query?.method || 'GET'
@@ -327,4 +395,10 @@ export const handler = createHandler(async (ctx, body) => {
327
395
 
328
396
  throw new Error('Invalid action or method')
329
397
  })
330
- // CIL[END chunk_id="ai-interactions_handler_1784019432"]
398
+ // CIL[DOC-VECTOR type="context" content="purpose='Main request router for the ai-interactions Netlify function.'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/resolve-ids.ts"]
399
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
400
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
401
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
402
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
403
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
404
+ // CIL[END stable_id="~/.framework/functions/ai-interactions.ts:handler:constant"]