spine-framework 0.3.144 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (451) hide show
  1. package/.env.example +76 -0
  2. package/.framework/.spine-manifest.json +19 -0
  3. package/.framework/cli/commands/agents.ts +61 -33
  4. package/.framework/cli/commands/auth.ts +60 -28
  5. package/.framework/cli/commands/create-app.ts +212 -80
  6. package/.framework/cli/commands/dev.ts +184 -68
  7. package/.framework/cli/commands/doctor.ts +324 -152
  8. package/.framework/cli/commands/generate.ts +119 -68
  9. package/.framework/cli/commands/init.ts +141 -242
  10. package/.framework/cli/commands/install-app.ts +1336 -314
  11. package/.framework/cli/commands/items.ts +31 -29
  12. package/.framework/cli/commands/migrate.ts +299 -156
  13. package/.framework/cli/commands/migrations.ts +62 -30
  14. package/.framework/cli/commands/pipelines.ts +31 -29
  15. package/.framework/cli/commands/status.ts +105 -45
  16. package/.framework/cli/commands/system.ts +47 -42
  17. package/.framework/cli/commands/test.ts +161 -102
  18. package/.framework/cli/commands/upgrade.ts +260 -0
  19. package/.framework/cli/commands/validate-app.ts +517 -161
  20. package/.framework/cli/context.ts +117 -85
  21. package/.framework/cli/env-loader.ts +74 -43
  22. package/.framework/cli/index.ts +70 -46
  23. package/.framework/cli/lib/project-files.ts +404 -0
  24. package/.framework/docs/guides/testing-guide.md +1 -1
  25. package/.framework/docs/runtime-types.md +72 -72
  26. package/.framework/functions/_shared/access.ts +84 -0
  27. package/.framework/functions/_shared/agent-runner.ts +5051 -1026
  28. package/.framework/functions/_shared/app-manifest.ts +214 -94
  29. package/.framework/functions/_shared/ast.ts +214 -0
  30. package/.framework/functions/_shared/audit.ts +91 -55
  31. package/.framework/functions/_shared/cil.ts +368 -127
  32. package/.framework/functions/_shared/db.ts +337 -68
  33. package/.framework/functions/_shared/funnel.ts +228 -0
  34. package/.framework/functions/_shared/geo.ts +105 -0
  35. package/.framework/functions/_shared/hash-api-key.ts +94 -17
  36. package/.framework/functions/_shared/index.ts +22 -224
  37. package/.framework/functions/_shared/kb.ts +832 -58
  38. package/.framework/functions/_shared/llm.ts +118 -18
  39. package/.framework/functions/_shared/logging.ts +317 -19
  40. package/.framework/functions/_shared/middleware.ts +701 -131
  41. package/.framework/functions/_shared/notify.ts +70 -0
  42. package/.framework/functions/_shared/outcomes.ts +34 -19
  43. package/.framework/functions/_shared/permissions.ts +501 -315
  44. package/.framework/functions/_shared/pipeline-runner.ts +704 -155
  45. package/.framework/functions/_shared/principal.ts +436 -263
  46. package/.framework/functions/_shared/rate-limit.ts +233 -0
  47. package/.framework/functions/_shared/resolve-credentials.ts +86 -19
  48. package/.framework/functions/_shared/resolve-ids.ts +203 -139
  49. package/.framework/functions/_shared/retry-deliveries.ts +51 -16
  50. package/.framework/functions/_shared/schema-utils.ts +602 -521
  51. package/.framework/functions/_shared/security.ts +345 -0
  52. package/.framework/functions/_shared/testing.ts +197 -172
  53. package/.framework/functions/_shared/tracing.ts +351 -21
  54. package/.framework/functions/_shared/trigger-engine.ts +425 -136
  55. package/.framework/functions/_shared/webhook-registration.ts +71 -70
  56. package/.framework/functions/_shared/webhook-registry.ts +126 -83
  57. package/.framework/functions/account-nodes.ts +30 -30
  58. package/.framework/functions/adapters/generic-webhook-inbound.ts +49 -16
  59. package/.framework/functions/adapters/generic-webhook-outbound.ts +17 -17
  60. package/.framework/functions/adapters/openai-outbound.ts +15 -16
  61. package/.framework/functions/admin-data.ts +596 -173
  62. package/.framework/functions/admin-funnel.ts +64 -60
  63. package/.framework/functions/admin-install-funnel.ts +84 -66
  64. package/.framework/functions/admin-signals.ts +69 -51
  65. package/.framework/functions/ai-agents.ts +431 -106
  66. package/.framework/functions/ai-interactions.ts +186 -112
  67. package/.framework/functions/api-keys.ts +107 -107
  68. package/.framework/functions/apps.ts +154 -136
  69. package/.framework/functions/auth.ts +83 -65
  70. package/.framework/functions/cil-agent-ingest.ts +189 -232
  71. package/.framework/functions/cil-agent.ts +433 -177
  72. package/.framework/functions/cil-callmap.ts +642 -430
  73. package/.framework/functions/cil-config.ts +139 -135
  74. package/.framework/functions/cil-context.ts +214 -127
  75. package/.framework/functions/cil-doc.ts +587 -458
  76. package/.framework/functions/cil-embeddings.ts +453 -364
  77. package/.framework/functions/cil-graph.ts +427 -142
  78. package/.framework/functions/cil-ingest.ts +1418 -1154
  79. package/.framework/functions/cil-pipeline.ts +276 -21
  80. package/.framework/functions/cil-project.ts +659 -132
  81. package/.framework/functions/cil-validate.ts +198 -164
  82. package/.framework/functions/debug-auth.ts +57 -55
  83. package/.framework/functions/deliveries.ts +80 -21
  84. package/.framework/functions/embeddings.ts +1023 -318
  85. package/.framework/functions/eval-harness.ts +146 -108
  86. package/.framework/functions/integration-outbound.ts +205 -75
  87. package/.framework/functions/integration-routes.ts +128 -23
  88. package/.framework/functions/integrations.ts +125 -100
  89. package/.framework/functions/invites.ts +1095 -460
  90. package/.framework/functions/item-progress.ts +158 -102
  91. package/.framework/functions/kb.ts +34 -10
  92. package/.framework/functions/logs.ts +133 -133
  93. package/.framework/functions/observability.ts +152 -122
  94. package/.framework/functions/pipeline-executions.ts +147 -132
  95. package/.framework/functions/pipelines.ts +134 -119
  96. package/.framework/functions/prompt-configs.ts +96 -80
  97. package/.framework/functions/roles.ts +112 -82
  98. package/.framework/functions/security.ts +450 -0
  99. package/.framework/functions/system-cron.ts +117 -80
  100. package/.framework/functions/system.ts +158 -98
  101. package/.framework/functions/tests.ts +29 -29
  102. package/.framework/functions/timers.ts +94 -95
  103. package/.framework/functions/trigger-scheduler.ts +10 -0
  104. package/.framework/functions/triggers.ts +179 -149
  105. package/.framework/functions/types.ts +137 -125
  106. package/.framework/mcp/index.ts +133 -0
  107. package/.framework/mcp/load-env.ts +60 -0
  108. package/.framework/mcp/shared/app-manifest.ts +275 -0
  109. package/.framework/mcp/shared/db.ts +477 -0
  110. package/.framework/mcp/shared/kb.ts +118 -0
  111. package/.framework/mcp/tools/architect.ts +431 -0
  112. package/.framework/mcp/tools/cil/context.ts +345 -0
  113. package/.framework/mcp/tools/cil/graph.ts +242 -0
  114. package/.framework/mcp/tools/cil/ingest.ts +1217 -0
  115. package/.framework/mcp/tools/cil/pipeline-orchestrator.ts +693 -0
  116. package/.framework/mcp/tools/cil/pipeline.ts +767 -0
  117. package/.framework/mcp/tools/cil/project.ts +791 -0
  118. package/.framework/mcp/tools/cil/retrieval.ts +336 -0
  119. package/.framework/mcp/tools/cil/search-core.ts +454 -0
  120. package/.framework/mcp/tools/cil/search.ts +97 -0
  121. package/.framework/mcp/tools/cil/suggest.ts +186 -0
  122. package/.framework/mcp/tools/cil/validate.ts +1369 -0
  123. package/.framework/mcp/tools/kb/delete.ts +139 -0
  124. package/.framework/mcp/tools/kb/index.ts +52 -0
  125. package/.framework/mcp/tools/kb/ingest.ts +84 -0
  126. package/.framework/mcp/tools/kb/list-types.ts +102 -0
  127. package/.framework/mcp/tools/kb/publish.ts +100 -0
  128. package/.framework/mcp/tools/kb/reindex.ts +86 -0
  129. package/.framework/mcp/tools/kb/revoke.ts +85 -0
  130. package/.framework/mcp/tools/kb/search.ts +101 -0
  131. package/.framework/mcp/tools/kb/upsert.ts +125 -0
  132. package/.framework/mcp/tools/observability.ts +510 -0
  133. package/.framework/migrations/001_core_schema.sql +15 -0
  134. package/.framework/migrations/002_core_rls_and_functions.sql +15 -0
  135. package/.framework/migrations/003_core_system_data.sql +16 -1
  136. package/.framework/migrations/004_core_rpc_and_broker.sql +17 -1
  137. package/.framework/migrations/005_core_observability.sql +17 -1
  138. package/.framework/migrations/006_security_hardening_rls.sql +15 -0
  139. package/.framework/migrations/007_kb_article_list.sql +17 -1
  140. package/.framework/migrations/008_items_target.sql +15 -0
  141. package/.framework/migrations/009_roles_slug_unique.sql +15 -0
  142. package/.framework/migrations/010_auth_user_trigger.sql +15 -0
  143. package/.framework/migrations/011_spine_system_account.sql +16 -0
  144. package/.framework/migrations/012_service_role_grants.sql +16 -0
  145. package/.framework/migrations/013_get_account_apps_role_filter.sql +15 -0
  146. package/.framework/migrations/014_apps_required_roles.sql +16 -0
  147. package/.framework/migrations/015_types_kind_slug_unique.sql +20 -0
  148. package/.framework/migrations/016_cil_types.sql +281 -0
  149. package/.framework/migrations/017_cil_stable_ids.sql +37 -0
  150. package/.framework/migrations/018_runtime_tables.sql +129 -0
  151. package/.framework/migrations/019_agent_prompt_columns.sql +56 -0
  152. package/.framework/migrations/020_schema_reconciliation.sql +67 -0
  153. package/.framework/migrations/021_kb_embedding_lifecycle.sql +31 -0
  154. package/.framework/migrations/032_cil_status_migration.sql +73 -0
  155. package/.framework/migrations/033_cil_versioning.sql +73 -0
  156. package/.framework/migrations/034_match_embeddings_knn.sql +115 -0
  157. package/.framework/migrations/035_rate_limits.sql +55 -0
  158. package/.framework/migrations/036_demo_record_flags.sql +72 -0
  159. package/.framework/migrations/037_kb_types_canonical.sql +244 -0
  160. package/.framework/migrations/038_drop_demo_record_flags.sql +38 -0
  161. package/.framework/migrations/042_registration_hierarchy.sql +309 -0
  162. package/.framework/migrations/043_policy_actor_cleanup.sql +39 -0
  163. package/.framework/migrations/044_match_embeddings_filtered_knn.sql +151 -0
  164. package/.framework/migrations/045_security_critical_rls.sql +139 -0
  165. package/.framework/migrations/046_security_missing_rls.sql +79 -0
  166. package/.framework/migrations/047_people_updated_by.sql +27 -0
  167. package/.framework/migrations/048_watcher_last_seen_at.sql +24 -0
  168. package/.framework/migrations/049_security_blocklist.sql +148 -0
  169. package/.framework/migrations/050_notifications.sql +49 -0
  170. package/.framework/migrations/051_message_agent_fields.sql +74 -0
  171. package/.framework/migrations/052_registration_security.sql +421 -0
  172. package/.framework/migrations/053_builtin_action_seeds.sql +66 -0
  173. package/.framework/migrations/054_kb_ingest_lease.sql +157 -0
  174. package/.framework/migrations/055_type_id_drift_reconciliation.sql +33 -0
  175. package/.framework/migrations/056_slug_column_reconciliation.sql +38 -0
  176. package/.framework/migrations/057_pipelines_slug_identity.sql +14 -0
  177. package/.framework/migrations/058_account_data_field_declarations.sql +53 -0
  178. package/.framework/migrations/059_registration_placement_fixes.sql +269 -0
  179. package/.framework/migrations/060_account_person_record_permissions.sql +38 -0
  180. package/.framework/migrations/061_fk_dedup.sql +32 -0
  181. package/.framework/public/spine-logo.svg +10 -3
  182. package/.framework/scripts/app-install-cli.ts +190 -93
  183. package/.framework/scripts/assemble-frontend.sh +127 -44
  184. package/.framework/scripts/assemble-functions.sh +128 -30
  185. package/.framework/scripts/boundary-check.sh +6 -2
  186. package/.framework/scripts/build-manifest.sh +24 -68
  187. package/.framework/scripts/check-core-integrity.sh +15 -76
  188. package/.framework/scripts/checksum-manifest.mts +343 -0
  189. package/.framework/scripts/cil-migrate-markers.ts +403 -0
  190. package/.framework/scripts/fix-cil-markers.mjs +176 -0
  191. package/.framework/scripts/verify-integrity.sh +21 -57
  192. package/.framework/scripts/verify-manifest.mts +305 -0
  193. package/.framework/seeds/types/funnel_signal_use.json +74 -21
  194. package/.framework/seeds/types/spine_instance.json +73 -21
  195. package/.framework/src/App.tsx +118 -72
  196. package/.framework/src/apps/admin/index.tsx +855 -58
  197. package/.framework/src/components/AppWrapper.tsx +43 -45
  198. package/.framework/src/components/CustomAppLoader.tsx +160 -116
  199. package/.framework/src/components/admin/AdminListPage.tsx +46 -44
  200. package/.framework/src/components/admin/AdminSidebar.tsx +57 -47
  201. package/.framework/src/components/admin/AdminStatsCard.tsx +46 -44
  202. package/.framework/src/components/admin/PageInstructions.tsx +98 -2
  203. package/.framework/src/components/admin/SortableTableHeader.tsx +44 -45
  204. package/.framework/src/components/app-shell/GenericAppShell.tsx +64 -65
  205. package/.framework/src/components/app-shell/GenericDetailPage.tsx +44 -47
  206. package/.framework/src/components/app-shell/GenericListPage.tsx +45 -49
  207. package/.framework/src/components/app-sidebar.tsx +42 -45
  208. package/.framework/src/components/auth/ProtectedRoute.tsx +48 -41
  209. package/.framework/src/components/auth/TurnstileWidget.tsx +27 -0
  210. package/.framework/src/components/kb/KBArticleEditor.tsx +231 -22
  211. package/.framework/src/components/kb/KBArticleList.tsx +251 -10
  212. package/.framework/src/components/layout/AppShell.tsx +51 -45
  213. package/.framework/src/components/layout/Header.tsx +42 -43
  214. package/.framework/src/components/layout/Layout.tsx +46 -46
  215. package/.framework/src/components/layout/Sidebar.tsx +196 -96
  216. package/.framework/src/components/runtime/DataDetailHeader.tsx +55 -30
  217. package/.framework/src/components/runtime/DataDetailPage.tsx +31 -269
  218. package/.framework/src/components/runtime/DataFilters.tsx +49 -74
  219. package/.framework/src/components/runtime/DataHeader.tsx +53 -32
  220. package/.framework/src/components/runtime/DataListPage.tsx +51 -155
  221. package/.framework/src/components/runtime/DataStats.tsx +66 -44
  222. package/.framework/src/components/runtime/DataTable.tsx +49 -149
  223. package/.framework/src/components/runtime/SchemaDetailForm.tsx +45 -75
  224. package/.framework/src/components/runtime/index.ts +119 -16
  225. package/.framework/src/components/search-form.tsx +46 -29
  226. package/.framework/src/components/shared/AgentView.tsx +65 -48
  227. package/.framework/src/components/shared/FieldRenderer.tsx +144 -50
  228. package/.framework/src/components/shared/InviteManager.tsx +207 -97
  229. package/.framework/src/components/shared/MemberList.tsx +97 -0
  230. package/.framework/src/components/shared/SchemaFields.tsx +107 -86
  231. package/.framework/src/components/ui/DataTable.tsx +80 -68
  232. package/.framework/src/components/ui/Form.tsx +157 -146
  233. package/.framework/src/components/ui/ItemCard.tsx +74 -67
  234. package/.framework/src/components/ui/ItemListView.tsx +73 -68
  235. package/.framework/src/components/ui/LoadingSpinner.tsx +43 -48
  236. package/.framework/src/components/ui/Modal.tsx +78 -68
  237. package/.framework/src/components/ui/RichTextEditor.tsx +89 -69
  238. package/.framework/src/components/ui/accordion.tsx +85 -86
  239. package/.framework/src/components/ui/alert-dialog.tsx +197 -184
  240. package/.framework/src/components/ui/alert.tsx +105 -94
  241. package/.framework/src/components/ui/aspect-ratio.tsx +57 -43
  242. package/.framework/src/components/ui/avatar.tsx +122 -107
  243. package/.framework/src/components/ui/badge.tsx +60 -55
  244. package/.framework/src/components/ui/breadcrumb.tsx +127 -128
  245. package/.framework/src/components/ui/button-group.tsx +86 -72
  246. package/.framework/src/components/ui/button.tsx +71 -50
  247. package/.framework/src/components/ui/calendar.tsx +72 -57
  248. package/.framework/src/components/ui/card.tsx +136 -129
  249. package/.framework/src/components/ui/carousel.tsx +226 -107
  250. package/.framework/src/components/ui/chart.tsx +252 -147
  251. package/.framework/src/components/ui/checkbox.tsx +43 -44
  252. package/.framework/src/components/ui/collapsible.tsx +86 -71
  253. package/.framework/src/components/ui/combobox.tsx +282 -249
  254. package/.framework/src/components/ui/command.tsx +158 -146
  255. package/.framework/src/components/ui/context-menu.tsx +239 -240
  256. package/.framework/src/components/ui/dialog.tsx +174 -157
  257. package/.framework/src/components/ui/direction.tsx +72 -56
  258. package/.framework/src/components/ui/drawer.tsx +168 -169
  259. package/.framework/src/components/ui/dropdown-menu.tsx +254 -223
  260. package/.framework/src/components/ui/empty.tsx +131 -120
  261. package/.framework/src/components/ui/field.tsx +205 -173
  262. package/.framework/src/components/ui/hover-card.tsx +71 -72
  263. package/.framework/src/components/ui/input-group.tsx +148 -133
  264. package/.framework/src/components/ui/input-otp.tsx +99 -86
  265. package/.framework/src/components/ui/input.tsx +43 -41
  266. package/.framework/src/components/ui/item.tsx +207 -185
  267. package/.framework/src/components/ui/kbd.tsx +57 -56
  268. package/.framework/src/components/ui/label.tsx +45 -41
  269. package/.framework/src/components/ui/menubar.tsx +268 -236
  270. package/.framework/src/components/ui/native-select.tsx +85 -86
  271. package/.framework/src/components/ui/navigation-menu.tsx +166 -156
  272. package/.framework/src/components/ui/pagination.tsx +131 -141
  273. package/.framework/src/components/ui/popover.tsx +125 -128
  274. package/.framework/src/components/ui/progress.tsx +47 -44
  275. package/.framework/src/components/ui/radio-group.tsx +60 -55
  276. package/.framework/src/components/ui/resizable.tsx +85 -72
  277. package/.framework/src/components/ui/scroll-area.tsx +57 -58
  278. package/.framework/src/components/ui/select.tsx +182 -169
  279. package/.framework/src/components/ui/separator.tsx +42 -43
  280. package/.framework/src/components/ui/sheet.tsx +170 -159
  281. package/.framework/src/components/ui/sidebar.tsx +395 -398
  282. package/.framework/src/components/ui/skeleton.tsx +42 -43
  283. package/.framework/src/components/ui/slider.tsx +61 -44
  284. package/.framework/src/components/ui/sonner.tsx +44 -44
  285. package/.framework/src/components/ui/spinner.tsx +47 -42
  286. package/.framework/src/components/ui/switch.tsx +56 -42
  287. package/.framework/src/components/ui/table-primitives.tsx +272 -132
  288. package/.framework/src/components/ui/table.tsx +140 -142
  289. package/.framework/src/components/ui/tabs.tsx +110 -93
  290. package/.framework/src/components/ui/textarea.tsx +43 -44
  291. package/.framework/src/components/ui/toggle-group.tsx +87 -71
  292. package/.framework/src/components/ui/toggle.tsx +56 -56
  293. package/.framework/src/components/ui/tooltip.tsx +99 -85
  294. package/.framework/src/contexts/AppContext.tsx +166 -114
  295. package/.framework/src/contexts/AuthContext.tsx +232 -137
  296. package/.framework/src/hooks/use-mobile.ts +43 -44
  297. package/.framework/src/hooks/useApi.ts +185 -172
  298. package/.framework/src/hooks/useAppPath.ts +31 -29
  299. package/.framework/src/hooks/useApps.ts +77 -42
  300. package/.framework/src/hooks/useEntityList.ts +66 -29
  301. package/.framework/src/hooks/useEntityRecord.ts +76 -32
  302. package/.framework/src/hooks/useForm.ts +62 -30
  303. package/.framework/src/hooks/useListSchema.ts +60 -43
  304. package/.framework/src/hooks/useSchemaRecord.ts +115 -95
  305. package/.framework/src/lib/api.ts +258 -134
  306. package/.framework/src/lib/registration.ts +181 -0
  307. package/.framework/src/lib/supabase.ts +118 -81
  308. package/.framework/src/lib/utils.ts +266 -266
  309. package/.framework/src/main.tsx +43 -44
  310. package/.framework/src/pages/DashboardPage.tsx +44 -43
  311. package/.framework/src/pages/NoAppPage.tsx +50 -0
  312. package/.framework/src/pages/NotFoundPage.tsx +32 -29
  313. package/.framework/src/pages/SetupPage.tsx +34 -33
  314. package/.framework/src/pages/admin/AIAgentDetailPage.tsx +69 -58
  315. package/.framework/src/pages/admin/AIAgentsPage.tsx +43 -40
  316. package/.framework/src/pages/admin/APIKeyDetailPage.tsx +63 -55
  317. package/.framework/src/pages/admin/APIKeysPage.tsx +44 -42
  318. package/.framework/src/pages/admin/AlertsConfigPage.tsx +117 -94
  319. package/.framework/src/pages/admin/AppDetailPage.tsx +48 -42
  320. package/.framework/src/pages/admin/AppsPage.tsx +45 -42
  321. package/.framework/src/pages/admin/DeliveriesPage.tsx +49 -17
  322. package/.framework/src/pages/admin/DesignedPage.tsx +31 -30
  323. package/.framework/src/pages/admin/EmbeddingDetailPage.tsx +58 -0
  324. package/.framework/src/pages/admin/EmbeddingsPage.tsx +49 -0
  325. package/.framework/src/pages/admin/ExtendedShadcnTestPage.tsx +31 -29
  326. package/.framework/src/pages/admin/IncrementalShadcnTestPage.tsx +46 -29
  327. package/.framework/src/pages/admin/IntegratedDashboard.tsx +32 -29
  328. package/.framework/src/pages/admin/IntegrationDetailPage.tsx +68 -55
  329. package/.framework/src/pages/admin/IntegrationsPage.tsx +45 -42
  330. package/.framework/src/pages/admin/InvitesPage.tsx +60 -44
  331. package/.framework/src/pages/admin/LogsPage.tsx +87 -137
  332. package/.framework/src/pages/admin/MinimalShadcnTestPage.tsx +31 -29
  333. package/.framework/src/pages/admin/ObservabilityDashboard.tsx +150 -89
  334. package/.framework/src/pages/admin/PipelineDetailPage.tsx +77 -104
  335. package/.framework/src/pages/admin/PipelineExecutionsPage.tsx +44 -43
  336. package/.framework/src/pages/admin/PipelinesPage.tsx +59 -145
  337. package/.framework/src/pages/admin/PromptConfigDetailPage.tsx +53 -42
  338. package/.framework/src/pages/admin/PromptConfigsPage.tsx +47 -117
  339. package/.framework/src/pages/admin/ProperlyDesignedPage.tsx +31 -44
  340. package/.framework/src/pages/admin/RoleDetailPage.tsx +49 -92
  341. package/.framework/src/pages/admin/RolesPage.tsx +47 -164
  342. package/.framework/src/pages/admin/SecurityPage.tsx +310 -0
  343. package/.framework/src/pages/admin/SelectTestPage.tsx +30 -32
  344. package/.framework/src/pages/admin/ShadcnTestPage.tsx +37 -44
  345. package/.framework/src/pages/admin/SimpleDashboard.tsx +32 -44
  346. package/.framework/src/pages/admin/TestRunDetailPage.tsx +97 -44
  347. package/.framework/src/pages/admin/TestingDashboard.tsx +126 -71
  348. package/.framework/src/pages/admin/TimerDetailPage.tsx +67 -55
  349. package/.framework/src/pages/admin/TimersPage.tsx +44 -42
  350. package/.framework/src/pages/admin/TriggerDetailPage.tsx +47 -42
  351. package/.framework/src/pages/admin/TriggersPage.tsx +58 -57
  352. package/.framework/src/pages/admin/TypeDetailPage.tsx +91 -55
  353. package/.framework/src/pages/admin/TypesPage.tsx +45 -42
  354. package/.framework/src/pages/admin/cil/CILAgentPage.tsx +258 -128
  355. package/.framework/src/pages/admin/cil/CILChunkDetailPage.tsx +127 -123
  356. package/.framework/src/pages/admin/cil/CILDashboardPage.tsx +308 -235
  357. package/.framework/src/pages/admin/cil/CILFileListPage.tsx +159 -110
  358. package/.framework/src/pages/admin/cil/CILFileSelectPage.tsx +432 -0
  359. package/.framework/src/pages/admin/cil/CILGraphPage.tsx +200 -178
  360. package/.framework/src/pages/admin/cil/CILIngestionPage.tsx +286 -239
  361. package/.framework/src/pages/admin/cil/CILProjectsPage.tsx +211 -90
  362. package/.framework/src/pages/admin/cil/CILSearchPage.tsx +156 -143
  363. package/.framework/src/pages/admin/cil/CILSuggestionsPage.tsx +379 -0
  364. package/.framework/src/pages/admin/cil/CILVersionsPage.tsx +337 -0
  365. package/.framework/src/pages/admin/cil/FlexiblePipelinePage.tsx +219 -214
  366. package/.framework/src/pages/admin/kb/KBAdminPage.tsx +64 -0
  367. package/.framework/src/pages/auth/AuthConfirmPage.tsx +135 -65
  368. package/.framework/src/pages/auth/ForgotPasswordPage.tsx +39 -31
  369. package/.framework/src/pages/auth/LoginPage.tsx +38 -32
  370. package/.framework/src/pages/auth/PendingApprovalPage.tsx +31 -28
  371. package/.framework/src/pages/auth/RegisterPage.tsx +429 -155
  372. package/.framework/src/pages/spine-framework/APIPage.tsx +33 -30
  373. package/.framework/src/pages/spine-framework/CLIPage.tsx +32 -30
  374. package/.framework/src/types/auth.ts +101 -93
  375. package/.framework/src/types/types.ts +283 -262
  376. package/.framework/templates/project.json +87 -0
  377. package/.framework/templates/spine.config.neutral.json +7 -0
  378. package/.framework/tests/api/api-surface.test.ts +381 -0
  379. package/.framework/tests/fixtures/seed.ts +427 -0
  380. package/.framework/tests/fixtures/teardown.ts +228 -0
  381. package/.framework/tests/reporter.ts +351 -0
  382. package/.framework/tests/setup.ts +135 -0
  383. package/.framework/tests/ui/ui-sweep.ts +278 -0
  384. package/.framework/tests/unit/admin-data-logger.test.ts +310 -0
  385. package/.framework/tests/unit/agent-runner.test.ts +2389 -0
  386. package/.framework/tests/unit/ai-interactions.test.ts +81 -0
  387. package/.framework/tests/unit/app-manifest.test.ts +359 -0
  388. package/.framework/tests/unit/assembly-scripts.test.ts +172 -0
  389. package/.framework/tests/unit/cil-determinism.test.ts +85 -0
  390. package/.framework/tests/unit/core-isolation.test.ts +153 -0
  391. package/.framework/tests/unit/funnel-signals.test.ts +135 -0
  392. package/.framework/tests/unit/install-app.test.ts +1759 -0
  393. package/.framework/tests/unit/invites-security.test.ts +572 -0
  394. package/.framework/tests/unit/kb-ingest-lease.test.ts +287 -0
  395. package/.framework/tests/unit/kb-search.test.ts +119 -0
  396. package/.framework/tests/unit/migrate.test.ts +509 -0
  397. package/.framework/tests/unit/notify.test.ts +136 -0
  398. package/.framework/tests/unit/permissions.test.ts +269 -0
  399. package/.framework/tests/unit/pipeline-runner.test.ts +755 -0
  400. package/.framework/tests/unit/principal-cache.test.ts +138 -0
  401. package/.framework/tests/unit/retrieval-golden.test.ts +520 -0
  402. package/.framework/tests/unit/runtime-isolation.test.ts +642 -0
  403. package/.framework/tests/unit/schema-utils.test.ts +225 -0
  404. package/.framework/tests/unit/trigger-engine.test.ts +513 -0
  405. package/.framework/tests/unit/validate-app.test.ts +527 -0
  406. package/README.md +34 -3
  407. package/bin/spine-framework.cjs +1 -0
  408. package/config/tailwind.config.cjs +7 -0
  409. package/config/tsconfig.functions.json +42 -0
  410. package/config/tsconfig.json +37 -9
  411. package/config/vite.config.ts +31 -2
  412. package/netlify.toml +31 -3
  413. package/package.json +46 -29
  414. package/scripts/assemble-frontend.sh +127 -44
  415. package/scripts/assemble-functions.sh +127 -29
  416. package/scripts/boundary-check.sh +6 -2
  417. package/scripts/build-manifest.sh +24 -68
  418. package/scripts/checksum-manifest.mts +345 -0
  419. package/scripts/dev-clean.sh +86 -0
  420. package/scripts/dev-netlify.sh +49 -0
  421. package/scripts/netlify-dev-wrapper.sh +2 -0
  422. package/scripts/verify-install.ts +358 -0
  423. package/scripts/verify-integrity.sh +21 -57
  424. package/scripts/verify-manifest.mts +305 -0
  425. package/templates/project/gitignore +45 -0
  426. package/{config → templates/project}/package-lock.json +22335 -9366
  427. package/vitest.config.ts +46 -0
  428. package/.framework/public/spine.config.json +0 -91
  429. package/config/deno.lock +0 -108
  430. package/config/tsconfig.node.tsbuildinfo +0 -1
  431. package/config/tsconfig.tsbuildinfo +0 -1
  432. package/config/vite.config.d.ts +0 -2
  433. package/custom/.devin/AGENT.md +0 -357
  434. package/custom/.devin/skills/install-app/SKILL.md +0 -39
  435. package/custom/.devin/skills/spine-workbench-discovery/SKILL.md +0 -39
  436. package/custom/.devin/skills/spine-workbench-idea/SKILL.md +0 -36
  437. package/custom/.devin/skills/spine-workbench-implement/SKILL.md +0 -46
  438. package/custom/.devin/skills/spine-workbench-initiative/SKILL.md +0 -28
  439. package/custom/.devin/skills/spine-workbench-plan/SKILL.md +0 -38
  440. package/custom/.devin/workflows/app-install.yaml +0 -83
  441. package/custom/README.md +0 -79
  442. package/docs/README.md +0 -15
  443. package/scripts/app-install-cli.ts +0 -286
  444. package/scripts/check-core-integrity.sh +0 -82
  445. package/scripts/ingest-chunks.cjs +0 -202
  446. package/scripts/kb-chunk-parser.cjs +0 -312
  447. package/scripts/kb-chunk-parser.ts +0 -330
  448. package/scripts/kb-ingest-docs.ts +0 -203
  449. package/scripts/load-test-app-install.ts +0 -484
  450. package/scripts/test-login.js +0 -33
  451. package/spine.config.json +0 -91
