spine-framework 0.3.124 → 0.3.126

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (319) hide show
  1. package/.framework/cli/commands/agents.ts +35 -37
  2. package/.framework/cli/commands/auth.ts +35 -34
  3. package/.framework/cli/commands/create-app.ts +104 -40
  4. package/.framework/cli/commands/dev.ts +104 -69
  5. package/.framework/cli/commands/doctor.ts +179 -69
  6. package/.framework/cli/commands/generate.ts +83 -143
  7. package/.framework/cli/commands/init.ts +72 -34
  8. package/.framework/cli/commands/install-app.ts +260 -125
  9. package/.framework/cli/commands/items.ts +33 -44
  10. package/.framework/cli/commands/migrate.ts +122 -40
  11. package/.framework/cli/commands/migrations.ts +33 -40
  12. package/.framework/cli/commands/pipelines.ts +31 -39
  13. package/.framework/cli/commands/status.ts +47 -23
  14. package/.framework/cli/commands/system.ts +47 -37
  15. package/.framework/cli/commands/test.ts +112 -68
  16. package/.framework/cli/commands/validate-app.ts +215 -121
  17. package/.framework/cli/context.ts +112 -130
  18. package/.framework/cli/env-loader.ts +47 -18
  19. package/.framework/cli/index.ts +81 -42
  20. package/.framework/docs/runtime-types.md +1024 -0
  21. package/.framework/functions/_shared/agent-runner.ts +1296 -961
  22. package/.framework/functions/_shared/app-manifest.ts +82 -68
  23. package/.framework/functions/_shared/audit.ts +135 -83
  24. package/.framework/functions/_shared/{cil-state.ts → cil.ts} +158 -56
  25. package/.framework/functions/_shared/db.ts +80 -126
  26. package/.framework/functions/_shared/hash-api-key.ts +63 -0
  27. package/.framework/functions/_shared/index.ts +224 -335
  28. package/.framework/functions/_shared/kb.ts +319 -0
  29. package/.framework/functions/_shared/llm.ts +92 -0
  30. package/.framework/functions/_shared/logging.ts +288 -0
  31. package/.framework/functions/_shared/middleware.ts +329 -365
  32. package/.framework/functions/_shared/outcomes.ts +36 -0
  33. package/.framework/functions/_shared/permissions.ts +359 -643
  34. package/.framework/functions/_shared/pipeline-runner.ts +243 -316
  35. package/.framework/functions/_shared/principal.ts +376 -468
  36. package/.framework/functions/_shared/resolve-credentials.ts +102 -0
  37. package/.framework/functions/_shared/resolve-ids.ts +188 -16
  38. package/.framework/functions/_shared/retry-deliveries.ts +104 -0
  39. package/.framework/functions/_shared/schema-utils.ts +611 -373
  40. package/.framework/functions/_shared/testing.ts +207 -137
  41. package/.framework/functions/_shared/tracing.ts +276 -0
  42. package/.framework/functions/_shared/trigger-engine.ts +159 -211
  43. package/.framework/functions/_shared/webhook-registration.ts +95 -81
  44. package/.framework/functions/_shared/webhook-registry.ts +153 -75
  45. package/.framework/functions/account-nodes.ts +31 -53
  46. package/.framework/functions/adapters/generic-webhook-inbound.ts +56 -0
  47. package/.framework/functions/adapters/generic-webhook-outbound.ts +43 -0
  48. package/.framework/functions/adapters/openai-outbound.ts +40 -0
  49. package/.framework/functions/admin-data.ts +685 -537
  50. package/.framework/functions/admin-funnel.ts +31 -20
  51. package/.framework/functions/admin-install-funnel.ts +47 -28
  52. package/.framework/functions/admin-signals.ts +47 -29
  53. package/.framework/functions/ai-agents.ts +122 -147
  54. package/.framework/functions/ai-interactions.ts +180 -90
  55. package/.framework/functions/api-keys.ts +250 -192
  56. package/.framework/functions/apps.ts +203 -197
  57. package/.framework/functions/auth.ts +98 -91
  58. package/.framework/functions/cil-agent-ingest.ts +773 -0
  59. package/.framework/functions/cil-agent.ts +592 -0
  60. package/.framework/functions/cil-callmap.ts +1227 -0
  61. package/.framework/functions/cil-config.ts +583 -0
  62. package/.framework/functions/cil-context.ts +445 -0
  63. package/.framework/functions/cil-doc.ts +1752 -0
  64. package/.framework/functions/cil-embeddings.ts +1202 -0
  65. package/.framework/functions/cil-graph.ts +585 -0
  66. package/.framework/functions/cil-ingest.ts +2416 -0
  67. package/.framework/functions/cil-pipeline.ts +318 -0
  68. package/.framework/functions/cil-project.ts +499 -0
  69. package/.framework/functions/cil-validate.ts +469 -0
  70. package/.framework/functions/debug-auth.ts +73 -53
  71. package/.framework/functions/deliveries.ts +117 -0
  72. package/.framework/functions/embeddings.ts +528 -516
  73. package/.framework/functions/eval-harness.ts +158 -106
  74. package/.framework/functions/integration-outbound.ts +311 -0
  75. package/.framework/functions/integration-routes.ts +240 -466
  76. package/.framework/functions/integrations.ts +132 -140
  77. package/.framework/functions/invites.ts +401 -201
  78. package/.framework/functions/item-progress.ts +113 -53
  79. package/.framework/functions/kb.ts +28 -0
  80. package/.framework/functions/logs.ts +239 -222
  81. package/.framework/functions/observability.ts +308 -259
  82. package/.framework/functions/pipeline-executions.ts +179 -235
  83. package/.framework/functions/pipelines.ts +163 -205
  84. package/.framework/functions/prompt-configs.ts +109 -156
  85. package/.framework/functions/roles.ts +97 -147
  86. package/.framework/functions/system-cron.ts +132 -218
  87. package/.framework/functions/system.ts +112 -52
  88. package/.framework/functions/tests.ts +32 -28
  89. package/.framework/functions/timers.ts +162 -210
  90. package/.framework/functions/triggers.ts +282 -346
  91. package/.framework/functions/types.ts +283 -400
  92. package/.framework/migrations/001_core_schema.sql +630 -0
  93. package/.framework/migrations/002_core_rls_and_functions.sql +532 -0
  94. package/.framework/migrations/{003_system_data.sql → 003_core_system_data.sql} +26 -153
  95. package/.framework/migrations/004_core_rpc_and_broker.sql +421 -0
  96. package/.framework/migrations/005_core_observability.sql +598 -0
  97. package/.framework/migrations/006_security_hardening_rls.sql +97 -0
  98. package/.framework/migrations/007_kb_article_list.sql +237 -0
  99. package/.framework/migrations/008_items_target.sql +8 -0
  100. package/.framework/migrations/009_roles_slug_unique.sql +11 -0
  101. package/.framework/public/spine.config.json +91 -0
  102. package/.framework/scripts/app-install-cli.ts +112 -98
  103. package/.framework/src/App.tsx +67 -20
  104. package/.framework/src/apps/admin/index.tsx +97 -27
  105. package/.framework/src/components/AppWrapper.tsx +50 -11
  106. package/.framework/src/components/CustomAppLoader.tsx +131 -22
  107. package/.framework/src/components/admin/AdminListPage.tsx +75 -8
  108. package/.framework/src/components/admin/AdminSidebar.tsx +148 -36
  109. package/.framework/src/components/admin/AdminStatsCard.tsx +48 -29
  110. package/.framework/src/components/admin/PageInstructions.tsx +49 -0
  111. package/.framework/src/components/admin/SortableTableHeader.tsx +49 -2
  112. package/.framework/src/components/app-shell/GenericAppShell.tsx +69 -11
  113. package/.framework/src/components/app-shell/GenericDetailPage.tsx +55 -10
  114. package/.framework/src/components/app-shell/GenericListPage.tsx +76 -9
  115. package/.framework/src/components/app-sidebar.tsx +50 -3
  116. package/.framework/src/components/auth/ProtectedRoute.tsx +53 -45
  117. package/.framework/src/components/kb/KBArticleEditor.tsx +409 -0
  118. package/.framework/src/components/kb/KBArticleList.tsx +557 -0
  119. package/.framework/src/components/layout/AppShell.tsx +54 -16
  120. package/.framework/src/components/layout/Header.tsx +50 -38
  121. package/.framework/src/components/layout/Layout.tsx +48 -32
  122. package/.framework/src/components/layout/Sidebar.tsx +167 -16
  123. package/.framework/src/components/runtime/DataDetailHeader.tsx +33 -1
  124. package/.framework/src/components/runtime/DataDetailPage.tsx +289 -4
  125. package/.framework/src/components/runtime/DataFilters.tsx +78 -1
  126. package/.framework/src/components/runtime/DataHeader.tsx +32 -29
  127. package/.framework/src/components/runtime/DataListPage.tsx +161 -2
  128. package/.framework/src/components/runtime/DataStats.tsx +48 -1
  129. package/.framework/src/components/runtime/DataTable.tsx +153 -1
  130. package/.framework/src/components/runtime/SchemaDetailForm.tsx +77 -46
  131. package/.framework/src/components/runtime/index.ts +16 -9
  132. package/.framework/src/components/search-form.tsx +33 -1
  133. package/.framework/src/components/shared/AgentView.tsx +48 -51
  134. package/.framework/src/components/shared/FieldRenderer.tsx +84 -67
  135. package/.framework/src/components/shared/InviteManager.tsx +113 -52
  136. package/.framework/src/components/shared/MemberList.tsx +182 -0
  137. package/.framework/src/components/shared/SchemaFields.tsx +96 -78
  138. package/.framework/src/components/ui/DataTable.tsx +86 -56
  139. package/.framework/src/components/ui/Form.tsx +188 -109
  140. package/.framework/src/components/ui/ItemCard.tsx +86 -58
  141. package/.framework/src/components/ui/ItemListView.tsx +88 -61
  142. package/.framework/src/components/ui/LoadingSpinner.tsx +52 -27
  143. package/.framework/src/components/ui/Modal.tsx +81 -4
  144. package/.framework/src/components/ui/RichTextEditor.tsx +101 -9
  145. package/.framework/src/components/ui/accordion.tsx +97 -5
  146. package/.framework/src/components/ui/alert-dialog.tsx +225 -13
  147. package/.framework/src/components/ui/alert.tsx +113 -6
  148. package/.framework/src/components/ui/aspect-ratio.tsx +49 -2
  149. package/.framework/src/components/ui/avatar.tsx +129 -7
  150. package/.framework/src/components/ui/badge.tsx +65 -3
  151. package/.framework/src/components/ui/breadcrumb.tsx +145 -8
  152. package/.framework/src/components/ui/button-group.tsx +81 -4
  153. package/.framework/src/components/ui/button.tsx +49 -2
  154. package/.framework/src/components/ui/calendar.tsx +65 -3
  155. package/.framework/src/components/ui/card.tsx +145 -8
  156. package/.framework/src/components/ui/carousel.tsx +129 -7
  157. package/.framework/src/components/ui/chart.tsx +161 -10
  158. package/.framework/src/components/ui/checkbox.tsx +49 -2
  159. package/.framework/src/components/ui/collapsible.tsx +81 -5
  160. package/.framework/src/components/ui/combobox.tsx +305 -20
  161. package/.framework/src/components/ui/command.tsx +177 -11
  162. package/.framework/src/components/ui/context-menu.tsx +273 -17
  163. package/.framework/src/components/ui/dialog.tsx +209 -27
  164. package/.framework/src/components/ui/direction.tsx +64 -4
  165. package/.framework/src/components/ui/drawer.tsx +193 -12
  166. package/.framework/src/components/ui/dropdown-menu.tsx +273 -18
  167. package/.framework/src/components/ui/empty.tsx +145 -9
  168. package/.framework/src/components/ui/field.tsx +209 -14
  169. package/.framework/src/components/ui/hover-card.tsx +81 -4
  170. package/.framework/src/components/ui/input-group.tsx +162 -10
  171. package/.framework/src/components/ui/input-otp.tsx +98 -5
  172. package/.framework/src/components/ui/input.tsx +49 -2
  173. package/.framework/src/components/ui/item.tsx +225 -13
  174. package/.framework/src/components/ui/kbd.tsx +65 -3
  175. package/.framework/src/components/ui/label.tsx +49 -2
  176. package/.framework/src/components/ui/menubar.tsx +289 -17
  177. package/.framework/src/components/ui/native-select.tsx +97 -5
  178. package/.framework/src/components/ui/navigation-menu.tsx +177 -10
  179. package/.framework/src/components/ui/pagination.tsx +161 -9
  180. package/.framework/src/components/ui/popover.tsx +145 -8
  181. package/.framework/src/components/ui/progress.tsx +49 -2
  182. package/.framework/src/components/ui/radio-group.tsx +65 -3
  183. package/.framework/src/components/ui/resizable.tsx +82 -4
  184. package/.framework/src/components/ui/scroll-area.tsx +65 -3
  185. package/.framework/src/components/ui/select.tsx +193 -11
  186. package/.framework/src/components/ui/separator.tsx +49 -2
  187. package/.framework/src/components/ui/sheet.tsx +193 -11
  188. package/.framework/src/components/ui/sidebar.tsx +481 -38
  189. package/.framework/src/components/ui/skeleton.tsx +49 -2
  190. package/.framework/src/components/ui/slider.tsx +49 -2
  191. package/.framework/src/components/ui/sonner.tsx +49 -2
  192. package/.framework/src/components/ui/spinner.tsx +49 -2
  193. package/.framework/src/components/ui/switch.tsx +49 -2
  194. package/.framework/src/components/ui/table-primitives.tsx +160 -33
  195. package/.framework/src/components/ui/table.tsx +161 -9
  196. package/.framework/src/components/ui/tabs.tsx +113 -6
  197. package/.framework/src/components/ui/textarea.tsx +49 -2
  198. package/.framework/src/components/ui/toggle-group.tsx +81 -4
  199. package/.framework/src/components/ui/toggle.tsx +65 -3
  200. package/.framework/src/components/ui/tooltip.tsx +97 -5
  201. package/.framework/src/contexts/AppContext.tsx +129 -45
  202. package/.framework/src/contexts/AuthContext.tsx +187 -144
  203. package/.framework/src/hooks/use-mobile.ts +48 -2
  204. package/.framework/src/hooks/useApi.ts +208 -159
  205. package/.framework/src/hooks/useAppPath.ts +32 -23
  206. package/.framework/src/hooks/useApps.ts +51 -20
  207. package/.framework/src/hooks/useEntityList.ts +32 -78
  208. package/.framework/src/hooks/useEntityRecord.ts +35 -96
  209. package/.framework/src/hooks/useForm.ts +32 -92
  210. package/.framework/src/hooks/useListSchema.ts +49 -78
  211. package/.framework/src/hooks/useSchemaRecord.ts +114 -105
  212. package/.framework/src/lib/api.ts +195 -116
  213. package/.framework/src/lib/supabase.ts +98 -64
  214. package/.framework/src/lib/utils.ts +287 -151
  215. package/.framework/src/main.tsx +49 -3
  216. package/.framework/src/pages/DashboardPage.tsx +52 -29
  217. package/.framework/src/pages/NotFoundPage.tsx +32 -10
  218. package/.framework/src/pages/SetupPage.tsx +32 -12
  219. package/.framework/src/pages/admin/AIAgentDetailPage.tsx +119 -10
  220. package/.framework/src/pages/admin/AIAgentsPage.tsx +48 -19
  221. package/.framework/src/pages/admin/APIKeyDetailPage.tsx +187 -17
  222. package/.framework/src/pages/admin/APIKeysPage.tsx +98 -22
  223. package/.framework/src/pages/admin/AlertsConfigPage.tsx +113 -26
  224. package/.framework/src/pages/admin/AppDetailPage.tsx +125 -8
  225. package/.framework/src/pages/admin/AppsPage.tsx +49 -2
  226. package/.framework/src/pages/admin/DeliveriesPage.tsx +196 -0
  227. package/.framework/src/pages/admin/DesignedPage.tsx +32 -18
  228. package/.framework/src/pages/admin/EmbeddingDetailPage.tsx +215 -484
  229. package/.framework/src/pages/admin/EmbeddingsPage.tsx +116 -319
  230. package/.framework/src/pages/admin/ExtendedShadcnTestPage.tsx +34 -9
  231. package/.framework/src/pages/admin/IncrementalShadcnTestPage.tsx +34 -9
  232. package/.framework/src/pages/admin/IntegratedDashboard.tsx +32 -16
  233. package/.framework/src/pages/admin/IntegrationDetailPage.tsx +183 -26
  234. package/.framework/src/pages/admin/IntegrationsPage.tsx +48 -19
  235. package/.framework/src/pages/admin/InvitesPage.tsx +48 -14
  236. package/.framework/src/pages/admin/LogsPage.tsx +422 -75
  237. package/.framework/src/pages/admin/MinimalShadcnTestPage.tsx +34 -9
  238. package/.framework/src/pages/admin/ObservabilityDashboard.tsx +113 -24
  239. package/.framework/src/pages/admin/PipelineDetailPage.tsx +206 -34
  240. package/.framework/src/pages/admin/PipelineExecutionsPage.tsx +50 -17
  241. package/.framework/src/pages/admin/PipelinesPage.tsx +160 -21
  242. package/.framework/src/pages/admin/PromptConfigDetailPage.tsx +378 -88
  243. package/.framework/src/pages/admin/PromptConfigsPage.tsx +125 -16
  244. package/.framework/src/pages/admin/ProperlyDesignedPage.tsx +49 -10
  245. package/.framework/src/pages/admin/RoleDetailPage.tsx +130 -10
  246. package/.framework/src/pages/admin/RolesPage.tsx +171 -18
  247. package/.framework/src/pages/admin/SelectTestPage.tsx +34 -9
  248. package/.framework/src/pages/admin/ShadcnTestPage.tsx +49 -11
  249. package/.framework/src/pages/admin/SimpleDashboard.tsx +49 -10
  250. package/.framework/src/pages/admin/TestRunDetailPage.tsx +49 -4
  251. package/.framework/src/pages/admin/TestingDashboard.tsx +98 -28
  252. package/.framework/src/pages/admin/TimerDetailPage.tsx +143 -33
  253. package/.framework/src/pages/admin/TimersPage.tsx +48 -20
  254. package/.framework/src/pages/admin/TriggerDetailPage.tsx +118 -30
  255. package/.framework/src/pages/admin/TriggersPage.tsx +64 -19
  256. package/.framework/src/pages/admin/TypeDetailPage.tsx +138 -15
  257. package/.framework/src/pages/admin/TypesPage.tsx +48 -20
  258. package/.framework/src/pages/admin/cil/CILAgentPage.tsx +465 -0
  259. package/.framework/src/pages/admin/cil/CILChunkDetailPage.tsx +787 -0
  260. package/.framework/src/pages/admin/cil/CILDashboardPage.tsx +699 -0
  261. package/.framework/src/pages/admin/cil/CILFileListPage.tsx +647 -0
  262. package/.framework/src/pages/admin/cil/CILGraphPage.tsx +616 -0
  263. package/.framework/src/pages/admin/cil/CILIngestionPage.tsx +1402 -0
  264. package/.framework/src/pages/admin/cil/CILProjectsPage.tsx +614 -0
  265. package/.framework/src/pages/admin/cil/CILSearchPage.tsx +571 -0
  266. package/.framework/src/pages/admin/cil/FlexiblePipelinePage.tsx +731 -0
  267. package/.framework/src/pages/admin/kb/KBAdminPage.tsx +64 -0
  268. package/.framework/src/pages/auth/AuthConfirmPage.tsx +52 -51
  269. package/.framework/src/pages/auth/ForgotPasswordPage.tsx +31 -22
  270. package/.framework/src/pages/auth/LoginPage.tsx +50 -23
  271. package/.framework/src/pages/auth/PendingApprovalPage.tsx +31 -15
  272. package/.framework/src/pages/auth/RegisterPage.tsx +281 -317
  273. package/.framework/src/pages/spine-framework/APIPage.tsx +33 -0
  274. package/.framework/src/pages/spine-framework/CLIPage.tsx +33 -0
  275. package/.framework/src/types/auth.ts +128 -71
  276. package/.framework/src/types/types.ts +373 -157
  277. package/custom/.devin/skills/spine-workbench-discovery/SKILL.md +39 -0
  278. package/custom/.devin/skills/spine-workbench-idea/SKILL.md +36 -0
  279. package/custom/.devin/skills/spine-workbench-implement/SKILL.md +46 -0
  280. package/custom/.devin/skills/spine-workbench-initiative/SKILL.md +28 -0
  281. package/custom/.devin/skills/spine-workbench-plan/SKILL.md +38 -0
  282. package/docs/README.md +9 -130
  283. package/netlify.toml +5 -2
  284. package/package.json +13 -25
  285. package/scripts/kb-ingest-docs.ts +203 -0
  286. package/spine.config.json +65 -4
  287. package/.framework/migrations/001_schema.sql +0 -425
  288. package/.framework/migrations/002_rls_and_functions.sql +0 -763
  289. package/.framework/migrations/004_enhancements.sql +0 -43
  290. package/.framework/migrations/005_auth_user_trigger.sql +0 -105
  291. package/.framework/migrations/006_fix_current_actor_id.sql +0 -21
  292. package/.framework/migrations/016_invites.sql +0 -27
  293. package/.framework/migrations/017_fix_get_account_apps.sql +0 -78
  294. package/.framework/migrations/018_apps_required_roles.sql +0 -17
  295. package/.framework/migrations/019_triggers_unique_constraint.sql +0 -13
  296. package/.framework/migrations/020_get_account_apps_role_filter.sql +0 -117
  297. package/.framework/migrations/021_app_domains.sql +0 -112
  298. package/.framework/migrations/022_route_prefix_domain_unique.sql +0 -21
  299. package/.framework/migrations/023_match_embeddings_rpc.sql +0 -78
  300. package/.framework/migrations/024_messages_account_id.sql +0 -9
  301. package/.framework/migrations/025_retype_threads_messages.sql +0 -240
  302. package/.framework/migrations/026_fix_rls_policies.sql +0 -47
  303. package/.framework/migrations/027_embedding_lifecycle.sql +0 -176
  304. package/.framework/migrations/028_fix_message_data_permissions.sql +0 -49
  305. package/.framework/migrations/029_tighten_support_triage_prompt.sql +0 -41
  306. package/.framework/migrations/030_messages_updated_by.sql +0 -6
  307. package/.framework/migrations/031_seed_upsert_constraints.sql +0 -35
  308. package/docs/APPS.md +0 -232
  309. package/docs/ARCHITECTURE.md +0 -246
  310. package/docs/INSTALL.md +0 -155
  311. package/docs/design-schema-spec.md +0 -1837
  312. package/docs/dev-guides/01-create-an-app.md +0 -183
  313. package/docs/dev-guides/02-create-a-function.md +0 -178
  314. package/docs/dev-guides/03-create-a-component.md +0 -178
  315. package/docs/dev-guides/04-webhook-handlers.md +0 -129
  316. package/docs/dev-guides/05-testing.md +0 -168
  317. package/docs/dev-guides/README.md +0 -40
  318. package/docs/npm-packages-plan.md +0 -288
  319. package/docs/spine-core--api-reference.md +0 -822
