spine-framework 0.3.145 → 0.4.1

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 +5067 -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
@@ -0,0 +1,510 @@
1
+ // CIL[BEGIN stable_id="~/.framework/mcp/tools/observability.ts:module_header:module_header" type="module_header" identity="module_header" parent="~/.framework/mcp/tools/observability.ts"]
2
+ // CIL[DOC-MACRO purpose="MCP tool registration module for observability logs and metrics"]
3
+ // CIL[DOC-RESPONSIBILITY responsibility="Imports dependencies and exports the register function that wires observability MCP tools to an McpServer"]
4
+ // CIL[DOC-CONTEXT module="observability" layer="mcp-tools" related_files=".framework/mcp/shared/db.ts"]
5
+ // CIL[DOC-CONTRACT inputs="McpServer instance via register" outputs="MCP tool handlers for volume, error rate, latency, pipeline, top actors, AI support, and logs" errors="Throws from adminDb RPC or query errors via throwDbError" side_effects="None at module load"]
6
+ // CIL[DOC-MICRO logic_summary="Sets up zod schemas and adminDb RPC calls for observability data" notable_decisions="[]"]
7
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
8
+ // CIL[DOC-STABILITY stability="stable"]
9
+ // CIL[DOC-AUDIENCE audience="framework-maintainers"]
10
+
11
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'
12
+ import { z } from 'zod'
13
+ import { adminDb } from '../shared/db.js'
14
+ import { resolveTypeId } from '../shared/db.js'
15
+ // CIL[DOC-VECTOR type="context" content="purpose='MCP tool registration module for observability logs and metrics'; No verified external callers; imports: .framework/mcp/shared/db.ts"]
16
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
17
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
18
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
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
+ // CIL[END stable_id="~/.framework/mcp/tools/observability.ts:module_header:module_header"]
22
+
23
+
24
+ // CIL[BEGIN stable_id="~/.framework/mcp/tools/observability.ts:mapLogRow:function" type="function" identity="mapLogRow" parent="~/.framework/mcp/tools/observability.ts"]
25
+ // CIL[DOC-MACRO purpose="Map a raw log database row to a normalized client-facing log object"]
26
+ // CIL[DOC-RESPONSIBILITY responsibility="Transform database column names to the expected client log field names"]
27
+ // CIL[DOC-CONTEXT module="observability" layer="mcp-tools" related_files=".framework/mcp/shared/db.ts,.framework/mcp/tools/observability.ts"]
28
+ // CIL[DOC-CONTRACT inputs="row: any database log row" outputs="normalized log object" errors="None" side_effects="None"]
29
+ // CIL[DOC-MICRO logic_summary="Returns an object mapping row columns to the names expected by consumers" notable_decisions="[]"]
30
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
31
+ // CIL[DOC-STABILITY stability="stable"]
32
+ function mapLogRow(row: any) {
33
+ return {
34
+ id: row.id,
35
+ event_type: row.level,
36
+ actor_id: row.person_id,
37
+ target_type: row.source_type,
38
+ target_id: row.source_id,
39
+ action: row.source,
40
+ span_name: row.span_name,
41
+ trace_id: row.trace_id,
42
+ span_id: row.span_id,
43
+ parent_span_id: row.parent_span_id,
44
+ duration_ms: row.duration_ms,
45
+ outcome: row.outcome,
46
+ event_category: row.event_category,
47
+ kind: row.kind,
48
+ message: row.message,
49
+ details: row.context,
50
+ metadata: row.metadata,
51
+ created_at: row.created_at,
52
+ }
53
+ }
54
+ // CIL[DOC-VECTOR type="context" content="purpose='Map a raw log database row to a normalized client-facing log object'; No verified external callers; imports: .framework/mcp/shared/db.ts"]
55
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
56
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
57
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
58
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
59
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
60
+ // CIL[END stable_id="~/.framework/mcp/tools/observability.ts:mapLogRow:function"]
61
+
62
+
63
+ // CIL[BEGIN stable_id="~/.framework/mcp/tools/observability.ts:textResponse:function" type="function" identity="textResponse" parent="~/.framework/mcp/tools/observability.ts"]
64
+ // CIL[DOC-MACRO purpose="Wrap any value in an MCP text content response"]
65
+ // CIL[DOC-RESPONSIBILITY responsibility="Format JSON-serialized payloads for MCP text tool responses"]
66
+ // CIL[DOC-CONTEXT module="observability" layer="mcp-tools" related_files=".framework/mcp/shared/db.ts,.framework/mcp/tools/observability.ts"]
67
+ // CIL[DOC-CONTRACT inputs="obj: any" outputs="MCP content array with type text" errors="May throw if JSON.stringify receives circular input" side_effects="None"]
68
+ // CIL[DOC-MICRO logic_summary="Stringify object and return an MCP text content wrapper" notable_decisions="[]"]
69
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
70
+ // CIL[DOC-STABILITY stability="stable"]
71
+ function textResponse(obj: any) {
72
+ return {
73
+ content: [{
74
+ type: 'text' as const,
75
+ text: JSON.stringify(obj, null, 2),
76
+ }],
77
+ }
78
+ }
79
+ // CIL[DOC-VECTOR type="context" content="purpose='Wrap any value in an MCP text content response'; No verified external callers; imports: .framework/mcp/shared/db.ts"]
80
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
81
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
82
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
83
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
84
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
85
+ // CIL[END stable_id="~/.framework/mcp/tools/observability.ts:textResponse:function"]
86
+
87
+
88
+ // CIL[BEGIN stable_id="~/.framework/mcp/tools/observability.ts:throwDbError:function" type="function" identity="throwDbError" parent="~/.framework/mcp/tools/observability.ts"]
89
+ // CIL[DOC-MACRO purpose="Convert an unknown error into a JavaScript Error with a readable message"]
90
+ // CIL[DOC-RESPONSIBILITY responsibility="Provide uniform database error handling for tool handlers"]
91
+ // CIL[DOC-CONTEXT module="observability" layer="mcp-tools" related_files=".framework/mcp/shared/db.ts,.framework/mcp/tools/observability.ts"]
92
+ // CIL[DOC-CONTRACT inputs="error: any" outputs="Throws Error" errors="Throws Error for any error input" side_effects="None"]
93
+ // CIL[DOC-MICRO logic_summary="Coerce error to string and throw" notable_decisions="[]"]
94
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
95
+ // CIL[DOC-STABILITY stability="stable"]
96
+ function throwDbError(error: any) {
97
+ const msg = error && typeof error === 'object'
98
+ ? (error.message || JSON.stringify(error))
99
+ : String(error)
100
+ throw new Error(msg)
101
+ }
102
+ // CIL[DOC-VECTOR type="context" content="purpose='Convert an unknown error into a JavaScript Error with a readable message'; No verified external callers; imports: .framework/mcp/shared/db.ts"]
103
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
104
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
105
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
106
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
107
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
108
+ // CIL[END stable_id="~/.framework/mcp/tools/observability.ts:throwDbError:function"]
109
+
110
+
111
+ // CIL[BEGIN stable_id="~/.framework/mcp/tools/observability.ts:defaultRange:function" type="function" identity="defaultRange" parent="~/.framework/mcp/tools/observability.ts"]
112
+ // CIL[DOC-MACRO purpose="Return a default 24-hour ISO date range ending at now"]
113
+ // CIL[DOC-RESPONSIBILITY responsibility="Provide fallback from/to timestamps for time-bucketed metric queries"]
114
+ // CIL[DOC-CONTEXT module="observability" layer="mcp-tools" related_files=".framework/mcp/shared/db.ts,.framework/mcp/tools/observability.ts"]
115
+ // CIL[DOC-CONTRACT inputs="None" outputs="{ from: ISO string, to: ISO string }" errors="None" side_effects="None"]
116
+ // CIL[DOC-MICRO logic_summary="Compute yesterday by subtracting 24 hours from now" notable_decisions="[]"]
117
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
118
+ // CIL[DOC-STABILITY stability="stable"]
119
+ function defaultRange() {
120
+ const now = new Date()
121
+ const yesterday = new Date(now.getTime() - 24 * 60 * 60 * 1000).toISOString()
122
+ return { from: yesterday, to: now.toISOString() }
123
+ }
124
+ // CIL[DOC-VECTOR type="context" content="purpose='Return a default 24-hour ISO date range ending at now'; No verified external callers; imports: .framework/mcp/shared/db.ts"]
125
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
126
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
127
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
128
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
129
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
130
+ // CIL[END stable_id="~/.framework/mcp/tools/observability.ts:defaultRange:function"]
131
+
132
+
133
+
134
+ // CIL[BEGIN stable_id="~/.framework/mcp/tools/observability.ts:bucketToGranularity:constant" type="constant" identity="bucketToGranularity" parent="~/.framework/mcp/tools/observability.ts"]
135
+ // CIL[DOC-MACRO purpose="Map friendly bucket names to SQL interval strings"]
136
+ // CIL[DOC-RESPONSIBILITY responsibility="Translate hour/day/week inputs to PostgreSQL granularity literals"]
137
+ // CIL[DOC-CONTEXT module="observability" layer="mcp-tools" related_files=".framework/mcp/shared/db.ts,.framework/mcp/tools/observability.ts"]
138
+ // CIL[DOC-CONTRACT inputs="bucket string key" outputs="PostgreSQL interval string" errors="None" side_effects="None"]
139
+ // CIL[DOC-MICRO logic_summary="Lookup Record<string,string> with default 1 hour" notable_decisions="[]"]
140
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
141
+ // CIL[DOC-STABILITY stability="stable"]
142
+ const bucketToGranularity: Record<string, string> = {
143
+ hour: '1 hour',
144
+ day: '1 day',
145
+ week: '1 week',
146
+ }
147
+ // CIL[DOC-VECTOR type="context" content="purpose='Map friendly bucket names to SQL interval strings'; No verified external callers; imports: .framework/mcp/shared/db.ts"]
148
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
149
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
150
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
151
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
152
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
153
+ // CIL[END stable_id="~/.framework/mcp/tools/observability.ts:bucketToGranularity:constant"]
154
+
155
+
156
+
157
+
158
+ // CIL[BEGIN stable_id="~/.framework/mcp/tools/observability.ts:register:function" type="function" identity="register" parent="~/.framework/mcp/tools/observability.ts"]
159
+ // CIL[DOC-MACRO purpose="Register all observability MCP tools on a server instance"]
160
+ // CIL[DOC-RESPONSIBILITY responsibility="Expose metrics, logs, and AI support query tools to MCP clients"]
161
+ // CIL[DOC-CONTEXT module="observability" layer="mcp-tools" related_files=".framework/mcp/shared/db.ts,.framework/mcp/tools/observability.ts"]
162
+ // CIL[DOC-CONTRACT inputs="server: McpServer" outputs="Registered tool handlers with zod input schemas" errors="Throws on database RPC or query errors" side_effects="Adds ten tool handlers to the McpServer"]
163
+ // CIL[DOC-MICRO logic_summary="Defines ten tools using zod and adminDb RPC or queries: event volume, error rate, latency percentiles, pipeline stats, top actors, AI support metrics, log search, log list, log for target, log stats" notable_decisions="['latency_percentiles returns avg_handler_duration because percentile RPCs are not yet available']"]
164
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
165
+ // CIL[DOC-STABILITY stability="stable"]
166
+ export function register(server: McpServer) {
167
+ server.registerTool(
168
+ 'spine_observability_event_volume',
169
+ {
170
+ description: 'Get request count over time, bucketed by hour/day/week.',
171
+ inputSchema: z.object({
172
+ account_id: z.string().uuid(),
173
+ from: z.string().datetime().optional(),
174
+ to: z.string().datetime().optional(),
175
+ bucket: z.enum(['hour', 'day', 'week']).default('hour'),
176
+ }),
177
+ },
178
+ async ({ account_id, from, to, bucket }) => {
179
+ const range = defaultRange()
180
+ const { data, error } = await adminDb.rpc('get_metric_series', {
181
+ p_account_id: account_id,
182
+ p_metric_name: 'request_count',
183
+ p_granularity: bucketToGranularity[bucket] || '1 hour',
184
+ p_date_from: from || range.from,
185
+ p_date_to: to || range.to,
186
+ })
187
+ if (error) throwDbError(error)
188
+ return textResponse({ action: 'event_volume', data: data || [] })
189
+ }
190
+ )
191
+
192
+ server.registerTool(
193
+ 'spine_observability_error_rate',
194
+ {
195
+ description: 'Get error rate over time for an account and date range.',
196
+ inputSchema: z.object({
197
+ account_id: z.string().uuid(),
198
+ from: z.string().datetime().optional(),
199
+ to: z.string().datetime().optional(),
200
+ bucket: z.enum(['hour', 'day', 'week']).default('hour'),
201
+ }),
202
+ },
203
+ async ({ account_id, from, to, bucket }) => {
204
+ const range = defaultRange()
205
+ const { data, error } = await adminDb.rpc('get_metric_series', {
206
+ p_account_id: account_id,
207
+ p_metric_name: 'error_rate',
208
+ p_granularity: bucketToGranularity[bucket] || '1 hour',
209
+ p_date_from: from || range.from,
210
+ p_date_to: to || range.to,
211
+ })
212
+ if (error) throwDbError(error)
213
+ return textResponse({ action: 'error_rate', data: data || [] })
214
+ }
215
+ )
216
+
217
+ server.registerTool(
218
+ 'spine_observability_latency_percentiles',
219
+ {
220
+ description: 'Get handler latency (average duration_ms) over time. Percentile RPCs are not yet available; this returns the avg_handler_duration metric series.',
221
+ inputSchema: z.object({
222
+ account_id: z.string().uuid(),
223
+ from: z.string().datetime().optional(),
224
+ to: z.string().datetime().optional(),
225
+ bucket: z.enum(['hour', 'day', 'week']).default('hour'),
226
+ }),
227
+ },
228
+ async ({ account_id, from, to, bucket }) => {
229
+ const range = defaultRange()
230
+ const { data, error } = await adminDb.rpc('get_metric_series', {
231
+ p_account_id: account_id,
232
+ p_metric_name: 'avg_handler_duration',
233
+ p_granularity: bucketToGranularity[bucket] || '1 hour',
234
+ p_date_from: from || range.from,
235
+ p_date_to: to || range.to,
236
+ })
237
+ if (error) throwDbError(error)
238
+ return textResponse({ action: 'latency_percentiles', data: data || [] })
239
+ }
240
+ )
241
+
242
+ server.registerTool(
243
+ 'spine_observability_pipeline_stats',
244
+ {
245
+ description: 'Get pipeline failure rate over time.',
246
+ inputSchema: z.object({
247
+ account_id: z.string().uuid(),
248
+ from: z.string().datetime().optional(),
249
+ to: z.string().datetime().optional(),
250
+ bucket: z.enum(['hour', 'day', 'week']).default('hour'),
251
+ }),
252
+ },
253
+ async ({ account_id, from, to, bucket }) => {
254
+ const range = defaultRange()
255
+ const { data, error } = await adminDb.rpc('get_metric_series', {
256
+ p_account_id: account_id,
257
+ p_metric_name: 'pipeline_failure_rate',
258
+ p_granularity: bucketToGranularity[bucket] || '1 hour',
259
+ p_date_from: from || range.from,
260
+ p_date_to: to || range.to,
261
+ })
262
+ if (error) throwDbError(error)
263
+ return textResponse({ action: 'pipeline_stats', data: data || [] })
264
+ }
265
+ )
266
+
267
+ server.registerTool(
268
+ 'spine_observability_top_actors',
269
+ {
270
+ description: 'Get the top business outcomes by span_name/outcome count.',
271
+ inputSchema: z.object({
272
+ account_id: z.string().uuid(),
273
+ from: z.string().datetime().optional(),
274
+ to: z.string().datetime().optional(),
275
+ }),
276
+ },
277
+ async ({ account_id, from, to }) => {
278
+ const range = defaultRange()
279
+ const { data, error } = await adminDb.rpc('get_business_outcomes', {
280
+ p_account_id: account_id,
281
+ p_date_from: from || range.from,
282
+ p_date_to: to || range.to,
283
+ })
284
+ if (error) throwDbError(error)
285
+ return textResponse({ action: 'business_outcomes', data: data || [] })
286
+ }
287
+ )
288
+
289
+ server.registerTool(
290
+ 'spine_observability_ai_support_metrics',
291
+ {
292
+ description: 'Get AI support metrics and knowledge gap analysis for an account.',
293
+ inputSchema: z.object({
294
+ account_id: z.string().uuid(),
295
+ from: z.string().datetime().optional(),
296
+ to: z.string().datetime().optional(),
297
+ }),
298
+ },
299
+ async ({ account_id, from, to }) => {
300
+ const now = new Date()
301
+ const thirtyDaysAgo = new Date(now.getTime() - 30 * 24 * 60 * 60 * 1000).toISOString()
302
+ const fromDate = from || thirtyDaysAgo
303
+ const toDate = to || now.toISOString()
304
+
305
+ const feedbackTypeId = await resolveTypeId('item', 'ai_feedback_record')
306
+
307
+ const [feedbackResult, resolvedResult, escalatedResult] = await Promise.allSettled([
308
+ adminDb
309
+ .from('items')
310
+ .select('data')
311
+ .eq('account_id', account_id)
312
+ .eq('type_id', feedbackTypeId)
313
+ .gte('created_at', fromDate)
314
+ .lte('created_at', toDate)
315
+ .limit(5000),
316
+ adminDb
317
+ .from('items')
318
+ .select('id', { count: 'exact', head: true })
319
+ .eq('account_id', account_id)
320
+ .eq('status', 'resolved')
321
+ .eq('data->>aim_escalation_reason', 'none')
322
+ .gte('created_at', fromDate)
323
+ .lte('created_at', toDate),
324
+ adminDb
325
+ .from('items')
326
+ .select('id', { count: 'exact', head: true })
327
+ .eq('account_id', account_id)
328
+ .eq('status', 'human_assigned')
329
+ .gte('created_at', fromDate)
330
+ .lte('created_at', toDate),
331
+ ])
332
+
333
+ const feedbackRows = feedbackResult.status === 'fulfilled' ? (feedbackResult.value.data || []) : []
334
+ const aiAttempted = feedbackRows.length
335
+ const notHelpful = feedbackRows.filter((r: any) => r.data?.customer_feedback === 'not_helpful').length
336
+ const kbCreated = feedbackRows.filter((r: any) => r.data?.kb_article_id).length
337
+ const kbReuseCount = feedbackRows.reduce((sum: number, r: any) => sum + (Number(r.data?.reuse_count) || 0), 0)
338
+ const knowledgeGaps = feedbackRows.filter(
339
+ (r: any) => r.data?.kb_candidate === false && r.data?.customer_feedback === 'not_helpful'
340
+ ).length
341
+ const aiResolved = resolvedResult.status === 'fulfilled' ? (resolvedResult.value.count || 0) : 0
342
+ const escalated = escalatedResult.status === 'fulfilled' ? (escalatedResult.value.count || 0) : 0
343
+ const thumbsDownRate = aiAttempted > 0 ? notHelpful / aiAttempted : 0
344
+
345
+ return textResponse({
346
+ action: 'ai_support_metrics',
347
+ period: { from: fromDate, to: toDate },
348
+ ai_attempted: aiAttempted,
349
+ ai_resolved: aiResolved,
350
+ human_escalations: escalated,
351
+ thumbs_down_rate: Math.round(thumbsDownRate * 1000) / 1000,
352
+ kb_articles_created: kbCreated,
353
+ kb_reuse_count: kbReuseCount,
354
+ knowledge_gaps: knowledgeGaps,
355
+ })
356
+ }
357
+ )
358
+
359
+ server.registerTool(
360
+ 'spine_logs_search',
361
+ {
362
+ description: 'Full-text search over log messages for an account.',
363
+ inputSchema: z.object({
364
+ account_id: z.string().uuid(),
365
+ query: z.string(),
366
+ event_type: z.string().optional(),
367
+ target_type: z.string().optional(),
368
+ limit: z.number().int().min(1).max(1000).default(50),
369
+ offset: z.number().int().min(0).default(0),
370
+ }),
371
+ },
372
+ async ({ account_id, query, event_type, target_type, limit, offset }) => {
373
+ let q = adminDb
374
+ .from('logs')
375
+ .select('*')
376
+ .eq('account_id', account_id)
377
+ .ilike('message', `%${query}%`)
378
+ .order('created_at', { ascending: false })
379
+
380
+ if (event_type) q = q.eq('level', event_type)
381
+ if (target_type) q = q.eq('source_type', target_type)
382
+
383
+ const { data, error } = await q.range(offset, offset + limit - 1)
384
+ if (error) throwDbError(error)
385
+ return textResponse({ action: 'search', data: (data || []).map(mapLogRow) })
386
+ }
387
+ )
388
+
389
+ server.registerTool(
390
+ 'spine_logs_for_account',
391
+ {
392
+ description: 'List log entries for an account with optional filtering and pagination.',
393
+ inputSchema: z.object({
394
+ account_id: z.string().uuid(),
395
+ event_type: z.string().optional(),
396
+ target_type: z.string().optional(),
397
+ source: z.string().optional(),
398
+ source_id: z.string().optional(),
399
+ actor_id: z.string().uuid().optional(),
400
+ date_from: z.string().datetime().optional(),
401
+ date_to: z.string().datetime().optional(),
402
+ trace_id: z.string().optional(),
403
+ limit: z.number().int().min(1).max(1000).default(100),
404
+ offset: z.number().int().min(0).default(0),
405
+ }),
406
+ },
407
+ async ({ account_id, event_type, target_type, source, source_id, actor_id, date_from, date_to, trace_id, limit, offset }) => {
408
+ let q = adminDb
409
+ .from('logs')
410
+ .select('*', { count: 'exact' })
411
+ .eq('account_id', account_id)
412
+ .order('created_at', { ascending: false })
413
+
414
+ if (event_type) q = q.eq('level', event_type)
415
+ if (target_type) q = q.eq('source_type', target_type)
416
+ if (source) q = q.eq('source', source)
417
+ if (source_id) q = q.eq('source_id', source_id)
418
+ if (actor_id) q = q.eq('person_id', actor_id)
419
+ if (date_from) q = q.gte('created_at', date_from)
420
+ if (date_to) q = q.lte('created_at', date_to)
421
+ if (trace_id) q = q.eq('trace_id', trace_id)
422
+
423
+ const { data, error, count } = await q.range(offset, offset + limit - 1)
424
+ if (error) throwDbError(error)
425
+ return textResponse({
426
+ action: 'account',
427
+ data: (data || []).map(mapLogRow),
428
+ total: count || 0,
429
+ })
430
+ }
431
+ )
432
+
433
+ server.registerTool(
434
+ 'spine_logs_for_target',
435
+ {
436
+ description: 'List log entries for a specific target entity.',
437
+ inputSchema: z.object({
438
+ account_id: z.string().uuid(),
439
+ target_type: z.string(),
440
+ target_id: z.string(),
441
+ event_type: z.string().optional(),
442
+ limit: z.number().int().min(1).max(1000).default(100),
443
+ offset: z.number().int().min(0).default(0),
444
+ }),
445
+ },
446
+ async ({ account_id, target_type, target_id, event_type, limit, offset }) => {
447
+ let q = adminDb
448
+ .from('logs')
449
+ .select('*')
450
+ .eq('account_id', account_id)
451
+ .eq('source_type', target_type)
452
+ .eq('source_id', target_id)
453
+ .order('created_at', { ascending: false })
454
+
455
+ if (event_type) q = q.eq('level', event_type)
456
+
457
+ const { data, error } = await q.range(offset, offset + limit - 1)
458
+ if (error) throwDbError(error)
459
+ return textResponse({ action: 'target', data: (data || []).map(mapLogRow) })
460
+ }
461
+ )
462
+
463
+ server.registerTool(
464
+ 'spine_logs_stats',
465
+ {
466
+ description: 'Aggregate log counts by type and source for an account and optional filters.',
467
+ inputSchema: z.object({
468
+ account_id: z.string().uuid(),
469
+ event_type: z.string().optional(),
470
+ target_type: z.string().optional(),
471
+ source: z.string().optional(),
472
+ source_id: z.string().optional(),
473
+ actor_id: z.string().uuid().optional(),
474
+ query: z.string().optional(),
475
+ date_from: z.string().datetime().optional(),
476
+ date_to: z.string().datetime().optional(),
477
+ }),
478
+ },
479
+ async ({ account_id, event_type, target_type, source, source_id, actor_id, query, date_from, date_to }) => {
480
+ const { data, error } = await adminDb.rpc('get_log_stats', {
481
+ p_account_id: account_id,
482
+ p_level: event_type || null,
483
+ p_source: source || null,
484
+ p_source_type: target_type || null,
485
+ p_source_id: source_id || null,
486
+ p_person_id: actor_id || null,
487
+ p_query: query || null,
488
+ p_date_from: date_from || null,
489
+ p_date_to: date_to || null,
490
+ })
491
+ if (error) throwDbError(error)
492
+ return textResponse({ action: 'stats', data: data?.[0] || {
493
+ total: 0,
494
+ error_count: 0,
495
+ user_action_count: 0,
496
+ event_type_count: 0,
497
+ levels: [],
498
+ sources: [],
499
+ source_types: [],
500
+ }})
501
+ }
502
+ )
503
+ }
504
+ // CIL[DOC-VECTOR type="context" content="purpose='Register all observability MCP tools on a server instance'; No verified external callers; imports: .framework/mcp/shared/db.ts"]
505
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
506
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
507
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
508
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
509
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
510
+ // CIL[END stable_id="~/.framework/mcp/tools/observability.ts:register:function"]
@@ -1,3 +1,11 @@
1
+ -- CIL[BEGIN stable_id="~/.framework/migrations/001_core_schema.sql:core_schema_migration:file" type="file" identity="core_schema_migration" parent="~/.framework/migrations/001_core_schema.sql"]
2
+ -- CIL[DOC-MACRO purpose="Spine v2 consolidated core schema migration"]
3
+ -- CIL[DOC-RESPONSIBILITY responsibility="Creates base tables, extensions, indexes, triggers, seed data, and enables RLS for the Spine v2 runtime"]
4
+ -- CIL[DOC-CONTEXT module="core_schema" layer="database" related_files=".framework/migrations/001_core_schema.sql"]
5
+ -- CIL[DOC-CONTRACT inputs="SQL execution context with public schema, uuid, pgvector, and gen_random_uuid support" outputs="Core tables, indexes, triggers, updated_at function, seed apps, and RLS enabled" errors="SQL errors if tables already exist with incompatible definitions or permissions are insufficient" side_effects="Creates or extends public schema objects and enables row level security on tenant tables"]
6
+ -- CIL[DOC-MICRO logic_summary="Defines runtime tables for accounts, people, types, apps, roles, items, threads, messages, links, attachments, watchers, link types, pipelines, executions, triggers, timers, configs, integrations, logs, observability, tests, embeddings, ai agents, invites, api keys, alerts, progress, account paths, and system settings. Adds indexes, updated_at triggers, seed app rows, and enables RLS." notable_decisions="[]"]
7
+ -- CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
8
+ -- CIL[DOC-STABILITY stability="stable"]
1
9
  -- Spine v2 consolidated core schema
