@bitcobblers/wod-wiki-tools 0.55.2206 → 0.56.2210

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 (632) hide show
  1. package/dist/{agentCommands-O6WPIGLW.mjs → agentCommands-X3IPRNVS.mjs} +3 -3
  2. package/dist/{agentCommands-O6WPIGLW.mjs.map → agentCommands-X3IPRNVS.mjs.map} +1 -1
  3. package/dist/bin/wod.cjs +1 -1
  4. package/dist/bin/wod.cjs.map +1 -1
  5. package/dist/bin/wod.mjs +2 -2
  6. package/dist/{chunk-67JAEWEF.mjs → chunk-4P7CJBE6.mjs} +3 -3
  7. package/dist/{chunk-67JAEWEF.mjs.map → chunk-4P7CJBE6.mjs.map} +1 -1
  8. package/dist/{chunk-WKU3MRQI.mjs → chunk-75GNABZK.mjs} +3 -3
  9. package/dist/chunk-75GNABZK.mjs.map +1 -0
  10. package/dist/{chunk-76CB4MGO.mjs → chunk-G74KVCH2.mjs} +8 -8
  11. package/dist/{chunk-76CB4MGO.mjs.map → chunk-G74KVCH2.mjs.map} +1 -1
  12. package/dist/{chunk-RVQB3DYE.mjs → chunk-TVSQRJKK.mjs} +3 -3
  13. package/dist/{chunk-RVQB3DYE.mjs.map → chunk-TVSQRJKK.mjs.map} +1 -1
  14. package/dist/{chunk-FNEN33GQ.mjs → chunk-W3JQPGSC.mjs} +3 -3
  15. package/dist/{chunk-FNEN33GQ.mjs.map → chunk-W3JQPGSC.mjs.map} +1 -1
  16. package/dist/index.cjs +1 -1
  17. package/dist/index.cjs.map +1 -1
  18. package/dist/index.mjs +5 -5
  19. package/dist/{mcp-XCK6B5JA.mjs → mcp-HLSSJ7CG.mjs} +4 -4
  20. package/dist/{mcp-XCK6B5JA.mjs.map → mcp-HLSSJ7CG.mjs.map} +1 -1
  21. package/dist/{scaffoldFeed-MC4UX4CO.mjs → scaffoldFeed-JANDJS7O.mjs} +3 -3
  22. package/dist/{scaffoldFeed-MC4UX4CO.mjs.map → scaffoldFeed-JANDJS7O.mjs.map} +1 -1
  23. package/dist/server/app.cjs +1 -1
  24. package/dist/server/app.cjs.map +1 -1
  25. package/dist/server/app.mjs +3 -3
  26. package/dist/server-EMJ6CK6I.mjs +13 -0
  27. package/dist/{server-HQJMA7BU.mjs.map → server-EMJ6CK6I.mjs.map} +1 -1
  28. package/dist/web/playground/.nojekyll +0 -0
  29. package/dist/web/playground/.well-known/agent-capabilities.json +1611 -0
  30. package/dist/web/playground/assets/{feedSync.worker-CJyLPLAX.js → feedSync.worker-D_nseqQE.js} +16 -16
  31. package/dist/web/playground/assets/main-BmC44tg2.css +2 -0
  32. package/dist/web/playground/assets/main-DBcVPQ2q.js +1160 -0
  33. package/dist/web/playground/assets/{statementBuilderFlow-CtEe1EOX.js → statementBuilderFlow-zMJNADic.js} +2 -2
  34. package/dist/web/playground/assets/{vendor-BUlwHBNF.js → vendor-B_PPmYw_.js} +5 -5
  35. package/dist/web/{server/assets/vendor-codemirror-Bh6hyz5v.js → playground/assets/vendor-codemirror-CvjMzS3W.js} +2 -2
  36. package/dist/web/playground/index.html +4 -4
  37. package/dist/web/playground/llms-full.txt +9 -1
  38. package/dist/web/playground/llms.txt +7 -2
  39. package/dist/web/{server/seed/core/chunks/canvas.6cf875a1.json → playground/seed/core/chunks/canvas.1525e286.json} +1 -1
  40. package/dist/web/playground/seed/core/chunks/{dashboards.277192c5.json → dashboards.95ab5050.json} +1 -1
  41. package/dist/web/playground/seed/core/chunks/{efforts.b943edc6.json → efforts.19869130.json} +1 -1
  42. package/dist/web/playground/seed/core/chunks/{equipment.3cc3e02c.json → equipment.b6fc363d.json} +1 -1
  43. package/dist/web/playground/seed/core/indexes/notebooks/canvas.json +180 -180
  44. package/dist/web/playground/seed/core/indexes/notebooks/dashboards.json +16 -16
  45. package/dist/web/playground/seed/core/indexes/notebooks/efforts.json +326 -326
  46. package/dist/web/playground/seed/core/indexes/notebooks/equipment.json +50 -50
  47. package/dist/web/playground/seed/core/manifest.json +27 -27
  48. package/dist/web/playground/seed/core/markdown/canvas/ai-first/README.json +1 -1
  49. package/dist/web/playground/seed/core/markdown/canvas/guide/README.json +4 -4
  50. package/dist/web/playground/seed/core/markdown/canvas/guide/clock.json +1 -1
  51. package/dist/web/playground/seed/core/markdown/canvas/guide/dashboards.json +1 -1
  52. package/dist/web/playground/seed/core/markdown/canvas/guide/metrics-summaries.json +2 -2
  53. package/dist/web/playground/seed/core/markdown/canvas/guide/metrics.json +12 -12
  54. package/dist/web/playground/seed/core/markdown/canvas/guide/protocols.json +20 -20
  55. package/dist/web/playground/seed/core/markdown/canvas/guide/sessions.json +33 -33
  56. package/dist/web/playground/seed/core/markdown/canvas/guide/start.json +11 -11
  57. package/dist/web/playground/seed/core/markdown/canvas/guide/structure.json +25 -25
  58. package/dist/web/playground/seed/core/markdown/canvas/guide/wql.json +5 -5
  59. package/dist/web/playground/seed/core/markdown/canvas/home/sample-script.json +4 -4
  60. package/dist/web/playground/seed/core/markdown/canvas/home/welcome-1.json +2 -2
  61. package/dist/web/playground/seed/core/markdown/canvas/syntax/actions-comments.json +4 -4
  62. package/dist/web/playground/seed/core/markdown/canvas/syntax/alternating-emom.json +5 -5
  63. package/dist/web/playground/seed/core/markdown/canvas/syntax/basic-emom.json +4 -4
  64. package/dist/web/playground/seed/core/markdown/canvas/syntax/calculated-metrics.json +4 -4
  65. package/dist/web/playground/seed/core/markdown/canvas/syntax/classic-amrap.json +6 -6
  66. package/dist/web/playground/seed/core/markdown/canvas/syntax/complex-barbell-cycling.json +4 -4
  67. package/dist/web/playground/seed/core/markdown/canvas/syntax/complex-full-session.json +10 -10
  68. package/dist/web/playground/seed/core/markdown/canvas/syntax/complex-nested-protocols.json +7 -7
  69. package/dist/web/playground/seed/core/markdown/canvas/syntax/complex-partner-workout.json +7 -7
  70. package/dist/web/playground/seed/core/markdown/canvas/syntax/complex-swimming.json +5 -5
  71. package/dist/web/playground/seed/core/markdown/canvas/syntax/core-rules.json +4 -4
  72. package/dist/web/playground/seed/core/markdown/canvas/syntax/custom-and-calculated-metrics.json +4 -4
  73. package/dist/web/playground/seed/core/markdown/canvas/syntax/custom-intervals.json +4 -4
  74. package/dist/web/playground/seed/core/markdown/canvas/syntax/custom-metrics-1.json +4 -4
  75. package/dist/web/playground/seed/core/markdown/canvas/syntax/custom-metrics-2.json +5 -5
  76. package/dist/web/playground/seed/core/markdown/canvas/syntax/custom-metrics-3.json +3 -3
  77. package/dist/web/playground/seed/core/markdown/canvas/syntax/custom-metrics-4.json +4 -4
  78. package/dist/web/playground/seed/core/markdown/canvas/syntax/custom-metrics-5.json +4 -4
  79. package/dist/web/playground/seed/core/markdown/canvas/syntax/dialect-climb-bouldering.json +2 -2
  80. package/dist/web/playground/seed/core/markdown/canvas/syntax/dialect-climb-hangboard.json +2 -2
  81. package/dist/web/playground/seed/core/markdown/canvas/syntax/dialect-climb-sport.json +2 -2
  82. package/dist/web/playground/seed/core/markdown/canvas/syntax/dialect-log.json +4 -4
  83. package/dist/web/playground/seed/core/markdown/canvas/syntax/dialect-plan.json +8 -8
  84. package/dist/web/playground/seed/core/markdown/canvas/syntax/dialect-wod.json +5 -5
  85. package/dist/web/playground/seed/core/markdown/canvas/syntax/distance-intervals.json +3 -3
  86. package/dist/web/playground/seed/core/markdown/canvas/syntax/document-1.json +4 -4
  87. package/dist/web/playground/seed/core/markdown/canvas/syntax/document-2.json +5 -5
  88. package/dist/web/playground/seed/core/markdown/canvas/syntax/document-3.json +10 -10
  89. package/dist/web/playground/seed/core/markdown/canvas/syntax/document-4.json +5 -5
  90. package/dist/web/playground/seed/core/markdown/canvas/syntax/effort-notes.json +5 -5
  91. package/dist/web/playground/seed/core/markdown/canvas/syntax/frontmatter-summaries.json +4 -4
  92. package/dist/web/playground/seed/core/markdown/canvas/syntax/groups-1.json +5 -5
  93. package/dist/web/playground/seed/core/markdown/canvas/syntax/groups-2.json +6 -6
  94. package/dist/web/playground/seed/core/markdown/canvas/syntax/groups-3.json +3 -3
  95. package/dist/web/playground/seed/core/markdown/canvas/syntax/groups-4.json +3 -3
  96. package/dist/web/playground/seed/core/markdown/canvas/syntax/longer-duration.json +4 -4
  97. package/dist/web/playground/seed/core/markdown/canvas/syntax/longer-intervals.json +4 -4
  98. package/dist/web/playground/seed/core/markdown/canvas/syntax/measurements.json +7 -7
  99. package/dist/web/playground/seed/core/markdown/canvas/syntax/metrics-1.json +5 -5
  100. package/dist/web/playground/seed/core/markdown/canvas/syntax/metrics-2.json +7 -7
  101. package/dist/web/playground/seed/core/markdown/canvas/syntax/metrics-3.json +8 -8
  102. package/dist/web/playground/seed/core/markdown/canvas/syntax/metrics-4.json +6 -6
  103. package/dist/web/playground/seed/core/markdown/canvas/syntax/metrics-5.json +5 -5
  104. package/dist/web/playground/seed/core/markdown/canvas/syntax/mixed-sections.json +10 -10
  105. package/dist/web/playground/seed/core/markdown/canvas/syntax/mixed-timers.json +5 -5
  106. package/dist/web/playground/seed/core/markdown/canvas/syntax/multiple-amrap-windows.json +7 -7
  107. package/dist/web/playground/seed/core/markdown/canvas/syntax/multiple-sets.json +4 -4
  108. package/dist/web/playground/seed/core/markdown/canvas/syntax/named-groups.json +6 -6
  109. package/dist/web/playground/seed/core/markdown/canvas/syntax/protocols-1.json +6 -6
  110. package/dist/web/playground/seed/core/markdown/canvas/syntax/protocols-2.json +4 -4
  111. package/dist/web/playground/seed/core/markdown/canvas/syntax/protocols-3.json +6 -6
  112. package/dist/web/playground/seed/core/markdown/canvas/syntax/protocols-4.json +3 -3
  113. package/dist/web/playground/seed/core/markdown/canvas/syntax/protocols-5.json +4 -4
  114. package/dist/web/playground/seed/core/markdown/canvas/syntax/single-movement.json +3 -3
  115. package/dist/web/playground/seed/core/markdown/canvas/syntax/supplemental-1.json +4 -4
  116. package/dist/web/playground/seed/core/markdown/canvas/syntax/supplemental-2.json +5 -5
  117. package/dist/web/playground/seed/core/markdown/canvas/syntax/supplemental-3.json +4 -4
  118. package/dist/web/playground/seed/core/markdown/canvas/syntax/supplemental-4.json +4 -4
  119. package/dist/web/playground/seed/core/markdown/canvas/syntax/time-cap.json +6 -6
  120. package/dist/web/playground/seed/core/markdown/canvas/syntax/timer-modifiers.json +6 -6
  121. package/dist/web/playground/seed/core/markdown/canvas/syntax/timers-1.json +6 -6
  122. package/dist/web/playground/seed/core/markdown/canvas/syntax/timers-2.json +4 -4
  123. package/dist/web/playground/seed/core/markdown/canvas/syntax/timers-3.json +4 -4
  124. package/dist/web/playground/seed/core/markdown/canvas/syntax/timers-4.json +4 -4
  125. package/dist/web/playground/seed/core/markdown/canvas/syntax/timers-5.json +5 -5
  126. package/dist/web/playground/seed/core/markdown/canvas/syntax/timers-rest.json +4 -4
  127. package/dist/web/playground/seed/core/markdown/canvas/wql-presets/aggregate-by-effort.json +2 -2
  128. package/dist/web/playground/seed/core/markdown/canvas/wql-presets/aggregate-by-week.json +2 -2
  129. package/dist/web/playground/seed/core/markdown/canvas/wql-presets/content-fran.json +2 -2
  130. package/dist/web/playground/seed/core/markdown/canvas/wql-presets/filter-combos.json +2 -2
  131. package/dist/web/playground/seed/core/markdown/canvas/wql-presets/pipes-limit.json +2 -2
  132. package/dist/web/playground/seed/core/markdown/canvas/wql-presets/session-rpe.json +2 -2
  133. package/dist/web/playground/seed/core/markdown/canvas/wql-presets/source-journal.json +2 -2
  134. package/dist/web/playground/seed/core/markdown/canvas/wql-presets/tis-trend.json +2 -2
  135. package/dist/web/playground/seed/core/markdown/canvas/wql-presets/where-join.json +2 -2
  136. package/dist/web/playground/seed/core/markdown/dashboards/benchmark-pr-board.json +6 -6
  137. package/dist/web/playground/seed/core/markdown/dashboards/finger-strength-v8.json +5 -5
  138. package/dist/web/playground/seed/core/markdown/dashboards/polarized-base-marathon.json +9 -9
  139. package/dist/web/playground/seed/core/markdown/dashboards/recovery-readiness.json +7 -7
  140. package/dist/web/playground/seed/core/markdown/dashboards/road-to-560-total.json +9 -9
  141. package/dist/web/playground/seed/core/markdown/dashboards/training-block-review.json +11 -11
  142. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/air-squat.json +1 -1
  143. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/box-jump.json +1 -1
  144. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/broad-jump.json +1 -1
  145. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/burpee-box-jump-over.json +1 -1
  146. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/burpee-over-dumbbell.json +1 -1
  147. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/burpee.json +1 -1
  148. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/dumbbell-squat-clean.json +1 -1
  149. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/ghd-sit-up.json +1 -1
  150. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/ground-kong.json +1 -1
  151. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/jumping-jack.json +1 -1
  152. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/kong-walk.json +1 -1
  153. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/lunge.json +1 -1
  154. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/overhead-squat.json +1 -1
  155. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/parkour-roll.json +1 -1
  156. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/parkour-squat.json +1 -1
  157. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/pistol-squat.json +1 -1
  158. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/plank.json +1 -1
  159. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/precision-burpee.json +1 -1
  160. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/precision-jump.json +1 -1
  161. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/quadrupedal-movement.json +1 -1
  162. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/russian-twist.json +1 -1
  163. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/sit-up.json +1 -1
  164. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/squat-clean.json +1 -1
  165. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/squat-hold.json +1 -1
  166. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/squat-snatch.json +1 -1
  167. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/tuck-jump.json +1 -1
  168. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/wall-ball.json +1 -1
  169. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/wall-burpee.json +1 -1
  170. package/dist/web/playground/seed/core/markdown/efforts/cycling/assault-bike.json +1 -1
  171. package/dist/web/playground/seed/core/markdown/efforts/cycling/cycling-moderate.json +1 -1
  172. package/dist/web/playground/seed/core/markdown/efforts/cycling/cycling-vigorous.json +1 -1
  173. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/assisted-pull-up.json +1 -1
  174. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/burpee-pull-up.json +1 -1
  175. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/chest-to-bar-pull-up.json +1 -1
  176. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/dip.json +1 -1
  177. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/double-under.json +1 -1
  178. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/handstand-hold.json +1 -1
  179. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/handstand-push-up.json +1 -1
  180. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/handstand-walk.json +1 -1
  181. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/jump-rope.json +1 -1
  182. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/jumping-pull-up.json +1 -1
  183. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/jumping-push-up.json +1 -1
  184. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/l-sit-pull-up.json +1 -1
  185. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/muscle-up.json +1 -1
  186. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/pull-up.json +1 -1
  187. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/push-up.json +1 -1
  188. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/reverse-wall-dip.json +1 -1
  189. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/rope-climb.json +1 -1
  190. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/toes-to-bar.json +1 -1
  191. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-arm-bar.json +1 -1
  192. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-around-the-world.json +1 -1
  193. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-bent-over-row.json +1 -1
  194. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-clean-and-jerk.json +1 -1
  195. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-clean-and-press.json +1 -1
  196. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-clean.json +1 -1
  197. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-deadlift.json +1 -1
  198. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-floor-press.json +1 -1
  199. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-front-squat.json +1 -1
  200. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-goblet-squat.json +1 -1
  201. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-gorilla-row.json +1 -1
  202. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-halo.json +1 -1
  203. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-jerk.json +1 -1
  204. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-overhead-squat.json +1 -1
  205. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-press.json +1 -1
  206. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-snatch.json +1 -1
  207. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-swing.json +1 -1
  208. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-windmill.json +1 -1
  209. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/turkish-get-up.json +1 -1
  210. package/dist/web/playground/seed/core/markdown/efforts/recovery/rest.json +1 -1
  211. package/dist/web/playground/seed/core/markdown/efforts/recovery/stretching.json +1 -1
  212. package/dist/web/playground/seed/core/markdown/efforts/rowing/rowing-sprint.json +1 -1
  213. package/dist/web/playground/seed/core/markdown/efforts/rowing/rowing.json +1 -1
  214. package/dist/web/playground/seed/core/markdown/efforts/rowing/ski-erg.json +1 -1
  215. package/dist/web/playground/seed/core/markdown/efforts/running/backward-running.json +1 -1
  216. package/dist/web/playground/seed/core/markdown/efforts/running/running-6-mph.json +1 -1
  217. package/dist/web/playground/seed/core/markdown/efforts/running/running-8-mph.json +1 -1
  218. package/dist/web/playground/seed/core/markdown/efforts/running/running-sprint.json +1 -1
  219. package/dist/web/playground/seed/core/markdown/efforts/snatch.json +2 -2
  220. package/dist/web/playground/seed/core/markdown/efforts/strength/back-squat.json +1 -1
  221. package/dist/web/playground/seed/core/markdown/efforts/strength/bench-press.json +1 -1
  222. package/dist/web/playground/seed/core/markdown/efforts/strength/box-step-up.json +1 -1
  223. package/dist/web/playground/seed/core/markdown/efforts/strength/carioca.json +1 -1
  224. package/dist/web/playground/seed/core/markdown/efforts/strength/clean-and-jerk.json +1 -1
  225. package/dist/web/playground/seed/core/markdown/efforts/strength/cluster.json +1 -1
  226. package/dist/web/playground/seed/core/markdown/efforts/strength/dead-hang.json +1 -1
  227. package/dist/web/playground/seed/core/markdown/efforts/strength/deadlift.json +1 -1
  228. package/dist/web/playground/seed/core/markdown/efforts/strength/devils-press.json +1 -1
  229. package/dist/web/playground/seed/core/markdown/efforts/strength/dumbbell-box-step-up.json +1 -1
  230. package/dist/web/playground/seed/core/markdown/efforts/strength/dumbbell-clean.json +1 -1
  231. package/dist/web/playground/seed/core/markdown/efforts/strength/dumbbell-fly.json +1 -1
  232. package/dist/web/playground/seed/core/markdown/efforts/strength/dumbbell-row.json +1 -1
  233. package/dist/web/playground/seed/core/markdown/efforts/strength/dumbbell-snatch.json +1 -1
  234. package/dist/web/playground/seed/core/markdown/efforts/strength/dumbbell-thruster.json +1 -1
  235. package/dist/web/playground/seed/core/markdown/efforts/strength/elbows-to-knees.json +1 -1
  236. package/dist/web/playground/seed/core/markdown/efforts/strength/farmer-carry.json +1 -1
  237. package/dist/web/playground/seed/core/markdown/efforts/strength/frog-stand.json +1 -1
  238. package/dist/web/playground/seed/core/markdown/efforts/strength/front-squat.json +1 -1
  239. package/dist/web/playground/seed/core/markdown/efforts/strength/good-morning.json +1 -1
  240. package/dist/web/playground/seed/core/markdown/efforts/strength/hanging-leg-raise.json +1 -1
  241. package/dist/web/playground/seed/core/markdown/efforts/strength/hollow-rock.json +1 -1
  242. package/dist/web/playground/seed/core/markdown/efforts/strength/knees-to-elbows.json +1 -1
  243. package/dist/web/playground/seed/core/markdown/efforts/strength/l-sit.json +1 -1
  244. package/dist/web/playground/seed/core/markdown/efforts/strength/man-maker.json +1 -1
  245. package/dist/web/playground/seed/core/markdown/efforts/strength/medicine-ball-clean.json +1 -1
  246. package/dist/web/playground/seed/core/markdown/efforts/strength/overhead-press.json +1 -1
  247. package/dist/web/playground/seed/core/markdown/efforts/strength/parkour-vault.json +1 -1
  248. package/dist/web/playground/seed/core/markdown/efforts/strength/pig-flip.json +1 -1
  249. package/dist/web/playground/seed/core/markdown/efforts/strength/power-clean.json +1 -1
  250. package/dist/web/playground/seed/core/markdown/efforts/strength/power-snatch.json +1 -1
  251. package/dist/web/playground/seed/core/markdown/efforts/strength/push-jerk.json +1 -1
  252. package/dist/web/playground/seed/core/markdown/efforts/strength/push-press.json +1 -1
  253. package/dist/web/playground/seed/core/markdown/efforts/strength/romanian-deadlift.json +1 -1
  254. package/dist/web/playground/seed/core/markdown/efforts/strength/single-leg-deadlift.json +1 -1
  255. package/dist/web/playground/seed/core/markdown/efforts/strength/skull-crusher.json +1 -1
  256. package/dist/web/playground/seed/core/markdown/efforts/strength/slam-ball.json +1 -1
  257. package/dist/web/playground/seed/core/markdown/efforts/strength/sled-pull.json +1 -1
  258. package/dist/web/playground/seed/core/markdown/efforts/strength/sled-push.json +1 -1
  259. package/dist/web/playground/seed/core/markdown/efforts/strength/sumo-deadlift.json +1 -1
  260. package/dist/web/playground/seed/core/markdown/efforts/strength/thruster.json +1 -1
  261. package/dist/web/playground/seed/core/markdown/efforts/strength/triceps-extension.json +1 -1
  262. package/dist/web/playground/seed/core/markdown/efforts/strength/v-sit-hold.json +1 -1
  263. package/dist/web/playground/seed/core/markdown/efforts/strength/wall-walk.json +1 -1
  264. package/dist/web/playground/seed/core/markdown/efforts/strength/yoga-sun-salutation.json +1 -1
  265. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-assisted-sprint.json +1 -1
  266. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-backstroke.json +1 -1
  267. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-breaststroke-kick.json +1 -1
  268. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-breaststroke.json +1 -1
  269. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-butterfly.json +1 -1
  270. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-catch-up-drill.json +1 -1
  271. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-choice-stroke.json +1 -1
  272. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-dive-start.json +1 -1
  273. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-dolphin-kick.json +1 -1
  274. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-drafting.json +1 -1
  275. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-fingertip-drag.json +1 -1
  276. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-freestyle.json +1 -1
  277. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-individual-medley.json +1 -1
  278. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-kick.json +1 -1
  279. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-pull.json +1 -1
  280. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-resisted-sprint.json +1 -1
  281. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-rotation-drill.json +1 -1
  282. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-sighting.json +1 -1
  283. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-single-arm-drill.json +1 -1
  284. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-stroke-transition.json +1 -1
  285. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-two-kick-one-pull.json +1 -1
  286. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-vigorous.json +1 -1
  287. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming.json +1 -1
  288. package/dist/web/playground/seed/core/markdown/efforts/unconventional/clubbell-arm-cast.json +1 -1
  289. package/dist/web/playground/seed/core/markdown/efforts/unconventional/clubbell-circles.json +1 -1
  290. package/dist/web/playground/seed/core/markdown/efforts/unconventional/clubbell-mill.json +1 -1
  291. package/dist/web/playground/seed/core/markdown/efforts/unconventional/clubbell-reverse-mill.json +1 -1
  292. package/dist/web/playground/seed/core/markdown/efforts/unconventional/clubbell-shield-cast.json +1 -1
  293. package/dist/web/playground/seed/core/markdown/efforts/unconventional/macebell-10-to-2-swing.json +1 -1
  294. package/dist/web/playground/seed/core/markdown/efforts/unconventional/macebell-360-swing.json +1 -1
  295. package/dist/web/playground/seed/core/markdown/efforts/unconventional/macebell-barbarian-squat.json +1 -1
  296. package/dist/web/playground/seed/core/markdown/efforts/unconventional/macebell-flow.json +1 -1
  297. package/dist/web/playground/seed/core/markdown/efforts/unconventional/macebell-gravedigger.json +1 -1
  298. package/dist/web/playground/seed/core/markdown/efforts/unconventional/macebell-touchdown.json +1 -1
  299. package/dist/web/playground/seed/core/markdown/efforts/unconventional/sandbag-bear-hug-carry.json +1 -1
  300. package/dist/web/playground/seed/core/markdown/efforts/unconventional/sandbag-bear-hug-extension.json +1 -1
  301. package/dist/web/playground/seed/core/markdown/efforts/unconventional/sandbag-over-shoulder.json +1 -1
  302. package/dist/web/playground/seed/core/markdown/efforts/walking/walking-3-mph.json +1 -1
  303. package/dist/web/playground/seed/core/markdown/equipment/air-bike.json +1 -1
  304. package/dist/web/playground/seed/core/markdown/equipment/barbell.json +1 -1
  305. package/dist/web/playground/seed/core/markdown/equipment/bench.json +1 -1
  306. package/dist/web/playground/seed/core/markdown/equipment/bike-erg.json +1 -1
  307. package/dist/web/playground/seed/core/markdown/equipment/climbing-rope.json +1 -1
  308. package/dist/web/playground/seed/core/markdown/equipment/clubs.json +1 -1
  309. package/dist/web/playground/seed/core/markdown/equipment/dumbbell.json +1 -1
  310. package/dist/web/playground/seed/core/markdown/equipment/ghd.json +1 -1
  311. package/dist/web/playground/seed/core/markdown/equipment/gymnastic-rings.json +1 -1
  312. package/dist/web/playground/seed/core/markdown/equipment/jump-rope.json +1 -1
  313. package/dist/web/playground/seed/core/markdown/equipment/kettlebell.json +1 -1
  314. package/dist/web/playground/seed/core/markdown/equipment/macebell.json +1 -1
  315. package/dist/web/playground/seed/core/markdown/equipment/medicine-ball.json +1 -1
  316. package/dist/web/playground/seed/core/markdown/equipment/parallettes.json +1 -1
  317. package/dist/web/playground/seed/core/markdown/equipment/plyo-box.json +1 -1
  318. package/dist/web/playground/seed/core/markdown/equipment/pull-up-bar.json +1 -1
  319. package/dist/web/playground/seed/core/markdown/equipment/rower.json +1 -1
  320. package/dist/web/playground/seed/core/markdown/equipment/sandbag.json +1 -1
  321. package/dist/web/playground/seed/core/markdown/equipment/ski-erg.json +1 -1
  322. package/dist/web/playground/seed/core/markdown/equipment/slam-ball.json +1 -1
  323. package/dist/web/playground/seed/core/markdown/equipment/sled.json +1 -1
  324. package/dist/web/playground/seed/core/markdown/equipment/sledgehammer.json +1 -1
  325. package/dist/web/playground/seed/core/markdown/equipment/weight-vest.json +1 -1
  326. package/dist/web/playground/seed/core/report.html +13 -13
  327. package/dist/web/server/.nojekyll +0 -0
  328. package/dist/web/server/.well-known/agent-capabilities.json +1611 -0
  329. package/dist/web/server/assets/{feedSync.worker-CJyLPLAX.js → feedSync.worker-D_nseqQE.js} +16 -16
  330. package/dist/web/server/assets/main-6bxhwnOE.js +1160 -0
  331. package/dist/web/server/assets/main-BmC44tg2.css +2 -0
  332. package/dist/web/server/assets/{statementBuilderFlow-4p9d-7VX.js → statementBuilderFlow-_MVj040u.js} +2 -2
  333. package/dist/web/server/assets/{vendor-BUlwHBNF.js → vendor-B_PPmYw_.js} +5 -5
  334. package/dist/web/{playground/assets/vendor-codemirror-Bh6hyz5v.js → server/assets/vendor-codemirror-CvjMzS3W.js} +2 -2
  335. package/dist/web/server/index.html +4 -4
  336. package/dist/web/server/llms-full.txt +9 -1
  337. package/dist/web/server/llms.txt +7 -2
  338. package/dist/web/{playground/seed/core/chunks/canvas.6cf875a1.json → server/seed/core/chunks/canvas.1525e286.json} +1 -1
  339. package/dist/web/server/seed/core/chunks/{dashboards.277192c5.json → dashboards.95ab5050.json} +1 -1
  340. package/dist/web/server/seed/core/chunks/{efforts.b943edc6.json → efforts.19869130.json} +1 -1
  341. package/dist/web/server/seed/core/chunks/{equipment.3cc3e02c.json → equipment.b6fc363d.json} +1 -1
  342. package/dist/web/server/seed/core/indexes/notebooks/canvas.json +180 -180
  343. package/dist/web/server/seed/core/indexes/notebooks/dashboards.json +16 -16
  344. package/dist/web/server/seed/core/indexes/notebooks/efforts.json +326 -326
  345. package/dist/web/server/seed/core/indexes/notebooks/equipment.json +50 -50
  346. package/dist/web/server/seed/core/manifest.json +27 -27
  347. package/dist/web/server/seed/core/markdown/canvas/ai-first/README.json +1 -1
  348. package/dist/web/server/seed/core/markdown/canvas/guide/README.json +4 -4
  349. package/dist/web/server/seed/core/markdown/canvas/guide/clock.json +1 -1
  350. package/dist/web/server/seed/core/markdown/canvas/guide/dashboards.json +1 -1
  351. package/dist/web/server/seed/core/markdown/canvas/guide/metrics-summaries.json +2 -2
  352. package/dist/web/server/seed/core/markdown/canvas/guide/metrics.json +12 -12
  353. package/dist/web/server/seed/core/markdown/canvas/guide/protocols.json +20 -20
  354. package/dist/web/server/seed/core/markdown/canvas/guide/sessions.json +33 -33
  355. package/dist/web/server/seed/core/markdown/canvas/guide/start.json +11 -11
  356. package/dist/web/server/seed/core/markdown/canvas/guide/structure.json +25 -25
  357. package/dist/web/server/seed/core/markdown/canvas/guide/wql.json +5 -5
  358. package/dist/web/server/seed/core/markdown/canvas/home/sample-script.json +4 -4
  359. package/dist/web/server/seed/core/markdown/canvas/home/welcome-1.json +2 -2
  360. package/dist/web/server/seed/core/markdown/canvas/syntax/actions-comments.json +4 -4
  361. package/dist/web/server/seed/core/markdown/canvas/syntax/alternating-emom.json +5 -5
  362. package/dist/web/server/seed/core/markdown/canvas/syntax/basic-emom.json +4 -4
  363. package/dist/web/server/seed/core/markdown/canvas/syntax/calculated-metrics.json +4 -4
  364. package/dist/web/server/seed/core/markdown/canvas/syntax/classic-amrap.json +6 -6
  365. package/dist/web/server/seed/core/markdown/canvas/syntax/complex-barbell-cycling.json +4 -4
  366. package/dist/web/server/seed/core/markdown/canvas/syntax/complex-full-session.json +10 -10
  367. package/dist/web/server/seed/core/markdown/canvas/syntax/complex-nested-protocols.json +7 -7
  368. package/dist/web/server/seed/core/markdown/canvas/syntax/complex-partner-workout.json +7 -7
  369. package/dist/web/server/seed/core/markdown/canvas/syntax/complex-swimming.json +5 -5
  370. package/dist/web/server/seed/core/markdown/canvas/syntax/core-rules.json +4 -4
  371. package/dist/web/server/seed/core/markdown/canvas/syntax/custom-and-calculated-metrics.json +4 -4
  372. package/dist/web/server/seed/core/markdown/canvas/syntax/custom-intervals.json +4 -4
  373. package/dist/web/server/seed/core/markdown/canvas/syntax/custom-metrics-1.json +4 -4
  374. package/dist/web/server/seed/core/markdown/canvas/syntax/custom-metrics-2.json +5 -5
  375. package/dist/web/server/seed/core/markdown/canvas/syntax/custom-metrics-3.json +3 -3
  376. package/dist/web/server/seed/core/markdown/canvas/syntax/custom-metrics-4.json +4 -4
  377. package/dist/web/server/seed/core/markdown/canvas/syntax/custom-metrics-5.json +4 -4
  378. package/dist/web/server/seed/core/markdown/canvas/syntax/dialect-climb-bouldering.json +2 -2
  379. package/dist/web/server/seed/core/markdown/canvas/syntax/dialect-climb-hangboard.json +2 -2
  380. package/dist/web/server/seed/core/markdown/canvas/syntax/dialect-climb-sport.json +2 -2
  381. package/dist/web/server/seed/core/markdown/canvas/syntax/dialect-log.json +4 -4
  382. package/dist/web/server/seed/core/markdown/canvas/syntax/dialect-plan.json +8 -8
  383. package/dist/web/server/seed/core/markdown/canvas/syntax/dialect-wod.json +5 -5
  384. package/dist/web/server/seed/core/markdown/canvas/syntax/distance-intervals.json +3 -3
  385. package/dist/web/server/seed/core/markdown/canvas/syntax/document-1.json +4 -4
  386. package/dist/web/server/seed/core/markdown/canvas/syntax/document-2.json +5 -5
  387. package/dist/web/server/seed/core/markdown/canvas/syntax/document-3.json +10 -10
  388. package/dist/web/server/seed/core/markdown/canvas/syntax/document-4.json +5 -5
  389. package/dist/web/server/seed/core/markdown/canvas/syntax/effort-notes.json +5 -5
  390. package/dist/web/server/seed/core/markdown/canvas/syntax/frontmatter-summaries.json +4 -4
  391. package/dist/web/server/seed/core/markdown/canvas/syntax/groups-1.json +5 -5
  392. package/dist/web/server/seed/core/markdown/canvas/syntax/groups-2.json +6 -6
  393. package/dist/web/server/seed/core/markdown/canvas/syntax/groups-3.json +3 -3
  394. package/dist/web/server/seed/core/markdown/canvas/syntax/groups-4.json +3 -3
  395. package/dist/web/server/seed/core/markdown/canvas/syntax/longer-duration.json +4 -4
  396. package/dist/web/server/seed/core/markdown/canvas/syntax/longer-intervals.json +4 -4
  397. package/dist/web/server/seed/core/markdown/canvas/syntax/measurements.json +7 -7
  398. package/dist/web/server/seed/core/markdown/canvas/syntax/metrics-1.json +5 -5
  399. package/dist/web/server/seed/core/markdown/canvas/syntax/metrics-2.json +7 -7
  400. package/dist/web/server/seed/core/markdown/canvas/syntax/metrics-3.json +8 -8
  401. package/dist/web/server/seed/core/markdown/canvas/syntax/metrics-4.json +6 -6
  402. package/dist/web/server/seed/core/markdown/canvas/syntax/metrics-5.json +5 -5
  403. package/dist/web/server/seed/core/markdown/canvas/syntax/mixed-sections.json +10 -10
  404. package/dist/web/server/seed/core/markdown/canvas/syntax/mixed-timers.json +5 -5
  405. package/dist/web/server/seed/core/markdown/canvas/syntax/multiple-amrap-windows.json +7 -7
  406. package/dist/web/server/seed/core/markdown/canvas/syntax/multiple-sets.json +4 -4
  407. package/dist/web/server/seed/core/markdown/canvas/syntax/named-groups.json +6 -6
  408. package/dist/web/server/seed/core/markdown/canvas/syntax/protocols-1.json +6 -6
  409. package/dist/web/server/seed/core/markdown/canvas/syntax/protocols-2.json +4 -4
  410. package/dist/web/server/seed/core/markdown/canvas/syntax/protocols-3.json +6 -6
  411. package/dist/web/server/seed/core/markdown/canvas/syntax/protocols-4.json +3 -3
  412. package/dist/web/server/seed/core/markdown/canvas/syntax/protocols-5.json +4 -4
  413. package/dist/web/server/seed/core/markdown/canvas/syntax/single-movement.json +3 -3
  414. package/dist/web/server/seed/core/markdown/canvas/syntax/supplemental-1.json +4 -4
  415. package/dist/web/server/seed/core/markdown/canvas/syntax/supplemental-2.json +5 -5
  416. package/dist/web/server/seed/core/markdown/canvas/syntax/supplemental-3.json +4 -4
  417. package/dist/web/server/seed/core/markdown/canvas/syntax/supplemental-4.json +4 -4
  418. package/dist/web/server/seed/core/markdown/canvas/syntax/time-cap.json +6 -6
  419. package/dist/web/server/seed/core/markdown/canvas/syntax/timer-modifiers.json +6 -6
  420. package/dist/web/server/seed/core/markdown/canvas/syntax/timers-1.json +6 -6
  421. package/dist/web/server/seed/core/markdown/canvas/syntax/timers-2.json +4 -4
  422. package/dist/web/server/seed/core/markdown/canvas/syntax/timers-3.json +4 -4
  423. package/dist/web/server/seed/core/markdown/canvas/syntax/timers-4.json +4 -4
  424. package/dist/web/server/seed/core/markdown/canvas/syntax/timers-5.json +5 -5
  425. package/dist/web/server/seed/core/markdown/canvas/syntax/timers-rest.json +4 -4
  426. package/dist/web/server/seed/core/markdown/canvas/wql-presets/aggregate-by-effort.json +2 -2
  427. package/dist/web/server/seed/core/markdown/canvas/wql-presets/aggregate-by-week.json +2 -2
  428. package/dist/web/server/seed/core/markdown/canvas/wql-presets/content-fran.json +2 -2
  429. package/dist/web/server/seed/core/markdown/canvas/wql-presets/filter-combos.json +2 -2
  430. package/dist/web/server/seed/core/markdown/canvas/wql-presets/pipes-limit.json +2 -2
  431. package/dist/web/server/seed/core/markdown/canvas/wql-presets/session-rpe.json +2 -2
  432. package/dist/web/server/seed/core/markdown/canvas/wql-presets/source-journal.json +2 -2
  433. package/dist/web/server/seed/core/markdown/canvas/wql-presets/tis-trend.json +2 -2
  434. package/dist/web/server/seed/core/markdown/canvas/wql-presets/where-join.json +2 -2
  435. package/dist/web/server/seed/core/markdown/dashboards/benchmark-pr-board.json +6 -6
  436. package/dist/web/server/seed/core/markdown/dashboards/finger-strength-v8.json +5 -5
  437. package/dist/web/server/seed/core/markdown/dashboards/polarized-base-marathon.json +9 -9
  438. package/dist/web/server/seed/core/markdown/dashboards/recovery-readiness.json +7 -7
  439. package/dist/web/server/seed/core/markdown/dashboards/road-to-560-total.json +9 -9
  440. package/dist/web/server/seed/core/markdown/dashboards/training-block-review.json +11 -11
  441. package/dist/web/server/seed/core/markdown/efforts/bodyweight/air-squat.json +1 -1
  442. package/dist/web/server/seed/core/markdown/efforts/bodyweight/box-jump.json +1 -1
  443. package/dist/web/server/seed/core/markdown/efforts/bodyweight/broad-jump.json +1 -1
  444. package/dist/web/server/seed/core/markdown/efforts/bodyweight/burpee-box-jump-over.json +1 -1
  445. package/dist/web/server/seed/core/markdown/efforts/bodyweight/burpee-over-dumbbell.json +1 -1
  446. package/dist/web/server/seed/core/markdown/efforts/bodyweight/burpee.json +1 -1
  447. package/dist/web/server/seed/core/markdown/efforts/bodyweight/dumbbell-squat-clean.json +1 -1
  448. package/dist/web/server/seed/core/markdown/efforts/bodyweight/ghd-sit-up.json +1 -1
  449. package/dist/web/server/seed/core/markdown/efforts/bodyweight/ground-kong.json +1 -1
  450. package/dist/web/server/seed/core/markdown/efforts/bodyweight/jumping-jack.json +1 -1
  451. package/dist/web/server/seed/core/markdown/efforts/bodyweight/kong-walk.json +1 -1
  452. package/dist/web/server/seed/core/markdown/efforts/bodyweight/lunge.json +1 -1
  453. package/dist/web/server/seed/core/markdown/efforts/bodyweight/overhead-squat.json +1 -1
  454. package/dist/web/server/seed/core/markdown/efforts/bodyweight/parkour-roll.json +1 -1
  455. package/dist/web/server/seed/core/markdown/efforts/bodyweight/parkour-squat.json +1 -1
  456. package/dist/web/server/seed/core/markdown/efforts/bodyweight/pistol-squat.json +1 -1
  457. package/dist/web/server/seed/core/markdown/efforts/bodyweight/plank.json +1 -1
  458. package/dist/web/server/seed/core/markdown/efforts/bodyweight/precision-burpee.json +1 -1
  459. package/dist/web/server/seed/core/markdown/efforts/bodyweight/precision-jump.json +1 -1
  460. package/dist/web/server/seed/core/markdown/efforts/bodyweight/quadrupedal-movement.json +1 -1
  461. package/dist/web/server/seed/core/markdown/efforts/bodyweight/russian-twist.json +1 -1
  462. package/dist/web/server/seed/core/markdown/efforts/bodyweight/sit-up.json +1 -1
  463. package/dist/web/server/seed/core/markdown/efforts/bodyweight/squat-clean.json +1 -1
  464. package/dist/web/server/seed/core/markdown/efforts/bodyweight/squat-hold.json +1 -1
  465. package/dist/web/server/seed/core/markdown/efforts/bodyweight/squat-snatch.json +1 -1
  466. package/dist/web/server/seed/core/markdown/efforts/bodyweight/tuck-jump.json +1 -1
  467. package/dist/web/server/seed/core/markdown/efforts/bodyweight/wall-ball.json +1 -1
  468. package/dist/web/server/seed/core/markdown/efforts/bodyweight/wall-burpee.json +1 -1
  469. package/dist/web/server/seed/core/markdown/efforts/cycling/assault-bike.json +1 -1
  470. package/dist/web/server/seed/core/markdown/efforts/cycling/cycling-moderate.json +1 -1
  471. package/dist/web/server/seed/core/markdown/efforts/cycling/cycling-vigorous.json +1 -1
  472. package/dist/web/server/seed/core/markdown/efforts/gymnastics/assisted-pull-up.json +1 -1
  473. package/dist/web/server/seed/core/markdown/efforts/gymnastics/burpee-pull-up.json +1 -1
  474. package/dist/web/server/seed/core/markdown/efforts/gymnastics/chest-to-bar-pull-up.json +1 -1
  475. package/dist/web/server/seed/core/markdown/efforts/gymnastics/dip.json +1 -1
  476. package/dist/web/server/seed/core/markdown/efforts/gymnastics/double-under.json +1 -1
  477. package/dist/web/server/seed/core/markdown/efforts/gymnastics/handstand-hold.json +1 -1
  478. package/dist/web/server/seed/core/markdown/efforts/gymnastics/handstand-push-up.json +1 -1
  479. package/dist/web/server/seed/core/markdown/efforts/gymnastics/handstand-walk.json +1 -1
  480. package/dist/web/server/seed/core/markdown/efforts/gymnastics/jump-rope.json +1 -1
  481. package/dist/web/server/seed/core/markdown/efforts/gymnastics/jumping-pull-up.json +1 -1
  482. package/dist/web/server/seed/core/markdown/efforts/gymnastics/jumping-push-up.json +1 -1
  483. package/dist/web/server/seed/core/markdown/efforts/gymnastics/l-sit-pull-up.json +1 -1
  484. package/dist/web/server/seed/core/markdown/efforts/gymnastics/muscle-up.json +1 -1
  485. package/dist/web/server/seed/core/markdown/efforts/gymnastics/pull-up.json +1 -1
  486. package/dist/web/server/seed/core/markdown/efforts/gymnastics/push-up.json +1 -1
  487. package/dist/web/server/seed/core/markdown/efforts/gymnastics/reverse-wall-dip.json +1 -1
  488. package/dist/web/server/seed/core/markdown/efforts/gymnastics/rope-climb.json +1 -1
  489. package/dist/web/server/seed/core/markdown/efforts/gymnastics/toes-to-bar.json +1 -1
  490. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-arm-bar.json +1 -1
  491. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-around-the-world.json +1 -1
  492. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-bent-over-row.json +1 -1
  493. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-clean-and-jerk.json +1 -1
  494. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-clean-and-press.json +1 -1
  495. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-clean.json +1 -1
  496. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-deadlift.json +1 -1
  497. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-floor-press.json +1 -1
  498. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-front-squat.json +1 -1
  499. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-goblet-squat.json +1 -1
  500. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-gorilla-row.json +1 -1
  501. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-halo.json +1 -1
  502. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-jerk.json +1 -1
  503. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-overhead-squat.json +1 -1
  504. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-press.json +1 -1
  505. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-snatch.json +1 -1
  506. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-swing.json +1 -1
  507. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-windmill.json +1 -1
  508. package/dist/web/server/seed/core/markdown/efforts/kettlebell/turkish-get-up.json +1 -1
  509. package/dist/web/server/seed/core/markdown/efforts/recovery/rest.json +1 -1
  510. package/dist/web/server/seed/core/markdown/efforts/recovery/stretching.json +1 -1
  511. package/dist/web/server/seed/core/markdown/efforts/rowing/rowing-sprint.json +1 -1
  512. package/dist/web/server/seed/core/markdown/efforts/rowing/rowing.json +1 -1
  513. package/dist/web/server/seed/core/markdown/efforts/rowing/ski-erg.json +1 -1
  514. package/dist/web/server/seed/core/markdown/efforts/running/backward-running.json +1 -1
  515. package/dist/web/server/seed/core/markdown/efforts/running/running-6-mph.json +1 -1
  516. package/dist/web/server/seed/core/markdown/efforts/running/running-8-mph.json +1 -1
  517. package/dist/web/server/seed/core/markdown/efforts/running/running-sprint.json +1 -1
  518. package/dist/web/server/seed/core/markdown/efforts/snatch.json +2 -2
  519. package/dist/web/server/seed/core/markdown/efforts/strength/back-squat.json +1 -1
  520. package/dist/web/server/seed/core/markdown/efforts/strength/bench-press.json +1 -1
  521. package/dist/web/server/seed/core/markdown/efforts/strength/box-step-up.json +1 -1
  522. package/dist/web/server/seed/core/markdown/efforts/strength/carioca.json +1 -1
  523. package/dist/web/server/seed/core/markdown/efforts/strength/clean-and-jerk.json +1 -1
  524. package/dist/web/server/seed/core/markdown/efforts/strength/cluster.json +1 -1
  525. package/dist/web/server/seed/core/markdown/efforts/strength/dead-hang.json +1 -1
  526. package/dist/web/server/seed/core/markdown/efforts/strength/deadlift.json +1 -1
  527. package/dist/web/server/seed/core/markdown/efforts/strength/devils-press.json +1 -1
  528. package/dist/web/server/seed/core/markdown/efforts/strength/dumbbell-box-step-up.json +1 -1
  529. package/dist/web/server/seed/core/markdown/efforts/strength/dumbbell-clean.json +1 -1
  530. package/dist/web/server/seed/core/markdown/efforts/strength/dumbbell-fly.json +1 -1
  531. package/dist/web/server/seed/core/markdown/efforts/strength/dumbbell-row.json +1 -1
  532. package/dist/web/server/seed/core/markdown/efforts/strength/dumbbell-snatch.json +1 -1
  533. package/dist/web/server/seed/core/markdown/efforts/strength/dumbbell-thruster.json +1 -1
  534. package/dist/web/server/seed/core/markdown/efforts/strength/elbows-to-knees.json +1 -1
  535. package/dist/web/server/seed/core/markdown/efforts/strength/farmer-carry.json +1 -1
  536. package/dist/web/server/seed/core/markdown/efforts/strength/frog-stand.json +1 -1
  537. package/dist/web/server/seed/core/markdown/efforts/strength/front-squat.json +1 -1
  538. package/dist/web/server/seed/core/markdown/efforts/strength/good-morning.json +1 -1
  539. package/dist/web/server/seed/core/markdown/efforts/strength/hanging-leg-raise.json +1 -1
  540. package/dist/web/server/seed/core/markdown/efforts/strength/hollow-rock.json +1 -1
  541. package/dist/web/server/seed/core/markdown/efforts/strength/knees-to-elbows.json +1 -1
  542. package/dist/web/server/seed/core/markdown/efforts/strength/l-sit.json +1 -1
  543. package/dist/web/server/seed/core/markdown/efforts/strength/man-maker.json +1 -1
  544. package/dist/web/server/seed/core/markdown/efforts/strength/medicine-ball-clean.json +1 -1
  545. package/dist/web/server/seed/core/markdown/efforts/strength/overhead-press.json +1 -1
  546. package/dist/web/server/seed/core/markdown/efforts/strength/parkour-vault.json +1 -1
  547. package/dist/web/server/seed/core/markdown/efforts/strength/pig-flip.json +1 -1
  548. package/dist/web/server/seed/core/markdown/efforts/strength/power-clean.json +1 -1
  549. package/dist/web/server/seed/core/markdown/efforts/strength/power-snatch.json +1 -1
  550. package/dist/web/server/seed/core/markdown/efforts/strength/push-jerk.json +1 -1
  551. package/dist/web/server/seed/core/markdown/efforts/strength/push-press.json +1 -1
  552. package/dist/web/server/seed/core/markdown/efforts/strength/romanian-deadlift.json +1 -1
  553. package/dist/web/server/seed/core/markdown/efforts/strength/single-leg-deadlift.json +1 -1
  554. package/dist/web/server/seed/core/markdown/efforts/strength/skull-crusher.json +1 -1
  555. package/dist/web/server/seed/core/markdown/efforts/strength/slam-ball.json +1 -1
  556. package/dist/web/server/seed/core/markdown/efforts/strength/sled-pull.json +1 -1
  557. package/dist/web/server/seed/core/markdown/efforts/strength/sled-push.json +1 -1
  558. package/dist/web/server/seed/core/markdown/efforts/strength/sumo-deadlift.json +1 -1
  559. package/dist/web/server/seed/core/markdown/efforts/strength/thruster.json +1 -1
  560. package/dist/web/server/seed/core/markdown/efforts/strength/triceps-extension.json +1 -1
  561. package/dist/web/server/seed/core/markdown/efforts/strength/v-sit-hold.json +1 -1
  562. package/dist/web/server/seed/core/markdown/efforts/strength/wall-walk.json +1 -1
  563. package/dist/web/server/seed/core/markdown/efforts/strength/yoga-sun-salutation.json +1 -1
  564. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-assisted-sprint.json +1 -1
  565. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-backstroke.json +1 -1
  566. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-breaststroke-kick.json +1 -1
  567. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-breaststroke.json +1 -1
  568. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-butterfly.json +1 -1
  569. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-catch-up-drill.json +1 -1
  570. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-choice-stroke.json +1 -1
  571. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-dive-start.json +1 -1
  572. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-dolphin-kick.json +1 -1
  573. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-drafting.json +1 -1
  574. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-fingertip-drag.json +1 -1
  575. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-freestyle.json +1 -1
  576. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-individual-medley.json +1 -1
  577. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-kick.json +1 -1
  578. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-pull.json +1 -1
  579. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-resisted-sprint.json +1 -1
  580. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-rotation-drill.json +1 -1
  581. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-sighting.json +1 -1
  582. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-single-arm-drill.json +1 -1
  583. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-stroke-transition.json +1 -1
  584. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-two-kick-one-pull.json +1 -1
  585. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-vigorous.json +1 -1
  586. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming.json +1 -1
  587. package/dist/web/server/seed/core/markdown/efforts/unconventional/clubbell-arm-cast.json +1 -1
  588. package/dist/web/server/seed/core/markdown/efforts/unconventional/clubbell-circles.json +1 -1
  589. package/dist/web/server/seed/core/markdown/efforts/unconventional/clubbell-mill.json +1 -1
  590. package/dist/web/server/seed/core/markdown/efforts/unconventional/clubbell-reverse-mill.json +1 -1
  591. package/dist/web/server/seed/core/markdown/efforts/unconventional/clubbell-shield-cast.json +1 -1
  592. package/dist/web/server/seed/core/markdown/efforts/unconventional/macebell-10-to-2-swing.json +1 -1
  593. package/dist/web/server/seed/core/markdown/efforts/unconventional/macebell-360-swing.json +1 -1
  594. package/dist/web/server/seed/core/markdown/efforts/unconventional/macebell-barbarian-squat.json +1 -1
  595. package/dist/web/server/seed/core/markdown/efforts/unconventional/macebell-flow.json +1 -1
  596. package/dist/web/server/seed/core/markdown/efforts/unconventional/macebell-gravedigger.json +1 -1
  597. package/dist/web/server/seed/core/markdown/efforts/unconventional/macebell-touchdown.json +1 -1
  598. package/dist/web/server/seed/core/markdown/efforts/unconventional/sandbag-bear-hug-carry.json +1 -1
  599. package/dist/web/server/seed/core/markdown/efforts/unconventional/sandbag-bear-hug-extension.json +1 -1
  600. package/dist/web/server/seed/core/markdown/efforts/unconventional/sandbag-over-shoulder.json +1 -1
  601. package/dist/web/server/seed/core/markdown/efforts/walking/walking-3-mph.json +1 -1
  602. package/dist/web/server/seed/core/markdown/equipment/air-bike.json +1 -1
  603. package/dist/web/server/seed/core/markdown/equipment/barbell.json +1 -1
  604. package/dist/web/server/seed/core/markdown/equipment/bench.json +1 -1
  605. package/dist/web/server/seed/core/markdown/equipment/bike-erg.json +1 -1
  606. package/dist/web/server/seed/core/markdown/equipment/climbing-rope.json +1 -1
  607. package/dist/web/server/seed/core/markdown/equipment/clubs.json +1 -1
  608. package/dist/web/server/seed/core/markdown/equipment/dumbbell.json +1 -1
  609. package/dist/web/server/seed/core/markdown/equipment/ghd.json +1 -1
  610. package/dist/web/server/seed/core/markdown/equipment/gymnastic-rings.json +1 -1
  611. package/dist/web/server/seed/core/markdown/equipment/jump-rope.json +1 -1
  612. package/dist/web/server/seed/core/markdown/equipment/kettlebell.json +1 -1
  613. package/dist/web/server/seed/core/markdown/equipment/macebell.json +1 -1
  614. package/dist/web/server/seed/core/markdown/equipment/medicine-ball.json +1 -1
  615. package/dist/web/server/seed/core/markdown/equipment/parallettes.json +1 -1
  616. package/dist/web/server/seed/core/markdown/equipment/plyo-box.json +1 -1
  617. package/dist/web/server/seed/core/markdown/equipment/pull-up-bar.json +1 -1
  618. package/dist/web/server/seed/core/markdown/equipment/rower.json +1 -1
  619. package/dist/web/server/seed/core/markdown/equipment/sandbag.json +1 -1
  620. package/dist/web/server/seed/core/markdown/equipment/ski-erg.json +1 -1
  621. package/dist/web/server/seed/core/markdown/equipment/slam-ball.json +1 -1
  622. package/dist/web/server/seed/core/markdown/equipment/sled.json +1 -1
  623. package/dist/web/server/seed/core/markdown/equipment/sledgehammer.json +1 -1
  624. package/dist/web/server/seed/core/markdown/equipment/weight-vest.json +1 -1
  625. package/dist/web/server/seed/core/report.html +13 -13
  626. package/package.json +6 -6
  627. package/dist/chunk-WKU3MRQI.mjs.map +0 -1
  628. package/dist/server-HQJMA7BU.mjs +0 -13
  629. package/dist/web/playground/assets/main-CmNfdWYO.js +0 -1160
  630. package/dist/web/playground/assets/main-DedlsEjf.css +0 -2
  631. package/dist/web/server/assets/main-DJQ7VwVX.js +0 -1160
  632. package/dist/web/server/assets/main-DedlsEjf.css +0 -2