@@ -1,3 +1,12 @@
1
+ // CIL[BEGIN stable_id="~/.framework/functions/observability.ts:module_header:module_header" type="module_header" identity="module_header" parent="~/.framework/functions/observability.ts"]
2
+ // CIL[DOC-MACRO purpose="Observability and analytics function entry point"]
3
+ // CIL[DOC-RESPONSIBILITY responsibility="Exports handler-driven analytics endpoints for event volume, error rate, latency, pipeline stats, top actors, AI support metrics, and log cleanup"]
4
+ // CIL[DOC-CONTEXT module="observability" layer="functions" related_files=".framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/principal.ts,.framework/functions/_shared/resolve-ids.ts"]
5
+ // CIL[DOC-CONTRACT inputs="none" outputs="none" errors="none" side_effects="none"]
6
+ // CIL[DOC-MICRO logic_summary="Imports shared middleware, database, auth, and id resolution utilities" 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
 
@@ -6,40 +15,25 @@
6
15
 
7
16
 
8
17
 
9
- // CIL[BEGIN chunk_id="observability_moduleheader_1783968140" type="module_header" identity="imports" parent="none"]
10
- // CIL[DOC-MACRO purpose="Import dependencies for observability metrics API"]
11
- // CIL[DOC-RESPONSIBILITY responsibility="Import handler utilities and database access"]
12
- // CIL[DOC-CONTEXT module="observability" layer="api-handler" related_files="[\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/functions/_shared/schema-utils.ts\",\"custom/apps/portal/pages/ContentPage.tsx\",\"\\\"]"]
13
- // CIL[DOC-CONTRACT inputs="none" outputs="Imported modules" errors="Import failures" side_effects="none"]
14
- // CIL[DOC-MICRO logic_summary="Imports createHandler, adminDb" notable_decisions="[]"]
15
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
16
- // CIL[DOC-STABILITY stability="stable"]
17
- // CIL[DOC-AUDIENCE audience="developer"]
18
- // CIL[DOC-VECTOR type="context" content="Layer: api-handler. Direct callers: 0. Direct calls: 0. Related files: custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/functions/_shared/principal.ts, .framework/functions/_shared/schema-utils.ts, custom/apps/portal/pages/ContentPage.tsx, \."]
19
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
20
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
21
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
22
- // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
23
- // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
24
18
  import { createHandler } from './_shared/middleware'