2
10
  -- Base tables, extensions, indexes, triggers, and RLS enablements.
3
11
 
@@ -670,3 +678,10 @@ ALTER TABLE public.alerts ENABLE ROW LEVEL SECURITY;
670
678
  ALTER TABLE public.item_progress ENABLE ROW LEVEL SECURITY;
671
679
  ALTER TABLE public.account_paths ENABLE ROW LEVEL SECURITY;
672
680
  ALTER TABLE public.system_settings ENABLE ROW LEVEL SECURITY;
681
+ -- CIL[DOC-VECTOR type="context" content="purpose='Spine v2 consolidated core schema migration'; No verified external callers; imports: none"]
682
+ -- CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
683
+ -- CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
684
+ -- CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
685
+ -- CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
686
+ -- CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
687
+ -- CIL[END stable_id="~/.framework/migrations/001_core_schema.sql:core_schema_migration:file"]
@@ -1,3 +1,11 @@
1
+ -- CIL[BEGIN stable_id="~/.framework/migrations/002_core_rls_and_functions.sql:core_rls_and_functions:file" type="file" identity="core_rls_and_functions" parent="~/.framework/migrations/002_core_rls_and_functions.sql"]
2
+ -- CIL[DOC-MACRO purpose="Consolidated Spine v2 RLS policies, auth helper functions, foreign key constraints, and updated_at triggers for tenant-isolated database access."]
3
+ -- CIL[DOC-RESPONSIBILITY responsibility="Defines the core database security and integrity layer: accessibility functions, automatic account-path maintenance, referential integrity, row-level security policies, and updated_at trigger wiring."]
4
+ -- CIL[DOC-CONTEXT module="migrations" layer="database" related_files=".framework/migrations/002_core_rls_and_functions.sql"]
5
+ -- CIL[DOC-CONTRACT inputs="N/A (migration script)" outputs="Functions, triggers, foreign keys, and RLS policies in the public schema" errors="Migration execution errors; RLS or FK violations if schema/data invariants are broken" side_effects="Creates or replaces database objects, enables RLS on referenced tables, modifies the constraint set"]
6
+ -- CIL[DOC-MICRO logic_summary="Implements get_accessible_accounts recursively, current_actor_id resolution, person_is_system_admin check, update_account_paths trigger, set_updated_at trigger, foreign key constraints across core tables, and per-table RLS policies using the helper functions." notable_decisions="[]"]
7
+ -- CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
8
+ -- CIL[DOC-STABILITY stability="stable"]
1
9
  -- Spine v2 consolidated RLS and functions