@@ -1,5 +1,5 @@
1
1
  import { createRequire } from 'module';
2
- import { createHandler } from './chunk-FNEN33GQ.mjs';
2
+ import { createHandler } from './chunk-W3JQPGSC.mjs';
3
3
  import { openCliDb, nodePath, nodeFs } from './chunk-FUISPA7A.mjs';
4
4
  import http from 'http';
5
5
  import { Readable } from 'stream';
@@ -167,5 +167,5 @@ async function runCliServer(mode, options, writeOut) {
167
167
  }
168
168
 
169
169
  export { runCliServer };
170
- //# sourceMappingURL=chunk-RVQB3DYE.mjs.map
171
- //# sourceMappingURL=chunk-RVQB3DYE.mjs.map
170
+ //# sourceMappingURL=chunk-TVSQRJKK.mjs.map
171
+ //# sourceMappingURL=chunk-TVSQRJKK.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli/server.ts"],"names":["dist"],"mappings":";;;;;;;;;AA8CA,SAAS,aAAA,GAAmB;AAC1B,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI,MAAA;AACJ,EAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAW,CAAC,KAAK,GAAA,KAAQ;AAC3C,IAAA,OAAA,GAAU,GAAA;AACV,IAAA,MAAA,GAAS,GAAA;AAAA,EACX,CAAC,CAAA;AACD,EAAA,OAAO,EAAE,OAAA,EAAS,OAAA,EAAS,MAAA,EAAO;AACpC;AAEA,SAAS,eAAA,CACP,OAAA,EACA,IAAA,EACA,IAAA,EACyB;AACzB,EAAA,MAAM,IAAK,UAAA,CAAoJ,GAAA;AAC/J,EAAA,IAAI,GAAG,KAAA,EAAO;AACZ,IAAA,MAAM,CAAA,GAAI,EAAE,KAAA,CAAM,EAAE,MAAM,QAAA,EAAU,IAAA,EAAM,KAAA,EAAO,OAAA,EAAS,CAAA;AAC1D,IAAA,OAAO,OAAA,CAAQ,QAAQ,EAAE,IAAA,EAAM,MAAM,CAAA,CAAE,IAAA,IAAQ,CAAA;AAAA,EACjD;AAGA,EAAA,MAAM,EAAE,OAAA,EAAS,OAAA,EAAS,MAAA,KAAW,aAAA,EAA8B;AACnE,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,YAAA,CAAa,OAAO,KAAK,GAAA,KAAQ;AACnD,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,GAAA,CAAI,OAAO,GAAA,EAAK,CAAA,OAAA,EAAU,GAAA,CAAI,OAAA,CAAQ,QAAQ,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,IAAI,EAAE,CAAA,CAAE,CAAA;AACrF,MAAA,MAAM,OAAA,GAAU,GAAA,CAAI,MAAA,KAAW,KAAA,IAAS,IAAI,MAAA,KAAW,MAAA;AACvD,MAAA,MAAM,MAAA,GAAS,IAAI,OAAA,CAAQ,GAAA,EAAK;AAAA,QAC9B,QAAQ,GAAA,CAAI,MAAA;AAAA,QACZ,SAAS,GAAA,CAAI,OAAA;AAAA,QACb,IAAA,EAAM,OAAA,GAAW,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,GAA4B,IAAA;AAAA,QAC/D,GAAI,OAAA,GAAU,EAAE,MAAA,EAAQ,MAAA,KAAW;AAAC,OACtB,CAAA;AAChB,MAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,MAAM,CAAA;AACnC,MAAA,GAAA,CAAI,SAAA,CAAU,OAAO,MAAA,EAAQ,MAAA,CAAO,YAAY,MAAA,CAAO,OAAA,CAAQ,OAAA,EAAS,CAAC,CAAA;AACzE,MAAA,IAAI,OAAO,IAAA,EAAM;AACf,QAAA,QAAA,CAAS,OAAA,CAAQ,MAAA,CAAO,IAAW,CAAA,CAAE,KAAK,GAAG,CAAA;AAAA,MAC/C,CAAA,MAAO;AACL,QAAA,GAAA,CAAI,GAAA,EAAI;AAAA,MACV;AAAA,IACF,CAAA,CAAA,MAAQ;AACN,MAAA,GAAA,CAAI,UAAA,GAAa,GAAA;AACjB,MAAA,GAAA,CAAI,IAAI,uBAAuB,CAAA;AAAA,IACjC;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAA,CAAO,IAAA,CAAK,SAAS,MAAM,CAAA;AAC3B,EAAA,MAAA,CAAO,MAAA,CAAO,IAAA,EAAM,IAAA,EAAM,MAAM;AAC9B,IAAA,OAAA,CAAQ;AAAA,MACN,MAAM,MAAM;AACV,QAAA,MAAM,QAAQ,aAAA,EAAoB;AAClC,QAAA,MAAA,CAAO,KAAA,CAAM,MAAM,KAAA,CAAM,OAAA,EAAS,CAAA;AAClC,QAAA,OAAO,KAAA,CAAM,OAAA;AAAA,MACf;AAAA,KACD,CAAA;AAAA,EACH,CAAC,CAAA;AACD,EAAA,OAAO,OAAA;AACT;AAQA,SAAS,SAAA,GAAoB;AAC3B,EAAA,MAAM,IAAI,QAAA,EAAS;AACnB,EAAA,MAAM,IAAA,GAAyC,MAAA,CAAA,IAAA;AAC/C,EAAA,IAAI,OAAO,KAAK,GAAA,KAAQ,QAAA,SAAiB,CAAA,CAAE,OAAA,CAAQ,KAAK,GAAG,CAAA;AAC3D,EAAA,IAAI,OAAO,KAAK,GAAA,KAAQ,QAAA,IAAY,KAAK,GAAA,CAAI,UAAA,CAAW,OAAO,CAAA,EAAG;AAChE,IAAA,OAAO,CAAA,CAAE,OAAA,CAAQ,CAAA,CAAE,OAAA,CAAQ,kBAAA,CAAmB,IAAI,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,GAAG,CAAA,CAAE,QAAQ,CAAC,CAAC,CAAA;AAAA,EACjF;AACA,EAAA,MAAM,IAAI,MAAM,+EAA+E,CAAA;AACjG;AAOA,SAAS,UAAA,GAAqB;AAC5B,EAAA,MAAM,IAAI,QAAA,EAAS;AACnB,EAAA,MAAM,KAAK,MAAA,EAAO;AAClB,EAAA,KAAA,IAAS,MAAM,SAAA,EAAU,IAAK,MAAM,CAAA,CAAE,OAAA,CAAQ,GAAG,CAAA,EAAG;AAClD,IAAA,IAAI;AACF,MAAA,IAAI,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,YAAA,CAAa,EAAE,OAAA,CAAQ,GAAA,EAAK,cAAc,CAAA,EAAG,MAAM,CAAC,CAAA,CAAE,IAAA,KAAS,+BAA+B,OAAO,GAAA;AAAA,IACzH,CAAA,CAAA,MAAQ;AAAA,IAAwC;AAChD,IAAA,MAAM,MAAA,GAAS,CAAA,CAAE,OAAA,CAAQ,GAAG,CAAA;AAC5B,IAAA,IAAI,WAAW,GAAA,EAAK;AAAA,EACtB;AACA,EAAA,MAAM,IAAI,MAAM,wFAAwF,CAAA;AAC1G;AAQA,SAAS,WAAA,CAAY,MAAqB,OAAA,EAAmC;AAC3E,EAAA,MAAM,IAAI,QAAA,EAAS;AACnB,EAAA,MAAM,QAAA,GAAW,QAAQ,IAAA,EAAM,IAAA,MAAU,OAAA,CAAQ,GAAA,CAAI,eAAA,EAAiB,IAAA,EAAK,IAAK,MAAA;AAChF,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,MAAMA,KAAAA,GAAO,CAAA,CAAE,OAAA,CAAQ,QAAQ,CAAA;AAC/B,IAAA,IAAI,CAAC,QAAO,CAAE,UAAA,CAAW,EAAE,OAAA,CAAQA,KAAAA,EAAM,YAAY,CAAC,CAAA,EAAG;AACvD,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,IAAA,EAAO,IAAI,CAAA,oCAAA,EAAuCA,KAAI,CAAA,mHAAA;AAAA,OAExD;AAAA,IACF;AACA,IAAA,OAAOA,KAAAA;AAAA,EACT;AACA,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,OAAA,CAAQ,UAAA,EAAW,EAAG,QAAQ,KAAA,EAAO,IAAA,KAAS,YAAA,GAAe,YAAA,GAAe,QAAQ,CAAA;AACnG,EAAA,IAAI,CAAC,QAAO,CAAE,UAAA,CAAW,EAAE,OAAA,CAAQ,IAAA,EAAM,YAAY,CAAC,CAAA,EAAG;AACvD,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,IAAA,EAAO,IAAI,CAAA,4CAAA,EAA0C,IAAI,CAAA,sLAAA;AAAA,KAG3D;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAGA,SAAS,WAAA,CAAY,MAAqB,OAAA,EAA2D;AACnG,EAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,EAAM,IAAA,MAAU,OAAA,CAAQ,GAAA,CAAI,IAAA,EAAM,IAAA,EAAK,IAAK,WAAA;AACjE,EAAA,MAAM,OAAA,GAAU,QAAQ,IAAA,EAAM,IAAA,MAAU,OAAA,CAAQ,GAAA,CAAI,IAAA,EAAM,IAAA,EAAK,IAAK,MAAA;AACpE,EAAA,MAAM,IAAA,GAAO,OAAO,OAAO,CAAA;AAC3B,EAAA,IAAI,CAAC,OAAO,SAAA,CAAU,IAAI,KAAK,IAAA,GAAO,CAAA,IAAK,OAAO,KAAA,EAAO;AACvD,IAAA,MAAM,IAAI,MAAM,CAAA,IAAA,EAAO,IAAI,kBAAkB,IAAA,CAAK,SAAA,CAAU,OAAO,CAAC,CAAA,wBAAA,CAA0B,CAAA;AAAA,EAChG;AACA,EAAA,OAAO,EAAE,MAAM,IAAA,EAAK;AACtB;AAOA,eAAsB,YAAA,CACpB,IAAA,EACA,OAAA,EACA,QAAA,EACe;AACf,EAAA,MAAM,EAAE,IAAA,EAAM,IAAA,EAAK,GAAI,WAAA,CAAY,MAAM,OAAO,CAAA;AAIhD,EAAA,IAAI,EAAA;AACJ,EAAA,IAAI,OAAA,GAAU,aAAA;AACd,EAAA,IAAI,SAAS,QAAA,EAAU;AACrB,IAAA,MAAM,WAAW,OAAA,CAAQ,QAAA;AACzB,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,MAAM,IAAI,MAAM,oHAA+G,CAAA;AAAA,IACjI;AACA,IAAA,IAAI;AACF,MAAA,EAAA,GAAK,MAAM,SAAA,CAAU,QAAA,EAAU,EAAE,UAAA,EAAY,OAAO,CAAA;AAAA,IACtD,SAAS,CAAA,EAAG;AACV,MAAA,MAAM,UAAU,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU,OAAO,CAAC,CAAA;AACzD,MAAA,MAAM,IAAI,MAAM,CAAA,8DAAA,EAA4D,OAAO,IAAI,EAAE,KAAA,EAAO,GAAG,CAAA;AAAA,IACrG;AACA,IAAA,OAAA,GAAU,EAAA,CAAG,IAAA;AAAA,EACf;AAEA,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,WAAA,CAAY,IAAA,EAAM,OAAO,CAAA;AAEtC,IAAA,MAAM,OAAA,GACJ,IAAA,KAAS,QAAA,IAAY,OAAA,CAAQ,QAAA,EAAU,IAAA,KAAS,QAAA,GAC5C,CAAA,EAAG,OAAA,CAAQ,QAAA,CAAS,IAAI,CAAA,KAAA,CAAA,GACxB,KAAA,CAAA;AACN,IAAA,MAAM,OAAA,GAAU,aAAA,CAAc,EAAA,EAAI,EAAA,IAAM,IAAA,EAAM;AAAA,MAC5C,cAAA,EAAgB,IAAA;AAAA,MAChB,OAAA;AAAA,MACA,aAAa,OAAA,CAAQ,WAAA,KAAgB,IAAA,IAAQ,OAAA,CAAQ,IAAI,gBAAA,KAAqB,GAAA;AAAA,MAC9E,QAAA,EAAU,OAAA,CAAQ,GAAA,CAAI,aAAA,EAAe,IAAA;AAAK,KAC3C,CAAA;AACD,IAAA,MAAA,GAAS,MAAM,eAAA,CAAgB,OAAA,EAAS,IAAA,EAAM,IAAI,CAAA;AAClD,IAAA,IAAI,SAAS,QAAA,EAAU;AACrB,MAAA,QAAA,CAAS,CAAA,mBAAA,EAAsB,IAAI,CAAA,CAAA,EAAI,IAAI,WAAM,OAAO,CAAA,WAAA,EAAW,IAAI,CAAA,CAAE,CAAA;AAAA,IAC3E,CAAA,MAAO;AACL,MAAA,QAAA,CAAS,0BAA0B,IAAI,CAAA,CAAA,EAAI,IAAI,CAAA,mDAAA,EAA8C,IAAI,CAAA,CAAE,CAAA;AAAA,IACrG;AAAA,EACF,SAAS,CAAA,EAAG;AACV,IAAA,IAAI,EAAA,EAAI,MAAM,EAAA,CAAG,KAAA,EAAM;AACvB,IAAA,MAAM,CAAA;AAAA,EACR;AAEA,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,MAAM,WAAW,YAA2B;AAC1C,IAAA,IAAI,OAAA,EAAS,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA;AAC3B,IAAA,OAAA,GAAU,IAAA;AACV,IAAA,IAAI;AACF,MAAA,MAAM,OAAO,IAAA,EAAK;AAAA,IACpB,CAAA,SAAE;AACA,MAAA,IAAI,EAAA,EAAI,MAAM,EAAA,CAAG,KAAA,EAAM;AACvB,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAAA,EACF,CAAA;AACA,EAAA,OAAA,CAAQ,EAAA,CAAG,UAAU,MAAM;AAAE,IAAA,KAAK,QAAA,EAAS;AAAA,EAAG,CAAC,CAAA;AAC/C,EAAA,OAAA,CAAQ,EAAA,CAAG,WAAW,MAAM;AAAE,IAAA,KAAK,QAAA,EAAS;AAAA,EAAG,CAAC,CAAA;AAGhD,EAAA,MAAM,IAAI,QAAe,MAAM;AAAA,EAAC,CAAC,CAAA;AACnC","file":"chunk-RVQB3DYE.mjs","sourcesContent":["/**\n * server.ts — `wod server` (alias `serve`) / `wod playground` (Bun-only front\n * door).\n *\n * Serves the packaged engine stack: the shared fetch handler shipped in this\n * package (the same code the Docker image serves) plus the frontend build\n * packaged under the engine's dist/web/ — no repository checkout, no runtime\n * build.\n *\n * server probes the configured database first (never creates schema —\n * that's `wod init`), then serves API + SPA.\n * playground serves the browser-storage SPA build and never opens a database\n * (every /api request answers 404).\n *\n * Retains the event loop until SIGINT/SIGTERM; shutdown drains in-flight\n * requests before closing the database.\n */\n\nimport http from 'node:http';\nimport { Readable } from 'node:stream';\nimport { openCliDb, nodeFs, nodePath } from './db';\nimport type { CliDatabaseConfig } from './config';\nimport type { CliDb } from './db';\nimport { createHandler } from '../server/app';\ntype WriteOut = (text: string) => void;\n\nexport type CliServerMode = 'server' | 'playground';\n\nexport interface CliServerOptions {\n /** Resolved database configuration. REQUIRED for 'server'; ignored — never\n * opened or validated — for 'playground'. */\n database?: CliDatabaseConfig;\n host?: string;\n port?: string;\n /** Explicit dist directory (flag or PLAYGROUND_DIST); must already exist. */\n dist?: string;\n /** Restrict `/api/mcp` to Tier 0 read-only tools. */\n mcpReadonly?: boolean;\n /** Merged CLI environment (process env + .env). */\n env: Record<string, string | undefined>;\n}\n\ninterface HttpServerLike {\n stop(): Promise<void>;\n}\n\nfunction withResolvers<T>() {\n let resolve!: (value: T | PromiseLike<T>) => void;\n let reject!: (reason?: unknown) => void;\n const promise = new Promise<T>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n return { promise, resolve, reject };\n}\n\nfunction startHttpServer(\n handler: (request: Request) => Promise<Response>,\n host: string,\n port: number,\n): Promise<HttpServerLike> {\n const b = (globalThis as { Bun?: { serve(opts: { port: number; hostname: string; fetch: (req: Request) => Promise<Response> }): { stop(): Promise<void> } } }).Bun;\n if (b?.serve) {\n const s = b.serve({ port, hostname: host, fetch: handler });\n return Promise.resolve({ stop: () => s.stop() });\n }\n\n // ponytail: node:http adapter streams Web Request/Response in pure Node (v18+) without express/fastify dependencies\n const { promise, resolve, reject } = withResolvers<HttpServerLike>();\n const server = http.createServer(async (req, res) => {\n try {\n const url = new URL(req.url || '/', `http://${req.headers.host || `${host}:${port}`}`);\n const hasBody = req.method !== 'GET' && req.method !== 'HEAD';\n const webReq = new Request(url, {\n method: req.method,\n headers: req.headers as Record<string, string>,\n body: hasBody ? (Readable.toWeb(req) as unknown as BodyInit) : null,\n ...(hasBody ? { duplex: 'half' } : {}),\n } as RequestInit);\n const webRes = await handler(webReq);\n res.writeHead(webRes.status, Object.fromEntries(webRes.headers.entries()));\n if (webRes.body) {\n Readable.fromWeb(webRes.body as any).pipe(res);\n } else {\n res.end();\n }\n } catch {\n res.statusCode = 500;\n res.end('internal server error');\n }\n });\n\n server.once('error', reject);\n server.listen(port, host, () => {\n resolve({\n stop: () => {\n const close = withResolvers<void>();\n server.close(() => close.resolve());\n return close.promise;\n },\n });\n });\n return promise;\n}\n\n/**\n * This module's directory, robust across shipped layouts: ESM via\n * import.meta.url (works under node and Bun; esbuild shims it in CJS too) and\n * Bun's import.meta.dir. ESM code splitting may relocate this module to a\n * chunk at dist/ root, so never assume dist/cli.\n */\nfunction moduleDir(): string {\n const p = nodePath();\n const meta: { dir?: unknown; url?: unknown } = import.meta; // Bun adds `dir`; the TS lib knows neither.\n if (typeof meta.dir === 'string') return p.resolve(meta.dir);\n if (typeof meta.url === 'string' && meta.url.startsWith('file:')) {\n return p.resolve(p.dirname(decodeURIComponent(new URL('.', meta.url).pathname)));\n }\n throw new Error('wod server/playground: cannot determine the installed engine module directory');\n}\n\n/**\n * The installed engine package root: nearest enclosing package.json belonging\n * to this package, walking up from the executing module (dist/cli, a split\n * chunk at dist/ root, dist/bin, or src/cli in a checkout).\n */\nfunction engineRoot(): string {\n const p = nodePath();\n const fs = nodeFs();\n for (let dir = moduleDir(); ; dir = p.dirname(dir)) {\n try {\n if (JSON.parse(fs.readFileSync(p.resolve(dir, 'package.json'), 'utf8')).name === '@bitcobblers/wod-wiki-tools') return dir;\n } catch { /* no manifest here — keep walking */ }\n const parent = p.dirname(dir);\n if (parent === dir) break;\n }\n throw new Error('wod server/playground: cannot locate the installed @bitcobblers/wod-wiki-tools package');\n}\n\n/**\n * Resolve the frontend dist directory. The packaged default lives inside the\n * installed engine module (dist/web/server or dist/web/playground); an\n * explicit --dist/PLAYGROUND_DIST is cwd-relative and must already contain a\n * built SPA (index.html). Nothing is built at runtime.\n */\nfunction resolveDist(mode: CliServerMode, options: CliServerOptions): string {\n const p = nodePath();\n const explicit = options.dist?.trim() || options.env.PLAYGROUND_DIST?.trim() || undefined;\n if (explicit) {\n const dist = p.resolve(explicit); // cwd-relative override\n if (!nodeFs().existsSync(p.resolve(dist, 'index.html'))) {\n throw new Error(\n `wod ${mode}: no built frontend (index.html) at ${dist} — --dist/PLAYGROUND_DIST must `\n + 'point at an already-built directory (the CLI never builds frontends at runtime)',\n );\n }\n return dist;\n }\n const dist = p.resolve(engineRoot(), 'dist', 'web', mode === 'playground' ? 'playground' : 'server');\n if (!nodeFs().existsSync(p.resolve(dist, 'index.html'))) {\n throw new Error(\n `wod ${mode}: packaged frontend missing — expected ${dist}/index.html. `\n + 'Reinstall @bitcobblers/wod-wiki-tools (bun add @bitcobblers/wod-wiki-tools), '\n + 'or rebuild the release assets from a checkout (bun run build:cli) and reinstall the package.',\n );\n }\n return dist;\n}\n\n/** Validate bind address first: flag > HOST/PORT env > loopback:3000. */\nfunction resolveBind(mode: CliServerMode, options: CliServerOptions): { host: string; port: number } {\n const host = options.host?.trim() || options.env.HOST?.trim() || '127.0.0.1';\n const rawPort = options.port?.trim() || options.env.PORT?.trim() || '3000';\n const port = Number(rawPort);\n if (!Number.isInteger(port) || port < 1 || port > 65535) {\n throw new Error(`wod ${mode}: invalid port ${JSON.stringify(rawPort)} (need integer 1..65535)`);\n }\n return { host, port };\n}\n\n/**\n * Start the shared server for `wod server` / `wod playground`. Throws on any\n * startup failure; on success it never returns until SIGINT/SIGTERM (drain,\n * close database, exit 0).\n */\nexport async function runCliServer(\n mode: CliServerMode,\n options: CliServerOptions,\n writeOut: WriteOut,\n): Promise<void> {\n const { host, port } = resolveBind(mode, options); // Validate bind before opening anything.\n\n // Server probes the database BEFORE binding a socket: a missing/uninitialized\n // database refuses with `wod init` guidance.\n let db: CliDb | undefined;\n let dbLabel = 'no database';\n if (mode === 'server') {\n const database = options.database; // hoisted so the guard's narrowing sticks\n if (!database) {\n throw new Error('wod server: no database configuration resolved — this is a runner bug (expected resolveDatabaseConfig output)');\n }\n try {\n db = await openCliDb(database, { initialize: false });\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n throw new Error(`wod server: database not ready — run \\`wod init\\` first. ${message}`, { cause: e });\n }\n dbLabel = db.path;\n }\n\n let server: HttpServerLike;\n try {\n const dist = resolveDist(mode, options);\n // Bundled server handler; persist self-hosted published feed next to local SQLite DB when applicable\n const feedDir =\n mode === 'server' && options.database?.kind === 'sqlite'\n ? `${options.database.path}.feed`\n : undefined;\n const handler = createHandler(db?.db ?? null, {\n playgroundDist: dist,\n feedDir,\n mcpReadonly: options.mcpReadonly === true || options.env.WOD_MCP_READONLY === '1',\n mcpToken: options.env.WOD_MCP_TOKEN?.trim(),\n });\n server = await startHttpServer(handler, host, port);\n if (mode === 'server') {\n writeOut(`wod server: http://${host}:${port} — ${dbLabel} · dist ${dist}`);\n } else {\n writeOut(`wod playground: http://${host}:${port} — in-browser storage (no database) · dist ${dist}`);\n }\n } catch (e) {\n if (db) await db.close(); // never leak the probe connection when startup fails\n throw e;\n }\n\n let closing = false;\n const shutdown = async (): Promise<void> => {\n if (closing) process.exit(0); // second signal forces the exit\n closing = true;\n try {\n await server.stop();\n } finally {\n if (db) await db.close();\n process.exit(0);\n }\n };\n process.on('SIGINT', () => { void shutdown(); });\n process.on('SIGTERM', () => { void shutdown(); });\n\n // Park until a signal handler exits the process.\n await new Promise<never>(() => {});\n}\n"]}
1
+ {"version":3,"sources":["../src/cli/server.ts"],"names":["dist"],"mappings":"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","file":"chunk-TVSQRJKK.mjs","sourcesContent":["/**\n * server.ts — `wod server` (alias `serve`) / `wod playground` (Bun-only front\n * door).\n *\n * Serves the packaged engine stack: the shared fetch handler shipped in this\n * package (the same code the Docker image serves) plus the frontend build\n * packaged under the engine's dist/web/ — no repository checkout, no runtime\n * build.\n *\n * server probes the configured database first (never creates schema —\n * that's `wod init`), then serves API + SPA.\n * playground serves the browser-storage SPA build and never opens a database\n * (every /api request answers 404).\n *\n * Retains the event loop until SIGINT/SIGTERM; shutdown drains in-flight\n * requests before closing the database.\n */\n\nimport http from 'node:http';\nimport { Readable } from 'node:stream';\nimport { openCliDb, nodeFs, nodePath } from './db';\nimport type { CliDatabaseConfig } from './config';\nimport type { CliDb } from './db';\nimport { createHandler } from '../server/app';\ntype WriteOut = (text: string) => void;\n\nexport type CliServerMode = 'server' | 'playground';\n\nexport interface CliServerOptions {\n /** Resolved database configuration. REQUIRED for 'server'; ignored — never\n * opened or validated — for 'playground'. */\n database?: CliDatabaseConfig;\n host?: string;\n port?: string;\n /** Explicit dist directory (flag or PLAYGROUND_DIST); must already exist. */\n dist?: string;\n /** Restrict `/api/mcp` to Tier 0 read-only tools. */\n mcpReadonly?: boolean;\n /** Merged CLI environment (process env + .env). */\n env: Record<string, string | undefined>;\n}\n\ninterface HttpServerLike {\n stop(): Promise<void>;\n}\n\nfunction withResolvers<T>() {\n let resolve!: (value: T | PromiseLike<T>) => void;\n let reject!: (reason?: unknown) => void;\n const promise = new Promise<T>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n return { promise, resolve, reject };\n}\n\nfunction startHttpServer(\n handler: (request: Request) => Promise<Response>,\n host: string,\n port: number,\n): Promise<HttpServerLike> {\n const b = (globalThis as { Bun?: { serve(opts: { port: number; hostname: string; fetch: (req: Request) => Promise<Response> }): { stop(): Promise<void> } } }).Bun;\n if (b?.serve) {\n const s = b.serve({ port, hostname: host, fetch: handler });\n return Promise.resolve({ stop: () => s.stop() });\n }\n\n // ponytail: node:http adapter streams Web Request/Response in pure Node (v18+) without express/fastify dependencies\n const { promise, resolve, reject } = withResolvers<HttpServerLike>();\n const server = http.createServer(async (req, res) => {\n try {\n const url = new URL(req.url || '/', `http://${req.headers.host || `${host}:${port}`}`);\n const hasBody = req.method !== 'GET' && req.method !== 'HEAD';\n const webReq = new Request(url, {\n method: req.method,\n headers: req.headers as Record<string, string>,\n body: hasBody ? (Readable.toWeb(req) as unknown as BodyInit) : null,\n ...(hasBody ? { duplex: 'half' } : {}),\n } as RequestInit);\n const webRes = await handler(webReq);\n res.writeHead(webRes.status, Object.fromEntries(webRes.headers.entries()));\n if (webRes.body) {\n Readable.fromWeb(webRes.body as any).pipe(res);\n } else {\n res.end();\n }\n } catch {\n res.statusCode = 500;\n res.end('internal server error');\n }\n });\n\n server.once('error', reject);\n server.listen(port, host, () => {\n resolve({\n stop: () => {\n const close = withResolvers<void>();\n server.close(() => close.resolve());\n return close.promise;\n },\n });\n });\n return promise;\n}\n\n/**\n * This module's directory, robust across shipped layouts: ESM via\n * import.meta.url (works under node and Bun; esbuild shims it in CJS too) and\n * Bun's import.meta.dir. ESM code splitting may relocate this module to a\n * chunk at dist/ root, so never assume dist/cli.\n */\nfunction moduleDir(): string {\n const p = nodePath();\n const meta: { dir?: unknown; url?: unknown } = import.meta; // Bun adds `dir`; the TS lib knows neither.\n if (typeof meta.dir === 'string') return p.resolve(meta.dir);\n if (typeof meta.url === 'string' && meta.url.startsWith('file:')) {\n return p.resolve(p.dirname(decodeURIComponent(new URL('.', meta.url).pathname)));\n }\n throw new Error('wod server/playground: cannot determine the installed engine module directory');\n}\n\n/**\n * The installed engine package root: nearest enclosing package.json belonging\n * to this package, walking up from the executing module (dist/cli, a split\n * chunk at dist/ root, dist/bin, or src/cli in a checkout).\n */\nfunction engineRoot(): string {\n const p = nodePath();\n const fs = nodeFs();\n for (let dir = moduleDir(); ; dir = p.dirname(dir)) {\n try {\n if (JSON.parse(fs.readFileSync(p.resolve(dir, 'package.json'), 'utf8')).name === '@bitcobblers/wod-wiki-tools') return dir;\n } catch { /* no manifest here — keep walking */ }\n const parent = p.dirname(dir);\n if (parent === dir) break;\n }\n throw new Error('wod server/playground: cannot locate the installed @bitcobblers/wod-wiki-tools package');\n}\n\n/**\n * Resolve the frontend dist directory. The packaged default lives inside the\n * installed engine module (dist/web/server or dist/web/playground); an\n * explicit --dist/PLAYGROUND_DIST is cwd-relative and must already contain a\n * built SPA (index.html). Nothing is built at runtime.\n */\nfunction resolveDist(mode: CliServerMode, options: CliServerOptions): string {\n const p = nodePath();\n const explicit = options.dist?.trim() || options.env.PLAYGROUND_DIST?.trim() || undefined;\n if (explicit) {\n const dist = p.resolve(explicit); // cwd-relative override\n if (!nodeFs().existsSync(p.resolve(dist, 'index.html'))) {\n throw new Error(\n `wod ${mode}: no built frontend (index.html) at ${dist} — --dist/PLAYGROUND_DIST must `\n + 'point at an already-built directory (the CLI never builds frontends at runtime)',\n );\n }\n return dist;\n }\n const dist = p.resolve(engineRoot(), 'dist', 'web', mode === 'playground' ? 'playground' : 'server');\n if (!nodeFs().existsSync(p.resolve(dist, 'index.html'))) {\n throw new Error(\n `wod ${mode}: packaged frontend missing — expected ${dist}/index.html. `\n + 'Reinstall @bitcobblers/wod-wiki-tools (bun add @bitcobblers/wod-wiki-tools), '\n + 'or rebuild the release assets from a checkout (bun run build:cli) and reinstall the package.',\n );\n }\n return dist;\n}\n\n/** Validate bind address first: flag > HOST/PORT env > loopback:3000. */\nfunction resolveBind(mode: CliServerMode, options: CliServerOptions): { host: string; port: number } {\n const host = options.host?.trim() || options.env.HOST?.trim() || '127.0.0.1';\n const rawPort = options.port?.trim() || options.env.PORT?.trim() || '3000';\n const port = Number(rawPort);\n if (!Number.isInteger(port) || port < 1 || port > 65535) {\n throw new Error(`wod ${mode}: invalid port ${JSON.stringify(rawPort)} (need integer 1..65535)`);\n }\n return { host, port };\n}\n\n/**\n * Start the shared server for `wod server` / `wod playground`. Throws on any\n * startup failure; on success it never returns until SIGINT/SIGTERM (drain,\n * close database, exit 0).\n */\nexport async function runCliServer(\n mode: CliServerMode,\n options: CliServerOptions,\n writeOut: WriteOut,\n): Promise<void> {\n const { host, port } = resolveBind(mode, options); // Validate bind before opening anything.\n\n // Server probes the database BEFORE binding a socket: a missing/uninitialized\n // database refuses with `wod init` guidance.\n let db: CliDb | undefined;\n let dbLabel = 'no database';\n if (mode === 'server') {\n const database = options.database; // hoisted so the guard's narrowing sticks\n if (!database) {\n throw new Error('wod server: no database configuration resolved — this is a runner bug (expected resolveDatabaseConfig output)');\n }\n try {\n db = await openCliDb(database, { initialize: false });\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n throw new Error(`wod server: database not ready — run \\`wod init\\` first. ${message}`, { cause: e });\n }\n dbLabel = db.path;\n }\n\n let server: HttpServerLike;\n try {\n const dist = resolveDist(mode, options);\n // Bundled server handler; persist self-hosted published feed next to local SQLite DB when applicable\n const feedDir =\n mode === 'server' && options.database?.kind === 'sqlite'\n ? `${options.database.path}.feed`\n : undefined;\n const handler = createHandler(db?.db ?? null, {\n playgroundDist: dist,\n feedDir,\n mcpReadonly: options.mcpReadonly === true || options.env.WOD_MCP_READONLY === '1',\n mcpToken: options.env.WOD_MCP_TOKEN?.trim(),\n });\n server = await startHttpServer(handler, host, port);\n if (mode === 'server') {\n writeOut(`wod server: http://${host}:${port} — ${dbLabel} · dist ${dist}`);\n } else {\n writeOut(`wod playground: http://${host}:${port} — in-browser storage (no database) · dist ${dist}`);\n }\n } catch (e) {\n if (db) await db.close(); // never leak the probe connection when startup fails\n throw e;\n }\n\n let closing = false;\n const shutdown = async (): Promise<void> => {\n if (closing) process.exit(0); // second signal forces the exit\n closing = true;\n try {\n await server.stop();\n } finally {\n if (db) await db.close();\n process.exit(0);\n }\n };\n process.on('SIGINT', () => { void shutdown(); });\n process.on('SIGTERM', () => { void shutdown(); });\n\n // Park until a signal handler exits the process.\n await new Promise<never>(() => {});\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import { createRequire } from 'module';
2
- import { createWodMcpServer } from './chunk-67JAEWEF.mjs';
2
+ import { createWodMcpServer } from './chunk-4P7CJBE6.mjs';
3
3
  import { NodeFsFeedTree } from './chunk-FUISPA7A.mjs';
4
4
  import { resolve, sep, join } from 'path';
5
5
  import { stat, realpath } from 'fs/promises';
@@ -476,5 +476,5 @@ function createHandler(db, options) {
476
476
  }
477
477
 
478
478
  export { createHandler, handleMcpHttpRequest };
479
- //# sourceMappingURL=chunk-FNEN33GQ.mjs.map
480
- //# sourceMappingURL=chunk-FNEN33GQ.mjs.map
479
+ //# sourceMappingURL=chunk-W3JQPGSC.mjs.map
480
+ //# sourceMappingURL=chunk-W3JQPGSC.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/server/errors.ts","../src/mcp/httpHandler.ts","../src/server/app.ts"],"names":["SqlStorage"],"mappings":"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","file":"chunk-FNEN33GQ.mjs","sourcesContent":["/**\n * errors.ts — the single HTTP error type every layer throws; app.ts maps it\n * to the wire's { error, code? } JSON with the matching status.\n */\nexport class HttpError extends Error {\n constructor(readonly status: number, message: string, readonly code?: string) {\n super(message);\n this.name = 'HttpError';\n }\n}\n","import { WebStandardStreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/webStandardStreamableHttp.js';\nimport { SqlStorage, type Database } from '@bitcobblers/wod-wiki-storage/sql';\nimport type { FeedTree } from '@bitcobblers/wod-wiki-engine';\nimport { createWodMcpServer } from './createWodMcpServer';\n\nconst MCP_CORS_HEADERS: Record<string, string> = {\n 'access-control-allow-origin': '*',\n 'access-control-allow-methods': 'GET, POST, DELETE, OPTIONS',\n 'access-control-allow-headers': 'Content-Type, Accept, Authorization, Mcp-Session-Id, MCP-Protocol-Version, Last-Event-ID',\n 'access-control-expose-headers': 'Mcp-Session-Id, MCP-Protocol-Version',\n};\n\nfunction withMcpCors(response: Response): Response {\n const headers = new Headers(response.headers);\n for (const [k, v] of Object.entries(MCP_CORS_HEADERS)) {\n if (!headers.has(k)) {\n headers.set(k, v);\n }\n }\n return new Response(response.body, {\n status: response.status,\n statusText: response.statusText,\n headers,\n });\n}\n\nfunction normalizeAcceptForPost(request: Request): Request {\n if (request.method !== 'POST') return request;\n const accept = request.headers.get('accept') ?? '';\n if (accept.includes('application/json') && accept.includes('text/event-stream')) {\n return request;\n }\n const headers = new Headers(request.headers);\n headers.set('accept', 'application/json, text/event-stream');\n return new Request(request, { headers });\n}\n\nexport interface HandleMcpHttpOptions {\n db: Database;\n feedTree: FeedTree;\n baseUrl: string;\n readonly?: boolean;\n authToken?: string;\n}\n\n/**\n * Handles Web-Standard Streamable HTTP MCP requests at `/api/mcp`.\n * Uses stateless per-request `WebStandardStreamableHTTPServerTransport` with\n * `enableJsonResponse: true` so both official MCP SDK clients and plain HTTP\n * JSON-RPC clients work out of the box without sticky session requirements.\n */\nexport async function handleMcpHttpRequest(\n request: Request,\n options: HandleMcpHttpOptions,\n): Promise<Response> {\n if (request.method === 'OPTIONS') {\n return new Response(null, { status: 204, headers: MCP_CORS_HEADERS });\n }\n\n const expectedToken = options.authToken ?? process.env.WOD_MCP_TOKEN?.trim();\n if (expectedToken) {\n const authHeader = request.headers.get('authorization') ?? '';\n const bearer = authHeader.startsWith('Bearer ') ? authHeader.slice('Bearer '.length).trim() : '';\n if (bearer !== expectedToken) {\n return withMcpCors(\n new Response(\n JSON.stringify({\n jsonrpc: '2.0',\n error: { code: -32001, message: 'Unauthorized: missing or invalid Bearer token' },\n id: null,\n }),\n { status: 401, headers: { 'content-type': 'application/json' } },\n ),\n );\n }\n }\n\n const storage = new SqlStorage(options.db);\n const server = createWodMcpServer({\n storage,\n feedTree: options.feedTree,\n baseUrl: options.baseUrl,\n readonly: options.readonly ?? process.env.WOD_MCP_READONLY === '1',\n });\n\n const transport = new WebStandardStreamableHTTPServerTransport({\n sessionIdGenerator: undefined,\n enableJsonResponse: true,\n });\n\n await server.connect(transport);\n try {\n const normalizedReq = normalizeAcceptForPost(request);\n const response = await transport.handleRequest(normalizedReq);\n return withMcpCors(response);\n } finally {\n await transport.close().catch(() => {});\n await server.close().catch(() => {});\n }\n}\n","/**\n * app.ts — one native fetch handler for the whole surface:\n * GET /api/health\n * GET /api/v1/:store/get?key= GET /api/v1/:store/all?range=&count=\n * GET /api/v1/:store/index/:idx?range=&count=\n * GET /api/v1/:store/count?range=&index=\n * PUT /api/v1/:store {value} DELETE /api/v1/:store?key=\n * POST /api/v1/:store/clear POST /api/v1/tx {ops}\n * POST /api/v1/wipe POST /api/v1/query\n * everything else: static SPA serving from playgroundDist (asset miss with an\n * extension → 404; extensionless → index.html; traversal/symlink escapes →\n * 403; /api never falls through to the SPA).\n *\n * `db` may be null for the CLI playground mode: static SPA serving only, every\n * /api request answers 404 — the playground never touches a server database.\n */\n\nimport { join, resolve, sep } from 'node:path';\nimport { stat, realpath } from 'node:fs/promises';\nimport { realpathSync, createReadStream } from 'node:fs';\nimport { Readable } from 'node:stream';\nimport { HttpError } from './errors';\nimport {\n SqlStorage,\n handleDomainQuery,\n refreshDomain,\n wipeDomain,\n MAX_BODY,\n StorageError,\n storeDefinition,\n getRow,\n listRows,\n countRows,\n wipeRows,\n type Database,\n} from '@bitcobblers/wod-wiki-storage/sql';\nimport { keyFromValue, type KeyDTO, type RangeDTO, type TxOp } from '@bitcobblers/wod-wiki-storage';\nimport {\n FeedTreeError,\n MemoryFeedTree,\n checkUnpublishedFeedChanges,\n publishFeedFromStorage,\n type FeedTree,\n} from '@bitcobblers/wod-wiki-engine';\nimport { exportAgentCapabilitiesManifest } from '@bitcobblers/wod-wiki-engine/agent';\nimport { NodeFsFeedTree } from '../cli/nodeFeedTree';\nimport { handleMcpHttpRequest } from '../mcp/httpHandler';\nconst json = (value: unknown, status: number): Response =>\n new Response(JSON.stringify(value), { status, headers: { 'content-type': 'application/json' } });\n\nfunction streamFile(path: string): BodyInit {\n const bun = (globalThis as { Bun?: { file(p: string): BodyInit } }).Bun;\n if (bun?.file) return bun.file(path);\n // ponytail: node:fs Readable.toWeb streams files in pure Node.js (v18+) without dependencies\n return Readable.toWeb(createReadStream(path)) as unknown as BodyInit;\n}\n\nconst plain = (body: string, status: number): Response =>\n new Response(body, { status, headers: { 'content-type': 'text/plain; charset=utf-8' } });\n\nconst notFound = (): Response => json({ error: 'not found' }, 404);\nconst methodNotAllowed = (): Response => json({ error: 'method not allowed' }, 405);\n\nconst noContent = (): Response => new Response(null, { status: 204 });\n\n/** URLSearchParams already applies the form-urlencoded '+' → space then %XX\n * decoding the wire contract relies on. */\nconst qget = (url: URL, name: string): string | undefined => url.searchParams.get(name) ?? undefined;\n\nfunction jsonParam(url: URL, name: string): unknown {\n const raw = qget(url, name);\n if (raw === undefined) return undefined;\n try {\n return JSON.parse(raw) as unknown;\n } catch {\n throw new HttpError(400, `invalid JSON in ?${name}`);\n }\n}\n\n/** ?range accepts a RangeDTO object or a bare key (scalar/tuple → {only}). */\nfunction rangeParam(url: URL): RangeDTO | undefined {\n const v = jsonParam(url, 'range');\n if (v === undefined) return undefined;\n if (v !== null && typeof v === 'object' && !Array.isArray(v)) return v as RangeDTO;\n return { only: v as KeyDTO };\n}\n\nfunction countParam(url: URL): number | undefined {\n const raw = qget(url, 'count');\n if (raw === undefined) return undefined;\n const n = Number(raw); // Number('') === 0, matching the wire contract\n if (!Number.isFinite(n) || n < 0) throw new HttpError(400, 'invalid ?count');\n return Math.trunc(n);\n}\n\nasync function readJsonBody(req: Request, maxBytes?: number): Promise<unknown> {\n const body = await req.text();\n if (maxBytes !== undefined && body.length > maxBytes) {\n throw new HttpError(413, `domain query body exceeds ${maxBytes} bytes`);\n }\n try {\n return JSON.parse(body) as unknown;\n } catch {\n throw new HttpError(400, 'body must be valid JSON');\n }\n}\n\nfunction txOps(value: unknown): TxOp[] {\n if (!Array.isArray(value)) throw new HttpError(400, 'tx body must be {ops: []}');\n return value.map((op: unknown): TxOp => {\n if (op === null || typeof op !== 'object' || Array.isArray(op) || !('store' in op) || typeof op.store !== 'string' || !('op' in op)) {\n throw new HttpError(400, 'tx op must have a store and operation');\n }\n const def = storeDefinition(op.store);\n const store = def.name;\n switch (op.op) {\n case 'put':\n if (!('value' in op)) throw new HttpError(400, 'put requires value');\n return { op: 'put', store, value: op.value };\n case 'delete':\n if (!('key' in op)) throw new HttpError(400, 'delete requires key');\n return { op: 'delete', store, key: op.key as KeyDTO };\n case 'clear':\n return { op: 'clear', store };\n case 'check': {\n if (!('key' in op) || !('value' in op)) throw new HttpError(400, 'check requires key and value');\n const scalar = (key: unknown): key is string | number => typeof key === 'string' || (typeof key === 'number' && Number.isFinite(key));\n if (!scalar(op.key) && !(Array.isArray(op.key) && op.key.length > 0 && op.key.every(scalar))) {\n throw new HttpError(400, 'check requires a scalar key or non-empty scalar tuple');\n }\n if (op.value !== null && (typeof op.value !== 'object' || Array.isArray(op.value))) {\n throw new HttpError(400, 'check value must be a row or null');\n }\n const parts = Array.isArray(op.key) ? op.key : [op.key];\n if (parts.length !== def.keyPath.length) throw new HttpError(400, 'check key arity must match the store');\n if (op.value !== null) {\n let rowKey: KeyDTO;\n try { rowKey = keyFromValue(def, op.value); }\n catch { throw new HttpError(400, 'check row must have its primary key'); }\n if (JSON.stringify(rowKey) !== JSON.stringify(op.key)) throw new HttpError(400, 'check row primary key must match key');\n }\n return { op: 'check', store, key: op.key, value: op.value };\n }\n default:\n throw new HttpError(400, 'tx op must be put | delete | clear | check');\n }\n });\n}\n\n// ── Static SPA serving ───────────────────────────────────────────────────────\n\nconst MIME: Record<string, string> = {\n html: 'text/html; charset=utf-8',\n js: 'text/javascript; charset=utf-8',\n mjs: 'text/javascript; charset=utf-8',\n css: 'text/css; charset=utf-8',\n json: 'application/json; charset=utf-8',\n map: 'application/json; charset=utf-8',\n svg: 'image/svg+xml',\n png: 'image/png',\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n webp: 'image/webp',\n ico: 'image/x-icon',\n woff: 'font/woff',\n woff2: 'font/woff2',\n ttf: 'font/ttf',\n mp3: 'audio/mpeg',\n wav: 'audio/wav',\n webmanifest: 'application/manifest+json',\n xml: 'application/xml',\n txt: 'text/plain; charset=utf-8',\n md: 'text/markdown; charset=utf-8',\n jsonl: 'application/x-ndjson; charset=utf-8',\n csv: 'text/csv; charset=utf-8',\n};\n\nasync function realpathSafe(path: string): Promise<string | undefined> {\n try {\n return await realpath(path);\n } catch {\n return undefined;\n }\n}\n\nasync function serveFile(real: string, rel: string): Promise<Response> {\n // Seed chunks are content-hashed; everything else revalidates.\n const cache = rel.includes('seed/chunks/')\n ? 'public, max-age=31536000, immutable'\n : 'no-cache';\n const ext = rel.slice(rel.lastIndexOf('.') + 1).toLowerCase();\n return new Response(streamFile(real), {\n headers: { 'content-type': MIME[ext] ?? 'application/octet-stream', 'cache-control': cache },\n });\n}\n\nasync function serveSpaShell(distRoot: string): Promise<Response | undefined> {\n const index = await realpathSafe(join(distRoot, 'index.html'));\n // Same symlink confinement as assets: a dist/index.html symlink pointing\n // outside must not become the shell.\n if (index && (index === distRoot || index.startsWith(distRoot + sep))\n && (await stat(index).then((s) => s.isFile(), () => false))) {\n return new Response(streamFile(index), {\n headers: { 'content-type': MIME.html, 'cache-control': 'no-cache' },\n });\n }\n return undefined;\n}\n\nasync function staticResponse(distRoot: string | undefined, method: string, pathname: string): Promise<Response> {\n if (method !== 'GET') return plain('method not allowed', 405);\n if (!distRoot) {\n return plain('wod-wiki-api: playground dist not found. Set PLAYGROUND_DIST or run the playground server build.', 503);\n }\n let rel: string;\n try {\n rel = decodeURIComponent(pathname).replace(/^\\/+/, '');\n } catch {\n return plain('bad request', 400);\n }\n if (rel === '') rel = 'index.html';\n const parts = rel.split('/');\n if (parts.some((p) => p === '..')) return plain('forbidden', 403);\n const base = parts[parts.length - 1] ?? '';\n const hasExtension = base.includes('.');\n\n const abs = resolve(distRoot, ...parts);\n const real = await realpathSafe(abs);\n // Symlink confinement: serve only paths that really live under the dist root.\n if (real && (real === distRoot || real.startsWith(distRoot + sep))) {\n const info = await stat(real).then((s) => s.isFile(), () => false);\n if (info) return serveFile(real, rel);\n }\n // SPA fallback: extensionless paths render the app shell.\n if (!hasExtension) {\n const shell = await serveSpaShell(distRoot);\n if (shell) return shell;\n }\n return plain('not found', 404);\n}\n\n// ── API routing ──────────────────────────────────────────────────────────────\n\nasync function storeRoutes(db: Database, method: string, sub: string, url: URL, req: Request): Promise<Response> {\n let inner = sub.slice('/v1/'.length);\n if (inner.endsWith('/')) inner = inner.slice(0, -1);\n if (inner === '') return notFound();\n const segments = inner.split('/');\n let name: string;\n let action: string | undefined;\n if (segments.length === 1) {\n name = segments[0];\n } else if (segments.length === 2) {\n [name, action] = segments;\n } else if (segments.length === 3 && segments[1] === 'index' && segments[2] !== '') {\n [name, , action] = segments;\n action = `index/${action}`;\n } else {\n return notFound();\n }\n const def = storeDefinition(name); // 404 for unknown stores\n\n const range = rangeParam(url);\n const count = countParam(url);\n\n if (action === 'get' && method === 'GET') {\n const key = jsonParam(url, 'key');\n if (key === undefined) throw new HttpError(400, 'missing ?key');\n const row = await getRow(db, def, key as KeyDTO);\n return row === undefined ? notFound() : json(row, 200);\n }\n if (action === 'all' && method === 'GET') {\n return json(await listRows(db, def, range, count), 200);\n }\n if (action === 'count' && method === 'GET') {\n const indexName = qget(url, 'index');\n const n = indexName\n ? await countRows(db, def, range, indexName)\n : await countRows(db, def, range);\n return json({ count: Number(n) }, 200);\n }\n if (action === 'clear' && method === 'POST') {\n await db.transaction((tx) => refreshDomain(tx, [{ op: 'clear', store: def.name }]));\n return noContent();\n }\n if (action?.startsWith('index/') && method === 'GET') {\n return json(await listRows(db, def, range, count, action.slice('index/'.length)), 200);\n }\n if (action === undefined && method === 'PUT') {\n const parsed = await readJsonBody(req);\n const value = typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed) && 'value' in parsed\n ? parsed.value\n : undefined;\n if (value === undefined) throw new HttpError(400, 'body must be {value: ...}');\n const [key] = await db.transaction((tx) => refreshDomain(tx, [{ op: 'put', store: def.name, value }]));\n return json({ key }, 200);\n }\n if (action === undefined && method === 'DELETE') {\n const keyParam = jsonParam(url, 'key');\n const target = keyParam !== undefined ? keyParam : range;\n if (target === undefined || target === null) throw new HttpError(400, 'DELETE requires ?key or ?range');\n // Wire DELETE accepts a key or a range; the TxOp delete variant types the\n // narrower KeyDTO even though deleteRows honours both.\n await db.transaction((tx) => refreshDomain(tx, [{ op: 'delete', store: def.name, key: target as KeyDTO }]));\n return noContent();\n }\n return methodNotAllowed();\n}\n\nfunction isPublishedFeedAssetPath(pathname: string): string | null {\n if (pathname === '/feed' || pathname === '/feed/') return 'index.html';\n if (!pathname.startsWith('/feed/')) return null;\n const sub = pathname.slice('/feed/'.length);\n if (\n sub === 'index.html' ||\n sub === 'manifest.json' ||\n sub === 'report.html' ||\n sub.startsWith('chunks/') ||\n sub.startsWith('indexes/') ||\n sub.startsWith('markdown/')\n ) {\n return sub;\n }\n return null;\n}\n\nasync function servePublishedFeed(feedTree: FeedTree, method: string, relPath: string): Promise<Response> {\n if (method === 'OPTIONS') {\n return new Response(null, {\n status: 204,\n headers: {\n 'access-control-allow-origin': '*',\n 'access-control-allow-methods': 'GET, HEAD, OPTIONS',\n },\n });\n }\n if (method !== 'GET') return methodNotAllowed();\n try {\n const decoded = decodeURIComponent(relPath);\n const bytes = await feedTree.read(decoded);\n const ext = decoded.includes('.') ? decoded.slice(decoded.lastIndexOf('.') + 1).toLowerCase() : 'html';\n const cache = decoded.startsWith('chunks/')\n ? 'public, max-age=31536000, immutable'\n : 'no-cache';\n const copy = new Uint8Array(bytes.byteLength);\n copy.set(bytes);\n return new Response(copy.buffer, {\n status: 200,\n headers: {\n 'content-type': MIME[ext] ?? 'application/octet-stream',\n 'cache-control': cache,\n 'access-control-allow-origin': '*',\n },\n });\n } catch (err) {\n if (err instanceof FeedTreeError && err.code === 'not-found') return notFound();\n if (err instanceof FeedTreeError && err.code === 'layout') return plain('forbidden', 403);\n throw err;\n }\n}\n\nasync function apiRoutes(\n db: Database,\n feedTree: FeedTree,\n req: Request,\n method: string,\n sub: string,\n url: URL,\n mcpOptions?: { readonly?: boolean; authToken?: string },\n): Promise<Response> {\n if (sub === '/health') {\n return json({ ok: true, driver: db.dialect }, 200);\n }\n if (sub === '/mcp') {\n return handleMcpHttpRequest(req, {\n db,\n feedTree,\n baseUrl: url.origin,\n readonly: mcpOptions?.readonly,\n authToken: mcpOptions?.authToken,\n });\n }\n if (sub === '/v1/feed/status' && method === 'GET') {\n const storage = new SqlStorage(db);\n const status = await checkUnpublishedFeedChanges(storage, feedTree);\n return json({ ...status, feedUrl: `${url.origin}/feed/` }, 200);\n }\n if (sub === '/v1/feed/publish' && method === 'POST') {\n const body = req.headers.get('content-length') === '0' ? {} : await readJsonBody(req).catch(() => ({}));\n const opts = typeof body === 'object' && body !== null ? (body as Record<string, unknown>) : {};\n const storage = new SqlStorage(db);\n const report = await publishFeedFromStorage(storage, feedTree, {\n layout: 'feed',\n ...(typeof opts.name === 'string' ? { name: opts.name } : {}),\n ...(typeof opts.description === 'string' ? { description: opts.description } : {}),\n ...(typeof opts.repositoryUrl === 'string' ? { repositoryUrl: opts.repositoryUrl } : {}),\n ...(typeof opts.notebookSlug === 'string' ? { notebookSlug: opts.notebookSlug } : {}),\n });\n return json({\n manifest: report.manifest,\n notebooks: report.notebooks,\n totalNotes: report.totalNotes,\n totalPublicSessions: report.totalPublicSessions,\n feedUrl: `${url.origin}/feed/`,\n }, 200);\n }\n if (sub === '/v1/wipe' && method === 'POST') {\n await db.transaction(async (tx) => {\n // System memberships survive; derived projections follow (empty is consistent).\n await wipeRows(tx);\n await wipeDomain(tx);\n });\n return noContent();\n }\n if (sub === '/v1/tx' && method === 'POST') {\n const parsed = await readJsonBody(req);\n const ops = typeof parsed === 'object' && parsed !== null && 'ops' in parsed ? parsed.ops : undefined;\n const parsedOps = txOps(ops);\n const results = await db.transaction((tx) => refreshDomain(tx, parsedOps));\n return json({ results }, 200);\n }\n if (sub === '/v1/query') {\n if (method !== 'POST') return methodNotAllowed();\n const body = await readJsonBody(req, MAX_BODY);\n return json(await handleDomainQuery(db, body), 200);\n }\n if (sub.startsWith('/v1/')) return storeRoutes(db, method, sub, url, req);\n return notFound();\n}\n\n// ── Handler factory ──────────────────────────────────────────────────────────\n\nfunction distRootOf(playgroundDist: string | undefined): string | undefined {\n if (!playgroundDist) return undefined;\n try {\n return realpathSync(playgroundDist);\n } catch {\n return undefined;\n }\n}\n\nexport function createHandler(\n db: Database | null,\n options: {\n playgroundDist: string;\n feedDir?: string;\n feedTree?: FeedTree;\n mcpReadonly?: boolean;\n mcpToken?: string;\n },\n): (request: Request) => Promise<Response> {\n const distRoot = distRootOf(options.playgroundDist);\n const feedTree: FeedTree =\n options.feedTree ??\n (options.feedDir ? new NodeFsFeedTree(options.feedDir) : new MemoryFeedTree());\n return async (request: Request): Promise<Response> => {\n try {\n const url = new URL(request.url);\n const method = request.method === 'HEAD' ? 'GET' : request.method; // Bun strips HEAD bodies\n const path = url.pathname;\n if (path === '/api' || path.startsWith('/api/')) {\n return db\n ? await apiRoutes(\n db,\n feedTree,\n request,\n request.method === 'OPTIONS' ? 'OPTIONS' : method,\n path.slice('/api'.length) || '/',\n url,\n { readonly: options.mcpReadonly, authToken: options.mcpToken },\n )\n : notFound();\n }\n if (db && path === '/.well-known/agent-capabilities.json' && method === 'GET') {\n const res = await staticResponse(distRoot, method, path);\n if (res.status === 200) return res;\n return json(exportAgentCapabilitiesManifest(), 200);\n }\n if (db) {\n const feedAsset = isPublishedFeedAssetPath(path);\n if (feedAsset !== null) {\n return await servePublishedFeed(feedTree, request.method === 'OPTIONS' ? 'OPTIONS' : method, feedAsset);\n }\n }\n return await staticResponse(distRoot, method, path);\n } catch (e) {\n if (e instanceof HttpError || e instanceof StorageError) {\n const status = e.status;\n if (status >= 500) console.error('[wod-wiki-api]', e.message);\n const body: { error: string; code?: string } = { error: status >= 500 ? 'internal error' : e.message };\n if (e.code) body.code = e.code;\n return json(body, status);\n }\n console.error('[wod-wiki-api]', e);\n return json({ error: 'internal error' }, 500);\n }\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/server/errors.ts","../src/mcp/httpHandler.ts","../src/server/app.ts"],"names":["SqlStorage"],"mappings":"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","file":"chunk-W3JQPGSC.mjs","sourcesContent":["/**\n * errors.ts — the single HTTP error type every layer throws; app.ts maps it\n * to the wire's { error, code? } JSON with the matching status.\n */\nexport class HttpError extends Error {\n constructor(readonly status: number, message: string, readonly code?: string) {\n super(message);\n this.name = 'HttpError';\n }\n}\n","import { WebStandardStreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/webStandardStreamableHttp.js';\nimport { SqlStorage, type Database } from '@bitcobblers/wod-wiki-storage/sql';\nimport type { FeedTree } from '@bitcobblers/wod-wiki-engine';\nimport { createWodMcpServer } from './createWodMcpServer';\n\nconst MCP_CORS_HEADERS: Record<string, string> = {\n 'access-control-allow-origin': '*',\n 'access-control-allow-methods': 'GET, POST, DELETE, OPTIONS',\n 'access-control-allow-headers': 'Content-Type, Accept, Authorization, Mcp-Session-Id, MCP-Protocol-Version, Last-Event-ID',\n 'access-control-expose-headers': 'Mcp-Session-Id, MCP-Protocol-Version',\n};\n\nfunction withMcpCors(response: Response): Response {\n const headers = new Headers(response.headers);\n for (const [k, v] of Object.entries(MCP_CORS_HEADERS)) {\n if (!headers.has(k)) {\n headers.set(k, v);\n }\n }\n return new Response(response.body, {\n status: response.status,\n statusText: response.statusText,\n headers,\n });\n}\n\nfunction normalizeAcceptForPost(request: Request): Request {\n if (request.method !== 'POST') return request;\n const accept = request.headers.get('accept') ?? '';\n if (accept.includes('application/json') && accept.includes('text/event-stream')) {\n return request;\n }\n const headers = new Headers(request.headers);\n headers.set('accept', 'application/json, text/event-stream');\n return new Request(request, { headers });\n}\n\nexport interface HandleMcpHttpOptions {\n db: Database;\n feedTree: FeedTree;\n baseUrl: string;\n readonly?: boolean;\n authToken?: string;\n}\n\n/**\n * Handles Web-Standard Streamable HTTP MCP requests at `/api/mcp`.\n * Uses stateless per-request `WebStandardStreamableHTTPServerTransport` with\n * `enableJsonResponse: true` so both official MCP SDK clients and plain HTTP\n * JSON-RPC clients work out of the box without sticky session requirements.\n */\nexport async function handleMcpHttpRequest(\n request: Request,\n options: HandleMcpHttpOptions,\n): Promise<Response> {\n if (request.method === 'OPTIONS') {\n return new Response(null, { status: 204, headers: MCP_CORS_HEADERS });\n }\n\n const expectedToken = options.authToken ?? process.env.WOD_MCP_TOKEN?.trim();\n if (expectedToken) {\n const authHeader = request.headers.get('authorization') ?? '';\n const bearer = authHeader.startsWith('Bearer ') ? authHeader.slice('Bearer '.length).trim() : '';\n if (bearer !== expectedToken) {\n return withMcpCors(\n new Response(\n JSON.stringify({\n jsonrpc: '2.0',\n error: { code: -32001, message: 'Unauthorized: missing or invalid Bearer token' },\n id: null,\n }),\n { status: 401, headers: { 'content-type': 'application/json' } },\n ),\n );\n }\n }\n\n const storage = new SqlStorage(options.db);\n const server = createWodMcpServer({\n storage,\n feedTree: options.feedTree,\n baseUrl: options.baseUrl,\n readonly: options.readonly ?? process.env.WOD_MCP_READONLY === '1',\n });\n\n const transport = new WebStandardStreamableHTTPServerTransport({\n sessionIdGenerator: undefined,\n enableJsonResponse: true,\n });\n\n await server.connect(transport);\n try {\n const normalizedReq = normalizeAcceptForPost(request);\n const response = await transport.handleRequest(normalizedReq);\n return withMcpCors(response);\n } finally {\n await transport.close().catch(() => {});\n await server.close().catch(() => {});\n }\n}\n","/**\n * app.ts — one native fetch handler for the whole surface:\n * GET /api/health\n * GET /api/v1/:store/get?key= GET /api/v1/:store/all?range=&count=\n * GET /api/v1/:store/index/:idx?range=&count=\n * GET /api/v1/:store/count?range=&index=\n * PUT /api/v1/:store {value} DELETE /api/v1/:store?key=\n * POST /api/v1/:store/clear POST /api/v1/tx {ops}\n * POST /api/v1/wipe POST /api/v1/query\n * everything else: static SPA serving from playgroundDist (asset miss with an\n * extension → 404; extensionless → index.html; traversal/symlink escapes →\n * 403; /api never falls through to the SPA).\n *\n * `db` may be null for the CLI playground mode: static SPA serving only, every\n * /api request answers 404 — the playground never touches a server database.\n */\n\nimport { join, resolve, sep } from 'node:path';\nimport { stat, realpath } from 'node:fs/promises';\nimport { realpathSync, createReadStream } from 'node:fs';\nimport { Readable } from 'node:stream';\nimport { HttpError } from './errors';\nimport {\n SqlStorage,\n handleDomainQuery,\n refreshDomain,\n wipeDomain,\n MAX_BODY,\n StorageError,\n storeDefinition,\n getRow,\n listRows,\n countRows,\n wipeRows,\n type Database,\n} from '@bitcobblers/wod-wiki-storage/sql';\nimport { keyFromValue, type KeyDTO, type RangeDTO, type TxOp } from '@bitcobblers/wod-wiki-storage';\nimport {\n FeedTreeError,\n MemoryFeedTree,\n checkUnpublishedFeedChanges,\n publishFeedFromStorage,\n type FeedTree,\n} from '@bitcobblers/wod-wiki-engine';\nimport { exportAgentCapabilitiesManifest } from '@bitcobblers/wod-wiki-engine/agent';\nimport { NodeFsFeedTree } from '../cli/nodeFeedTree';\nimport { handleMcpHttpRequest } from '../mcp/httpHandler';\nconst json = (value: unknown, status: number): Response =>\n new Response(JSON.stringify(value), { status, headers: { 'content-type': 'application/json' } });\n\nfunction streamFile(path: string): BodyInit {\n const bun = (globalThis as { Bun?: { file(p: string): BodyInit } }).Bun;\n if (bun?.file) return bun.file(path);\n // ponytail: node:fs Readable.toWeb streams files in pure Node.js (v18+) without dependencies\n return Readable.toWeb(createReadStream(path)) as unknown as BodyInit;\n}\n\nconst plain = (body: string, status: number): Response =>\n new Response(body, { status, headers: { 'content-type': 'text/plain; charset=utf-8' } });\n\nconst notFound = (): Response => json({ error: 'not found' }, 404);\nconst methodNotAllowed = (): Response => json({ error: 'method not allowed' }, 405);\n\nconst noContent = (): Response => new Response(null, { status: 204 });\n\n/** URLSearchParams already applies the form-urlencoded '+' → space then %XX\n * decoding the wire contract relies on. */\nconst qget = (url: URL, name: string): string | undefined => url.searchParams.get(name) ?? undefined;\n\nfunction jsonParam(url: URL, name: string): unknown {\n const raw = qget(url, name);\n if (raw === undefined) return undefined;\n try {\n return JSON.parse(raw) as unknown;\n } catch {\n throw new HttpError(400, `invalid JSON in ?${name}`);\n }\n}\n\n/** ?range accepts a RangeDTO object or a bare key (scalar/tuple → {only}). */\nfunction rangeParam(url: URL): RangeDTO | undefined {\n const v = jsonParam(url, 'range');\n if (v === undefined) return undefined;\n if (v !== null && typeof v === 'object' && !Array.isArray(v)) return v as RangeDTO;\n return { only: v as KeyDTO };\n}\n\nfunction countParam(url: URL): number | undefined {\n const raw = qget(url, 'count');\n if (raw === undefined) return undefined;\n const n = Number(raw); // Number('') === 0, matching the wire contract\n if (!Number.isFinite(n) || n < 0) throw new HttpError(400, 'invalid ?count');\n return Math.trunc(n);\n}\n\nasync function readJsonBody(req: Request, maxBytes?: number): Promise<unknown> {\n const body = await req.text();\n if (maxBytes !== undefined && body.length > maxBytes) {\n throw new HttpError(413, `domain query body exceeds ${maxBytes} bytes`);\n }\n try {\n return JSON.parse(body) as unknown;\n } catch {\n throw new HttpError(400, 'body must be valid JSON');\n }\n}\n\nfunction txOps(value: unknown): TxOp[] {\n if (!Array.isArray(value)) throw new HttpError(400, 'tx body must be {ops: []}');\n return value.map((op: unknown): TxOp => {\n if (op === null || typeof op !== 'object' || Array.isArray(op) || !('store' in op) || typeof op.store !== 'string' || !('op' in op)) {\n throw new HttpError(400, 'tx op must have a store and operation');\n }\n const def = storeDefinition(op.store);\n const store = def.name;\n switch (op.op) {\n case 'put':\n if (!('value' in op)) throw new HttpError(400, 'put requires value');\n return { op: 'put', store, value: op.value };\n case 'delete':\n if (!('key' in op)) throw new HttpError(400, 'delete requires key');\n return { op: 'delete', store, key: op.key as KeyDTO };\n case 'clear':\n return { op: 'clear', store };\n case 'check': {\n if (!('key' in op) || !('value' in op)) throw new HttpError(400, 'check requires key and value');\n const scalar = (key: unknown): key is string | number => typeof key === 'string' || (typeof key === 'number' && Number.isFinite(key));\n if (!scalar(op.key) && !(Array.isArray(op.key) && op.key.length > 0 && op.key.every(scalar))) {\n throw new HttpError(400, 'check requires a scalar key or non-empty scalar tuple');\n }\n if (op.value !== null && (typeof op.value !== 'object' || Array.isArray(op.value))) {\n throw new HttpError(400, 'check value must be a row or null');\n }\n const parts = Array.isArray(op.key) ? op.key : [op.key];\n if (parts.length !== def.keyPath.length) throw new HttpError(400, 'check key arity must match the store');\n if (op.value !== null) {\n let rowKey: KeyDTO;\n try { rowKey = keyFromValue(def, op.value); }\n catch { throw new HttpError(400, 'check row must have its primary key'); }\n if (JSON.stringify(rowKey) !== JSON.stringify(op.key)) throw new HttpError(400, 'check row primary key must match key');\n }\n return { op: 'check', store, key: op.key, value: op.value };\n }\n default:\n throw new HttpError(400, 'tx op must be put | delete | clear | check');\n }\n });\n}\n\n// ── Static SPA serving ───────────────────────────────────────────────────────\n\nconst MIME: Record<string, string> = {\n html: 'text/html; charset=utf-8',\n js: 'text/javascript; charset=utf-8',\n mjs: 'text/javascript; charset=utf-8',\n css: 'text/css; charset=utf-8',\n json: 'application/json; charset=utf-8',\n map: 'application/json; charset=utf-8',\n svg: 'image/svg+xml',\n png: 'image/png',\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n webp: 'image/webp',\n ico: 'image/x-icon',\n woff: 'font/woff',\n woff2: 'font/woff2',\n ttf: 'font/ttf',\n mp3: 'audio/mpeg',\n wav: 'audio/wav',\n webmanifest: 'application/manifest+json',\n xml: 'application/xml',\n txt: 'text/plain; charset=utf-8',\n md: 'text/markdown; charset=utf-8',\n jsonl: 'application/x-ndjson; charset=utf-8',\n csv: 'text/csv; charset=utf-8',\n};\n\nasync function realpathSafe(path: string): Promise<string | undefined> {\n try {\n return await realpath(path);\n } catch {\n return undefined;\n }\n}\n\nasync function serveFile(real: string, rel: string): Promise<Response> {\n // Seed chunks are content-hashed; everything else revalidates.\n const cache = rel.includes('seed/chunks/')\n ? 'public, max-age=31536000, immutable'\n : 'no-cache';\n const ext = rel.slice(rel.lastIndexOf('.') + 1).toLowerCase();\n return new Response(streamFile(real), {\n headers: { 'content-type': MIME[ext] ?? 'application/octet-stream', 'cache-control': cache },\n });\n}\n\nasync function serveSpaShell(distRoot: string): Promise<Response | undefined> {\n const index = await realpathSafe(join(distRoot, 'index.html'));\n // Same symlink confinement as assets: a dist/index.html symlink pointing\n // outside must not become the shell.\n if (index && (index === distRoot || index.startsWith(distRoot + sep))\n && (await stat(index).then((s) => s.isFile(), () => false))) {\n return new Response(streamFile(index), {\n headers: { 'content-type': MIME.html, 'cache-control': 'no-cache' },\n });\n }\n return undefined;\n}\n\nasync function staticResponse(distRoot: string | undefined, method: string, pathname: string): Promise<Response> {\n if (method !== 'GET') return plain('method not allowed', 405);\n if (!distRoot) {\n return plain('wod-wiki-api: playground dist not found. Set PLAYGROUND_DIST or run the playground server build.', 503);\n }\n let rel: string;\n try {\n rel = decodeURIComponent(pathname).replace(/^\\/+/, '');\n } catch {\n return plain('bad request', 400);\n }\n if (rel === '') rel = 'index.html';\n const parts = rel.split('/');\n if (parts.some((p) => p === '..')) return plain('forbidden', 403);\n const base = parts[parts.length - 1] ?? '';\n const hasExtension = base.includes('.');\n\n const abs = resolve(distRoot, ...parts);\n const real = await realpathSafe(abs);\n // Symlink confinement: serve only paths that really live under the dist root.\n if (real && (real === distRoot || real.startsWith(distRoot + sep))) {\n const info = await stat(real).then((s) => s.isFile(), () => false);\n if (info) return serveFile(real, rel);\n }\n // SPA fallback: extensionless paths render the app shell.\n if (!hasExtension) {\n const shell = await serveSpaShell(distRoot);\n if (shell) return shell;\n }\n return plain('not found', 404);\n}\n\n// ── API routing ──────────────────────────────────────────────────────────────\n\nasync function storeRoutes(db: Database, method: string, sub: string, url: URL, req: Request): Promise<Response> {\n let inner = sub.slice('/v1/'.length);\n if (inner.endsWith('/')) inner = inner.slice(0, -1);\n if (inner === '') return notFound();\n const segments = inner.split('/');\n let name: string;\n let action: string | undefined;\n if (segments.length === 1) {\n name = segments[0];\n } else if (segments.length === 2) {\n [name, action] = segments;\n } else if (segments.length === 3 && segments[1] === 'index' && segments[2] !== '') {\n [name, , action] = segments;\n action = `index/${action}`;\n } else {\n return notFound();\n }\n const def = storeDefinition(name); // 404 for unknown stores\n\n const range = rangeParam(url);\n const count = countParam(url);\n\n if (action === 'get' && method === 'GET') {\n const key = jsonParam(url, 'key');\n if (key === undefined) throw new HttpError(400, 'missing ?key');\n const row = await getRow(db, def, key as KeyDTO);\n return row === undefined ? notFound() : json(row, 200);\n }\n if (action === 'all' && method === 'GET') {\n return json(await listRows(db, def, range, count), 200);\n }\n if (action === 'count' && method === 'GET') {\n const indexName = qget(url, 'index');\n const n = indexName\n ? await countRows(db, def, range, indexName)\n : await countRows(db, def, range);\n return json({ count: Number(n) }, 200);\n }\n if (action === 'clear' && method === 'POST') {\n await db.transaction((tx) => refreshDomain(tx, [{ op: 'clear', store: def.name }]));\n return noContent();\n }\n if (action?.startsWith('index/') && method === 'GET') {\n return json(await listRows(db, def, range, count, action.slice('index/'.length)), 200);\n }\n if (action === undefined && method === 'PUT') {\n const parsed = await readJsonBody(req);\n const value = typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed) && 'value' in parsed\n ? parsed.value\n : undefined;\n if (value === undefined) throw new HttpError(400, 'body must be {value: ...}');\n const [key] = await db.transaction((tx) => refreshDomain(tx, [{ op: 'put', store: def.name, value }]));\n return json({ key }, 200);\n }\n if (action === undefined && method === 'DELETE') {\n const keyParam = jsonParam(url, 'key');\n const target = keyParam !== undefined ? keyParam : range;\n if (target === undefined || target === null) throw new HttpError(400, 'DELETE requires ?key or ?range');\n // Wire DELETE accepts a key or a range; the TxOp delete variant types the\n // narrower KeyDTO even though deleteRows honours both.\n await db.transaction((tx) => refreshDomain(tx, [{ op: 'delete', store: def.name, key: target as KeyDTO }]));\n return noContent();\n }\n return methodNotAllowed();\n}\n\nfunction isPublishedFeedAssetPath(pathname: string): string | null {\n if (pathname === '/feed' || pathname === '/feed/') return 'index.html';\n if (!pathname.startsWith('/feed/')) return null;\n const sub = pathname.slice('/feed/'.length);\n if (\n sub === 'index.html' ||\n sub === 'manifest.json' ||\n sub === 'report.html' ||\n sub.startsWith('chunks/') ||\n sub.startsWith('indexes/') ||\n sub.startsWith('markdown/')\n ) {\n return sub;\n }\n return null;\n}\n\nasync function servePublishedFeed(feedTree: FeedTree, method: string, relPath: string): Promise<Response> {\n if (method === 'OPTIONS') {\n return new Response(null, {\n status: 204,\n headers: {\n 'access-control-allow-origin': '*',\n 'access-control-allow-methods': 'GET, HEAD, OPTIONS',\n },\n });\n }\n if (method !== 'GET') return methodNotAllowed();\n try {\n const decoded = decodeURIComponent(relPath);\n const bytes = await feedTree.read(decoded);\n const ext = decoded.includes('.') ? decoded.slice(decoded.lastIndexOf('.') + 1).toLowerCase() : 'html';\n const cache = decoded.startsWith('chunks/')\n ? 'public, max-age=31536000, immutable'\n : 'no-cache';\n const copy = new Uint8Array(bytes.byteLength);\n copy.set(bytes);\n return new Response(copy.buffer, {\n status: 200,\n headers: {\n 'content-type': MIME[ext] ?? 'application/octet-stream',\n 'cache-control': cache,\n 'access-control-allow-origin': '*',\n },\n });\n } catch (err) {\n if (err instanceof FeedTreeError && err.code === 'not-found') return notFound();\n if (err instanceof FeedTreeError && err.code === 'layout') return plain('forbidden', 403);\n throw err;\n }\n}\n\nasync function apiRoutes(\n db: Database,\n feedTree: FeedTree,\n req: Request,\n method: string,\n sub: string,\n url: URL,\n mcpOptions?: { readonly?: boolean; authToken?: string },\n): Promise<Response> {\n if (sub === '/health') {\n return json({ ok: true, driver: db.dialect }, 200);\n }\n if (sub === '/mcp') {\n return handleMcpHttpRequest(req, {\n db,\n feedTree,\n baseUrl: url.origin,\n readonly: mcpOptions?.readonly,\n authToken: mcpOptions?.authToken,\n });\n }\n if (sub === '/v1/feed/status' && method === 'GET') {\n const storage = new SqlStorage(db);\n const status = await checkUnpublishedFeedChanges(storage, feedTree);\n return json({ ...status, feedUrl: `${url.origin}/feed/` }, 200);\n }\n if (sub === '/v1/feed/publish' && method === 'POST') {\n const body = req.headers.get('content-length') === '0' ? {} : await readJsonBody(req).catch(() => ({}));\n const opts = typeof body === 'object' && body !== null ? (body as Record<string, unknown>) : {};\n const storage = new SqlStorage(db);\n const report = await publishFeedFromStorage(storage, feedTree, {\n layout: 'feed',\n ...(typeof opts.name === 'string' ? { name: opts.name } : {}),\n ...(typeof opts.description === 'string' ? { description: opts.description } : {}),\n ...(typeof opts.repositoryUrl === 'string' ? { repositoryUrl: opts.repositoryUrl } : {}),\n ...(typeof opts.notebookSlug === 'string' ? { notebookSlug: opts.notebookSlug } : {}),\n });\n return json({\n manifest: report.manifest,\n notebooks: report.notebooks,\n totalNotes: report.totalNotes,\n totalPublicSessions: report.totalPublicSessions,\n feedUrl: `${url.origin}/feed/`,\n }, 200);\n }\n if (sub === '/v1/wipe' && method === 'POST') {\n await db.transaction(async (tx) => {\n // System memberships survive; derived projections follow (empty is consistent).\n await wipeRows(tx);\n await wipeDomain(tx);\n });\n return noContent();\n }\n if (sub === '/v1/tx' && method === 'POST') {\n const parsed = await readJsonBody(req);\n const ops = typeof parsed === 'object' && parsed !== null && 'ops' in parsed ? parsed.ops : undefined;\n const parsedOps = txOps(ops);\n const results = await db.transaction((tx) => refreshDomain(tx, parsedOps));\n return json({ results }, 200);\n }\n if (sub === '/v1/query') {\n if (method !== 'POST') return methodNotAllowed();\n const body = await readJsonBody(req, MAX_BODY);\n return json(await handleDomainQuery(db, body), 200);\n }\n if (sub.startsWith('/v1/')) return storeRoutes(db, method, sub, url, req);\n return notFound();\n}\n\n// ── Handler factory ──────────────────────────────────────────────────────────\n\nfunction distRootOf(playgroundDist: string | undefined): string | undefined {\n if (!playgroundDist) return undefined;\n try {\n return realpathSync(playgroundDist);\n } catch {\n return undefined;\n }\n}\n\nexport function createHandler(\n db: Database | null,\n options: {\n playgroundDist: string;\n feedDir?: string;\n feedTree?: FeedTree;\n mcpReadonly?: boolean;\n mcpToken?: string;\n },\n): (request: Request) => Promise<Response> {\n const distRoot = distRootOf(options.playgroundDist);\n const feedTree: FeedTree =\n options.feedTree ??\n (options.feedDir ? new NodeFsFeedTree(options.feedDir) : new MemoryFeedTree());\n return async (request: Request): Promise<Response> => {\n try {\n const url = new URL(request.url);\n const method = request.method === 'HEAD' ? 'GET' : request.method; // Bun strips HEAD bodies\n const path = url.pathname;\n if (path === '/api' || path.startsWith('/api/')) {\n return db\n ? await apiRoutes(\n db,\n feedTree,\n request,\n request.method === 'OPTIONS' ? 'OPTIONS' : method,\n path.slice('/api'.length) || '/',\n url,\n { readonly: options.mcpReadonly, authToken: options.mcpToken },\n )\n : notFound();\n }\n if (db && path === '/.well-known/agent-capabilities.json' && method === 'GET') {\n const res = await staticResponse(distRoot, method, path);\n if (res.status === 200) return res;\n return json(exportAgentCapabilitiesManifest(), 200);\n }\n if (db) {\n const feedAsset = isPublishedFeedAssetPath(path);\n if (feedAsset !== null) {\n return await servePublishedFeed(feedTree, request.method === 'OPTIONS' ? 'OPTIONS' : method, feedAsset);\n }\n }\n return await staticResponse(distRoot, method, path);\n } catch (e) {\n if (e instanceof HttpError || e instanceof StorageError) {\n const status = e.status;\n if (status >= 500) console.error('[wod-wiki-api]', e.message);\n const body: { error: string; code?: string } = { error: status >= 500 ? 'internal error' : e.message };\n if (e.code) body.code = e.code;\n return json(body, status);\n }\n console.error('[wod-wiki-api]', e);\n return json({ error: 'internal error' }, 500);\n }\n };\n}\n"]}
package/dist/index.cjs CHANGED
@@ -444,7 +444,7 @@ var init_report = __esm({
444
444
  var VERSION;
445
445
  var init_version = __esm({
446
446
  "src/version.ts"() {
447
- VERSION = "0.55.2206";
447
+ VERSION = "0.56.2210";
448
448
  }
449
449
  });
450
450