@plumix/core 0.3.0 → 0.5.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 (304) hide show
  1. package/dist/auth/authenticator.d.ts +8 -1
  2. package/dist/auth/authenticator.d.ts.map +1 -1
  3. package/dist/auth/authenticator.js +15 -0
  4. package/dist/auth/authenticator.js.map +1 -1
  5. package/dist/auth/bearer.js +2 -2
  6. package/dist/auth/bearer.js.map +1 -1
  7. package/dist/auth/bootstrap.d.ts.map +1 -1
  8. package/dist/auth/bootstrap.js +39 -22
  9. package/dist/auth/bootstrap.js.map +1 -1
  10. package/dist/cache/decision.d.ts +7 -3
  11. package/dist/cache/decision.d.ts.map +1 -1
  12. package/dist/cache/decision.js +8 -6
  13. package/dist/cache/decision.js.map +1 -1
  14. package/dist/cache/read-through.d.ts +3 -0
  15. package/dist/cache/read-through.d.ts.map +1 -1
  16. package/dist/cache/read-through.js +14 -7
  17. package/dist/cache/read-through.js.map +1 -1
  18. package/dist/cache/tags.d.ts.map +1 -1
  19. package/dist/cache/tags.js +9 -0
  20. package/dist/cache/tags.js.map +1 -1
  21. package/dist/config.d.ts +9 -0
  22. package/dist/config.d.ts.map +1 -1
  23. package/dist/config.js +1 -0
  24. package/dist/config.js.map +1 -1
  25. package/dist/context/app.d.ts +38 -6
  26. package/dist/context/app.d.ts.map +1 -1
  27. package/dist/context/app.js +41 -8
  28. package/dist/context/app.js.map +1 -1
  29. package/dist/context/collector.d.ts +9 -0
  30. package/dist/context/collector.d.ts.map +1 -0
  31. package/dist/context/collector.js +130 -0
  32. package/dist/context/collector.js.map +1 -0
  33. package/dist/context/index.d.ts +1 -0
  34. package/dist/context/index.d.ts.map +1 -1
  35. package/dist/context/index.js +1 -0
  36. package/dist/context/index.js.map +1 -1
  37. package/dist/context/stores.d.ts +2 -9
  38. package/dist/context/stores.d.ts.map +1 -1
  39. package/dist/context/stores.js.map +1 -1
  40. package/dist/context/telemetry.d.ts +148 -0
  41. package/dist/context/telemetry.d.ts.map +1 -0
  42. package/dist/context/telemetry.js +20 -0
  43. package/dist/context/telemetry.js.map +1 -0
  44. package/dist/context/traced-fetch.d.ts +14 -0
  45. package/dist/context/traced-fetch.d.ts.map +1 -0
  46. package/dist/context/traced-fetch.js +33 -0
  47. package/dist/context/traced-fetch.js.map +1 -0
  48. package/dist/db/errors.d.ts +8 -0
  49. package/dist/db/errors.d.ts.map +1 -1
  50. package/dist/db/errors.js +22 -0
  51. package/dist/db/errors.js.map +1 -1
  52. package/dist/db/index.d.ts +1 -1
  53. package/dist/db/index.d.ts.map +1 -1
  54. package/dist/db/index.js +1 -1
  55. package/dist/db/index.js.map +1 -1
  56. package/dist/db/libsql.d.ts.map +1 -1
  57. package/dist/db/libsql.js +6 -12
  58. package/dist/db/libsql.js.map +1 -1
  59. package/dist/db/query-kind.d.ts +8 -0
  60. package/dist/db/query-kind.d.ts.map +1 -0
  61. package/dist/db/query-kind.js +11 -0
  62. package/dist/db/query-kind.js.map +1 -0
  63. package/dist/db/schema/users.d.ts +57 -0
  64. package/dist/db/schema/users.d.ts.map +1 -1
  65. package/dist/db/schema/users.js +10 -2
  66. package/dist/db/schema/users.js.map +1 -1
  67. package/dist/db/trace-libsql.d.ts +15 -0
  68. package/dist/db/trace-libsql.d.ts.map +1 -0
  69. package/dist/db/trace-libsql.js +37 -0
  70. package/dist/db/trace-libsql.js.map +1 -0
  71. package/dist/db/trace.d.ts +21 -0
  72. package/dist/db/trace.d.ts.map +1 -0
  73. package/dist/db/trace.js +64 -0
  74. package/dist/db/trace.js.map +1 -0
  75. package/dist/debug-bar/consumer.d.ts +12 -0
  76. package/dist/debug-bar/consumer.d.ts.map +1 -0
  77. package/dist/debug-bar/consumer.js +13 -0
  78. package/dist/debug-bar/consumer.js.map +1 -0
  79. package/dist/debug-bar/format-param.d.ts +6 -4
  80. package/dist/debug-bar/format-param.d.ts.map +1 -1
  81. package/dist/debug-bar/format-param.js +6 -9
  82. package/dist/debug-bar/format-param.js.map +1 -1
  83. package/dist/debug-bar/highlight-sql.d.ts +0 -3
  84. package/dist/debug-bar/highlight-sql.d.ts.map +1 -1
  85. package/dist/debug-bar/highlight-sql.js +0 -6
  86. package/dist/debug-bar/highlight-sql.js.map +1 -1
  87. package/dist/debug-bar/panels/database.d.ts +6 -4
  88. package/dist/debug-bar/panels/database.d.ts.map +1 -1
  89. package/dist/debug-bar/panels/database.js +44 -8
  90. package/dist/debug-bar/panels/database.js.map +1 -1
  91. package/dist/debug-bar/panels/template.d.ts +1 -1
  92. package/dist/debug-bar/panels/template.d.ts.map +1 -1
  93. package/dist/debug-bar/panels/template.js +16 -2
  94. package/dist/debug-bar/panels/template.js.map +1 -1
  95. package/dist/debug-bar/panels/timeline.js +1 -1
  96. package/dist/debug-bar/panels/timeline.js.map +1 -1
  97. package/dist/debug-bar/styles.d.ts.map +1 -1
  98. package/dist/debug-bar/styles.js +5 -0
  99. package/dist/debug-bar/styles.js.map +1 -1
  100. package/dist/debug-bar/template-node-label.d.ts.map +1 -1
  101. package/dist/debug-bar/template-node-label.js +8 -0
  102. package/dist/debug-bar/template-node-label.js.map +1 -1
  103. package/dist/debug-bar/timeline-model.d.ts +3 -3
  104. package/dist/debug-bar/timeline-model.d.ts.map +1 -1
  105. package/dist/debug-bar/timeline-model.js +1 -1
  106. package/dist/debug-bar/timeline-model.js.map +1 -1
  107. package/dist/debug-bar/types.d.ts +1 -1
  108. package/dist/hooks/registry.d.ts.map +1 -1
  109. package/dist/hooks/registry.js +21 -3
  110. package/dist/hooks/registry.js.map +1 -1
  111. package/dist/index.d.ts +7 -5
  112. package/dist/index.d.ts.map +1 -1
  113. package/dist/index.js +5 -5
  114. package/dist/index.js.map +1 -1
  115. package/dist/mcp/server.d.ts.map +1 -1
  116. package/dist/mcp/server.js +9 -3
  117. package/dist/mcp/server.js.map +1 -1
  118. package/dist/plugin/manifest.d.ts +51 -0
  119. package/dist/plugin/manifest.d.ts.map +1 -1
  120. package/dist/plugin/manifest.js +8 -2
  121. package/dist/plugin/manifest.js.map +1 -1
  122. package/dist/plugin/provides-context.d.ts.map +1 -1
  123. package/dist/plugin/provides-context.js +5 -0
  124. package/dist/plugin/provides-context.js.map +1 -1
  125. package/dist/plugin/setup-context.d.ts +10 -1
  126. package/dist/plugin/setup-context.d.ts.map +1 -1
  127. package/dist/plugin/setup-context.js +12 -0
  128. package/dist/plugin/setup-context.js.map +1 -1
  129. package/dist/rest/build-handler.d.ts.map +1 -1
  130. package/dist/rest/build-handler.js +14 -1
  131. package/dist/rest/build-handler.js.map +1 -1
  132. package/dist/revisions/snapshot-envelope.d.ts +4 -2
  133. package/dist/revisions/snapshot-envelope.d.ts.map +1 -1
  134. package/dist/revisions/snapshot-envelope.js +6 -3
  135. package/dist/revisions/snapshot-envelope.js.map +1 -1
  136. package/dist/route/compile.d.ts +21 -0
  137. package/dist/route/compile.d.ts.map +1 -1
  138. package/dist/route/compile.js +63 -1
  139. package/dist/route/compile.js.map +1 -1
  140. package/dist/route/current.d.ts +5 -3
  141. package/dist/route/current.d.ts.map +1 -1
  142. package/dist/route/date-range.d.ts +12 -0
  143. package/dist/route/date-range.d.ts.map +1 -0
  144. package/dist/route/date-range.js +39 -0
  145. package/dist/route/date-range.js.map +1 -0
  146. package/dist/route/intent.d.ts +7 -3
  147. package/dist/route/intent.d.ts.map +1 -1
  148. package/dist/route/match.d.ts +1 -0
  149. package/dist/route/match.d.ts.map +1 -1
  150. package/dist/route/match.js +1 -1
  151. package/dist/route/match.js.map +1 -1
  152. package/dist/route/render/build-resolved-entries.d.ts.map +1 -1
  153. package/dist/route/render/build-resolved-entries.js +6 -1
  154. package/dist/route/render/build-resolved-entries.js.map +1 -1
  155. package/dist/route/render/render-template.d.ts.map +1 -1
  156. package/dist/route/render/render-template.js +23 -14
  157. package/dist/route/render/render-template.js.map +1 -1
  158. package/dist/route/render/resolved-entry.d.ts +36 -0
  159. package/dist/route/render/resolved-entry.d.ts.map +1 -1
  160. package/dist/route/render/template-builders.d.ts +66 -2
  161. package/dist/route/render/template-builders.d.ts.map +1 -1
  162. package/dist/route/render/template-builders.js +83 -4
  163. package/dist/route/render/template-builders.js.map +1 -1
  164. package/dist/route/render/template-hierarchy.d.ts +17 -1
  165. package/dist/route/render/template-hierarchy.d.ts.map +1 -1
  166. package/dist/route/render/template-hierarchy.js +23 -0
  167. package/dist/route/render/template-hierarchy.js.map +1 -1
  168. package/dist/route/resolve.d.ts +3 -1
  169. package/dist/route/resolve.d.ts.map +1 -1
  170. package/dist/route/resolve.js +152 -5
  171. package/dist/route/resolve.js.map +1 -1
  172. package/dist/rpc/authenticated.d.ts.map +1 -1
  173. package/dist/rpc/authenticated.js +2 -1
  174. package/dist/rpc/authenticated.js.map +1 -1
  175. package/dist/rpc/build-handler.d.ts.map +1 -1
  176. package/dist/rpc/build-handler.js +12 -0
  177. package/dist/rpc/build-handler.js.map +1 -1
  178. package/dist/rpc/procedures/auth/session.d.ts.map +1 -1
  179. package/dist/rpc/procedures/auth/session.js +2 -1
  180. package/dist/rpc/procedures/auth/session.js.map +1 -1
  181. package/dist/rpc/procedures/entry/create.d.ts +2 -2
  182. package/dist/rpc/procedures/entry/delete-permanent.d.ts +2 -2
  183. package/dist/rpc/procedures/entry/duplicate.d.ts +2 -2
  184. package/dist/rpc/procedures/entry/get.d.ts +2 -2
  185. package/dist/rpc/procedures/entry/helpers.d.ts +21 -0
  186. package/dist/rpc/procedures/entry/helpers.d.ts.map +1 -1
  187. package/dist/rpc/procedures/entry/helpers.js +44 -0
  188. package/dist/rpc/procedures/entry/helpers.js.map +1 -1
  189. package/dist/rpc/procedures/entry/index.d.ts +23 -22
  190. package/dist/rpc/procedures/entry/index.d.ts.map +1 -1
  191. package/dist/rpc/procedures/entry/list.d.ts +2 -2
  192. package/dist/rpc/procedures/entry/publish.d.ts +2 -2
  193. package/dist/rpc/procedures/entry/restore.d.ts +2 -2
  194. package/dist/rpc/procedures/entry/revisions.d.ts +8 -8
  195. package/dist/rpc/procedures/entry/schemas.d.ts +2 -0
  196. package/dist/rpc/procedures/entry/schemas.d.ts.map +1 -1
  197. package/dist/rpc/procedures/entry/schemas.js +7 -0
  198. package/dist/rpc/procedures/entry/schemas.js.map +1 -1
  199. package/dist/rpc/procedures/entry/trash.d.ts +2 -2
  200. package/dist/rpc/procedures/entry/update.d.ts +3 -2
  201. package/dist/rpc/procedures/entry/update.d.ts.map +1 -1
  202. package/dist/rpc/procedures/entry/update.js +10 -5
  203. package/dist/rpc/procedures/entry/update.js.map +1 -1
  204. package/dist/rpc/procedures/term/create.d.ts +2 -2
  205. package/dist/rpc/procedures/term/delete.d.ts +2 -2
  206. package/dist/rpc/procedures/term/get.d.ts +2 -2
  207. package/dist/rpc/procedures/term/index.d.ts +10 -10
  208. package/dist/rpc/procedures/term/list.d.ts +2 -2
  209. package/dist/rpc/procedures/term/update.d.ts +2 -2
  210. package/dist/rpc/procedures/user/delete.d.ts +2 -0
  211. package/dist/rpc/procedures/user/delete.d.ts.map +1 -1
  212. package/dist/rpc/procedures/user/disable.d.ts +2 -0
  213. package/dist/rpc/procedures/user/disable.d.ts.map +1 -1
  214. package/dist/rpc/procedures/user/enable.d.ts +2 -0
  215. package/dist/rpc/procedures/user/enable.d.ts.map +1 -1
  216. package/dist/rpc/procedures/user/get.d.ts +2 -0
  217. package/dist/rpc/procedures/user/get.d.ts.map +1 -1
  218. package/dist/rpc/procedures/user/index.d.ts +13 -0
  219. package/dist/rpc/procedures/user/index.d.ts.map +1 -1
  220. package/dist/rpc/procedures/user/invite.d.ts.map +1 -1
  221. package/dist/rpc/procedures/user/invite.js +28 -15
  222. package/dist/rpc/procedures/user/invite.js.map +1 -1
  223. package/dist/rpc/procedures/user/list.d.ts +2 -0
  224. package/dist/rpc/procedures/user/list.d.ts.map +1 -1
  225. package/dist/rpc/procedures/user/list.js +1 -0
  226. package/dist/rpc/procedures/user/list.js.map +1 -1
  227. package/dist/rpc/procedures/user/schemas.d.ts +1 -0
  228. package/dist/rpc/procedures/user/schemas.d.ts.map +1 -1
  229. package/dist/rpc/procedures/user/schemas.js +5 -0
  230. package/dist/rpc/procedures/user/schemas.js.map +1 -1
  231. package/dist/rpc/procedures/user/update.d.ts +3 -0
  232. package/dist/rpc/procedures/user/update.d.ts.map +1 -1
  233. package/dist/rpc/procedures/user/update.js +10 -1
  234. package/dist/rpc/procedures/user/update.js.map +1 -1
  235. package/dist/rpc/router.d.ts +46 -32
  236. package/dist/rpc/router.d.ts.map +1 -1
  237. package/dist/rpc/schemas.js +6 -6
  238. package/dist/rpc/schemas.js.map +1 -1
  239. package/dist/rpc/validation.d.ts +10 -0
  240. package/dist/rpc/validation.d.ts.map +1 -1
  241. package/dist/rpc/validation.js +10 -0
  242. package/dist/rpc/validation.js.map +1 -1
  243. package/dist/runtime/dispatcher.d.ts.map +1 -1
  244. package/dist/runtime/dispatcher.js +105 -14
  245. package/dist/runtime/dispatcher.js.map +1 -1
  246. package/dist/runtime/load-user-for-public-request.d.ts.map +1 -1
  247. package/dist/runtime/load-user-for-public-request.js +2 -2
  248. package/dist/runtime/load-user-for-public-request.js.map +1 -1
  249. package/dist/runtime/scheduled.d.ts +3 -1
  250. package/dist/runtime/scheduled.d.ts.map +1 -1
  251. package/dist/runtime/scheduled.js +16 -2
  252. package/dist/runtime/scheduled.js.map +1 -1
  253. package/dist/runtime/telemetry-delivery.d.ts +14 -0
  254. package/dist/runtime/telemetry-delivery.d.ts.map +1 -0
  255. package/dist/runtime/telemetry-delivery.js +39 -0
  256. package/dist/runtime/telemetry-delivery.js.map +1 -0
  257. package/dist/seo/feed.d.ts +19 -4
  258. package/dist/seo/feed.d.ts.map +1 -1
  259. package/dist/seo/feed.js +49 -12
  260. package/dist/seo/feed.js.map +1 -1
  261. package/dist/seo/head-defaults.d.ts.map +1 -1
  262. package/dist/seo/head-defaults.js +6 -3
  263. package/dist/seo/head-defaults.js.map +1 -1
  264. package/dist/template-registry.d.ts +31 -1
  265. package/dist/template-registry.d.ts.map +1 -1
  266. package/dist/test/default-theme.d.ts.map +1 -1
  267. package/dist/test/default-theme.js +3 -0
  268. package/dist/test/default-theme.js.map +1 -1
  269. package/dist/test/dispatcher.d.ts +13 -0
  270. package/dist/test/dispatcher.d.ts.map +1 -1
  271. package/dist/test/dispatcher.js +9 -3
  272. package/dist/test/dispatcher.js.map +1 -1
  273. package/dist/test/factories.d.ts +39 -21
  274. package/dist/test/factories.d.ts.map +1 -1
  275. package/dist/test/factories.js +1 -0
  276. package/dist/test/factories.js.map +1 -1
  277. package/dist/test/harness.d.ts.map +1 -1
  278. package/dist/test/harness.js +4 -12
  279. package/dist/test/harness.js.map +1 -1
  280. package/dist/theme.d.ts +15 -7
  281. package/dist/theme.d.ts.map +1 -1
  282. package/dist/theme.js +9 -0
  283. package/dist/theme.js.map +1 -1
  284. package/dist/users/slug.d.ts +12 -0
  285. package/dist/users/slug.d.ts.map +1 -0
  286. package/dist/users/slug.js +32 -0
  287. package/dist/users/slug.js.map +1 -0
  288. package/package.json +2 -2
  289. package/dist/context/debug.d.ts +0 -25
  290. package/dist/context/debug.d.ts.map +0 -1
  291. package/dist/context/debug.js +0 -13
  292. package/dist/context/debug.js.map +0 -1
  293. package/dist/debug-bar/collector.d.ts +0 -9
  294. package/dist/debug-bar/collector.d.ts.map +0 -1
  295. package/dist/debug-bar/collector.js +0 -80
  296. package/dist/debug-bar/collector.js.map +0 -1
  297. package/dist/debug-bar/db-query.d.ts +0 -21
  298. package/dist/debug-bar/db-query.d.ts.map +0 -1
  299. package/dist/debug-bar/db-query.js +0 -23
  300. package/dist/debug-bar/db-query.js.map +0 -1
  301. package/dist/debug-bar/trace-libsql.d.ts +0 -18
  302. package/dist/debug-bar/trace-libsql.d.ts.map +0 -1
  303. package/dist/debug-bar/trace-libsql.js +0 -42
  304. package/dist/debug-bar/trace-libsql.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/context/app.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/context/app.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { TelemetryCollector } from "./telemetry.js";