2
10
  -- Auth/RLS helper functions, foreign keys, and tenant-isolation policies.
3
11
 
@@ -633,3 +641,10 @@ CREATE POLICY api_keys_access ON public.api_keys FOR ALL
633
641
  CREATE POLICY logs_access ON public.logs FOR ALL
634
642
  USING (account_id IN (SELECT public.get_accessible_accounts(auth.uid()))
635
643
  );
644
+ -- CIL[DOC-VECTOR type="context" content="purpose='Consolidated Spine v2 RLS policies, auth helper functions, foreign key constraints, and updated_at triggers for tenant-isolated database access.'; No verified external callers; imports: none"]
645
+ -- CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
646
+ -- CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
647
+ -- CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
648
+ -- CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
649
+ -- CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
650
+ -- CIL[END stable_id="~/.framework/migrations/002_core_rls_and_functions.sql:core_rls_and_functions:file"]
@@ -1,3 +1,11 @@
1
+ -- CIL[BEGIN stable_id="~/.framework/migrations/003_core_system_data.sql:core_system_data:file" type="file" identity="core_system_data" parent="~/.framework/migrations/003_core_system_data.sql"]
2
+ -- CIL[DOC-MACRO purpose="Seed Spine v2 core system data including built-in roles, core apps, system types, the spine-system master account, and the get_account_apps helper."]
3
+ -- CIL[DOC-RESPONSIBILITY responsibility="Insert or upsert protected platform records required before runtime operation; establishes built-in system roles, core apps, generic types, the master account, and a query helper for account-scoped apps."]
4
+ -- CIL[DOC-CONTEXT module="migrations" layer="database" related_files=".framework/migrations/003_core_system_data.sql"]
5
+ -- CIL[DOC-CONTRACT inputs="none" outputs="mutated public.roles, public.apps, public.types, public.accounts rows; created public.get_account_apps function" errors="none (ON CONFLICT DO NOTHING/UPDATE ensures idempotency)" side_effects="persists Spine v2 core system seed data and helper function to the database"]
6
+ -- CIL[DOC-MICRO logic_summary="Inserts the system_admin role, a set of built-in roles, the spine-core and admin apps, core runtime types (person, item, thread, message, link, attachment, watcher, account), the spine-system master account, and defines the get_account_apps PL/pgSQL function." notable_decisions="[]"]
7
+ -- CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
8
+ -- CIL[DOC-STABILITY stability="stable"]
1
9
  -- Spine v2 consolidated core system data