@@ -0,0 +1,276 @@
1
+ // CIL[BEGIN chunk_id="tracing_moduleheader_1785012345" type="module_header" identity="module_header" parent="none"]
2
+ // CIL[DOC-MACRO purpose="W3C Trace Context propagation and span lifecycle for runtime evidence"]
3
+ // CIL[DOC-RESPONSIBILITY responsibility="Generate, parse, and manage trace/span IDs and timing"]
4
+ // CIL[DOC-CONTEXT module="_shared.tracing" layer="infrastructure" related_files="[]"]
5
+ // CIL[DOC-CONTRACT inputs="headers or CoreContext" outputs="TraceContext, Span records" errors="invalid traceparent" side_effects="none"]
6
+ // CIL[DOC-MICRO logic_summary="Implements W3C traceparent/tracestate parsing, span creation, and withSpan wrapper for distributed tracing" notable_decisions=["Use crypto.randomUUID-derived hex IDs", "Store spans in logs table via emitAudit/emitSpan"] ]
7
+ // CIL[DOC-CONFIDENCE pass="first" score="0.90" flags="none"]
8
+ // CIL[DOC-STABILITY stability="experimental"]
9
+ // CIL[DOC-AUDIENCE audience="developer"]
10
+ import { randomUUID } from 'crypto'
11
+ // CIL[END chunk_id="tracing_moduleheader_1785012345"]
12
+ // CIL[BEGIN chunk_id="tracing_functions_1785012345" type="module_exports" identity="functions" parent="tracing_moduleheader_1785012345"]
13
+ // CIL[DOC-MACRO purpose="W3C Trace Context helpers, span lifecycle, and traced database wrapper"]
14
+ // CIL[DOC-RESPONSIBILITY responsibility="Provide trace/span ID generation, parse/format traceparent/tracestate, and run code inside traced spans"]
15
+ // CIL[DOC-CONTEXT module="_shared.tracing" layer="infrastructure" related_files="[]"]
16
+ // CIL[DOC-CONTRACT inputs="headers or CoreContext" outputs="TraceContext, Span records, traced proxies" errors="invalid traceparent" side_effects="none"]
17
+ // CIL[DOC-MICRO logic_summary="Exports helpers for W3C trace context, span creation, withSpan wrappers, and a Supabase client proxy that emits db spans" notable_decisions=["Use crypto.randomUUID-derived hex IDs", "traceDb skips logs table to prevent recursive inserts"] ]
18
+ // CIL[DOC-CONFIDENCE pass="first" score="0.90" flags="none"]
19
+ // CIL[DOC-STABILITY stability="experimental"]
20
+
21
+ export interface TraceContext {
22
+ traceId: string
23
+ spanId: string
24
+ parentSpanId?: string
25
+ traceFlags: number
26
+ traceState?: string
27
+ sampled: boolean
28
+ }
29
+
30
+ export interface Span extends TraceContext {
31
+ spanName: string
32
+ startedAt: string
33
+ endedAt?: string
34
+ durationMs?: number
35
+ status?: 'ok' | 'error'
36
+ attributes?: Record<string, any>
37
+ }
38
+
39
+ export interface CoreContextWithTrace {
40
+ trace?: TraceContext
41
+ [key: string]: any
42
+ }
43
+
44
+ const TRACEPARENT_RE = /^00-([0-9a-f]{32})-([0-9a-f]{16})-([0-9a-f]{2})$/i
45
+ const TRACE_FLAGS_SAMPLED = 0x01
46
+
47
+ function generateHex(length: number): string {
48
+ // crypto.randomUUID gives 32 hex chars without dashes
49
+ const hex = randomUUID().replace(/-/g, '')
50
+ if (length > hex.length) {
51
+ return (hex + randomUUID().replace(/-/g, '')).slice(0, length).toLowerCase()
52
+ }
53
+ return hex.slice(0, length).toLowerCase()
54
+ }
55
+
56
+ export function generateTraceId(): string {
57
+ return generateHex(32)
58
+ }
59
+
60
+ export function generateSpanId(): string {
61
+ return generateHex(16)
62
+ }
63
+
64
+ export function newTrace(sampled = true): TraceContext {
65
+ return {
66
+ traceId: generateTraceId(),
67
+ spanId: generateSpanId(),
68
+ traceFlags: sampled ? TRACE_FLAGS_SAMPLED : 0,
69
+ sampled,
70
+ }
71
+ }
72
+
73
+ export function parseTraceParent(header?: string): { traceId: string; spanId: string; traceFlags: number } | null {
74
+ if (!header) return null
75
+ const match = header.trim().match(TRACEPARENT_RE)
76
+ if (!match) return null
77
+ return {
78
+ traceId: match[1].toLowerCase(),
79
+ spanId: match[2].toLowerCase(),
80
+ traceFlags: parseInt(match[3], 16),
81
+ }
82
+ }
83
+
84
+ export function formatTraceParent(traceId: string, spanId: string, traceFlags: number): string {
85
+ return `00-${traceId.toLowerCase()}-${spanId.toLowerCase()}-${traceFlags.toString(16).padStart(2, '0')}`
86
+ }
87
+
88
+ export function parseTraceState(header?: string): Record<string, string> {
89
+ const state: Record<string, string> = {}
90
+ if (!header) return state
91
+ for (const part of header.split(',')) {
92
+ const [key, ...rest] = part.trim().split('=')
93
+ if (key && rest.length > 0) state[key.trim()] = rest.join('=').trim()
94
+ }
95
+ return state
96
+ }
97
+
98
+ export function formatTraceState(state: Record<string, string>): string {
99
+ return Object.entries(state)
100
+ .map(([k, v]) => `${k}=${v}`)
101
+ .join(',')
102
+ }
103
+
104
+ export function isSampled(traceFlags: number): boolean {
105
+ return (traceFlags & TRACE_FLAGS_SAMPLED) === TRACE_FLAGS_SAMPLED
106
+ }
107
+
108
+ function traceQueryBuilder(
109
+ ctx: CoreContextWithTrace,
110
+ builder: any,
111
+ operation: string,
112
+ resource: string,
113
+ onSpanEnd?: (ctx: CoreContextWithTrace, span: Span) => void | Promise<void>
114
+ ): any {
115
+ return new Proxy(builder, {
116
+ get(target, prop: string | symbol) {
117
+ const value = (target as any)[prop]
118
+
119
+ if (prop === 'then' && typeof value === 'function') {
120
+ return (onFulfilled?: any, onRejected?: any) => {
121
+ const span = startSpan(ctx, `db.${operation}`, { attributes: { operation, resource } })
122
+ const start = Date.now()
123
+ return value.call(
124
+ target,
125
+ (result: any) => {
126
+ const durationMs = Date.now() - start
127
+ const rowCount = Array.isArray(result?.data) ? result.data.length : undefined
128
+ endSpan(span, { status: 'ok', attributes: { duration_ms: durationMs, row_count: rowCount } })
129
+ if (onSpanEnd) Promise.resolve(onSpanEnd(ctx, span)).catch(() => {})
130
+ return onFulfilled ? onFulfilled(result) : result
131
+ },
132
+ (err: any) => {
133
+ endSpan(span, { status: 'error', attributes: { error: err?.message || String(err) } })
134
+ if (onSpanEnd) Promise.resolve(onSpanEnd(ctx, span)).catch(() => {})
135
+ return onRejected ? onRejected(err) : Promise.reject(err)
136
+ }
137
+ )
138
+ }
139
+ }
140
+
141
+ if (prop === 'catch' && typeof value === 'function') {
142
+ return (onRejected?: any) => traceQueryBuilder(ctx, target, operation, resource, onSpanEnd).then(undefined, onRejected)
143
+ }
144
+
145
+ if (typeof value === 'function') {
146
+ return (...args: any[]) => {
147
+ const result = value.apply(target, args)
148
+ if (result && typeof result === 'object' && typeof result.then === 'function') {
149
+ return traceQueryBuilder(ctx, result, operation, resource, onSpanEnd)
150
+ }
151
+ return result
152
+ }
153
+ }
154
+
155
+ return value
156
+ }
157
+ })
158
+ }
159
+
160
+ export function traceDb(
161
+ ctx: CoreContextWithTrace,
162
+ db: any,
163
+ onSpanEnd?: (ctx: CoreContextWithTrace, span: Span) => void | Promise<void>
164
+ ): any {
165
+ if (!ctx.trace?.sampled || !db) return db
166
+ return new Proxy(db, {
167
+ get(target, prop: string | symbol) {
168
+ const value = (target as any)[prop]
169
+ if (prop === 'from' || prop === 'rpc') {
170
+ return (resource: string, ...args: any[]) => {
171
+ const builder = value.call(target, resource, ...args)
172
+ // Avoid tracing inserts into logs to prevent infinite recursion
173
+ if (prop === 'from' && resource === 'logs') return builder
174
+ return traceQueryBuilder(ctx, builder, String(prop), resource, onSpanEnd)
175
+ }
176
+ }
177
+ return value
178
+ }
179
+ })
180
+ }
181
+
182
+ export function startSpan(
183
+ ctx: CoreContextWithTrace,
184
+ spanName: string,
185
+ options?: {
186
+ attributes?: Record<string, any>
187
+ traceId?: string
188
+ traceFlags?: number
189
+ traceState?: string
190
+ sampled?: boolean
191
+ }
192
+ ): Span {
193
+ const parent = ctx.trace
194
+ const traceId = options?.traceId || parent?.traceId || generateTraceId()
195
+ const parentSpanId = parent?.spanId
196
+ const traceFlags = options?.traceFlags ?? parent?.traceFlags ?? TRACE_FLAGS_SAMPLED
197
+ const traceState = options?.traceState ?? parent?.traceState
198
+ const sampled = options?.sampled ?? parent?.sampled ?? isSampled(traceFlags)
199
+
200
+ return {
201
+ traceId,
202
+ spanId: generateSpanId(),
203
+ parentSpanId,
204
+ traceFlags,
205
+ traceState,
206
+ sampled,
207
+ spanName,
208
+ startedAt: new Date().toISOString(),
209
+ status: 'ok',
210
+ attributes: options?.attributes || {},
211
+ }
212
+ }
213
+
214
+ export function endSpan(span: Span, options?: { status?: 'ok' | 'error'; attributes?: Record<string, any> }): Span {
215
+ const endedAt = new Date().toISOString()
216
+ const started = new Date(span.startedAt).getTime()
217
+ const ended = new Date(endedAt).getTime()
218
+ span.endedAt = endedAt
219
+ span.durationMs = ended - started
220
+ if (options?.status) span.status = options.status
221
+ if (options?.attributes) {
222
+ span.attributes = { ...span.attributes, ...options.attributes }
223
+ }
224
+ return span
225
+ }
226
+
227
+ export async function withSpan<T>(
228
+ ctx: CoreContextWithTrace,
229
+ spanName: string,
230
+ fn: (ctx: CoreContextWithTrace) => Promise<T>,
231
+ options?: {
232
+ attributes?: Record<string, any>
233
+ onEnd?: (ctx: CoreContextWithTrace, span: Span) => void | Promise<void>
234
+ }
235
+ ): Promise<T> {
236
+ const span = startSpan(ctx, spanName, { attributes: options?.attributes })
237
+ const childCtx = { ...ctx, trace: span }
238
+ try {
239
+ const result = await fn(childCtx)
240
+ endSpan(span, { status: 'ok' })
241
+ if (options?.onEnd) await options.onEnd(childCtx, span)
242
+ return result
243
+ } catch (error: any) {
244
+ endSpan(span, { status: 'error', attributes: { error: error.message || String(error) } })
245
+ if (options?.onEnd) await options.onEnd(childCtx, span)
246
+ throw error
247
+ }
248
+ }
249
+
250
+ export function withSpanSync<T>(
251
+ ctx: CoreContextWithTrace,
252
+ spanName: string,
253
+ fn: (ctx: CoreContextWithTrace) => T,
254
+ options?: {
255
+ attributes?: Record<string, any>
256
+ onEnd?: (ctx: CoreContextWithTrace, span: Span) => void | Promise<void>
257
+ }
258
+ ): T {
259
+ const span = startSpan(ctx, spanName, { attributes: options?.attributes })
260
+ const childCtx = { ...ctx, trace: span }
261
+ try {
262
+ const result = fn(childCtx)
263
+ endSpan(span, { status: 'ok' })
264
+ if (options?.onEnd) {
265
+ Promise.resolve(options.onEnd(childCtx, span)).catch(() => {})
266
+ }
267
+ return result
268
+ } catch (error: any) {
269
+ endSpan(span, { status: 'error', attributes: { error: error.message || String(error) } })
270
+ if (options?.onEnd) {
271
+ Promise.resolve(options.onEnd(childCtx, span)).catch(() => {})
272
+ }
273
+ throw error
274
+ }
275
+ }
276
+ // CIL[END chunk_id="tracing_functions_1785012345"]