2
+ /**
3
+ * The real telemetry collector. Accumulates per-namespace entries and a span
4
+ * tree for the request. Always present in production bundles; created only
5
+ * when at least one registered consumer votes to sample the request, so a
6
+ * site with no consumers stays on the no-op and pays nothing.
7
+ */
8
+ export declare function createTelemetryCollector(): TelemetryCollector;
9
+ //# sourceMappingURL=collector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collector.d.ts","sourceRoot":"","sources":["../../src/context/collector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAInB,MAAM,gBAAgB,CAAC;AA0BxB;;;;;GAKG;AACH,wBAAgB,wBAAwB,IAAI,kBAAkB,CAuG7D"}
@@ -0,0 +1,130 @@
1
+ import { traceStore } from "./stores.js";
2
+ import { NOOP_HANDLE } from "./telemetry.js";
3
+ function isThenable(value) {
4
+ return (value != null && typeof value.then === "function");
5
+ }
6
+ // `String(x)` itself throws for e.g. `Object.create(null)`; the serializer
7
+ // must never replace the original failure with its own.
8
+ function describeThrown(error) {
9
+ try {
10
+ return { name: "Error", message: String(error) };
11
+ }
12
+ catch {
13
+ return { name: "Error", message: "<unserializable thrown value>" };
14
+ }
15
+ }
16
+ // Hard per-request caps so a pathological path (a runaway loop, an extreme
17
+ // N+1) can't accumulate unbounded memory. Overflow is never silent: it counts
18
+ // into getDropped(). Fixed on purpose — no config knob.
19
+ const MAX_SPANS = 2000;
20
+ const MAX_RECORDS_PER_NAMESPACE = 1000;
21
+ /**
22
+ * The real telemetry collector. Accumulates per-namespace entries and a span
23
+ * tree for the request. Always present in production bundles; created only
24
+ * when at least one registered consumer votes to sample the request, so a
25
+ * site with no consumers stays on the no-op and pays nothing.
26
+ */
27
+ export function createTelemetryCollector() {
28
+ const entries = new Map();
29
+ const roots = [];
30
+ let spanCount = 0;
31
+ let droppedSpans = 0;
32
+ const droppedRecords = {};
33
+ return {
34
+ record(namespace, entry) {
35
+ const bucket = entries.get(namespace);
36
+ if (bucket && bucket.length >= MAX_RECORDS_PER_NAMESPACE) {
37
+ droppedRecords[namespace] = (droppedRecords[namespace] ?? 0) + 1;
38
+ return;
39
+ }
40
+ const record = {
41
+ at: Date.now(),
42
+ data: typeof entry === "function" ? entry() : entry,
43
+ };
44
+ if (bucket)
45
+ bucket.push(record);
46
+ else
47
+ entries.set(namespace, [record]);
48
+ },
49
+ span(name, fn) {
50
+ // Over the cap: the work still runs and returns unchanged, but no span
51
+ // is allocated and lazy attributes are never evaluated.
52
+ if (spanCount >= MAX_SPANS) {
53
+ droppedSpans += 1;
54
+ return fn(NOOP_HANDLE);
55
+ }
56
+ spanCount += 1;
57
+ const startedAt = Date.now();
58
+ const span = {
59
+ name,
60
+ startedAt,
61
+ durationMs: 0,
62
+ status: "ok",
63
+ attributes: {},
64
+ children: [],
65
+ };
66
+ const handle = {
67
+ set(key, value) {
68
+ span.attributes[key] = typeof value === "function" ? value() : value;
69
+ },
70
+ };
71
+ // Attach to the enclosing span (via AsyncLocalStorage) so nesting
72
+ // reflects call structure; top-level spans become roots.
73
+ const parent = traceStore.getStore();
74
+ if (parent)
75
+ parent.children.push(span);
76
+ else
77
+ roots.push(span);
78
+ const stamp = () => {
79
+ span.durationMs = Date.now() - startedAt;
80
+ };
81
+ // Serialized (never the live Error) so a finished span tree stays
82
+ // JSON-safe for any consumer; the failure itself propagates unchanged.
83
+ const fail = (error) => {
84
+ stamp();
85
+ span.status = "error";
86
+ span.error =
87
+ error instanceof Error
88
+ ? { name: error.name, message: error.message, stack: error.stack }
89
+ : describeThrown(error);
90
+ };
91
+ let result;
92
+ try {
93
+ result = traceStore.run(span, () => fn(handle));
94
+ }
95
+ catch (error) {
96
+ fail(error);
97
+ throw error;
98
+ }
99
+ // Await async work before stamping so I/O time is measured, not just the
100
+ // synchronous prelude. Nesting already survives awaits via ALS.
101
+ if (isThenable(result)) {
102
+ return result.then((value) => {
103
+ stamp();
104
+ return value;
105
+ }, (error) => {
106
+ fail(error);
107
+ throw error;
108
+ });
109
+ }
110
+ stamp();
111
+ return result;
112
+ },
113
+ get(namespace) {
114
+ return entries.get(namespace) ?? [];
115
+ },
116
+ getRecords() {
117
+ // Copies, not the live buckets — this is the snapshot read, and a
118
+ // captured snapshot must not grow under post-response recording.
119
+ return Object.fromEntries([...entries].map(([namespace, bucket]) => [namespace, [...bucket]]));
120
+ },
121
+ getSpans() {
122
+ return roots;
123
+ },
124
+ getDropped() {
125
+ // Snapshot, not the live counter map — a captured value must not mutate.
126
+ return { spans: droppedSpans, records: { ...droppedRecords } };
127
+ },
128
+ };
129
+ }
130
+ //# sourceMappingURL=collector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collector.js","sourceRoot":"","sources":["../../src/context/collector.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
1
  export * from "./app.js";