25
19
  import { adminDb } from './_shared/db'
26
20
  import { isSystemAdmin } from './_shared/principal'
27
21
  import { resolveTypeId } from './_shared/resolve-ids'
28
- // CIL[END chunk_id="observability_moduleheader_1783968140"]
29
- // CIL[BEGIN chunk_id="observability_geteventvolume_1783968140" type="function" identity="getEventVolume" parent="none"]
30
- // CIL[DOC-MACRO purpose="Get event volume metrics with time bucketing"]
31
- // CIL[DOC-RESPONSIBILITY responsibility="Query aggregated event statistics"]
32
- // CIL[DOC-CONTEXT module="observability" layer="api-handler" related_files="[\".framework/src/pages/admin/RolesPage.tsx\",\".framework/functions/_shared/schema-utils.ts\",\".framework/src/components/ui/dialog.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/functions/_shared/db.ts\",\"\\\"]"]
33
- // CIL[DOC-CONTRACT inputs="none" outputs="Array of event volume data" errors="Account context required, dates required, DB errors" side_effects="DB RPC call"]
34
- // CIL[DOC-MICRO logic_summary="Calls get_event_volume RPC with date range and bucket parameters" notable_decisions="[]"]
35
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
36
- // CIL[DOC-STABILITY stability="stable"]
37
- // CIL[DOC-VECTOR type="context" content="Layer: api-handler. Direct callers: 1. Direct calls: 0. Related files: .framework/src/pages/admin/RolesPage.tsx, .framework/functions/_shared/schema-utils.ts, .framework/src/components/ui/dialog.tsx, .framework/functions/_shared/principal.ts, .framework/functions/_shared/db.ts, \."]
38
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 1. Total affected: 1."]
39
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
40
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
22
+ // CIL[DOC-VECTOR type="context" content="purpose='Observability and analytics function entry point'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/principal.ts"]
23
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
24
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
25
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
41
26
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
42
27
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
28
+ // CIL[END stable_id="~/.framework/functions/observability.ts:module_header:module_header"]
29
+ // CIL[BEGIN stable_id="~/.framework/functions/observability.ts:floorBucket:function" type="function" identity="floorBucket" parent="~/.framework/functions/observability.ts"]
30
+ // CIL[DOC-MACRO purpose="Bucket a date to a chosen granularity"]
31
+ // CIL[DOC-RESPONSIBILITY responsibility="Normalize a Date to the start of the requested hour or day bucket"]
32
+ // CIL[DOC-CONTEXT module="observability" layer="functions" related_files=".framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/principal.ts,.framework/functions/_shared/resolve-ids.ts,.framework/functions/observability.ts"]
33
+ // CIL[DOC-CONTRACT inputs="date: Date, bucket: string" outputs="Date" errors="none" side_effects="none"]
34
+ // CIL[DOC-MICRO logic_summary="Zeroes seconds and milliseconds; zeroes minutes for hour/day and hours for day" notable_decisions="[]"]
35
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
36
+ // CIL[DOC-STABILITY stability="stable"]
43
37
  function floorBucket(date: Date, bucket: string): Date {
44
38
  const d = new Date(date)
45
39
  d.setMilliseconds(0)
@@ -48,7 +42,22 @@ function floorBucket(date: Date, bucket: string): Date {
48
42
  if (bucket === 'day') d.setHours(0)
49
43
  return d
50
44
  }
51
-
45
+ // CIL[DOC-VECTOR type="context" content="purpose='Bucket a date to a chosen granularity'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/principal.ts"]
46
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
47
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
48
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
49
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
50
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
51
+ // CIL[END stable_id="~/.framework/functions/observability.ts:floorBucket:function"]
52
+
53
+ // CIL[BEGIN stable_id="~/.framework/functions/observability.ts:getEventVolume:constant" type="constant" identity="getEventVolume" parent="~/.framework/functions/observability.ts"]
54
+ // CIL[DOC-MACRO purpose="Return event counts grouped by time bucket"]
55
+ // CIL[DOC-RESPONSIBILITY responsibility="Query logs for a date range and aggregate counts by ISO bucket"]
56
+ // CIL[DOC-CONTEXT module="observability" layer="functions" related_files=".framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/principal.ts,.framework/functions/_shared/resolve-ids.ts,.framework/functions/observability.ts"]
57
+ // CIL[DOC-CONTRACT inputs="ctx.query.from, ctx.query.to, ctx.query.bucket" outputs="array of { bucket, count }" errors="Account context required; from/to required; database error" side_effects="reads logs table"]
58
+ // CIL[DOC-MICRO logic_summary="Selects adminDb or ctx.db based on role; filters by account_id; groups with floorBucket; sorts ascending" notable_decisions="[]"]
59
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
60
+ // CIL[DOC-STABILITY stability="stable"]
52
61
  export const getEventVolume = createHandler(async (ctx, body) => {
53
62
  const { from, to, bucket = 'hour' } = ctx.query || {}
54
63
  const db = isSystemAdmin(ctx.principal) ? adminDb : ctx.db
@@ -85,21 +94,21 @@ export const getEventVolume = createHandler(async (ctx, body) => {
85
94
  .map(([bucket, count]) => ({ bucket, count }))
86
95
  .sort((a, b) => new Date(a.bucket).getTime() - new Date(b.bucket).getTime())
87
96
  })
88
- // CIL[END chunk_id="observability_geteventvolume_1783968140"]
89
- // CIL[BEGIN chunk_id="observability_geterrorrate_1783968140" type="function" identity="getErrorRate" parent="none"]
90
- // CIL[DOC-MACRO purpose="Get error rate metrics for date range"]
91
- // CIL[DOC-RESPONSIBILITY responsibility="Query aggregated error statistics"]
92
- // CIL[DOC-CONTEXT module="observability" layer="api-handler" related_files="[\".framework/src/pages/admin/RolesPage.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/functions/_shared/db.ts\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"\\\"]"]
93
- // CIL[DOC-CONTRACT inputs="none" outputs="Error rate data object" errors="Account context required, dates required, DB errors" side_effects="DB RPC call"]
94
- // CIL[DOC-MICRO logic_summary="Calls get_error_rate RPC with date range parameters" notable_decisions="[]"]
95
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
96
- // CIL[DOC-STABILITY stability="stable"]
97
- // CIL[DOC-VECTOR type="context" content="Layer: api-handler. Direct callers: 1. Direct calls: 0. Related files: .framework/src/pages/admin/RolesPage.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/functions/_shared/principal.ts, .framework/functions/_shared/db.ts, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, \."]
98
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 1. Total affected: 1."]
99
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
100
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
97
+ // CIL[DOC-VECTOR type="context" content="purpose='Return event counts grouped by time bucket'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/principal.ts"]
98
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
99
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
100
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
101
101
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
102
102
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
103
+ // CIL[END stable_id="~/.framework/functions/observability.ts:getEventVolume:constant"]
104
+ // CIL[BEGIN stable_id="~/.framework/functions/observability.ts:getErrorRate:constant" type="constant" identity="getErrorRate" parent="~/.framework/functions/observability.ts"]
105
+ // CIL[DOC-MACRO purpose="Compute error rate over a date range"]
106
+ // CIL[DOC-RESPONSIBILITY responsibility="Count total log rows and failures to derive an error rate"]
107
+ // CIL[DOC-CONTEXT module="observability" layer="functions" related_files=".framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/principal.ts,.framework/functions/_shared/resolve-ids.ts,.framework/functions/observability.ts"]
108
+ // CIL[DOC-CONTRACT inputs="ctx.query.from, ctx.query.to" outputs="{ total, errors, rate }" errors="Account context required; from/to required; database error" side_effects="reads logs table"]
109
+ // CIL[DOC-MICRO logic_summary="Queries logs for outcome/level; counts rows where outcome is failure or level is error" notable_decisions="[]"]
110
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
111
+ // CIL[DOC-STABILITY stability="stable"]
103
112
  export const getErrorRate = createHandler(async (ctx, body) => {
104
113
  const { from, to } = ctx.query || {}
105
114
  const db = isSystemAdmin(ctx.principal) ? adminDb : ctx.db
@@ -135,21 +144,21 @@ export const getErrorRate = createHandler(async (ctx, body) => {
135
144
  rate: total > 0 ? errors / total : 0,
136
145
  }
137
146
  })
138
- // CIL[END chunk_id="observability_geterrorrate_1783968140"]
139
- // CIL[BEGIN chunk_id="observability_getlatencypercentiles_1783968140" type="function" identity="getLatencyPercentiles" parent="none"]
140
- // CIL[DOC-MACRO purpose="Get latency percentile metrics for performance monitoring"]
141
- // CIL[DOC-RESPONSIBILITY responsibility="Query aggregated latency statistics"]
142
- // CIL[DOC-CONTEXT module="observability" layer="api-handler" related_files="[\".framework/src/pages/admin/RolesPage.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/functions/_shared/principal.ts\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/functions/_shared/schema-utils.ts\",\"\\\"]"]
143
- // CIL[DOC-CONTRACT inputs="none" outputs="Latency percentile data" errors="Account context required, dates required, DB errors" side_effects="DB RPC call"]
144
- // CIL[DOC-MICRO logic_summary="Calls get_latency_percentiles RPC with source and date range" notable_decisions="[]"]
145
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
146
- // CIL[DOC-STABILITY stability="stable"]
147
- // CIL[DOC-VECTOR type="context" content="Layer: api-handler. Direct callers: 1. Direct calls: 0. Related files: .framework/src/pages/admin/RolesPage.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/functions/_shared/principal.ts, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/functions/_shared/schema-utils.ts, \."]
148
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 1. Total affected: 1."]
149
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
150
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
147
+ // CIL[DOC-VECTOR type="context" content="purpose='Compute error rate over a date range'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/principal.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
151
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
152
152
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
153
+ // CIL[END stable_id="~/.framework/functions/observability.ts:getErrorRate:constant"]
154
+ // CIL[BEGIN stable_id="~/.framework/functions/observability.ts:percentile:function" type="function" identity="percentile" parent="~/.framework/functions/observability.ts"]
155
+ // CIL[DOC-MACRO purpose="Compute a percentile of a sorted numeric array"]
156
+ // CIL[DOC-RESPONSIBILITY responsibility="Return weighted percentile value using linear interpolation"]
157
+ // CIL[DOC-CONTEXT module="observability" layer="functions" related_files=".framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/principal.ts,.framework/functions/_shared/resolve-ids.ts,.framework/functions/observability.ts"]
158
+ // CIL[DOC-CONTRACT inputs="sorted: number[], p: number" outputs="number" errors="none" side_effects="none"]
159
+ // CIL[DOC-MICRO logic_summary="Calculates index from p and length-1; blends lower and upper sorted values" notable_decisions="[]"]
160
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
161
+ // CIL[DOC-STABILITY stability="stable"]
153
162
  function percentile(sorted: number[], p: number): number {
154
163
  if (sorted.length === 0) return 0
155
164
  const idx = (p / 100) * (sorted.length - 1)
@@ -158,7 +167,22 @@ function percentile(sorted: number[], p: number): number {
158
167
  const weight = idx - lower
159
168
  return sorted[lower] * (1 - weight) + sorted[upper] * weight
160
169
  }
161
-
170
+ // CIL[DOC-VECTOR type="context" content="purpose='Compute a percentile of a sorted numeric array'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/principal.ts"]
171
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
172
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
173
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
174
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
175
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
176
+ // CIL[END stable_id="~/.framework/functions/observability.ts:percentile:function"]
177
+
178
+ // CIL[BEGIN stable_id="~/.framework/functions/observability.ts:getLatencyPercentiles:constant" type="constant" identity="getLatencyPercentiles" parent="~/.framework/functions/observability.ts"]
179
+ // CIL[DOC-MACRO purpose="Return duration latency percentiles"]
180
+ // CIL[DOC-RESPONSIBILITY responsibility="Query positive non-null duration_ms values and compute p50/p90/p95/p99"]
181
+ // CIL[DOC-CONTEXT module="observability" layer="functions" related_files=".framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/principal.ts,.framework/functions/_shared/resolve-ids.ts,.framework/functions/observability.ts"]
182
+ // CIL[DOC-CONTRACT inputs="ctx.query.from, ctx.query.to, ctx.query.source" outputs="{ p50, p90, p95, p99 }" errors="Account context required; from/to required; database error" side_effects="reads logs table"]
183
+ // CIL[DOC-MICRO logic_summary="Filters by span_name when source provided; converts and filters duration values; sorts and delegates to percentile" notable_decisions="[]"]
184
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
185
+ // CIL[DOC-STABILITY stability="stable"]
162
186
  export const getLatencyPercentiles = createHandler(async (ctx, body) => {
163
187
  const { from, to, source = 'request' } = ctx.query || {}
164
188
  const db = isSystemAdmin(ctx.principal) ? adminDb : ctx.db
@@ -199,21 +223,21 @@ export const getLatencyPercentiles = createHandler(async (ctx, body) => {
199
223
  p99: percentile(values, 99),
200
224
  }
201
225
  })
202
- // CIL[END chunk_id="observability_getlatencypercentiles_1783968140"]
203
- // CIL[BEGIN chunk_id="observability_getpipelinestats_1783968140" type="function" identity="getPipelineStats" parent="none"]
204
- // CIL[DOC-MACRO purpose="Get pipeline execution statistics for monitoring"]
205
- // CIL[DOC-RESPONSIBILITY responsibility="Query aggregated pipeline metrics"]
206
- // CIL[DOC-CONTEXT module="observability" layer="api-handler" related_files="[]"]
207
- // CIL[DOC-CONTRACT inputs="none" outputs="Array of pipeline statistics" errors="Account context required, dates required, DB errors" side_effects="DB RPC call"]
208
- // CIL[DOC-MICRO logic_summary="Calls get_pipeline_stats RPC with date range parameters" notable_decisions="[]"]
209
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
210
- // CIL[DOC-STABILITY stability="stable"]
211
- // CIL[DOC-VECTOR type="context" content="Layer: api-handler. Direct callers: 0. Direct calls: 0. Related files: none."]
212
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
213
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
214
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
226
+ // CIL[DOC-VECTOR type="context" content="purpose='Return duration latency percentiles'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/principal.ts"]
227
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
228
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
229
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
215
230
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
216
231
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
232
+ // CIL[END stable_id="~/.framework/functions/observability.ts:getLatencyPercentiles:constant"]
233
+ // CIL[BEGIN stable_id="~/.framework/functions/observability.ts:getPipelineStats:constant" type="constant" identity="getPipelineStats" parent="~/.framework/functions/observability.ts"]
234
+ // CIL[DOC-MACRO purpose="Aggregate pipeline execution statistics"]
235
+ // CIL[DOC-RESPONSIBILITY responsibility="Group pipeline_executions by pipeline_id and count successes/failures/durations"]
236
+ // CIL[DOC-CONTEXT module="observability" layer="functions" related_files=".framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/principal.ts,.framework/functions/_shared/resolve-ids.ts,.framework/functions/observability.ts"]
237
+ // CIL[DOC-CONTRACT inputs="ctx.query.from, ctx.query.to" outputs="array of { pipeline_id, success_count, failure_count, avg_duration_ms }" errors="Account context required; from/to required; database error" side_effects="reads pipeline_executions table"]
238
+ // CIL[DOC-MICRO logic_summary="Iterates rows to update per-pipeline counters and compute average duration where both timestamps exist" notable_decisions="[]"]
239
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
240
+ // CIL[DOC-STABILITY stability="stable"]
217
241
  export const getPipelineStats = createHandler(async (ctx, body) => {
218
242
  const { from, to } = ctx.query || {}
219
243
  const db = isSystemAdmin(ctx.principal) ? adminDb : ctx.db
@@ -262,21 +286,21 @@ export const getPipelineStats = createHandler(async (ctx, body) => {
262
286
  avg_duration_ms: s.duration_count > 0 ? Math.round(s.total_duration_ms / s.duration_count) : 0,
263
287
  }))
264
288
  })
265
- // CIL[END chunk_id="observability_getpipelinestats_1783968140"]
266
- // CIL[BEGIN chunk_id="observability_gettopactors_1783968140" type="function" identity="getTopActors" parent="none"]
267
- // CIL[DOC-MACRO purpose="Get top actors by activity volume for monitoring"]
268
- // CIL[DOC-RESPONSIBILITY responsibility="Query most active users/system actors"]
269
- // CIL[DOC-CONTEXT module="observability" layer="api-handler" related_files="[]"]
270
- // CIL[DOC-CONTRACT inputs="none" outputs="Array of actor activity data" errors="Account context required, dates required, DB errors" side_effects="DB RPC call"]
271
- // CIL[DOC-MICRO logic_summary="Calls get_top_actors RPC with date range and limit parameters" notable_decisions="[]"]
272
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
273
- // CIL[DOC-STABILITY stability="stable"]
274
- // CIL[DOC-VECTOR type="context" content="Layer: api-handler. Direct callers: 0. Direct calls: 0. Related files: none."]
275
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
276
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
277
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
289
+ // CIL[DOC-VECTOR type="context" content="purpose='Aggregate pipeline execution statistics'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/principal.ts"]
290
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
291
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
292
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
278
293
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
279
294
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
295
+ // CIL[END stable_id="~/.framework/functions/observability.ts:getPipelineStats:constant"]
296
+ // CIL[BEGIN stable_id="~/.framework/functions/observability.ts:getTopActors:constant" type="constant" identity="getTopActors" parent="~/.framework/functions/observability.ts"]
297
+ // CIL[DOC-MACRO purpose="Rank principals by event volume"]
298
+ // CIL[DOC-RESPONSIBILITY responsibility="Count log rows per created_by and return the top N"]
299
+ // CIL[DOC-CONTEXT module="observability" layer="functions" related_files=".framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/principal.ts,.framework/functions/_shared/resolve-ids.ts,.framework/functions/observability.ts"]
300
+ // CIL[DOC-CONTRACT inputs="ctx.query.from, ctx.query.to, ctx.query.limit" outputs="array of { principal_id, event_count }" errors="Account context required; from/to required; database error" side_effects="reads logs table"]
301
+ // CIL[DOC-MICRO logic_summary="Tallies created_by occurrences; sorts descending and limits to parsed limit defaulting to 5" notable_decisions="[]"]
302
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
303
+ // CIL[DOC-STABILITY stability="stable"]
280
304
  export const getTopActors = createHandler(async (ctx, body) => {
281
305
  const { from, to, limit = 5 } = ctx.query || {}
282
306
  const db = isSystemAdmin(ctx.principal) ? adminDb : ctx.db
@@ -314,21 +338,21 @@ export const getTopActors = createHandler(async (ctx, body) => {
314
338
  .sort((a, b) => b.event_count - a.event_count)
315
339
  .slice(0, parseInt(limit.toString()) || 5)
316
340
  })
317
- // CIL[END chunk_id="observability_gettopactors_1783968140"]
318
- // CIL[BEGIN chunk_id="observability_cleanupoldlogs_1783968140" type="function" identity="cleanupOldLogs" parent="none"]
319
- // CIL[DOC-MACRO purpose="Delete old log entries for storage management"]
320
- // CIL[DOC-RESPONSIBILITY responsibility="Perform log retention cleanup"]
321
- // CIL[DOC-CONTEXT module="observability" layer="api-handler" related_files="[]"]
322
- // CIL[DOC-CONTRACT inputs="none" outputs="{deleted_count: number}" errors="System admin required, DB errors" side_effects="DB RPC call, data deletion"]
323
- // CIL[DOC-MICRO logic_summary="Calls cleanup_old_logs RPC with retention days parameter" notable_decisions="[]"]
324
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
325
- // CIL[DOC-STABILITY stability="stable"]
326
- // CIL[DOC-VECTOR type="context" content="Layer: api-handler. Direct callers: 0. Direct calls: 0. Related files: none."]
327
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
328
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
329
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
341
+ // CIL[DOC-VECTOR type="context" content="purpose='Rank principals by event volume'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/principal.ts"]
342
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
343
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
344
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
330
345
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
331
346
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
347
+ // CIL[END stable_id="~/.framework/functions/observability.ts:getTopActors:constant"]
348
+ // CIL[BEGIN stable_id="~/.framework/functions/observability.ts:cleanupOldLogs:constant" type="constant" identity="cleanupOldLogs" parent="~/.framework/functions/observability.ts"]
349
+ // CIL[DOC-MACRO purpose="Delete old logs via retention policy"]
350
+ // CIL[DOC-RESPONSIBILITY responsibility="Invoke a stored function to purge logs older than the requested retention"]
351
+ // CIL[DOC-CONTEXT module="observability" layer="functions" related_files=".framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/principal.ts,.framework/functions/_shared/resolve-ids.ts,.framework/functions/observability.ts"]
352
+ // CIL[DOC-CONTRACT inputs="ctx.query.days" outputs="{ deleted_count }" errors="System admin required; database error" side_effects="calls cleanup_old_logs RPC; deletes records"]
353
+ // CIL[DOC-MICRO logic_summary="Restricts to system_admin; parses days defaulting to 90; runs cleanup_old_logs RPC" notable_decisions="[]"]
354
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
355
+ // CIL[DOC-STABILITY stability="stable"]
332
356
  export const cleanupOldLogs = createHandler(async (ctx, body) => {
333
357
  const { days = 90 } = ctx.query || {}
334
358
 
@@ -344,21 +368,21 @@ export const cleanupOldLogs = createHandler(async (ctx, body) => {
344
368
  if (err) throw err
345
369
  return { deleted_count: data?.[0]?.deleted_count || 0 }
346
370
  })
347
- // CIL[END chunk_id="observability_cleanupoldlogs_1783968140"]
348
- // CIL[BEGIN chunk_id="observability_getaisupportmetrics_1783968140" type="function" identity="getAiSupportMetrics" parent="none"]
349
- // CIL[DOC-MACRO purpose="Get AI support metrics and knowledge gaps analysis"]
350
- // CIL[DOC-RESPONSIBILITY responsibility="Query AI performance and coverage statistics"]
351
- // CIL[DOC-CONTEXT module="observability" layer="api-handler" related_files="[]"]
352
- // CIL[DOC-CONTRACT inputs="none" outputs="AI metrics object with knowledge gaps" errors="Account context required, DB errors" side_effects="DB queries"]
353
- // CIL[DOC-MICRO logic_summary="Queries AI metrics and knowledge gaps, returns aggregated analysis" notable_decisions="[]"]
354
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="complex_dependencies"]
355
- // CIL[DOC-STABILITY stability="stable"]
356
- // CIL[DOC-VECTOR type="context" content="Layer: api-handler. Direct callers: 0. Direct calls: 0. Related files: none."]
357
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
358
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
359
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
371
+ // CIL[DOC-VECTOR type="context" content="purpose='Delete old logs via retention policy'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/principal.ts"]
372
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
373
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
374
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
360
375
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
361
376
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
377
+ // CIL[END stable_id="~/.framework/functions/observability.ts:cleanupOldLogs:constant"]
378
+ // CIL[BEGIN stable_id="~/.framework/functions/observability.ts:getAiSupportMetrics:constant" type="constant" identity="getAiSupportMetrics" parent="~/.framework/functions/observability.ts"]
379
+ // CIL[DOC-MACRO purpose="Compute AI support KPIs for the account"]
380
+ // CIL[DOC-RESPONSIBILITY responsibility="Aggregate AI feedback, resolved items, and escalated items over a period"]
381
+ // CIL[DOC-CONTEXT module="observability" layer="functions" related_files=".framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/principal.ts,.framework/functions/_shared/resolve-ids.ts,.framework/functions/observability.ts"]
382
+ // CIL[DOC-CONTRACT inputs="ctx.query.from, ctx.query.to" outputs="{ period, ai_attempted, ai_resolved, human_escalations, thumbs_down_rate, kb_articles_created, kb_reuse_count, knowledge_gaps }" errors="Account context required; database error" side_effects="reads items table via adminDb"]
383
+ // CIL[DOC-MICRO logic_summary="Resolves ai_feedback_record type id; runs three parallel queries; computes rates and counts from feedback data" notable_decisions="[]"]
384
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
385
+ // CIL[DOC-STABILITY stability="stable"]
362
386
  export const getAiSupportMetrics = createHandler(async (ctx, _body) => {
363
387
  if (!ctx.accountId) throw new Error('Account context required')
364
388
 
@@ -429,21 +453,21 @@ export const getAiSupportMetrics = createHandler(async (ctx, _body) => {
429
453
  knowledge_gaps: knowledgeGaps,
430
454
  }
431
455
  })
432
- // CIL[END chunk_id="observability_getaisupportmetrics_1783968140"]
433
- // CIL[BEGIN chunk_id="observability_handler_1783968140" type="function" identity="handler" parent="none"]
434
- // CIL[DOC-MACRO purpose="Route observability actions to appropriate metric handlers"]
435
- // CIL[DOC-RESPONSIBILITY responsibility="Dispatch monitoring requests to correct metric functions"]
436
- // CIL[DOC-CONTEXT module="observability" layer="api-handler" related_files="[]"]
437
- // CIL[DOC-CONTRACT inputs="none" outputs="Varies by action" errors="Unknown action" side_effects="Delegates to handlers"]
438
- // CIL[DOC-MICRO logic_summary="Switch statement routes action parameter to appropriate metric handler" notable_decisions="[]"]
439
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
440
- // CIL[DOC-STABILITY stability="stable"]
441
- // CIL[DOC-VECTOR type="context" content="Layer: api-handler. Direct callers: 0. Direct calls: 0. Related files: none."]
442
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
443
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
444
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
456
+ // CIL[DOC-VECTOR type="context" content="purpose='Compute AI support KPIs for the account'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/principal.ts"]
457
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
458
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
459
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
445
460
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
446
461
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
462
+ // CIL[END stable_id="~/.framework/functions/observability.ts:getAiSupportMetrics:constant"]
463
+ // CIL[BEGIN stable_id="~/.framework/functions/observability.ts:handler:constant" type="constant" identity="handler" parent="~/.framework/functions/observability.ts"]
464
+ // CIL[DOC-MACRO purpose="Route observability action requests"]
465
+ // CIL[DOC-RESPONSIBILITY responsibility="Dispatch the requested analytics action to the appropriate function"]
466
+ // CIL[DOC-CONTEXT module="observability" layer="functions" related_files=".framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/principal.ts,.framework/functions/_shared/resolve-ids.ts,.framework/functions/observability.ts"]
467
+ // CIL[DOC-CONTRACT inputs="ctx.query.action" outputs="action-specific result" errors="Unknown action" side_effects="delegates to analytics functions"]
468
+ // CIL[DOC-MICRO logic_summary="Switch on action and awaits the matching handler; returns default error for unknown actions" notable_decisions="[]"]
469
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
470
+ // CIL[DOC-STABILITY stability="stable"]
447
471
  export const handler = createHandler(async (ctx, body) => {
448
472
  const { action } = ctx.query || {}
449
473
 
@@ -466,4 +490,10 @@ export const handler = createHandler(async (ctx, body) => {
466
490
  throw new Error(`Unknown action: ${action}. Valid actions: event_volume, error_rate, latency_percentiles, pipeline_stats, top_actors, ai_support_metrics, cleanup`)
467
491
  }
468
492
  })
469
- // CIL[END chunk_id="observability_handler_1783968140"]
493
+ // CIL[DOC-VECTOR type="context" content="purpose='Route observability action requests'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/principal.ts"]
494
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
495
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
496
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
497
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
498
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
499
+ // CIL[END stable_id="~/.framework/functions/observability.ts:handler:constant"]