2
10
  -- System roles and essential platform records.
3
11
 
@@ -533,4 +541,11 @@ BEGIN
533
541
  a.app_type,
534
542
  a.name;
535
543
  END;
536
- $function$;
544
+ $function$;
545
+ -- CIL[DOC-VECTOR type="context" content="purpose='Seed Spine v2 core system data including built-in roles, core apps, system types, the spine-system master account, and the get_account_apps helper.'; No verified external callers; imports: none"]
546
+ -- CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
547
+ -- CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
548
+ -- CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
549
+ -- CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
550
+ -- CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
551
+ -- CIL[END stable_id="~/.framework/migrations/003_core_system_data.sql:core_system_data:file"]
@@ -1,3 +1,12 @@
1
+ -- CIL[BEGIN stable_id="~/.framework/migrations/004_core_rpc_and_broker.sql:core_rpc_and_broker:file" type="file" identity="core_rpc_and_broker" parent="~/.framework/migrations/004_core_rpc_and_broker.sql"]
2
+ -- CIL[DOC-MACRO purpose="Consolidated RPCs and integration broker migration: vector search functions, integrations, API keys, webhooks, RLS, triggers, and seed integrations"]
3
+ -- CIL[DOC-RESPONSIBILITY responsibility="Creates HNSW index, match_embeddings and search_similar_embeddings RPCs, alters integrations and api_keys tables, creates api_key_usage_logs, webhook_handlers, webhook_deliveries tables, enables RLS and policies, sets updated_at triggers, and seeds default integrations and webhook handlers"]
4
+ -- CIL[DOC-CONTEXT module="migrations" layer="database" related_files=".framework/migrations/004_core_rpc_and_broker.sql"]
5
+ -- CIL[DOC-CONTRACT inputs="none" outputs="schema changes, functions, tables, indexes, RLS policies, triggers, seed rows" errors="SQL execution errors, permission denied, constraint violations" side_effects="Modifies public.integrations, public.api_keys, public.api_key_usage_logs, public.webhook_handlers, public.webhook_deliveries, and public.types; grants execute on functions; enables row level security"]
6
+ -- CIL[DOC-MICRO logic_summary="Create HNSW index if missing; define match_embeddings and search_similar_embeddings RPCs; augment integrations and api_keys columns, constraints and indexes; create api_key_usage_logs, webhook_handlers, and webhook_deliveries tables with indexes and foreign keys; enable RLS with auth-based and service_role bypass policies; add updated_at triggers; seed webhook_event type and openai, generic-http integrations plus generic and portal webhook handlers" notable_decisions="[]"]
7
+ -- CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
8
+ -- CIL[DOC-STABILITY stability="stable"]
9
+
1
10
  -- Spine v2 consolidated RPCs and integration broker