2
2
  export * from "./stores.js";
3
+ export * from "./telemetry.js";
3
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/context/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/context/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC"}
@@ -1,3 +1,4 @@
1
1
  export * from "./app.js";
2
2
  export * from "./stores.js";
3
+ export * from "./telemetry.js";
3
4
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/context/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/context/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC"}
@@ -1,20 +1,13 @@
1
1
  import { AsyncLocalStorage } from "node:async_hooks";
2
2
  import type { AppContext } from "./app.js";
3
+ import type { TelemetrySpan } from "./telemetry.js";
3
4
  export declare const requestStore: AsyncLocalStorage<AppContext>;
4
5
  export interface HookFrame {
5
6
  readonly hook: string;
6
7
  readonly plugin: string | null;
7
8
  }
8
9
  export declare const hookStore: AsyncLocalStorage<HookFrame>;
9
- export interface TraceSpan {
10
- readonly name: string;
11
- readonly startedAt: number;
12
- /** Wall-clock duration; set when the span's work completes. */
13
- durationMs: number;
14
- readonly children: TraceSpan[];
15
- readonly annotations: Record<string, unknown>;
16
- }
17
- export declare const traceStore: AsyncLocalStorage<TraceSpan>;
10
+ export declare const traceStore: AsyncLocalStorage<TelemetrySpan>;
18
11
  export declare const txStore: AsyncLocalStorage<unknown>;
