@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,4 +1,4 @@
1
- import type { Db } from "../context/app.js";
1
+ import type { AppContext, Db } from "../context/app.js";
2
2
  import type { User } from "../db/schema/users.js";
3
3
  /**
4
4
  * Resolved auth on a request — the user plus any guard-specific
@@ -87,6 +87,13 @@ export interface RequestAuthenticator {
87
87
  * caps. PAT-style scoping doesn't apply here.
88
88
  */
89
89
  export declare function sessionAuthenticator(): RequestAuthenticator;
90
+ /**
91
+ * Run an authenticator inside an `auth` telemetry span, so session/token
92
+ * resolution shows up in the request's span tree with its outcome. The
93
+ * single traced entry point for every auth choke point — public render,
94
+ * admin shell, RPC middleware, and the bearer surfaces (MCP, REST).
95
+ */
96
+ export declare function authenticateTraced(ctx: AppContext, authenticator: RequestAuthenticator): Promise<AuthResult | null>;
90
97
  /**
91
98
  * Whether a request carries a session this authenticator would resolve on a
92
99
  * public render. Defaults to "the standard `plumix_session` cookie is present"
@@ -1 +1 @@
1
- {"version":3,"file":"authenticator.d.ts","sourceRoot":"","sources":["../../src/auth/authenticator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAKlD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;CACjD;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,WAAW,oBAAoB;IACnC,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACnE;;;;;;;;;;;OAWG;IACH,UAAU,CAAC,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC;IACvC;;;;;;;;;;;;;;;;;OAiBG;IACH,UAAU,CAAC,IAAI,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,IAAI,oBAAoB,CAa3D;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,aAAa,EAAE,oBAAoB,EACnC,OAAO,EAAE,OAAO,GACf,OAAO,CAIT;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,IAAI,oBAAoB,CAuB5D;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,cAAc,EAAE,SAAS,oBAAoB,EAAE,GACjD,oBAAoB,CAoBtB;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,IAAI,oBAAoB,CAE3D"}
1
+ {"version":3,"file":"authenticator.d.ts","sourceRoot":"","sources":["../../src/auth/authenticator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAKlD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;CACjD;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,WAAW,oBAAoB;IACnC,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACnE;;;;;;;;;;;OAWG;IACH,UAAU,CAAC,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC;IACvC;;;;;;;;;;;;;;;;;OAiBG;IACH,UAAU,CAAC,IAAI,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,IAAI,oBAAoB,CAa3D;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,UAAU,EACf,aAAa,EAAE,oBAAoB,GAClC,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAO5B;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,aAAa,EAAE,oBAAoB,EACnC,OAAO,EAAE,OAAO,GACf,OAAO,CAIT;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,IAAI,oBAAoB,CAuB5D;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,cAAc,EAAE,SAAS,oBAAoB,EAAE,GACjD,oBAAoB,CAoBtB;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,IAAI,oBAAoB,CAE3D"}
@@ -25,6 +25,21 @@ export function sessionAuthenticator() {
25
25
  },
26
26
  };
27
27
  }
28
+ /**
29
+ * Run an authenticator inside an `auth` telemetry span, so session/token
30
+ * resolution shows up in the request's span tree with its outcome. The
31
+ * single traced entry point for every auth choke point — public render,
32
+ * admin shell, RPC middleware, and the bearer surfaces (MCP, REST).
33
+ */
34
+ export function authenticateTraced(ctx, authenticator) {
35
+ return ctx.telemetry.span("auth", async (s) => {
36
+ const result = await authenticator.authenticate(ctx.request, ctx.db);
37
+ s.set("auth.authenticated", result !== null);
38
+ if (result)
39
+ s.set("auth.user.id", result.user.id);
40
+ return result;
41
+ });
42
+ }
28
43
  /**
29
44
  * Whether a request carries a session this authenticator would resolve on a
30
45
  * public render. Defaults to "the standard `plumix_session` cookie is present"
@@ -1 +1 @@
1
- {"version":3,"file":"authenticator.js","sourceRoot":"","sources":["../../src/auth/authenticator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"authenticator.js","sourceRoot":"","sources":["../../src/auth/authenticator.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { withUser } from "../context/app.js";
2
- import { apiTokenAuthenticator } from "./authenticator.js";
2
+ import { apiTokenAuthenticator, authenticateTraced } from "./authenticator.js";
3
3
  // Bearer PAT only — shared by the CSRF-exempt external surfaces (MCP, REST).
4
4
  // Deliberately NOT the request's configured authenticator (cookie/custom
5
5
  // guard): cookie auth must never resolve on an endpoint mounted ahead of the
@@ -19,7 +19,7 @@ export function hasBearerToken(request) {
19
19
  * disabled. Callers decide whether a null means 401 or anonymous access.
20
20
  */