2
11
  -- Vector search RPC, integration broker schema, and broker RLS/policies.
3
12
 
@@ -420,4 +429,11 @@ VALUES (
420
429
  '{"api_token":{"source":"value","value":""}}',
421
430
  true, true, true, 'system'
422
431
  )
423
- ON CONFLICT (app_id, account_id, slug) DO NOTHING;
432
+ ON CONFLICT (app_id, account_id, slug) DO NOTHING;
433
+ -- CIL[DOC-VECTOR type="context" content="purpose='Consolidated RPCs and integration broker migration: vector search functions, integrations, API keys, webhooks, RLS, triggers, and seed integrations'; No verified external callers; imports: none"]
434
+ -- CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
435
+ -- CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
436
+ -- CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
437
+ -- CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
438
+ -- CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
439
+ -- CIL[END stable_id="~/.framework/migrations/004_core_rpc_and_broker.sql:core_rpc_and_broker:file"]
@@ -1,3 +1,12 @@
1
+ -- CIL[BEGIN stable_id="~/.framework/migrations/005_core_observability.sql:core_observability:file" type="file" identity="core_observability" parent="~/.framework/migrations/005_core_observability.sql"]
2
+ -- CIL[DOC-MACRO purpose="Consolidated observability, trace context, and knowledge search SQL migration"]
3
+ -- CIL[DOC-RESPONSIBILITY responsibility="Define logs trace columns, observability metric functions, RLS policy, match_embeddings filters, and data retention"]
4
+ -- CIL[DOC-CONTEXT module="migrations" layer="data" related_files=".framework/migrations/005_core_observability.sql"]
5
+ -- CIL[DOC-CONTRACT inputs="SQL migration runner" outputs="Updated public.logs schema, SQL functions, policy, indexes" errors="SQL execution errors, constraint violations" side_effects="Alters public.logs, recreates functions and indexes, grants permissions"]
6
+ -- CIL[DOC-MICRO logic_summary="Adds W3C trace columns and constraints to public.logs, creates trace/metric/outcome/prune functions and grants, updates RLS and match_embeddings with filters, adds retention functions" notable_decisions="[]"]
7
+ -- CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
8
+ -- CIL[DOC-STABILITY stability="stable"]
9
+
1
10
  -- Spine v2 consolidated observability and knowledge search
2
11
  -- Logs trace columns, observability metric RPCs, KB item RLS, and updated match_embeddings.
3
12
 
@@ -595,4 +604,11 @@ $$;
595
604
  GRANT EXECUTE ON FUNCTION public.prune_logs(uuid) TO authenticated;
596
605
  GRANT EXECUTE ON FUNCTION public.prune_logs(uuid) TO service_role;
597
606
  GRANT EXECUTE ON FUNCTION public.prune_observability(uuid) TO authenticated;
598
- GRANT EXECUTE ON FUNCTION public.prune_observability(uuid) TO service_role;
607
+ GRANT EXECUTE ON FUNCTION public.prune_observability(uuid) TO service_role;
608
+ -- CIL[DOC-VECTOR type="context" content="purpose='Consolidated observability, trace context, and knowledge search SQL migration'; No verified external callers; imports: none"]
609
+ -- CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
610
+ -- CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
611
+ -- CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
612
+ -- CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
613
+ -- CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
614
+ -- CIL[END stable_id="~/.framework/migrations/005_core_observability.sql:core_observability:file"]