19
12
  export declare function getContext(): AppContext;
20
13
  export declare function tryGetContext(): AppContext | null;
@@ -1 +1 @@
1
- {"version":3,"file":"stores.d.ts","sourceRoot":"","sources":["../../src/context/stores.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAG3C,eAAO,MAAM,YAAY,+BAAsC,CAAC;AAEhE,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,eAAO,MAAM,SAAS,8BAAqC,CAAC;AAE5D,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,+DAA+D;IAC/D,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,CAAC;IAC/B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/C;AAED,eAAO,MAAM,UAAU,8BAAqC,CAAC;AAE7D,eAAO,MAAM,OAAO,4BAAmC,CAAC;AAExD,wBAAgB,UAAU,IAAI,UAAU,CAIvC;AAED,wBAAgB,aAAa,IAAI,UAAU,GAAG,IAAI,CAEjD"}
1
+ {"version":3,"file":"stores.d.ts","sourceRoot":"","sources":["../../src/context/stores.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAGpD,eAAO,MAAM,YAAY,+BAAsC,CAAC;AAEhE,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,eAAO,MAAM,SAAS,8BAAqC,CAAC;AAE5D,eAAO,MAAM,UAAU,kCAAyC,CAAC;AAEjE,eAAO,MAAM,OAAO,4BAAmC,CAAC;AAExD,wBAAgB,UAAU,IAAI,UAAU,CAIvC;AAED,wBAAgB,aAAa,IAAI,UAAU,GAAG,IAAI,CAEjD"}
@@ -1 +1 @@
1
- {"version":3,"file":"stores.js","sourceRoot":"","sources":["../../src/context/stores.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,0EAA0E;AAC1E,gFAAgF;AAChF,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAGrD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,iBAAiB,EAAc,CAAC;AAOhE,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,iBAAiB,EAAa,CAAC;AAW5D,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,iBAAiB,EAAa,CAAC;AAE7D,MAAM,CAAC,MAAM,OAAO,GAAG,IAAI,iBAAiB,EAAW,CAAC;AAExD,MAAM,UAAU,UAAU;IACxB,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,CAAC;IACpC,IAAI,CAAC,GAAG;QAAE,MAAM,YAAY,CAAC,gBAAgB,EAAE,CAAC;IAChD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,YAAY,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC;AACzC,CAAC"}
1
+ {"version":3,"file":"stores.js","sourceRoot":"","sources":["../../src/context/stores.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,0EAA0E;AAC1E,gFAAgF;AAChF,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAIrD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,iBAAiB,EAAc,CAAC;AAOhE,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,iBAAiB,EAAa,CAAC;AAE5D,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,iBAAiB,EAAiB,CAAC;AAEjE,MAAM,CAAC,MAAM,OAAO,GAAG,IAAI,iBAAiB,EAAW,CAAC;AAExD,MAAM,UAAU,UAAU;IACxB,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,CAAC;IACpC,IAAI,CAAC,GAAG;QAAE,MAAM,YAAY,CAAC,gBAAgB,EAAE,CAAC;IAChD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,YAAY,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC;AACzC,CAAC"}
@@ -0,0 +1,148 @@
1
+ import type { AppContext } from "./app.js";
2
+ /** Attribute and record values must be JSON-serializable — enforced by type only. */
3
+ export type JsonValue = string | number | boolean | null | readonly JsonValue[] | {
4
+ readonly [key: string]: JsonValue;
5
+ };
6
+ /**
7
+ * A span's captured failure — the serialized form, never the live Error.
8
+ * @public consumer-facing (imported by exporters, not core)
9
+ */
10
+ export interface TelemetrySpanError {
11
+ readonly name: string;
12
+ readonly message: string;
13
+ readonly stack?: string;
14
+ }
15
+ /**
16
+ * One node in the request's span tree. Minimal and OTel-mappable: an exporter
17
+ * can project name/timing/attributes onto an OTel span ~1:1, minting ids at
18
+ * export time.
19
+ */
20
+ export interface TelemetrySpan {
21
+ readonly name: string;
22
+ readonly startedAt: number;
23
+ /** Wall-clock duration; set when the span's work completes. */
24
+ durationMs: number;
25
+ /** "error" when the span's function threw or rejected; the error is captured
26
+ * before the failure propagates unchanged. */
27
+ status: "ok" | "error";
28
+ error?: TelemetrySpanError;
29
+ readonly attributes: Record<string, JsonValue>;
30
+ readonly children: TelemetrySpan[];
31
+ }
32
+ /**
33
+ * Handed to a span's function for attaching attributes. A lazy (thunk) value is
34
+ * evaluated once by the active collector and never by the no-op — expensive
35
+ * payloads cost nothing when nobody collects.
36
+ */
37
+ export interface TelemetrySpanHandle {
38
+ set(key: string, value: JsonValue | (() => JsonValue)): void;
39
+ }
40
+ /** A recorded durationless fact, stamped so consumers can order it against spans. */
41
+ export interface TelemetryRecord {
42
+ readonly at: number;
43
+ readonly data: unknown;
44
+ }
45
+ /**
46
+ * What the hard per-request caps discarded — visible so a consumer never
47
+ * mistakes a truncated trace for a complete one.
48
+ * @public consumer-facing (imported by exporters, not core)
49
+ */
50
+ export interface TelemetryDropped {
51
+ readonly spans: number;
52
+ readonly records: Readonly<Record<string, number>>;
53
+ }
54
+ /**
55
+ * Request-scoped telemetry collector — the single source of truth for what
56
+ * happened during a request. Core and plugins record spans (anything with a
57
+ * duration) and records (durationless facts) under a namespace; consumers such
58
+ * as the dev debug bar read them back. Two implementations:
59
+ * {@link NOOP_TELEMETRY} (used whenever no consumer sampled the request) and
60
+ * the real accumulating collector, activated by consumer vote.
61
+ */
62
+ export interface TelemetryCollector {
63
+ /**
64
+ * Append an entry under `namespace` (for the debug bar: the panel's id).
65
+ * A function entry is a lazy payload: the active collector evaluates it once
66
+ * at record time; the no-op never does.
67
+ */
68
+ record(namespace: string, entry: unknown): void;
69
+ /** Time `fn`, record a span, and return `fn`'s result unchanged. */
70
+ span<T>(name: string, fn: (s: TelemetrySpanHandle) => T): T;
71
+ /** Timestamped entries recorded under `namespace`, in record order. */
72
+ get(namespace: string): readonly TelemetryRecord[];
73
+ /** Every namespace's entries, keyed by namespace — the snapshot read. */
74
+ getRecords(): Readonly<Record<string, readonly TelemetryRecord[]>>;
75
+ /** The collected span tree (the Timeline panel consumes this). */
76
+ getSpans(): readonly TelemetrySpan[];
77
+ /** Counts of entries discarded by the per-request caps. */
78
+ getDropped(): TelemetryDropped;
79
+ }
80
+ /**
81
+ * The finished request's identity and outcome, as a consumer sees it.
82
+ * `requestId` is `ctx.requestId`, minted at context creation — mid-request
83
+ * reads (logs, error hooks) correlate with the snapshot on the same value.
84
+ * `startedAt`/`durationMs` span the dispatch of the request — context
85
+ * creation and the sampling vote happen just before the clock starts.
86
+ * @public consumer-facing (imported by exporters, not core)
87
+ */
88
+ export interface TelemetryRequestEnvelope {
89
+ readonly requestId: string;
90
+ readonly method: string;
91
+ readonly url: string;
92
+ readonly status: number;
93
+ readonly startedAt: number;
94
+ readonly durationMs: number;
95
+ }
96
+ /**
97
+ * The finished, JSON-serializable view of a collected request: envelope, root
98
+ * spans, timestamped records by namespace, and what the caps discarded.
99
+ * Serializability is enforced by type only — no runtime validation. The
100
+ * envelope `url` is the full request URL, query string included — an
101
+ * exporter shipping snapshots off-box owns scrubbing query-borne secrets.
102
+ * @public consumer-facing (imported by exporters, not core)
103
+ */
104
+ export interface TelemetrySnapshot {
105
+ readonly request: TelemetryRequestEnvelope;
106
+ readonly spans: readonly TelemetrySpan[];
107
+ readonly records: Readonly<Record<string, readonly TelemetryRecord[]>>;
108
+ readonly dropped: TelemetryDropped;
109
+ }
110
+ /**
111
+ * A telemetry export destination, registered once in app config
112
+ * (`telemetry.consumers`). A request collects iff at least one registered
113
+ * consumer votes yes; with no consumers the collector stays the no-op and
114
+ * production pays nothing.
115
+ */
116
+ export interface TelemetryConsumer {
117
+ readonly id: string;
118
+ /**
119
+ * Head-sampling vote, called once at context creation (before any
120
+ * collection — `ctx.telemetry` is not yet active). Omitted = always yes.
121
+ * Runs pre-auth: on public requests `ctx.user` is null even when a
122
+ * session cookie is present. A throwing vote fails the request — decide
123
+ * from cheap request-shaped facts and don't throw.
124
+ */
125
+ readonly sample?: (ctx: AppContext) => boolean;
126
+ /**
127
+ * Receives the finished snapshot after the response (via `waitUntil` on
128
+ * Workers), so export latency never adds to response time. Errors live in
129
+ * the span tree — there is no separate error callback; an error-hook
130
+ * consumer may read the live `ctx.telemetry` mid-request instead.
131
+ */
132
+ readonly onRequestEnd?: (snapshot: TelemetrySnapshot, ctx: AppContext) => void | Promise<void>;
133
+ }
134
+ /** The `telemetry` app-config slot. */
135
+ export interface TelemetryConfig {
136
+ readonly consumers?: readonly TelemetryConsumer[];
137
+ }
138
+ /** Shared no-op span handle: attributes (lazy or not) are never evaluated. */
139
+ export declare const NOOP_HANDLE: TelemetrySpanHandle;
140
+ /**
141
+ * The permanent no-op collector. Lives in core proper so plugin `ctx.telemetry`
142
+ * call sites stay safe everywhere: `record` drops the entry, `span` calls
143
+ * through and returns the result, reads are empty. The real collector is
144
+ * swapped in only when at least one registered consumer votes to sample the
145
+ * request — a site with no consumers pays nothing, in dev or prod.
146
+ */
147
+ export declare const NOOP_TELEMETRY: TelemetryCollector;
148
+ //# sourceMappingURL=telemetry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../../src/context/telemetry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /** Shared no-op span handle: attributes (lazy or not) are never evaluated. */
2
+ export const NOOP_HANDLE = {
3
+ set: () => undefined,
4
+ };
5
+ /**
6
+ * The permanent no-op collector. Lives in core proper so plugin `ctx.telemetry`
7
+ * call sites stay safe everywhere: `record` drops the entry, `span` calls
8
+ * through and returns the result, reads are empty. The real collector is
9
+ * swapped in only when at least one registered consumer votes to sample the
10
+ * request — a site with no consumers pays nothing, in dev or prod.
11
+ */
12
+ export const NOOP_TELEMETRY = {
13
+ record: () => undefined,
14
+ span: (_name, fn) => fn(NOOP_HANDLE),
15
+ get: () => [],
16
+ getRecords: () => ({}),
17
+ getSpans: () => [],
18
+ getDropped: () => ({ spans: 0, records: {} }),
19
+ };
20
+ //# sourceMappingURL=telemetry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../src/context/telemetry.ts"],"names":[],"mappings":"AA4JA,8EAA8E;AAC9E,MAAM,CAAC,MAAM,WAAW,GAAwB;IAC9C,GAAG,EAAE,GAAG,EAAE,CAAC,SAAS;CACrB,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,cAAc,GAAuB;IAChD,MAAM,EAAE,GAAG,EAAE,CAAC,SAAS;IACvB,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC;IACpC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE;IACb,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC;IACtB,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE;IAClB,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;CAC9C,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { TelemetryCollector } from "./telemetry.js";
2
+ /**
3
+ * Traced outbound HTTP — the `ctx.fetch` implementation. Same call surface as
4
+ * global `fetch`; every call runs inside a telemetry span carrying method, URL,
5
+ * and response status (OTel-mappable attribute keys), with the span's own
6
+ * duration and error capture covering timing and failure. The collector is read
7
+ * per call so activation at context creation is always observed.
8
+ *
9
+ * W3C trace-context propagation (`traceparent` injection) is deliberately not
10
+ * here — trace ids don't exist during the request. The future OTel exporter
11
+ * will need a request-mutation seam at this choke point.
12
+ */
13
+ export declare function createTracedFetch(getTelemetry: () => TelemetryCollector): typeof globalThis.fetch;
14
+ //# sourceMappingURL=traced-fetch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traced-fetch.d.ts","sourceRoot":"","sources":["../../src/context/traced-fetch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AASzD;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAC/B,YAAY,EAAE,MAAM,kBAAkB,GACrC,OAAO,UAAU,CAAC,KAAK,CAgBzB"}
@@ -0,0 +1,33 @@
1
+ // The span label carries the host (not the full URL) so a timeline groups
2
+ // calls per upstream; the full URL lives in the `url.full` attribute.
3
+ function spanName(method, url) {
4
+ const host = URL.parse(url)?.host;
5
+ return host ? `fetch: ${method} ${host}` : `fetch: ${method}`;
6
+ }
7
+ /**
8
+ * Traced outbound HTTP — the `ctx.fetch` implementation. Same call surface as
9
+ * global `fetch`; every call runs inside a telemetry span carrying method, URL,
10
+ * and response status (OTel-mappable attribute keys), with the span's own
11
+ * duration and error capture covering timing and failure. The collector is read
12
+ * per call so activation at context creation is always observed.
13
+ *
14
+ * W3C trace-context propagation (`traceparent` injection) is deliberately not
15
+ * here — trace ids don't exist during the request. The future OTel exporter
16
+ * will need a request-mutation seam at this choke point.
17
+ */
18
+ export function createTracedFetch(getTelemetry) {
19
+ return (input, init) => {
20
+ // `init.method` wins over a Request input's method — the same precedence
21
+ // `new Request(input, init)` applies inside fetch itself.
22
+ const method = (init?.method ?? (input instanceof Request ? input.method : "GET")).toUpperCase();
23
+ const url = input instanceof Request ? input.url : String(input);
24
+ return getTelemetry().span(spanName(method, url), async (s) => {
25
+ s.set("http.request.method", method);
26
+ s.set("url.full", url);
27
+ const response = await globalThis.fetch(input, init);
28
+ s.set("http.response.status_code", response.status);
29
+ return response;
30
+ });
31
+ };
32
+ }
33
+ //# sourceMappingURL=traced-fetch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traced-fetch.js","sourceRoot":"","sources":["../../src/context/traced-fetch.ts"],"names":[],"mappings":"AAEA,0EAA0E;AAC1E,sEAAsE;AACtE,SAAS,QAAQ,CAAC,MAAc,EAAE,GAAW;IAC3C,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC;IAClC,OAAO,IAAI,CAAC,CAAC,CAAC,UAAU,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,UAAU,MAAM,EAAE,CAAC;AAChE,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,iBAAiB,CAC/B,YAAsC;IAEtC,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,yEAAyE;QACzE,0DAA0D;QAC1D,MAAM,MAAM,GAAG,CACb,IAAI,EAAE,MAAM,IAAI,CAAC,KAAK,YAAY,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAClE,CAAC,WAAW,EAAE,CAAC;QAChB,MAAM,GAAG,GAAG,KAAK,YAAY,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACjE,OAAO,YAAY,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;YAC5D,CAAC,CAAC,GAAG,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;YACrC,CAAC,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;YACvB,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YACrD,CAAC,CAAC,GAAG,CAAC,2BAA2B,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;YACpD,OAAO,QAAQ,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC"}
@@ -1,2 +1,10 @@
1
1
  export declare function isUniqueConstraintError(error: unknown): boolean;
2
+ /**
3
+ * True when the unique violation is on a specific `table.column` constraint —
4
+ * e.g. `isUniqueConstraintErrorOn(err, "users.slug")` to tell a slug collision
5
+ * apart from an email one. Column identity only rides on SQLite's message
6
+ * (`UNIQUE constraint failed: users.slug`), so this is message-only, unlike the
7
+ * code-first `isUniqueConstraintError`; every driver surfaces that phrase.
8
+ */
9
+ export declare function isUniqueConstraintErrorOn(error: unknown, qualifiedColumn: string): boolean;
2
10
  //# sourceMappingURL=errors.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/db/errors.ts"],"names":[],"mappings":"AA+DA,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAU/D"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/db/errors.ts"],"names":[],"mappings":"AA+DA,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAU/D;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,OAAO,EACd,eAAe,EAAE,MAAM,GACtB,OAAO,CAYT"}
package/dist/db/errors.js CHANGED
@@ -66,4 +66,26 @@ export function isUniqueConstraintError(error) {
66
66
  }
67
67
  return false;
68
68
  }
69
+ /**
70
+ * True when the unique violation is on a specific `table.column` constraint —
71
+ * e.g. `isUniqueConstraintErrorOn(err, "users.slug")` to tell a slug collision
72
+ * apart from an email one. Column identity only rides on SQLite's message
73
+ * (`UNIQUE constraint failed: users.slug`), so this is message-only, unlike the
74
+ * code-first `isUniqueConstraintError`; every driver surfaces that phrase.
75
+ */
76
+ export function isUniqueConstraintErrorOn(error, qualifiedColumn) {
77
+ const needle = `UNIQUE constraint failed: ${qualifiedColumn}`;
78
+ const seen = new Set();
79
+ let current = error;
80
+ for (let depth = 0; depth < MAX_CAUSE_DEPTH && current; depth++) {
81
+ if (seen.has(current))
82
+ return false; // cycle guard
83
+ seen.add(current);
84
+ const message = current.message;
85
+ if (typeof message === "string" && message.includes(needle))
86
+ return true;
87
+ current = current.cause;
88
+ }
89
+ return false;
90
+ }
69
91
  //# sourceMappingURL=errors.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/db/errors.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,qEAAqE;AACrE,0EAA0E;AAC1E,4EAA4E;AAC5E,uEAAuE;AACvE,wEAAwE;AACxE,kCAAkC;AAElC,uEAAuE;AACvE,0EAA0E;AAC1E,6CAA6C;AAC7C,MAAM,uBAAuB,GAAG,IAAI,GAAG,CAAC;IACtC,0BAA0B;IAC1B,8BAA8B;CAC/B,CAAC,CAAC;AACH,MAAM,uBAAuB,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AAEtD,8EAA8E;AAC9E,4EAA4E;AAC5E,+DAA+D;AAC/D,MAAM,eAAe,GAAG,CAAC,CAAC;AAE1B,sEAAsE;AACtE,yEAAyE;AACzE,wEAAwE;AACxE,kEAAkE;AAClE,MAAM,kBAAkB,GAAG,CAAC,MAAM,EAAE,cAAc,CAAU,CAAC;AAC7D,MAAM,kBAAkB,GAAG,CAAC,OAAO,EAAE,SAAS,EAAE,YAAY,CAAU,CAAC;AAEvE,SAAS,aAAa,CAAC,KAAc;IACnC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACtD,MAAM,GAAG,GAAG,KAAgC,CAAC;IAE7C,KAAK,MAAM,KAAK,IAAI,kBAAkB,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;QACzB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,uBAAuB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YACpE,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,kBAAkB,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;QACzB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,uBAAuB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YACpE,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,2EAA2E;IAC3E,mEAAmE;IACnE,2EAA2E;IAC3E,EAAE;IACF,qEAAqE;IACrE,qEAAqE;IACrE,iEAAiE;IACjE,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;IAC5B,IACE,OAAO,OAAO,KAAK,QAAQ;QAC3B,OAAO,CAAC,QAAQ,CAAC,2BAA2B,CAAC,EAC7C,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAAc;IACpD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAW,CAAC;IAChC,IAAI,OAAO,GAAY,KAAK,CAAC;IAC7B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,eAAe,IAAI,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC;QAChE,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;YAAE,OAAO,KAAK,CAAC,CAAC,cAAc;QACnD,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAClB,IAAI,aAAa,CAAC,OAAO,CAAC;YAAE,OAAO,IAAI,CAAC;QACxC,OAAO,GAAI,OAA+B,CAAC,KAAK,CAAC;IACnD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/db/errors.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
1
  export * from "drizzle-orm/sql";
2
2
  export type { InferInsertModel, InferSelectModel } from "drizzle-orm";
3
- export { isUniqueConstraintError } from "./errors.js";
3
+ export { isUniqueConstraintError, isUniqueConstraintErrorOn, } from "./errors.js";
4
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,EACL,uBAAuB,EACvB,yBAAyB,GAC1B,MAAM,aAAa,CAAC"}
package/dist/db/index.js CHANGED
@@ -1,3 +1,3 @@
1
1
  export * from "drizzle-orm/sql";
2
- export { isUniqueConstraintError } from "./errors.js";
2
+ export { isUniqueConstraintError, isUniqueConstraintErrorOn, } from "./errors.js";
3
3
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAEhC,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAEhC,OAAO,EACL,uBAAuB,EACvB,yBAAyB,GAC1B,MAAM,aAAa,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"libsql.d.ts","sourceRoot":"","sources":["../../src/db/libsql.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAK3D,MAAM,WAAW,YAAY;IAC3B;;;OAGG;IACH,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;;GAIG;AACH,MAAM,MAAM,iBAAiB,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC;AAEvD,MAAM,WAAW,qBAAsB,SAAQ,eAAe;IAC5D,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;CACpC;AAED;;;;;;;;GAQG;AACH,wBAAgB,MAAM,CAAC,MAAM,EAAE,iBAAiB,GAAG,qBAAqB,CA4BvE"}
1
+ {"version":3,"file":"libsql.d.ts","sourceRoot":"","sources":["../../src/db/libsql.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAI3D,MAAM,WAAW,YAAY;IAC3B;;;OAGG;IACH,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;;GAIG;AACH,MAAM,MAAM,iBAAiB,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC;AAEvD,MAAM,WAAW,qBAAsB,SAAQ,eAAe;IAC5D,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;CACpC;AAED;;;;;;;;GAQG;AACH,wBAAgB,MAAM,CAAC,MAAM,EAAE,iBAAiB,GAAG,qBAAqB,CAyBvE"}
package/dist/db/libsql.js CHANGED
@@ -1,8 +1,7 @@
1
1
  import { createClient } from "@libsql/client";
2
2
  import { drizzle } from "drizzle-orm/libsql";
3
- import { createDebugSqlLogger } from "../debug-bar/db-query.js";
4
- import { traceSqlClient } from "../debug-bar/trace-libsql.js";
5
3
  import { resolveEnvInput } from "../runtime/env-input.js";
4
+ import { traceSqlClient } from "./trace-libsql.js";
6
5
  /**
7
6
  * Database adapter for any libSQL-compatible SQLite endpoint. Lives behind
8
7
  * the `@plumix/core/db/libsql` subpath so the driver only loads when this
@@ -23,20 +22,15 @@ export function libsql(config) {
23
22
  connect: (env, _request, schema) => {
24
23
  if (!client) {
25
24
  const resolved = resolveEnvInput(config, env);
26
- const raw = createClient({
25
+ // Unconditional: spans are no-ops unless a telemetry consumer
26
+ // sampled the request, so production without consumers pays nothing.
27
+ client = traceSqlClient(createClient({
27
28
  url: resolved.url,
28
29
  authToken: resolved.authToken,
29
- });
30
- // Dev-only: time each query as a span for the Timeline panel.
31
- client = process.env.PLUMIX_DEV ? traceSqlClient(raw) : raw;
30
+ }));
32
31
  }
33
32
  return {
34
- db: drizzle(client, {
35
- schema,
36
- casing: "snake_case",
37
- // Dev-only: feed the debug bar's Database panel. Tree-shaken in prod.
38
- logger: process.env.PLUMIX_DEV ? createDebugSqlLogger() : undefined,
39
- }),
33
+ db: drizzle(client, { schema, casing: "snake_case" }),
40
34
  };
41
35
  },
42
36
  };
@@ -1 +1 @@
1
- {"version":3,"file":"libsql.js","sourceRoot":"","sources":["../../src/db/libsql.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAK7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAsB1D;;;;;;;;GAQG;AACH,MAAM,UAAU,MAAM,CAAC,MAAyB;IAC9C,2EAA2E;IAC3E,qEAAqE;IACrE,0EAA0E;IAC1E,IAAI,MAAmD,CAAC;IACxD,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,MAAM;QACN,OAAO,EAAE,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE;YACjC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,EAAE,GAAgB,CAAC,CAAC;gBAC3D,MAAM,GAAG,GAAG,YAAY,CAAC;oBACvB,GAAG,EAAE,QAAQ,CAAC,GAAG;oBACjB,SAAS,EAAE,QAAQ,CAAC,SAAS;iBAC9B,CAAC,CAAC;gBACH,8DAA8D;gBAC9D,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;YAC9D,CAAC;YACD,OAAO;gBACL,EAAE,EAAE,OAAO,CAAC,MAAM,EAAE;oBAClB,MAAM;oBACN,MAAM,EAAE,YAAY;oBACpB,sEAAsE;oBACtE,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,oBAAoB,EAAE,CAAC,CAAC,CAAC,SAAS;iBACpE,CAAC;aACH,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"libsql.js","sourceRoot":"","sources":["../../src/db/libsql.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAK7C,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAsBnD;;;;;;;;GAQG;AACH,MAAM,UAAU,MAAM,CAAC,MAAyB;IAC9C,2EAA2E;IAC3E,qEAAqE;IACrE,0EAA0E;IAC1E,IAAI,MAAmD,CAAC;IACxD,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,MAAM;QACN,OAAO,EAAE,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE;YACjC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,EAAE,GAAgB,CAAC,CAAC;gBAC3D,8DAA8D;gBAC9D,qEAAqE;gBACrE,MAAM,GAAG,cAAc,CACrB,YAAY,CAAC;oBACX,GAAG,EAAE,QAAQ,CAAC,GAAG;oBACjB,SAAS,EAAE,QAAQ,CAAC,SAAS;iBAC9B,CAAC,CACH,CAAC;YACJ,CAAC;YACD,OAAO;gBACL,EAAE,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;aACtD,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ export type QueryKind = "select" | "insert" | "update" | "delete" | "other";
2
+ /**
3
+ * The leading statement kind. Names every query span (`db: select`) and colors
4
+ * the Database panel's per-query badge — shared by prod tracing and the dev
5
+ * bar, hence its home here rather than in the debug-bar UI.
6
+ */
7
+ export declare function queryKind(sql: string): QueryKind;
8
+ //# sourceMappingURL=query-kind.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-kind.d.ts","sourceRoot":"","sources":["../../src/db/query-kind.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;AAI5E;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAGhD"}