21
21
  export async function authenticateBearer(ctx) {
22
- const result = await bearerAuthenticator.authenticate(ctx.request, ctx.db);
22
+ const result = await authenticateTraced(ctx, bearerAuthenticator);
23
23
  if (!result)
24
24
  return null;
25
25
  const { id, email, role, meta } = result.user;
@@ -1 +1 @@
1
- {"version":3,"file":"bearer.js","sourceRoot":"","sources":["../../src/auth/bearer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,6EAA6E;AAC7E,yEAAyE;AACzE,6EAA6E;AAC7E,+DAA+D;AAC/D,MAAM,mBAAmB,GAAG,qBAAqB,EAAE,CAAC;AAEpD,+EAA+E;AAC/E,6EAA6E;AAC7E,gFAAgF;AAChF,8BAA8B;AAC9B,MAAM,MAAM,GAAG,eAAe,CAAC;AAE/B,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC7C,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC;AACjE,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,GAAe;IAEf,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IAC3E,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC;IAC9C,OAAO,QAAQ,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,MAAM,CAAC,WAAW,IAAI,IAAI,CAAC,CAAC;AAC9E,CAAC"}
1
+ {"version":3,"file":"bearer.js","sourceRoot":"","sources":["../../src/auth/bearer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAE/E,6EAA6E;AAC7E,yEAAyE;AACzE,6EAA6E;AAC7E,+DAA+D;AAC/D,MAAM,mBAAmB,GAAG,qBAAqB,EAAE,CAAC;AAEpD,+EAA+E;AAC/E,6EAA6E;AAC7E,gFAAgF;AAChF,8BAA8B;AAC9B,MAAM,MAAM,GAAG,eAAe,CAAC;AAE/B,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC7C,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC;AACjE,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,GAAe;IAEf,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC;IAClE,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC;IAC9C,OAAO,QAAQ,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,MAAM,CAAC,WAAW,IAAI,IAAI,CAAC,CAAC;AAC9E,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/auth/bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAI5D,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;CAChC;AAED,wBAAsB,aAAa,CACjC,EAAE,EAAE,EAAE,EACN,KAAK,EAAE;IACL,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,WAAW,CAAC,EAAE,QAAQ,CAAC;IAChC,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;CAClC,GACA,OAAO,CAAC,gBAAgB,CAAC,CAwB3B"}
1
+ {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/auth/bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAK5D,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;CAChC;AAED,wBAAsB,aAAa,CACjC,EAAE,EAAE,EAAE,EACN,KAAK,EAAE;IACL,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,WAAW,CAAC,EAAE,QAAQ,CAAC;IAChC,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;CAClC,GACA,OAAO,CAAC,gBAAgB,CAAC,CA0C3B"}
@@ -1,27 +1,44 @@
1
- import { sql } from "../db/index.js";
1
+ import { isUniqueConstraintErrorOn, sql } from "../db/index.js";
2
2
  import { users } from "../db/schema/users.js";
3
+ import { deriveUserSlug, MAX_SLUG_ATTEMPTS } from "../users/slug.js";
3
4
  export async function provisionUser(db, input) {
4
5
  const defaultRole = input.defaultRole ?? "subscriber";
5
- // Role is decided inside the INSERT so concurrent first-user provisioning
6
- // can't elect two admins: SQLite serializes writers, and the subquery
7
- // observes previously-inserted rows. Only the statement that runs when
8
- // the table is empty gets `admin`.
9
- const [user] = await db
10
- .insert(users)
11
- .values({
12
- email: input.email,
13
- name: input.name ?? null,
14
- avatarUrl: input.avatarUrl ?? null,
15
- role: sql `CASE WHEN (SELECT COUNT(*) FROM ${users}) = 0 THEN 'admin' ELSE ${defaultRole} END`,
16
- emailVerifiedAt: input.emailVerified ? new Date() : null,
17
- })
18
- .returning();
19
- // eslint-disable-next-line no-restricted-syntax -- defensive driver-regression guard; migrate alongside auth errors in PR 2 (#234)
20
- if (!user)
21
- throw new Error("provisionUser: insert returned no row");
22
- return {
23
- user,
24
- bootstrapped: user.role === "admin" && defaultRole !== "admin",
25
- };
6
+ for (let attempt = 1;; attempt++) {
7
+ const slug = await deriveUserSlug(db, input.name);
8
+ // Role is decided inside the INSERT so concurrent first-user provisioning
9
+ // can't elect two admins: SQLite serializes writers, and the subquery
10
+ // observes previously-inserted rows. Only the statement that runs when
11
+ // the table is empty gets `admin`.
12
+ let user;
13
+ try {
14
+ [user] = await db
15
+ .insert(users)
16
+ .values({
17
+ email: input.email,
18
+ slug,
19
+ name: input.name ?? null,
20
+ avatarUrl: input.avatarUrl ?? null,
21
+ role: sql `CASE WHEN (SELECT COUNT(*) FROM ${users}) = 0 THEN 'admin' ELSE ${defaultRole} END`,
22
+ emailVerifiedAt: input.emailVerified ? new Date() : null,
23
+ })
24
+ .returning();
25
+ }
26
+ catch (error) {
27
+ // Only a slug race is retryable; an email collision is a real conflict
28
+ // the caller must see, so re-throw it (and any other error) as-is.
29
+ if (attempt < MAX_SLUG_ATTEMPTS &&
30
+ isUniqueConstraintErrorOn(error, "users.slug")) {
31
+ continue;
32
+ }
33
+ throw error;
34
+ }
35
+ // eslint-disable-next-line no-restricted-syntax -- defensive driver-regression guard; migrate alongside auth errors in PR 2 (#234)
36
+ if (!user)
37
+ throw new Error("provisionUser: insert returned no row");
38
+ return {
39
+ user,
40
+ bootstrapped: user.role === "admin" && defaultRole !== "admin",
41
+ };
42
+ }
26
43
  }
27
44
  //# sourceMappingURL=bootstrap.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/auth/bootstrap.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAO9C,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,EAAM,EACN,KAMC;IAED,MAAM,WAAW,GAAa,KAAK,CAAC,WAAW,IAAI,YAAY,CAAC;IAEhE,0EAA0E;IAC1E,sEAAsE;IACtE,uEAAuE;IACvE,mCAAmC;IACnC,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,EAAE;SACpB,MAAM,CAAC,KAAK,CAAC;SACb,MAAM,CAAC;QACN,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,IAAI;QACxB,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,IAAI;QAClC,IAAI,EAAE,GAAG,CAAU,mCAAmC,KAAK,2BAA2B,WAAW,MAAM;QACvG,eAAe,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI;KACzD,CAAC;SACD,SAAS,EAAE,CAAC;IAEf,mIAAmI;IACnI,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IACpE,OAAO;QACL,IAAI;QACJ,YAAY,EAAE,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,WAAW,KAAK,OAAO;KAC/D,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/auth/bootstrap.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,yBAAyB,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAOrE,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,EAAM,EACN,KAMC;IAED,MAAM,WAAW,GAAa,KAAK,CAAC,WAAW,IAAI,YAAY,CAAC;IAEhE,KAAK,IAAI,OAAO,GAAG,CAAC,GAAI,OAAO,EAAE,EAAE,CAAC;QAClC,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAElD,0EAA0E;QAC1E,sEAAsE;QACtE,uEAAuE;QACvE,mCAAmC;QACnC,IAAI,IAAsB,CAAC;QAC3B,IAAI,CAAC;YACH,CAAC,IAAI,CAAC,GAAG,MAAM,EAAE;iBACd,MAAM,CAAC,KAAK,CAAC;iBACb,MAAM,CAAC;gBACN,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,IAAI;gBACJ,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,IAAI;gBACxB,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,IAAI;gBAClC,IAAI,EAAE,GAAG,CAAU,mCAAmC,KAAK,2BAA2B,WAAW,MAAM;gBACvG,eAAe,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI;aACzD,CAAC;iBACD,SAAS,EAAE,CAAC;QACjB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,uEAAuE;YACvE,mEAAmE;YACnE,IACE,OAAO,GAAG,iBAAiB;gBAC3B,yBAAyB,CAAC,KAAK,EAAE,YAAY,CAAC,EAC9C,CAAC;gBACD,SAAS;YACX,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;QAED,mIAAmI;QACnI,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;QACpE,OAAO;YACL,IAAI;YACJ,YAAY,EAAE,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,WAAW,KAAK,OAAO;SAC/D,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -18,11 +18,15 @@ interface CacheableRequest {
18
18
  * would outlive the token's authorization window in the edge cache.
19
19
  */
20
20
  export declare function requestIsPrivileged(request: Request): boolean;
21
+ /** Why the edge cache refused to participate in a request. */
22
+ export type CacheBypassReason = "method" | "privileged" | "intent";
21
23
  /**
22
- * Whether the edge cache may participate in this request at all — the gate for
23
- * both reading a stored response and storing a fresh one.
24
+ * The gate for whether the edge cache may participate in this request at all —
25
+ * both reading a stored response and storing a fresh one. Returns `null` when
26
+ * the request is cacheable, otherwise the first failing check — the reason the
27
+ * telemetry `cache` record carries.
24
28
  */
25
- export declare function requestIsCacheable(req: CacheableRequest): boolean;
29
+ export declare function cacheBypassReason(req: CacheableRequest): CacheBypassReason | null;
26
30
  /**
27
31
  * Whether a rendered response may be written to the edge cache. Only a `200`
28
32
  * is a complete public document worth storing; redirects and errors are never
@@ -1 +1 @@
1
- {"version":3,"file":"decision.d.ts","sourceRoot":"","sources":["../../src/cache/decision.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAatD,UAAU,gBAAgB;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CAC1C;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAI7D;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAIjE;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAE1E"}
1
+ {"version":3,"file":"decision.d.ts","sourceRoot":"","sources":["../../src/cache/decision.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAatD,UAAU,gBAAgB;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CAC1C;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAI7D;AAED,8DAA8D;AAC9D,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,YAAY,GAAG,QAAQ,CAAC;AAEnE;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,gBAAgB,GACpB,iBAAiB,GAAG,IAAI,CAI1B;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAE1E"}
@@ -25,15 +25,17 @@ export function requestIsPrivileged(request) {
25
25
  return new URL(request.url).searchParams.has("preview");
26
26
  }
27
27
  /**
28
- * Whether the edge cache may participate in this request at all — the gate for
29
- * both reading a stored response and storing a fresh one.
28
+ * The gate for whether the edge cache may participate in this request at all —
29
+ * both reading a stored response and storing a fresh one. Returns `null` when
30
+ * the request is cacheable, otherwise the first failing check — the reason the
31
+ * telemetry `cache` record carries.
30
32
  */
31
- export function requestIsCacheable(req) {
33
+ export function cacheBypassReason(req) {
32
34
  if (req.method !== "GET" && req.method !== "HEAD")
33
- return false;
35
+ return "method";
34
36
  if (req.isPrivileged)
35
- return false;
36
- return CACHEABLE_INTENTS.has(req.intentKind);
37
+ return "privileged";
38
+ return CACHEABLE_INTENTS.has(req.intentKind) ? null : "intent";
37
39
  }
38
40
  /**
39
41
  * Whether a rendered response may be written to the edge cache. Only a `200`
@@ -1 +1 @@
1
- {"version":3,"file":"decision.js","sourceRoot":"","sources":["../../src/cache/decision.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,+EAA+E;AAC/E,8EAA8E;AAC9E,sDAAsD;AACtD,MAAM,iBAAiB,GAAqC,IAAI,GAAG,CAAC;IAClE,QAAQ;IACR,SAAS;IACT,UAAU;IACV,YAAY;CACb,CAAC,CAAC;AAYH;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAClD,IAAI,iBAAiB,CAAC,OAAO,CAAC,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACrD,IAAI,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;QAAE,OAAO,IAAI,CAAC;IACtD,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AAC1D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAqB;IACtD,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC;IAChE,IAAI,GAAG,CAAC,YAAY;QAAE,OAAO,KAAK,CAAC;IACnC,OAAO,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;AAC/C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAc,EAAE,MAAc;IAC/D,OAAO,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,GAAG,CAAC;AAC5C,CAAC"}
1
+ {"version":3,"file":"decision.js","sourceRoot":"","sources":["../../src/cache/decision.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,+EAA+E;AAC/E,8EAA8E;AAC9E,sDAAsD;AACtD,MAAM,iBAAiB,GAAqC,IAAI,GAAG,CAAC;IAClE,QAAQ;IACR,SAAS;IACT,UAAU;IACV,YAAY;CACb,CAAC,CAAC;AAYH;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAClD,IAAI,iBAAiB,CAAC,OAAO,CAAC,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACrD,IAAI,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;QAAE,OAAO,IAAI,CAAC;IACtD,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AAC1D,CAAC;AAKD;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAC/B,GAAqB;IAErB,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM;QAAE,OAAO,QAAQ,CAAC;IACnE,IAAI,GAAG,CAAC,YAAY;QAAE,OAAO,YAAY,CAAC;IAC1C,OAAO,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC;AACjE,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAc,EAAE,MAAc;IAC/D,OAAO,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,GAAG,CAAC;AAC5C,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import type { DeferFn } from "../context/app.js";
2
+ import type { TelemetryCollector } from "../context/telemetry.js";
2
3
  import type { RouteIntent } from "../route/intent.js";
3
4
  import type { ConnectedCache } from "../runtime/slots.js";
4
5
  interface ReadThroughArgs {
@@ -10,6 +11,8 @@ interface ReadThroughArgs {
10
11
  readonly intentKind: RouteIntent["kind"] | null;
11
12
  readonly cache: ConnectedCache;
12
13
  readonly defer: DeferFn;
14
+ /** Records the cache decision + reason as a durationless `cache` fact. */
15
+ readonly telemetry: TelemetryCollector;
13
16
  /** Renders the page live. Called once on a miss, never on a hit. */
14
17
  readonly render: () => Promise<Response>;
15
18
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"read-through.d.ts","sourceRoot":"","sources":["../../src/cache/read-through.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAO1D,UAAU,eAAe;IACvB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B;;;OAGG;IACH,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;IAChD,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,oEAAoE;IACpE,QAAQ,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC;IACzC;;;OAGG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,SAAS,MAAM,EAAE,CAAC;CACxC;AAED;;;;;;GAMG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC,CAsB1E"}
1
+ {"version":3,"file":"read-through.d.ts","sourceRoot":"","sources":["../../src/cache/read-through.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAO1D,UAAU,eAAe;IACvB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B;;;OAGG;IACH,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;IAChD,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,0EAA0E;IAC1E,QAAQ,CAAC,SAAS,EAAE,kBAAkB,CAAC;IACvC,oEAAoE;IACpE,QAAQ,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC;IACzC;;;OAGG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,SAAS,MAAM,EAAE,CAAC;CACxC;AAED;;;;;;GAMG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC,CA6B1E"}
@@ -1,4 +1,4 @@
1
- import { requestIsCacheable, requestIsPrivileged, responseIsStorable, } from "./decision.js";
1
+ import { cacheBypassReason, requestIsPrivileged, responseIsStorable, } from "./decision.js";
2
2
  /**
3
3
  * Serve a public page through the edge cache: return a stored response on a
4
4
  * hit, otherwise render live and store the result when it's cacheable. The
@@ -7,20 +7,27 @@ import { requestIsCacheable, requestIsPrivileged, responseIsStorable, } from "./
7
7
  * and touch the cache not at all.
8
8
  */
9
9
  export async function readThrough(args) {
10
- const { request, intentKind, cache, defer, render, tags } = args;
11
- if (intentKind === null ||
12
- !requestIsCacheable({
10
+ const { request, intentKind, cache, defer, telemetry, render, tags } = args;
11
+ const reason = intentKind === null
12
+ ? "no-route"
13
+ : cacheBypassReason({
13
14
  method: request.method,
14
15
  isPrivileged: requestIsPrivileged(request),
15
16
  intentKind,
16
- })) {
17
+ });
18
+ if (reason !== null) {
19
+ telemetry.record("cache", { decision: "bypass", reason });
17
20
  return render();
18
21
  }
19
22
  const hit = await cache.match(request);
20
- if (hit)
23
+ if (hit) {
24
+ telemetry.record("cache", { decision: "hit" });
21
25
  return hit;
26
+ }
22
27
  const fresh = await render();
23
- if (responseIsStorable(request.method, fresh.status)) {
28
+ const stored = responseIsStorable(request.method, fresh.status);
29
+ telemetry.record("cache", { decision: "miss", stored });
30
+ if (stored) {
24
31
  defer(cache.put(request, fresh.clone(), tags()));
25
32
  }
26
33
  return fresh;
@@ -1 +1 @@
1
- {"version":3,"file":"read-through.js","sourceRoot":"","sources":["../../src/cache/read-through.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,eAAe,CAAC;AAoBvB;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAqB;IACrD,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;IAEjE,IACE,UAAU,KAAK,IAAI;QACnB,CAAC,kBAAkB,CAAC;YAClB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,YAAY,EAAE,mBAAmB,CAAC,OAAO,CAAC;YAC1C,UAAU;SACX,CAAC,EACF,CAAC;QACD,OAAO,MAAM,EAAE,CAAC;IAClB,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACvC,IAAI,GAAG;QAAE,OAAO,GAAG,CAAC;IAEpB,MAAM,KAAK,GAAG,MAAM,MAAM,EAAE,CAAC;IAC7B,IAAI,kBAAkB,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QACrD,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"read-through.js","sourceRoot":"","sources":["../../src/cache/read-through.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,eAAe,CAAC;AAsBvB;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAqB;IACrD,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;IAE5E,MAAM,MAAM,GACV,UAAU,KAAK,IAAI;QACjB,CAAC,CAAC,UAAU;QACZ,CAAC,CAAC,iBAAiB,CAAC;YAChB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,YAAY,EAAE,mBAAmB,CAAC,OAAO,CAAC;YAC1C,UAAU;SACX,CAAC,CAAC;IACT,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;QAC1D,OAAO,MAAM,EAAE,CAAC;IAClB,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACvC,IAAI,GAAG,EAAE,CAAC;QACR,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;QAC/C,OAAO,GAAG,CAAC;IACb,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,MAAM,EAAE,CAAC;IAC7B,MAAM,MAAM,GAAG,kBAAkB,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAChE,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACxD,IAAI,MAAM,EAAE,CAAC;QACX,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"tags.d.ts","sourceRoot":"","sources":["../../src/cache/tags.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAKtD,wBAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,UAAU,cAAc;IACtB,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,cAAc,EAAE,cAAc,GAAG,IAAI,CAAC;IAC/C,mEAAmE;IACnE,QAAQ,CAAC,mBAAmB,EAAE,MAAM,SAAS,MAAM,EAAE,CAAC;IACtD,kDAAkD;IAClD,QAAQ,CAAC,kBAAkB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,SAAS,MAAM,EAAE,CAAC;CACtE;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,EAAE,CAgB1D;AAED,yEAAyE;AACzE,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAE3E;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,kBAAkB,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAE7E"}
1
+ {"version":3,"file":"tags.d.ts","sourceRoot":"","sources":["../../src/cache/tags.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAKtD,wBAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,UAAU,cAAc;IACtB,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,cAAc,EAAE,cAAc,GAAG,IAAI,CAAC;IAC/C,mEAAmE;IACnE,QAAQ,CAAC,mBAAmB,EAAE,MAAM,SAAS,MAAM,EAAE,CAAC;IACtD,kDAAkD;IAClD,QAAQ,CAAC,kBAAkB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,SAAS,MAAM,EAAE,CAAC;CACtE;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,EAAE,CAyB1D;AAED,yEAAyE;AACzE,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAE3E;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,kBAAkB,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAE7E"}
@@ -27,7 +27,16 @@ export function pageTags(sources) {
27
27
  return sources.frontPageEntryTypes().map(typeTag);
28
28
  case "taxonomy":
29
29
  return sources.taxonomyEntryTypes(intent.taxonomy).map(typeTag);
30
+ case "author":
31
+ case "date":
32
+ // Author and date archives list the same public, non-hierarchical type
33
+ // set as the front page, so any publish of those types can change them.
34
+ return sources.frontPageEntryTypes().map(typeTag);
35
+ case "custom":
30
36
  case "search":
37
+ // A plugin archive's content dependencies are unknown to core (as search
38
+ // results are), so it carries no coarse type tags — the plugin manages
39
+ // its own invalidation if it edge-caches.
31
40
  return [];
32
41
  }
33
42
  }
@@ -1 +1 @@
1
- {"version":3,"file":"tags.js","sourceRoot":"","sources":["../../src/cache/tags.ts"],"names":[],"mappings":"AAGA,8EAA8E;AAC9E,+EAA+E;AAC/E,2EAA2E;AAC3E,MAAM,UAAU,OAAO,CAAC,SAAiB;IACvC,OAAO,KAAK,SAAS,EAAE,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,OAAe;IACtC,OAAO,KAAK,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;AAChC,CAAC;AAWD;;;;;;GAMG;AACH,MAAM,UAAU,QAAQ,CAAC,OAAuB;IAC9C,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC;IAC3C,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,QAAQ;YACX,OAAO,cAAc,EAAE,IAAI,KAAK,OAAO;gBACrC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;gBAC1D,CAAC,CAAC,EAAE,CAAC;QACT,KAAK,SAAS;YACZ,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;QACrC,KAAK,YAAY;YACf,OAAO,OAAO,CAAC,mBAAmB,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACpD,KAAK,UAAU;YACb,OAAO,OAAO,CAAC,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAClE,KAAK,QAAQ;YACX,OAAO,EAAE,CAAC;IACd,CAAC;AACH,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,cAAc,CAAC,SAAiB,EAAE,OAAe;IAC/D,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;AACjD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,kBAAqC;IACjE,OAAO,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AACzC,CAAC"}
1
+ {"version":3,"file":"tags.js","sourceRoot":"","sources":["../../src/cache/tags.ts"],"names":[],"mappings":"AAGA,8EAA8E;AAC9E,+EAA+E;AAC/E,2EAA2E;AAC3E,MAAM,UAAU,OAAO,CAAC,SAAiB;IACvC,OAAO,KAAK,SAAS,EAAE,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,OAAe;IACtC,OAAO,KAAK,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;AAChC,CAAC;AAWD;;;;;;GAMG;AACH,MAAM,UAAU,QAAQ,CAAC,OAAuB;IAC9C,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC;IAC3C,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,QAAQ;YACX,OAAO,cAAc,EAAE,IAAI,KAAK,OAAO;gBACrC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;gBAC1D,CAAC,CAAC,EAAE,CAAC;QACT,KAAK,SAAS;YACZ,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;QACrC,KAAK,YAAY;YACf,OAAO,OAAO,CAAC,mBAAmB,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACpD,KAAK,UAAU;YACb,OAAO,OAAO,CAAC,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAClE,KAAK,QAAQ,CAAC;QACd,KAAK,MAAM;YACT,uEAAuE;YACvE,wEAAwE;YACxE,OAAO,OAAO,CAAC,mBAAmB,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACpD,KAAK,QAAQ,CAAC;QACd,KAAK,QAAQ;YACX,yEAAyE;YACzE,uEAAuE;YACvE,0CAA0C;YAC1C,OAAO,EAAE,CAAC;IACd,CAAC;AACH,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,cAAc,CAAC,SAAiB,EAAE,OAAe;IAC/D,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;AACjD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,kBAAqC;IACjE,OAAO,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AACzC,CAAC"}
package/dist/config.d.ts CHANGED
@@ -2,6 +2,7 @@ import type { HtmlAllowlistOverride } from "@plumix/blocks";
2
2
  import type { RemotePattern } from "@plumix/blocks/renderer";
3
3
  import type { PlumixAuthConfig } from "./auth/config.js";
4
4
  import type { MailerInput } from "./auth/mailer/resolve.js";
5
+ import type { TelemetryConfig } from "./context/telemetry.js";
5
6
  import type { DebugBarInput } from "./debug-bar/config.js";
6
7
  import type { I18nInput, ResolvedI18n } from "./i18n/locale-registry.js";
7
8
  import type { PluginDescriptor } from "./plugin/define.js";
@@ -98,6 +99,13 @@ export interface PlumixConfigInput {
98
99
  * to suppress it or `{ disable: [...] }` to silence individual panels.
99
100
  */
100
101
  readonly debugBar?: DebugBarInput;
102
+ /**
103
+ * Telemetry consumers, registered once here. Each consumer head-samples
104
+ * per request and receives a serializable snapshot post-response; with no
105
+ * consumers the collector stays a no-op and production pays nothing. The
106
+ * dev debug bar registers itself as the first consumer automatically.
107
+ */
108
+ readonly telemetry?: TelemetryConfig;
101
109
  /**
102
110
  * Block-system configuration. Today only exposes the operator-
103
111
  * configurable `core/html` allowlist override; future block-level
@@ -137,6 +145,7 @@ export interface PlumixConfig {
137
145
  readonly mcp?: InterfaceToggle;
138
146
  readonly api?: ApiConfig;
139
147
  readonly debugBar?: DebugBarInput;
148
+ readonly telemetry?: TelemetryConfig;
140
149
  readonly blocks?: {
141
150
  readonly htmlAllowlist?: HtmlAllowlistOverride;
142
151
  };
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
package/dist/config.js CHANGED
@@ -28,6 +28,7 @@ export function plumix(config) {
28
28
  mcp: config.mcp,
29
29
  api: config.api,
30
30
  debugBar: config.debugBar,
31
+ telemetry: config.telemetry,
31
32
  blocks: config.blocks,
32
33
  images: config.images,
33
34
  vite: config.vite,
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AA0BlD,MAAM,UAAU,gBAAgB,CAAC,MAAmC;IAClE,OAAO,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;AAClC,CAAC;AA6HD,MAAM,UAAU,MAAM,CAAC,MAAyB;IAC9C,iEAAiE;IACjE,oEAAoE;IACpE,oEAAoE;IACpE,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QAC5C,MAAM,WAAW,CAAC,uBAAuB,EAAE,CAAC;IAC9C,CAAC;IACD,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,YAAY;QACnC,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,EAAE;QAC7B,IAAI,EAAE,cAAc,CAClB,MAAM,CAAC,IAAI,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,CACxD;QACD,QAAQ,EAAE,iBAAiB,CAAC,MAAM,CAAC,QAAQ,CAAC;QAC5C,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,IAAI,EAAE,MAAM,CAAC,IAAI;KAClB,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,MAAM,IAAI,YAAY,EAAE,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AA0BlD,MAAM,UAAU,gBAAgB,CAAC,MAAmC;IAClE,OAAO,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;AAClC,CAAC;AAqID,MAAM,UAAU,MAAM,CAAC,MAAyB;IAC9C,iEAAiE;IACjE,oEAAoE;IACpE,oEAAoE;IACpE,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QAC5C,MAAM,WAAW,CAAC,uBAAuB,EAAE,CAAC;IAC9C,CAAC;IACD,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,YAAY;QACnC,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,EAAE;QAC7B,IAAI,EAAE,cAAc,CAClB,MAAM,CAAC,IAAI,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,CACxD;QACD,QAAQ,EAAE,iBAAiB,CAAC,MAAM,CAAC,QAAQ,CAAC;QAC5C,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,IAAI,EAAE,MAAM,CAAC,IAAI;KAClB,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,MAAM,IAAI,YAAY,EAAE,CAAC"}
@@ -15,7 +15,7 @@ import type { ResolvedEntity } from "../route/current.js";
15
15
  import type { OAuthProviderSummary } from "../runtime/app.js";
16
16
  import type { PlumixEnv } from "../runtime/bindings.js";
17
17
  import type { AssetsBinding, ConnectedCache, ConnectedObjectStorage, ImageDelivery } from "../runtime/slots.js";
18
- import type { DebugCollector } from "./debug.js";
18
+ import type { TelemetryCollector, TelemetryConfig, TelemetryConsumer } from "./telemetry.js";
19
19
  export type CoreSchema = typeof coreSchema;
20
20
  export type Db<TSchema extends Record<string, unknown> = CoreSchema> = BaseSQLiteDatabase<"async" | "sync", unknown, TSchema>;
21
21
  export interface AuthenticatedUser {
@@ -98,12 +98,28 @@ export interface AppContextBase<TSchema extends Record<string, unknown> = CoreSc
98
98
  readonly shortcodes: ShortcodeRegistry;
99
99
  readonly logger: Logger;
100
100
  /**
101
- * Request-scoped debug collector. Core and plugins record per-request data
102
- * for the dev debug bar via `ctx.debug.record`/`span`. Always present: the
103
- * real collector in dev, {@link NOOP_DEBUG} in prod (so call sites are safe
104
- * and the debug-bar module tree-shakes out of prod builds).
101
+ * Request-scoped telemetry collector spans + records for what happened
102
+ * during this request. Core and plugins record via `ctx.telemetry.record`/
103
+ * `span`. Always present: the real collector when at least one registered
104
+ * consumer voted to sample this request, {@link NOOP_TELEMETRY} otherwise
105
+ * (so call sites are safe and a site with no consumers pays nothing).
105
106
  */
106
- readonly debug: DebugCollector;
107
+ readonly telemetry: TelemetryCollector;
108
+ /**
109
+ * Traced outbound HTTP — same signature as global `fetch`, one telemetry
110
+ * span per call with method, URL, and response status. Core and plugins
111
+ * make external calls through this so a slow third-party API shows up in
112
+ * the request waterfall. Bare global `fetch` is an untraced platform
113
+ * boundary (the same line drawn for DB connections not obtained from
114
+ * `ctx.db`) — nothing is patched globally.
115
+ */
116
+ readonly fetch: typeof globalThis.fetch;
117
+ /**
118
+ * Consumers whose head-sampling vote said yes for this request — the
119
+ * targets of post-response snapshot delivery. Absent when nothing sampled
120
+ * (and `telemetry` is the no-op). Internal to the dispatcher.
121
+ */
122
+ readonly telemetryConsumers?: readonly TelemetryConsumer[];
107
123
  readonly auth: AuthNamespace;
108
124
  /**
109
125
  * Resolved request authenticator — same instance the dispatcher
@@ -211,6 +227,13 @@ export interface AppContextBase<TSchema extends Record<string, unknown> = CoreSc
211
227
  * / custom headers here; the dispatcher folds them into the Response.
212
228
  */
213
229
  readonly resHeaders?: Headers;
230
+ /**
231
+ * Unique id for this execution (request or cron run), minted at context
232
+ * creation so mid-request consumers — logs, error hooks, the debug bar —
233
+ * and the post-response telemetry snapshot all correlate on one value.
234
+ * The snapshot envelope's `requestId` is this id.
235
+ */
236
+ readonly requestId: string;
214
237
  /**
215
238
  * Set by the public-route resolver after URL → entity matching;
216
239
  * `null` for non-public routes (admin, RPC, etc.) and on cold-start.
@@ -220,6 +243,13 @@ export interface AppContextBase<TSchema extends Record<string, unknown> = CoreSc
220
243
  * and response rendering, and read paths see the populated value.
221
244
  */
222
245
  resolvedEntity: ResolvedEntity | null;
246
+ /**
247
+ * The template rule that won resolution (its `ruleLabel`), written by the
248
+ * theme renderer once a rule matches; `null` before render and on paths
249
+ * that never render a template. Same write-once-mutable design as
250
+ * `resolvedEntity` — the resolve phase span reads it back post-render.
251
+ */
252
+ resolvedTemplate: string | null;
223
253
  }
224
254
  export type AppContext<TSchema extends Record<string, unknown> = CoreSchema> = AppContextBase<TSchema> & AppContextExtensions;
225
255
  export type AuthenticatedAppContext<TSchema extends Record<string, unknown> = CoreSchema> = Omit<AppContext<TSchema>, "user"> & {
@@ -245,6 +275,8 @@ export interface CreateAppContextArgs<TSchema extends Record<string, unknown>> {
245
275
  readonly origin?: string;
246
276
  readonly basePath?: string;
247
277
  readonly debugBar?: DebugBarInput;
278
+ /** App-config telemetry slot — registered consumers vote per request. */
279
+ readonly telemetry?: TelemetryConfig;
248
280
  readonly siteName?: string;
249
281
  readonly logger?: Logger;
250
282
  readonly defer?: DeferFn;
@@ -1 +1 @@
1
- {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../src/context/app.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../src/context/app.ts"],"names":[],"mappings":"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"}
@@ -2,11 +2,13 @@ import { createBlockRegistry } from "@plumix/blocks";
2
2
  import { defaultAuthenticator } from "../auth/authenticator.js";
3
3
  import { resolveMailer } from "../auth/mailer/resolve.js";
4
4
  import { createCapabilityResolver } from "../auth/rbac.js";
5
- import { createDebugCollector } from "../debug-bar/collector.js";
5
+ import { debugBarTelemetryConsumer } from "../debug-bar/consumer.js";
6
6
  import { resolveLocales } from "../i18n/locale-registry.js";
7
7
  import { resolveLocale } from "../i18n/resolve-locale.js";
8
- import { NOOP_DEBUG } from "./debug.js";
8
+ import { createTelemetryCollector } from "./collector.js";
9
9
  import { ContextError } from "./errors.js";
10
+ import { NOOP_TELEMETRY } from "./telemetry.js";
11
+ import { createTracedFetch } from "./traced-fetch.js";
10
12
  const EMPTY_BLOCK_REGISTRY = createBlockRegistry([]);
11
13
  const EMPTY_MARK_LIST = Object.freeze([]);
12
14
  const EMPTY_SHORTCODE_REGISTRY = new Map();
@@ -100,7 +102,9 @@ export function createAppContext(args) {
100
102
  oauthProviders: args.oauthProviders ?? [],
101
103
  authenticator: args.authenticator ?? defaultAuthenticator(),
102
104
  bootstrapAllowed: args.bootstrapAllowed ?? false,
105
+ requestId: crypto.randomUUID(),
103
106
  resolvedEntity: null,
107
+ resolvedTemplate: null,
104
108
  // Best-effort fallback for tests / runtimes that don't pass an
105
109
  // explicit origin: derive from the inbound request URL. Production
106
110
  // always passes the canonical operator-set origin so URLs in
@@ -108,11 +112,13 @@ export function createAppContext(args) {
108
112
  origin: args.origin ?? new URL(args.request.url).origin,
109
113
  basePath: args.basePath ?? "",
110
114
  debugBar: args.debugBar,
111
- // Real collector only in dev; `process.env.PLUMIX_DEV` is Vite-empty in a
112
- // build, so the prod branch keeps NOOP_DEBUG and tree-shakes the rest.
113
- debug: process.env.PLUMIX_DEV
114
- ? createDebugCollector(args.debugBar)
115
- : NOOP_DEBUG,
115
+ // Provisional no-op swapped for the real collector below iff a consumer
116
+ // votes to sample this request. Consumers see the assembled context when
117
+ // voting, so `telemetry` must exist (inactive) before the vote runs.
118
+ telemetry: NOOP_TELEMETRY,
119
+ // Reads `base.telemetry` per call, so the post-vote collector swap below
120
+ // is observed without rebinding.
121
+ fetch: createTracedFetch(() => base.telemetry),
116
122
  siteName: args.siteName,
117
123
  };
118
124
  // Spread plugin-contributed entries onto the base. The cast is the
@@ -133,7 +139,34 @@ export function createAppContext(args) {
133
139
  target[key] = entry.value;
134
140
  }
135
141
  }
136
- return base;
142
+ const ctx = base;
143
+ // Consumers are declared against the core schema; a custom-schema context
144
+ // is structurally the same at the seam, so the double cast is safe.
145
+ const sampled = sampleTelemetryConsumers(ctx, args.debugBar, args.telemetry);
146
+ if (sampled.length > 0) {
147
+ // The context is frozen-by-type, not by object — createAppContext owns
148
+ // construction, so activating the collector post-vote is a private step.
149
+ const mutable = base;
150
+ mutable.telemetry = createTelemetryCollector();
151
+ mutable.telemetryConsumers = sampled;
152
+ }
153
+ return ctx;
154
+ }
155
+ /**
156
+ * The gate: which registered consumers want this request collected. In dev
157
+ * the debug bar registers first (the `PLUMIX_DEV` branch is Vite-empty in a
158
+ * build, so the bar and its config never reach production bundles); config
159
+ * consumers follow. A consumer without `sample` always votes yes.
160
+ */
161
+ function sampleTelemetryConsumers(ctx, debugBar, config) {
162
+ const consumers = [];
163
+ if (process.env.PLUMIX_DEV) {
164
+ const bar = debugBarTelemetryConsumer(debugBar);
165
+ if (bar)
166
+ consumers.push(bar);
167
+ }
168
+ consumers.push(...(config?.consumers ?? []));
169
+ return consumers.filter((c) => c.sample?.(ctx) ?? true);
137
170
  }
138
171
  export function withUser(ctx, user, tokenScopes = null) {
139
172
  const resolver = createCapabilityResolver(ctx.plugins);