@bitcobblers/wod-wiki-tools 0.53.2203 → 0.54.2205

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 (647) hide show
  1. package/dist/agentCommands-AMMASJPH.mjs +586 -0
  2. package/dist/agentCommands-AMMASJPH.mjs.map +1 -0
  3. package/dist/bin/wod.cjs +1071 -29
  4. package/dist/bin/wod.cjs.map +1 -1
  5. package/dist/bin/wod.mjs +2 -2
  6. package/dist/{chunk-LNBKPHEP.mjs → chunk-AS6OJRNH.mjs} +9 -4
  7. package/dist/chunk-AS6OJRNH.mjs.map +1 -0
  8. package/dist/{chunk-LWW4HK4G.mjs → chunk-KXNK4PIB.mjs} +168 -28
  9. package/dist/chunk-KXNK4PIB.mjs.map +1 -0
  10. package/dist/{chunk-ES4ZZ447.mjs → chunk-T7VB7PPO.mjs} +3 -3
  11. package/dist/chunk-T7VB7PPO.mjs.map +1 -0
  12. package/dist/{chunk-2EWCEE6N.mjs → chunk-WLCUM7KO.mjs} +106 -6
  13. package/dist/chunk-WLCUM7KO.mjs.map +1 -0
  14. package/dist/chunk-ZZVL6UGV.mjs +144 -0
  15. package/dist/chunk-ZZVL6UGV.mjs.map +1 -0
  16. package/dist/index.cjs +1075 -29
  17. package/dist/index.cjs.map +1 -1
  18. package/dist/index.d.cts +68 -3
  19. package/dist/index.d.ts +68 -3
  20. package/dist/index.mjs +5 -4
  21. package/dist/mcp-D6QARYOG.mjs +73 -0
  22. package/dist/mcp-D6QARYOG.mjs.map +1 -0
  23. package/dist/{scaffoldFeed-OS5HGYG4.mjs → scaffoldFeed-D55NINVJ.mjs} +3 -3
  24. package/dist/{scaffoldFeed-OS5HGYG4.mjs.map → scaffoldFeed-D55NINVJ.mjs.map} +1 -1
  25. package/dist/server/app.cjs +239 -2
  26. package/dist/server/app.cjs.map +1 -1
  27. package/dist/server/app.d.cts +2 -0
  28. package/dist/server/app.d.ts +2 -0
  29. package/dist/server/app.mjs +3 -1
  30. package/dist/server-2GTVPJDA.mjs +13 -0
  31. package/dist/{server-SHNWCIIM.mjs.map → server-2GTVPJDA.mjs.map} +1 -1
  32. package/dist/skills/README.md +5 -4
  33. package/dist/skills/wod-agent-parity/SKILL.md +41 -0
  34. package/dist/skills/wod-cli/SKILL.md +127 -0
  35. package/dist/skills/wod-wiki-testing/SKILL.md +45 -0
  36. package/dist/skills/wod-wiki-testing/references/catalog.md +81 -0
  37. package/dist/skills/wod-wql/SKILL.md +63 -0
  38. package/dist/web/playground/ai-skills/agent-parity.md +41 -0
  39. package/dist/web/playground/ai-skills/cli.md +127 -0
  40. package/dist/web/playground/ai-skills/wql.md +63 -0
  41. package/dist/web/playground/assets/main-BH_SMMzT.css +2 -0
  42. package/dist/web/playground/assets/main-vYMBKnsB.js +1152 -0
  43. package/dist/web/playground/assets/{statementBuilderFlow-BHGR9gIs.js → statementBuilderFlow-D8GG8Y7r.js} +2 -2
  44. package/dist/web/playground/assets/vendor-BUlwHBNF.js +255 -0
  45. package/dist/web/playground/assets/{vendor-codemirror-B4BeZarI.js → vendor-codemirror-Bh6hyz5v.js} +11 -11
  46. package/dist/web/playground/index.html +4 -4
  47. package/dist/web/playground/llms-full.txt +1444 -0
  48. package/dist/web/playground/llms.txt +67 -0
  49. package/dist/web/{server/seed/core/chunks/canvas.28c523ac.json → playground/seed/core/chunks/canvas.b0bc465b.json} +1 -1
  50. package/dist/web/playground/seed/core/chunks/{dashboards.dc521d4e.json → dashboards.af9a29e4.json} +1 -1
  51. package/dist/web/playground/seed/core/chunks/{efforts.cc1d51a5.json → efforts.902271f9.json} +1 -1
  52. package/dist/web/playground/seed/core/chunks/{equipment.3c479de5.json → equipment.dbdc1af3.json} +1 -1
  53. package/dist/web/playground/seed/core/indexes/notebooks/canvas.json +180 -180
  54. package/dist/web/playground/seed/core/indexes/notebooks/dashboards.json +16 -16
  55. package/dist/web/playground/seed/core/indexes/notebooks/efforts.json +326 -326
  56. package/dist/web/playground/seed/core/indexes/notebooks/equipment.json +50 -50
  57. package/dist/web/playground/seed/core/manifest.json +27 -27
  58. package/dist/web/playground/seed/core/markdown/canvas/ai-first/README.json +1 -1
  59. package/dist/web/playground/seed/core/markdown/canvas/guide/README.json +4 -4
  60. package/dist/web/playground/seed/core/markdown/canvas/guide/clock.json +1 -1
  61. package/dist/web/playground/seed/core/markdown/canvas/guide/dashboards.json +1 -1
  62. package/dist/web/playground/seed/core/markdown/canvas/guide/metrics-summaries.json +2 -2
  63. package/dist/web/playground/seed/core/markdown/canvas/guide/metrics.json +12 -12
  64. package/dist/web/playground/seed/core/markdown/canvas/guide/protocols.json +20 -20
  65. package/dist/web/playground/seed/core/markdown/canvas/guide/sessions.json +33 -33
  66. package/dist/web/playground/seed/core/markdown/canvas/guide/start.json +11 -11
  67. package/dist/web/playground/seed/core/markdown/canvas/guide/structure.json +25 -25
  68. package/dist/web/playground/seed/core/markdown/canvas/guide/wql.json +5 -5
  69. package/dist/web/playground/seed/core/markdown/canvas/home/sample-script.json +4 -4
  70. package/dist/web/playground/seed/core/markdown/canvas/home/welcome-1.json +2 -2
  71. package/dist/web/playground/seed/core/markdown/canvas/syntax/actions-comments.json +4 -4
  72. package/dist/web/playground/seed/core/markdown/canvas/syntax/alternating-emom.json +5 -5
  73. package/dist/web/playground/seed/core/markdown/canvas/syntax/basic-emom.json +4 -4
  74. package/dist/web/playground/seed/core/markdown/canvas/syntax/calculated-metrics.json +4 -4
  75. package/dist/web/playground/seed/core/markdown/canvas/syntax/classic-amrap.json +6 -6
  76. package/dist/web/playground/seed/core/markdown/canvas/syntax/complex-barbell-cycling.json +4 -4
  77. package/dist/web/playground/seed/core/markdown/canvas/syntax/complex-full-session.json +10 -10
  78. package/dist/web/playground/seed/core/markdown/canvas/syntax/complex-nested-protocols.json +7 -7
  79. package/dist/web/playground/seed/core/markdown/canvas/syntax/complex-partner-workout.json +7 -7
  80. package/dist/web/playground/seed/core/markdown/canvas/syntax/complex-swimming.json +5 -5
  81. package/dist/web/playground/seed/core/markdown/canvas/syntax/core-rules.json +4 -4
  82. package/dist/web/playground/seed/core/markdown/canvas/syntax/custom-and-calculated-metrics.json +4 -4
  83. package/dist/web/playground/seed/core/markdown/canvas/syntax/custom-intervals.json +4 -4
  84. package/dist/web/playground/seed/core/markdown/canvas/syntax/custom-metrics-1.json +4 -4
  85. package/dist/web/playground/seed/core/markdown/canvas/syntax/custom-metrics-2.json +5 -5
  86. package/dist/web/playground/seed/core/markdown/canvas/syntax/custom-metrics-3.json +3 -3
  87. package/dist/web/playground/seed/core/markdown/canvas/syntax/custom-metrics-4.json +4 -4
  88. package/dist/web/playground/seed/core/markdown/canvas/syntax/custom-metrics-5.json +4 -4
  89. package/dist/web/playground/seed/core/markdown/canvas/syntax/dialect-climb-bouldering.json +2 -2
  90. package/dist/web/playground/seed/core/markdown/canvas/syntax/dialect-climb-hangboard.json +2 -2
  91. package/dist/web/playground/seed/core/markdown/canvas/syntax/dialect-climb-sport.json +2 -2
  92. package/dist/web/playground/seed/core/markdown/canvas/syntax/dialect-log.json +4 -4
  93. package/dist/web/playground/seed/core/markdown/canvas/syntax/dialect-plan.json +8 -8
  94. package/dist/web/playground/seed/core/markdown/canvas/syntax/dialect-wod.json +5 -5
  95. package/dist/web/playground/seed/core/markdown/canvas/syntax/distance-intervals.json +3 -3
  96. package/dist/web/playground/seed/core/markdown/canvas/syntax/document-1.json +4 -4
  97. package/dist/web/playground/seed/core/markdown/canvas/syntax/document-2.json +5 -5
  98. package/dist/web/playground/seed/core/markdown/canvas/syntax/document-3.json +10 -10
  99. package/dist/web/playground/seed/core/markdown/canvas/syntax/document-4.json +5 -5
  100. package/dist/web/playground/seed/core/markdown/canvas/syntax/effort-notes.json +5 -5
  101. package/dist/web/playground/seed/core/markdown/canvas/syntax/frontmatter-summaries.json +4 -4
  102. package/dist/web/playground/seed/core/markdown/canvas/syntax/groups-1.json +5 -5
  103. package/dist/web/playground/seed/core/markdown/canvas/syntax/groups-2.json +6 -6
  104. package/dist/web/playground/seed/core/markdown/canvas/syntax/groups-3.json +3 -3
  105. package/dist/web/playground/seed/core/markdown/canvas/syntax/groups-4.json +3 -3
  106. package/dist/web/playground/seed/core/markdown/canvas/syntax/longer-duration.json +4 -4
  107. package/dist/web/playground/seed/core/markdown/canvas/syntax/longer-intervals.json +4 -4
  108. package/dist/web/playground/seed/core/markdown/canvas/syntax/measurements.json +7 -7
  109. package/dist/web/playground/seed/core/markdown/canvas/syntax/metrics-1.json +5 -5
  110. package/dist/web/playground/seed/core/markdown/canvas/syntax/metrics-2.json +7 -7
  111. package/dist/web/playground/seed/core/markdown/canvas/syntax/metrics-3.json +8 -8
  112. package/dist/web/playground/seed/core/markdown/canvas/syntax/metrics-4.json +6 -6
  113. package/dist/web/playground/seed/core/markdown/canvas/syntax/metrics-5.json +5 -5
  114. package/dist/web/playground/seed/core/markdown/canvas/syntax/mixed-sections.json +10 -10
  115. package/dist/web/playground/seed/core/markdown/canvas/syntax/mixed-timers.json +5 -5
  116. package/dist/web/playground/seed/core/markdown/canvas/syntax/multiple-amrap-windows.json +7 -7
  117. package/dist/web/playground/seed/core/markdown/canvas/syntax/multiple-sets.json +4 -4
  118. package/dist/web/playground/seed/core/markdown/canvas/syntax/named-groups.json +6 -6
  119. package/dist/web/playground/seed/core/markdown/canvas/syntax/protocols-1.json +6 -6
  120. package/dist/web/playground/seed/core/markdown/canvas/syntax/protocols-2.json +4 -4
  121. package/dist/web/playground/seed/core/markdown/canvas/syntax/protocols-3.json +6 -6
  122. package/dist/web/playground/seed/core/markdown/canvas/syntax/protocols-4.json +3 -3
  123. package/dist/web/playground/seed/core/markdown/canvas/syntax/protocols-5.json +4 -4
  124. package/dist/web/playground/seed/core/markdown/canvas/syntax/single-movement.json +3 -3
  125. package/dist/web/playground/seed/core/markdown/canvas/syntax/supplemental-1.json +4 -4
  126. package/dist/web/playground/seed/core/markdown/canvas/syntax/supplemental-2.json +5 -5
  127. package/dist/web/playground/seed/core/markdown/canvas/syntax/supplemental-3.json +4 -4
  128. package/dist/web/playground/seed/core/markdown/canvas/syntax/supplemental-4.json +4 -4
  129. package/dist/web/playground/seed/core/markdown/canvas/syntax/time-cap.json +6 -6
  130. package/dist/web/playground/seed/core/markdown/canvas/syntax/timer-modifiers.json +6 -6
  131. package/dist/web/playground/seed/core/markdown/canvas/syntax/timers-1.json +6 -6
  132. package/dist/web/playground/seed/core/markdown/canvas/syntax/timers-2.json +4 -4
  133. package/dist/web/playground/seed/core/markdown/canvas/syntax/timers-3.json +4 -4
  134. package/dist/web/playground/seed/core/markdown/canvas/syntax/timers-4.json +4 -4
  135. package/dist/web/playground/seed/core/markdown/canvas/syntax/timers-5.json +5 -5
  136. package/dist/web/playground/seed/core/markdown/canvas/syntax/timers-rest.json +4 -4
  137. package/dist/web/playground/seed/core/markdown/canvas/wql-presets/aggregate-by-effort.json +2 -2
  138. package/dist/web/playground/seed/core/markdown/canvas/wql-presets/aggregate-by-week.json +2 -2
  139. package/dist/web/playground/seed/core/markdown/canvas/wql-presets/content-fran.json +2 -2
  140. package/dist/web/playground/seed/core/markdown/canvas/wql-presets/filter-combos.json +2 -2
  141. package/dist/web/playground/seed/core/markdown/canvas/wql-presets/pipes-limit.json +2 -2
  142. package/dist/web/playground/seed/core/markdown/canvas/wql-presets/session-rpe.json +2 -2
  143. package/dist/web/playground/seed/core/markdown/canvas/wql-presets/source-journal.json +2 -2
  144. package/dist/web/playground/seed/core/markdown/canvas/wql-presets/tis-trend.json +2 -2
  145. package/dist/web/playground/seed/core/markdown/canvas/wql-presets/where-join.json +2 -2
  146. package/dist/web/playground/seed/core/markdown/dashboards/benchmark-pr-board.json +6 -6
  147. package/dist/web/playground/seed/core/markdown/dashboards/finger-strength-v8.json +5 -5
  148. package/dist/web/playground/seed/core/markdown/dashboards/polarized-base-marathon.json +9 -9
  149. package/dist/web/playground/seed/core/markdown/dashboards/recovery-readiness.json +7 -7
  150. package/dist/web/playground/seed/core/markdown/dashboards/road-to-560-total.json +9 -9
  151. package/dist/web/playground/seed/core/markdown/dashboards/training-block-review.json +11 -11
  152. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/air-squat.json +1 -1
  153. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/box-jump.json +1 -1
  154. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/broad-jump.json +1 -1
  155. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/burpee-box-jump-over.json +1 -1
  156. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/burpee-over-dumbbell.json +1 -1
  157. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/burpee.json +1 -1
  158. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/dumbbell-squat-clean.json +1 -1
  159. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/ghd-sit-up.json +1 -1
  160. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/ground-kong.json +1 -1
  161. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/jumping-jack.json +1 -1
  162. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/kong-walk.json +1 -1
  163. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/lunge.json +1 -1
  164. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/overhead-squat.json +1 -1
  165. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/parkour-roll.json +1 -1
  166. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/parkour-squat.json +1 -1
  167. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/pistol-squat.json +1 -1
  168. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/plank.json +1 -1
  169. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/precision-burpee.json +1 -1
  170. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/precision-jump.json +1 -1
  171. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/quadrupedal-movement.json +1 -1
  172. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/russian-twist.json +1 -1
  173. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/sit-up.json +1 -1
  174. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/squat-clean.json +1 -1
  175. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/squat-hold.json +1 -1
  176. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/squat-snatch.json +1 -1
  177. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/tuck-jump.json +1 -1
  178. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/wall-ball.json +1 -1
  179. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/wall-burpee.json +1 -1
  180. package/dist/web/playground/seed/core/markdown/efforts/cycling/assault-bike.json +1 -1
  181. package/dist/web/playground/seed/core/markdown/efforts/cycling/cycling-moderate.json +1 -1
  182. package/dist/web/playground/seed/core/markdown/efforts/cycling/cycling-vigorous.json +1 -1
  183. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/assisted-pull-up.json +1 -1
  184. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/burpee-pull-up.json +1 -1
  185. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/chest-to-bar-pull-up.json +1 -1
  186. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/dip.json +1 -1
  187. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/double-under.json +1 -1
  188. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/handstand-hold.json +1 -1
  189. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/handstand-push-up.json +1 -1
  190. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/handstand-walk.json +1 -1
  191. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/jump-rope.json +1 -1
  192. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/jumping-pull-up.json +1 -1
  193. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/jumping-push-up.json +1 -1
  194. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/l-sit-pull-up.json +1 -1
  195. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/muscle-up.json +1 -1
  196. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/pull-up.json +1 -1
  197. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/push-up.json +1 -1
  198. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/reverse-wall-dip.json +1 -1
  199. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/rope-climb.json +1 -1
  200. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/toes-to-bar.json +1 -1
  201. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-arm-bar.json +1 -1
  202. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-around-the-world.json +1 -1
  203. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-bent-over-row.json +1 -1
  204. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-clean-and-jerk.json +1 -1
  205. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-clean-and-press.json +1 -1
  206. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-clean.json +1 -1
  207. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-deadlift.json +1 -1
  208. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-floor-press.json +1 -1
  209. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-front-squat.json +1 -1
  210. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-goblet-squat.json +1 -1
  211. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-gorilla-row.json +1 -1
  212. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-halo.json +1 -1
  213. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-jerk.json +1 -1
  214. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-overhead-squat.json +1 -1
  215. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-press.json +1 -1
  216. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-snatch.json +1 -1
  217. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-swing.json +1 -1
  218. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-windmill.json +1 -1
  219. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/turkish-get-up.json +1 -1
  220. package/dist/web/playground/seed/core/markdown/efforts/recovery/rest.json +1 -1
  221. package/dist/web/playground/seed/core/markdown/efforts/recovery/stretching.json +1 -1
  222. package/dist/web/playground/seed/core/markdown/efforts/rowing/rowing-sprint.json +1 -1
  223. package/dist/web/playground/seed/core/markdown/efforts/rowing/rowing.json +1 -1
  224. package/dist/web/playground/seed/core/markdown/efforts/rowing/ski-erg.json +1 -1
  225. package/dist/web/playground/seed/core/markdown/efforts/running/backward-running.json +1 -1
  226. package/dist/web/playground/seed/core/markdown/efforts/running/running-6-mph.json +1 -1
  227. package/dist/web/playground/seed/core/markdown/efforts/running/running-8-mph.json +1 -1
  228. package/dist/web/playground/seed/core/markdown/efforts/running/running-sprint.json +1 -1
  229. package/dist/web/playground/seed/core/markdown/efforts/snatch.json +2 -2
  230. package/dist/web/playground/seed/core/markdown/efforts/strength/back-squat.json +1 -1
  231. package/dist/web/playground/seed/core/markdown/efforts/strength/bench-press.json +1 -1
  232. package/dist/web/playground/seed/core/markdown/efforts/strength/box-step-up.json +1 -1
  233. package/dist/web/playground/seed/core/markdown/efforts/strength/carioca.json +1 -1
  234. package/dist/web/playground/seed/core/markdown/efforts/strength/clean-and-jerk.json +1 -1
  235. package/dist/web/playground/seed/core/markdown/efforts/strength/cluster.json +1 -1
  236. package/dist/web/playground/seed/core/markdown/efforts/strength/dead-hang.json +1 -1
  237. package/dist/web/playground/seed/core/markdown/efforts/strength/deadlift.json +1 -1
  238. package/dist/web/playground/seed/core/markdown/efforts/strength/devils-press.json +1 -1
  239. package/dist/web/playground/seed/core/markdown/efforts/strength/dumbbell-box-step-up.json +1 -1
  240. package/dist/web/playground/seed/core/markdown/efforts/strength/dumbbell-clean.json +1 -1
  241. package/dist/web/playground/seed/core/markdown/efforts/strength/dumbbell-fly.json +1 -1
  242. package/dist/web/playground/seed/core/markdown/efforts/strength/dumbbell-row.json +1 -1
  243. package/dist/web/playground/seed/core/markdown/efforts/strength/dumbbell-snatch.json +1 -1
  244. package/dist/web/playground/seed/core/markdown/efforts/strength/dumbbell-thruster.json +1 -1
  245. package/dist/web/playground/seed/core/markdown/efforts/strength/elbows-to-knees.json +1 -1
  246. package/dist/web/playground/seed/core/markdown/efforts/strength/farmer-carry.json +1 -1
  247. package/dist/web/playground/seed/core/markdown/efforts/strength/frog-stand.json +1 -1
  248. package/dist/web/playground/seed/core/markdown/efforts/strength/front-squat.json +1 -1
  249. package/dist/web/playground/seed/core/markdown/efforts/strength/good-morning.json +1 -1
  250. package/dist/web/playground/seed/core/markdown/efforts/strength/hanging-leg-raise.json +1 -1
  251. package/dist/web/playground/seed/core/markdown/efforts/strength/hollow-rock.json +1 -1
  252. package/dist/web/playground/seed/core/markdown/efforts/strength/knees-to-elbows.json +1 -1
  253. package/dist/web/playground/seed/core/markdown/efforts/strength/l-sit.json +1 -1
  254. package/dist/web/playground/seed/core/markdown/efforts/strength/man-maker.json +1 -1
  255. package/dist/web/playground/seed/core/markdown/efforts/strength/medicine-ball-clean.json +1 -1
  256. package/dist/web/playground/seed/core/markdown/efforts/strength/overhead-press.json +1 -1
  257. package/dist/web/playground/seed/core/markdown/efforts/strength/parkour-vault.json +1 -1
  258. package/dist/web/playground/seed/core/markdown/efforts/strength/pig-flip.json +1 -1
  259. package/dist/web/playground/seed/core/markdown/efforts/strength/power-clean.json +1 -1
  260. package/dist/web/playground/seed/core/markdown/efforts/strength/power-snatch.json +1 -1
  261. package/dist/web/playground/seed/core/markdown/efforts/strength/push-jerk.json +1 -1
  262. package/dist/web/playground/seed/core/markdown/efforts/strength/push-press.json +1 -1
  263. package/dist/web/playground/seed/core/markdown/efforts/strength/romanian-deadlift.json +1 -1
  264. package/dist/web/playground/seed/core/markdown/efforts/strength/single-leg-deadlift.json +1 -1
  265. package/dist/web/playground/seed/core/markdown/efforts/strength/skull-crusher.json +1 -1
  266. package/dist/web/playground/seed/core/markdown/efforts/strength/slam-ball.json +1 -1
  267. package/dist/web/playground/seed/core/markdown/efforts/strength/sled-pull.json +1 -1
  268. package/dist/web/playground/seed/core/markdown/efforts/strength/sled-push.json +1 -1
  269. package/dist/web/playground/seed/core/markdown/efforts/strength/sumo-deadlift.json +1 -1
  270. package/dist/web/playground/seed/core/markdown/efforts/strength/thruster.json +1 -1
  271. package/dist/web/playground/seed/core/markdown/efforts/strength/triceps-extension.json +1 -1
  272. package/dist/web/playground/seed/core/markdown/efforts/strength/v-sit-hold.json +1 -1
  273. package/dist/web/playground/seed/core/markdown/efforts/strength/wall-walk.json +1 -1
  274. package/dist/web/playground/seed/core/markdown/efforts/strength/yoga-sun-salutation.json +1 -1
  275. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-assisted-sprint.json +1 -1
  276. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-backstroke.json +1 -1
  277. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-breaststroke-kick.json +1 -1
  278. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-breaststroke.json +1 -1
  279. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-butterfly.json +1 -1
  280. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-catch-up-drill.json +1 -1
  281. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-choice-stroke.json +1 -1
  282. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-dive-start.json +1 -1
  283. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-dolphin-kick.json +1 -1
  284. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-drafting.json +1 -1
  285. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-fingertip-drag.json +1 -1
  286. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-freestyle.json +1 -1
  287. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-individual-medley.json +1 -1
  288. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-kick.json +1 -1
  289. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-pull.json +1 -1
  290. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-resisted-sprint.json +1 -1
  291. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-rotation-drill.json +1 -1
  292. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-sighting.json +1 -1
  293. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-single-arm-drill.json +1 -1
  294. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-stroke-transition.json +1 -1
  295. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-two-kick-one-pull.json +1 -1
  296. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-vigorous.json +1 -1
  297. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming.json +1 -1
  298. package/dist/web/playground/seed/core/markdown/efforts/unconventional/clubbell-arm-cast.json +1 -1
  299. package/dist/web/playground/seed/core/markdown/efforts/unconventional/clubbell-circles.json +1 -1
  300. package/dist/web/playground/seed/core/markdown/efforts/unconventional/clubbell-mill.json +1 -1
  301. package/dist/web/playground/seed/core/markdown/efforts/unconventional/clubbell-reverse-mill.json +1 -1
  302. package/dist/web/playground/seed/core/markdown/efforts/unconventional/clubbell-shield-cast.json +1 -1
  303. package/dist/web/playground/seed/core/markdown/efforts/unconventional/macebell-10-to-2-swing.json +1 -1
  304. package/dist/web/playground/seed/core/markdown/efforts/unconventional/macebell-360-swing.json +1 -1
  305. package/dist/web/playground/seed/core/markdown/efforts/unconventional/macebell-barbarian-squat.json +1 -1
  306. package/dist/web/playground/seed/core/markdown/efforts/unconventional/macebell-flow.json +1 -1
  307. package/dist/web/playground/seed/core/markdown/efforts/unconventional/macebell-gravedigger.json +1 -1
  308. package/dist/web/playground/seed/core/markdown/efforts/unconventional/macebell-touchdown.json +1 -1
  309. package/dist/web/playground/seed/core/markdown/efforts/unconventional/sandbag-bear-hug-carry.json +1 -1
  310. package/dist/web/playground/seed/core/markdown/efforts/unconventional/sandbag-bear-hug-extension.json +1 -1
  311. package/dist/web/playground/seed/core/markdown/efforts/unconventional/sandbag-over-shoulder.json +1 -1
  312. package/dist/web/playground/seed/core/markdown/efforts/walking/walking-3-mph.json +1 -1
  313. package/dist/web/playground/seed/core/markdown/equipment/air-bike.json +1 -1
  314. package/dist/web/playground/seed/core/markdown/equipment/barbell.json +1 -1
  315. package/dist/web/playground/seed/core/markdown/equipment/bench.json +1 -1
  316. package/dist/web/playground/seed/core/markdown/equipment/bike-erg.json +1 -1
  317. package/dist/web/playground/seed/core/markdown/equipment/climbing-rope.json +1 -1
  318. package/dist/web/playground/seed/core/markdown/equipment/clubs.json +1 -1
  319. package/dist/web/playground/seed/core/markdown/equipment/dumbbell.json +1 -1
  320. package/dist/web/playground/seed/core/markdown/equipment/ghd.json +1 -1
  321. package/dist/web/playground/seed/core/markdown/equipment/gymnastic-rings.json +1 -1
  322. package/dist/web/playground/seed/core/markdown/equipment/jump-rope.json +1 -1
  323. package/dist/web/playground/seed/core/markdown/equipment/kettlebell.json +1 -1
  324. package/dist/web/playground/seed/core/markdown/equipment/macebell.json +1 -1
  325. package/dist/web/playground/seed/core/markdown/equipment/medicine-ball.json +1 -1
  326. package/dist/web/playground/seed/core/markdown/equipment/parallettes.json +1 -1
  327. package/dist/web/playground/seed/core/markdown/equipment/plyo-box.json +1 -1
  328. package/dist/web/playground/seed/core/markdown/equipment/pull-up-bar.json +1 -1
  329. package/dist/web/playground/seed/core/markdown/equipment/rower.json +1 -1
  330. package/dist/web/playground/seed/core/markdown/equipment/sandbag.json +1 -1
  331. package/dist/web/playground/seed/core/markdown/equipment/ski-erg.json +1 -1
  332. package/dist/web/playground/seed/core/markdown/equipment/slam-ball.json +1 -1
  333. package/dist/web/playground/seed/core/markdown/equipment/sled.json +1 -1
  334. package/dist/web/playground/seed/core/markdown/equipment/sledgehammer.json +1 -1
  335. package/dist/web/playground/seed/core/markdown/equipment/weight-vest.json +1 -1
  336. package/dist/web/playground/seed/core/report.html +13 -13
  337. package/dist/web/server/ai-skills/agent-parity.md +41 -0
  338. package/dist/web/server/ai-skills/cli.md +127 -0
  339. package/dist/web/server/ai-skills/wql.md +63 -0
  340. package/dist/web/server/assets/main-BH_SMMzT.css +2 -0
  341. package/dist/web/server/assets/main-D0W-D5YL.js +1152 -0
  342. package/dist/web/server/assets/{statementBuilderFlow-C7ob6Wnu.js → statementBuilderFlow-CtmmV_Yv.js} +2 -2
  343. package/dist/web/server/assets/vendor-BUlwHBNF.js +255 -0
  344. package/dist/web/server/assets/{vendor-codemirror-B4BeZarI.js → vendor-codemirror-Bh6hyz5v.js} +11 -11
  345. package/dist/web/server/index.html +4 -4
  346. package/dist/web/server/llms-full.txt +1444 -0
  347. package/dist/web/server/llms.txt +67 -0
  348. package/dist/web/{playground/seed/core/chunks/canvas.28c523ac.json → server/seed/core/chunks/canvas.b0bc465b.json} +1 -1
  349. package/dist/web/server/seed/core/chunks/{dashboards.dc521d4e.json → dashboards.af9a29e4.json} +1 -1
  350. package/dist/web/server/seed/core/chunks/{efforts.cc1d51a5.json → efforts.902271f9.json} +1 -1
  351. package/dist/web/server/seed/core/chunks/{equipment.3c479de5.json → equipment.dbdc1af3.json} +1 -1
  352. package/dist/web/server/seed/core/indexes/notebooks/canvas.json +180 -180
  353. package/dist/web/server/seed/core/indexes/notebooks/dashboards.json +16 -16
  354. package/dist/web/server/seed/core/indexes/notebooks/efforts.json +326 -326
  355. package/dist/web/server/seed/core/indexes/notebooks/equipment.json +50 -50
  356. package/dist/web/server/seed/core/manifest.json +27 -27
  357. package/dist/web/server/seed/core/markdown/canvas/ai-first/README.json +1 -1
  358. package/dist/web/server/seed/core/markdown/canvas/guide/README.json +4 -4
  359. package/dist/web/server/seed/core/markdown/canvas/guide/clock.json +1 -1
  360. package/dist/web/server/seed/core/markdown/canvas/guide/dashboards.json +1 -1
  361. package/dist/web/server/seed/core/markdown/canvas/guide/metrics-summaries.json +2 -2
  362. package/dist/web/server/seed/core/markdown/canvas/guide/metrics.json +12 -12
  363. package/dist/web/server/seed/core/markdown/canvas/guide/protocols.json +20 -20
  364. package/dist/web/server/seed/core/markdown/canvas/guide/sessions.json +33 -33
  365. package/dist/web/server/seed/core/markdown/canvas/guide/start.json +11 -11
  366. package/dist/web/server/seed/core/markdown/canvas/guide/structure.json +25 -25
  367. package/dist/web/server/seed/core/markdown/canvas/guide/wql.json +5 -5
  368. package/dist/web/server/seed/core/markdown/canvas/home/sample-script.json +4 -4
  369. package/dist/web/server/seed/core/markdown/canvas/home/welcome-1.json +2 -2
  370. package/dist/web/server/seed/core/markdown/canvas/syntax/actions-comments.json +4 -4
  371. package/dist/web/server/seed/core/markdown/canvas/syntax/alternating-emom.json +5 -5
  372. package/dist/web/server/seed/core/markdown/canvas/syntax/basic-emom.json +4 -4
  373. package/dist/web/server/seed/core/markdown/canvas/syntax/calculated-metrics.json +4 -4
  374. package/dist/web/server/seed/core/markdown/canvas/syntax/classic-amrap.json +6 -6
  375. package/dist/web/server/seed/core/markdown/canvas/syntax/complex-barbell-cycling.json +4 -4
  376. package/dist/web/server/seed/core/markdown/canvas/syntax/complex-full-session.json +10 -10
  377. package/dist/web/server/seed/core/markdown/canvas/syntax/complex-nested-protocols.json +7 -7
  378. package/dist/web/server/seed/core/markdown/canvas/syntax/complex-partner-workout.json +7 -7
  379. package/dist/web/server/seed/core/markdown/canvas/syntax/complex-swimming.json +5 -5
  380. package/dist/web/server/seed/core/markdown/canvas/syntax/core-rules.json +4 -4
  381. package/dist/web/server/seed/core/markdown/canvas/syntax/custom-and-calculated-metrics.json +4 -4
  382. package/dist/web/server/seed/core/markdown/canvas/syntax/custom-intervals.json +4 -4
  383. package/dist/web/server/seed/core/markdown/canvas/syntax/custom-metrics-1.json +4 -4
  384. package/dist/web/server/seed/core/markdown/canvas/syntax/custom-metrics-2.json +5 -5
  385. package/dist/web/server/seed/core/markdown/canvas/syntax/custom-metrics-3.json +3 -3
  386. package/dist/web/server/seed/core/markdown/canvas/syntax/custom-metrics-4.json +4 -4
  387. package/dist/web/server/seed/core/markdown/canvas/syntax/custom-metrics-5.json +4 -4
  388. package/dist/web/server/seed/core/markdown/canvas/syntax/dialect-climb-bouldering.json +2 -2
  389. package/dist/web/server/seed/core/markdown/canvas/syntax/dialect-climb-hangboard.json +2 -2
  390. package/dist/web/server/seed/core/markdown/canvas/syntax/dialect-climb-sport.json +2 -2
  391. package/dist/web/server/seed/core/markdown/canvas/syntax/dialect-log.json +4 -4
  392. package/dist/web/server/seed/core/markdown/canvas/syntax/dialect-plan.json +8 -8
  393. package/dist/web/server/seed/core/markdown/canvas/syntax/dialect-wod.json +5 -5
  394. package/dist/web/server/seed/core/markdown/canvas/syntax/distance-intervals.json +3 -3
  395. package/dist/web/server/seed/core/markdown/canvas/syntax/document-1.json +4 -4
  396. package/dist/web/server/seed/core/markdown/canvas/syntax/document-2.json +5 -5
  397. package/dist/web/server/seed/core/markdown/canvas/syntax/document-3.json +10 -10
  398. package/dist/web/server/seed/core/markdown/canvas/syntax/document-4.json +5 -5
  399. package/dist/web/server/seed/core/markdown/canvas/syntax/effort-notes.json +5 -5
  400. package/dist/web/server/seed/core/markdown/canvas/syntax/frontmatter-summaries.json +4 -4
  401. package/dist/web/server/seed/core/markdown/canvas/syntax/groups-1.json +5 -5
  402. package/dist/web/server/seed/core/markdown/canvas/syntax/groups-2.json +6 -6
  403. package/dist/web/server/seed/core/markdown/canvas/syntax/groups-3.json +3 -3
  404. package/dist/web/server/seed/core/markdown/canvas/syntax/groups-4.json +3 -3
  405. package/dist/web/server/seed/core/markdown/canvas/syntax/longer-duration.json +4 -4
  406. package/dist/web/server/seed/core/markdown/canvas/syntax/longer-intervals.json +4 -4
  407. package/dist/web/server/seed/core/markdown/canvas/syntax/measurements.json +7 -7
  408. package/dist/web/server/seed/core/markdown/canvas/syntax/metrics-1.json +5 -5
  409. package/dist/web/server/seed/core/markdown/canvas/syntax/metrics-2.json +7 -7
  410. package/dist/web/server/seed/core/markdown/canvas/syntax/metrics-3.json +8 -8
  411. package/dist/web/server/seed/core/markdown/canvas/syntax/metrics-4.json +6 -6
  412. package/dist/web/server/seed/core/markdown/canvas/syntax/metrics-5.json +5 -5
  413. package/dist/web/server/seed/core/markdown/canvas/syntax/mixed-sections.json +10 -10
  414. package/dist/web/server/seed/core/markdown/canvas/syntax/mixed-timers.json +5 -5
  415. package/dist/web/server/seed/core/markdown/canvas/syntax/multiple-amrap-windows.json +7 -7
  416. package/dist/web/server/seed/core/markdown/canvas/syntax/multiple-sets.json +4 -4
  417. package/dist/web/server/seed/core/markdown/canvas/syntax/named-groups.json +6 -6
  418. package/dist/web/server/seed/core/markdown/canvas/syntax/protocols-1.json +6 -6
  419. package/dist/web/server/seed/core/markdown/canvas/syntax/protocols-2.json +4 -4
  420. package/dist/web/server/seed/core/markdown/canvas/syntax/protocols-3.json +6 -6
  421. package/dist/web/server/seed/core/markdown/canvas/syntax/protocols-4.json +3 -3
  422. package/dist/web/server/seed/core/markdown/canvas/syntax/protocols-5.json +4 -4
  423. package/dist/web/server/seed/core/markdown/canvas/syntax/single-movement.json +3 -3
  424. package/dist/web/server/seed/core/markdown/canvas/syntax/supplemental-1.json +4 -4
  425. package/dist/web/server/seed/core/markdown/canvas/syntax/supplemental-2.json +5 -5
  426. package/dist/web/server/seed/core/markdown/canvas/syntax/supplemental-3.json +4 -4
  427. package/dist/web/server/seed/core/markdown/canvas/syntax/supplemental-4.json +4 -4
  428. package/dist/web/server/seed/core/markdown/canvas/syntax/time-cap.json +6 -6
  429. package/dist/web/server/seed/core/markdown/canvas/syntax/timer-modifiers.json +6 -6
  430. package/dist/web/server/seed/core/markdown/canvas/syntax/timers-1.json +6 -6
  431. package/dist/web/server/seed/core/markdown/canvas/syntax/timers-2.json +4 -4
  432. package/dist/web/server/seed/core/markdown/canvas/syntax/timers-3.json +4 -4
  433. package/dist/web/server/seed/core/markdown/canvas/syntax/timers-4.json +4 -4
  434. package/dist/web/server/seed/core/markdown/canvas/syntax/timers-5.json +5 -5
  435. package/dist/web/server/seed/core/markdown/canvas/syntax/timers-rest.json +4 -4
  436. package/dist/web/server/seed/core/markdown/canvas/wql-presets/aggregate-by-effort.json +2 -2
  437. package/dist/web/server/seed/core/markdown/canvas/wql-presets/aggregate-by-week.json +2 -2
  438. package/dist/web/server/seed/core/markdown/canvas/wql-presets/content-fran.json +2 -2
  439. package/dist/web/server/seed/core/markdown/canvas/wql-presets/filter-combos.json +2 -2
  440. package/dist/web/server/seed/core/markdown/canvas/wql-presets/pipes-limit.json +2 -2
  441. package/dist/web/server/seed/core/markdown/canvas/wql-presets/session-rpe.json +2 -2
  442. package/dist/web/server/seed/core/markdown/canvas/wql-presets/source-journal.json +2 -2
  443. package/dist/web/server/seed/core/markdown/canvas/wql-presets/tis-trend.json +2 -2
  444. package/dist/web/server/seed/core/markdown/canvas/wql-presets/where-join.json +2 -2
  445. package/dist/web/server/seed/core/markdown/dashboards/benchmark-pr-board.json +6 -6
  446. package/dist/web/server/seed/core/markdown/dashboards/finger-strength-v8.json +5 -5
  447. package/dist/web/server/seed/core/markdown/dashboards/polarized-base-marathon.json +9 -9
  448. package/dist/web/server/seed/core/markdown/dashboards/recovery-readiness.json +7 -7
  449. package/dist/web/server/seed/core/markdown/dashboards/road-to-560-total.json +9 -9
  450. package/dist/web/server/seed/core/markdown/dashboards/training-block-review.json +11 -11
  451. package/dist/web/server/seed/core/markdown/efforts/bodyweight/air-squat.json +1 -1
  452. package/dist/web/server/seed/core/markdown/efforts/bodyweight/box-jump.json +1 -1
  453. package/dist/web/server/seed/core/markdown/efforts/bodyweight/broad-jump.json +1 -1
  454. package/dist/web/server/seed/core/markdown/efforts/bodyweight/burpee-box-jump-over.json +1 -1
  455. package/dist/web/server/seed/core/markdown/efforts/bodyweight/burpee-over-dumbbell.json +1 -1
  456. package/dist/web/server/seed/core/markdown/efforts/bodyweight/burpee.json +1 -1
  457. package/dist/web/server/seed/core/markdown/efforts/bodyweight/dumbbell-squat-clean.json +1 -1
  458. package/dist/web/server/seed/core/markdown/efforts/bodyweight/ghd-sit-up.json +1 -1
  459. package/dist/web/server/seed/core/markdown/efforts/bodyweight/ground-kong.json +1 -1
  460. package/dist/web/server/seed/core/markdown/efforts/bodyweight/jumping-jack.json +1 -1
  461. package/dist/web/server/seed/core/markdown/efforts/bodyweight/kong-walk.json +1 -1
  462. package/dist/web/server/seed/core/markdown/efforts/bodyweight/lunge.json +1 -1
  463. package/dist/web/server/seed/core/markdown/efforts/bodyweight/overhead-squat.json +1 -1
  464. package/dist/web/server/seed/core/markdown/efforts/bodyweight/parkour-roll.json +1 -1
  465. package/dist/web/server/seed/core/markdown/efforts/bodyweight/parkour-squat.json +1 -1
  466. package/dist/web/server/seed/core/markdown/efforts/bodyweight/pistol-squat.json +1 -1
  467. package/dist/web/server/seed/core/markdown/efforts/bodyweight/plank.json +1 -1
  468. package/dist/web/server/seed/core/markdown/efforts/bodyweight/precision-burpee.json +1 -1
  469. package/dist/web/server/seed/core/markdown/efforts/bodyweight/precision-jump.json +1 -1
  470. package/dist/web/server/seed/core/markdown/efforts/bodyweight/quadrupedal-movement.json +1 -1
  471. package/dist/web/server/seed/core/markdown/efforts/bodyweight/russian-twist.json +1 -1
  472. package/dist/web/server/seed/core/markdown/efforts/bodyweight/sit-up.json +1 -1
  473. package/dist/web/server/seed/core/markdown/efforts/bodyweight/squat-clean.json +1 -1
  474. package/dist/web/server/seed/core/markdown/efforts/bodyweight/squat-hold.json +1 -1
  475. package/dist/web/server/seed/core/markdown/efforts/bodyweight/squat-snatch.json +1 -1
  476. package/dist/web/server/seed/core/markdown/efforts/bodyweight/tuck-jump.json +1 -1
  477. package/dist/web/server/seed/core/markdown/efforts/bodyweight/wall-ball.json +1 -1
  478. package/dist/web/server/seed/core/markdown/efforts/bodyweight/wall-burpee.json +1 -1
  479. package/dist/web/server/seed/core/markdown/efforts/cycling/assault-bike.json +1 -1
  480. package/dist/web/server/seed/core/markdown/efforts/cycling/cycling-moderate.json +1 -1
  481. package/dist/web/server/seed/core/markdown/efforts/cycling/cycling-vigorous.json +1 -1
  482. package/dist/web/server/seed/core/markdown/efforts/gymnastics/assisted-pull-up.json +1 -1
  483. package/dist/web/server/seed/core/markdown/efforts/gymnastics/burpee-pull-up.json +1 -1
  484. package/dist/web/server/seed/core/markdown/efforts/gymnastics/chest-to-bar-pull-up.json +1 -1
  485. package/dist/web/server/seed/core/markdown/efforts/gymnastics/dip.json +1 -1
  486. package/dist/web/server/seed/core/markdown/efforts/gymnastics/double-under.json +1 -1
  487. package/dist/web/server/seed/core/markdown/efforts/gymnastics/handstand-hold.json +1 -1
  488. package/dist/web/server/seed/core/markdown/efforts/gymnastics/handstand-push-up.json +1 -1
  489. package/dist/web/server/seed/core/markdown/efforts/gymnastics/handstand-walk.json +1 -1
  490. package/dist/web/server/seed/core/markdown/efforts/gymnastics/jump-rope.json +1 -1
  491. package/dist/web/server/seed/core/markdown/efforts/gymnastics/jumping-pull-up.json +1 -1
  492. package/dist/web/server/seed/core/markdown/efforts/gymnastics/jumping-push-up.json +1 -1
  493. package/dist/web/server/seed/core/markdown/efforts/gymnastics/l-sit-pull-up.json +1 -1
  494. package/dist/web/server/seed/core/markdown/efforts/gymnastics/muscle-up.json +1 -1
  495. package/dist/web/server/seed/core/markdown/efforts/gymnastics/pull-up.json +1 -1
  496. package/dist/web/server/seed/core/markdown/efforts/gymnastics/push-up.json +1 -1
  497. package/dist/web/server/seed/core/markdown/efforts/gymnastics/reverse-wall-dip.json +1 -1
  498. package/dist/web/server/seed/core/markdown/efforts/gymnastics/rope-climb.json +1 -1
  499. package/dist/web/server/seed/core/markdown/efforts/gymnastics/toes-to-bar.json +1 -1
  500. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-arm-bar.json +1 -1
  501. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-around-the-world.json +1 -1
  502. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-bent-over-row.json +1 -1
  503. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-clean-and-jerk.json +1 -1
  504. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-clean-and-press.json +1 -1
  505. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-clean.json +1 -1
  506. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-deadlift.json +1 -1
  507. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-floor-press.json +1 -1
  508. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-front-squat.json +1 -1
  509. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-goblet-squat.json +1 -1
  510. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-gorilla-row.json +1 -1
  511. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-halo.json +1 -1
  512. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-jerk.json +1 -1
  513. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-overhead-squat.json +1 -1
  514. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-press.json +1 -1
  515. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-snatch.json +1 -1
  516. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-swing.json +1 -1
  517. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-windmill.json +1 -1
  518. package/dist/web/server/seed/core/markdown/efforts/kettlebell/turkish-get-up.json +1 -1
  519. package/dist/web/server/seed/core/markdown/efforts/recovery/rest.json +1 -1
  520. package/dist/web/server/seed/core/markdown/efforts/recovery/stretching.json +1 -1
  521. package/dist/web/server/seed/core/markdown/efforts/rowing/rowing-sprint.json +1 -1
  522. package/dist/web/server/seed/core/markdown/efforts/rowing/rowing.json +1 -1
  523. package/dist/web/server/seed/core/markdown/efforts/rowing/ski-erg.json +1 -1
  524. package/dist/web/server/seed/core/markdown/efforts/running/backward-running.json +1 -1
  525. package/dist/web/server/seed/core/markdown/efforts/running/running-6-mph.json +1 -1
  526. package/dist/web/server/seed/core/markdown/efforts/running/running-8-mph.json +1 -1
  527. package/dist/web/server/seed/core/markdown/efforts/running/running-sprint.json +1 -1
  528. package/dist/web/server/seed/core/markdown/efforts/snatch.json +2 -2
  529. package/dist/web/server/seed/core/markdown/efforts/strength/back-squat.json +1 -1
  530. package/dist/web/server/seed/core/markdown/efforts/strength/bench-press.json +1 -1
  531. package/dist/web/server/seed/core/markdown/efforts/strength/box-step-up.json +1 -1
  532. package/dist/web/server/seed/core/markdown/efforts/strength/carioca.json +1 -1
  533. package/dist/web/server/seed/core/markdown/efforts/strength/clean-and-jerk.json +1 -1
  534. package/dist/web/server/seed/core/markdown/efforts/strength/cluster.json +1 -1
  535. package/dist/web/server/seed/core/markdown/efforts/strength/dead-hang.json +1 -1
  536. package/dist/web/server/seed/core/markdown/efforts/strength/deadlift.json +1 -1
  537. package/dist/web/server/seed/core/markdown/efforts/strength/devils-press.json +1 -1
  538. package/dist/web/server/seed/core/markdown/efforts/strength/dumbbell-box-step-up.json +1 -1
  539. package/dist/web/server/seed/core/markdown/efforts/strength/dumbbell-clean.json +1 -1
  540. package/dist/web/server/seed/core/markdown/efforts/strength/dumbbell-fly.json +1 -1
  541. package/dist/web/server/seed/core/markdown/efforts/strength/dumbbell-row.json +1 -1
  542. package/dist/web/server/seed/core/markdown/efforts/strength/dumbbell-snatch.json +1 -1
  543. package/dist/web/server/seed/core/markdown/efforts/strength/dumbbell-thruster.json +1 -1
  544. package/dist/web/server/seed/core/markdown/efforts/strength/elbows-to-knees.json +1 -1
  545. package/dist/web/server/seed/core/markdown/efforts/strength/farmer-carry.json +1 -1
  546. package/dist/web/server/seed/core/markdown/efforts/strength/frog-stand.json +1 -1
  547. package/dist/web/server/seed/core/markdown/efforts/strength/front-squat.json +1 -1
  548. package/dist/web/server/seed/core/markdown/efforts/strength/good-morning.json +1 -1
  549. package/dist/web/server/seed/core/markdown/efforts/strength/hanging-leg-raise.json +1 -1
  550. package/dist/web/server/seed/core/markdown/efforts/strength/hollow-rock.json +1 -1
  551. package/dist/web/server/seed/core/markdown/efforts/strength/knees-to-elbows.json +1 -1
  552. package/dist/web/server/seed/core/markdown/efforts/strength/l-sit.json +1 -1
  553. package/dist/web/server/seed/core/markdown/efforts/strength/man-maker.json +1 -1
  554. package/dist/web/server/seed/core/markdown/efforts/strength/medicine-ball-clean.json +1 -1
  555. package/dist/web/server/seed/core/markdown/efforts/strength/overhead-press.json +1 -1
  556. package/dist/web/server/seed/core/markdown/efforts/strength/parkour-vault.json +1 -1
  557. package/dist/web/server/seed/core/markdown/efforts/strength/pig-flip.json +1 -1
  558. package/dist/web/server/seed/core/markdown/efforts/strength/power-clean.json +1 -1
  559. package/dist/web/server/seed/core/markdown/efforts/strength/power-snatch.json +1 -1
  560. package/dist/web/server/seed/core/markdown/efforts/strength/push-jerk.json +1 -1
  561. package/dist/web/server/seed/core/markdown/efforts/strength/push-press.json +1 -1
  562. package/dist/web/server/seed/core/markdown/efforts/strength/romanian-deadlift.json +1 -1
  563. package/dist/web/server/seed/core/markdown/efforts/strength/single-leg-deadlift.json +1 -1
  564. package/dist/web/server/seed/core/markdown/efforts/strength/skull-crusher.json +1 -1
  565. package/dist/web/server/seed/core/markdown/efforts/strength/slam-ball.json +1 -1
  566. package/dist/web/server/seed/core/markdown/efforts/strength/sled-pull.json +1 -1
  567. package/dist/web/server/seed/core/markdown/efforts/strength/sled-push.json +1 -1
  568. package/dist/web/server/seed/core/markdown/efforts/strength/sumo-deadlift.json +1 -1
  569. package/dist/web/server/seed/core/markdown/efforts/strength/thruster.json +1 -1
  570. package/dist/web/server/seed/core/markdown/efforts/strength/triceps-extension.json +1 -1
  571. package/dist/web/server/seed/core/markdown/efforts/strength/v-sit-hold.json +1 -1
  572. package/dist/web/server/seed/core/markdown/efforts/strength/wall-walk.json +1 -1
  573. package/dist/web/server/seed/core/markdown/efforts/strength/yoga-sun-salutation.json +1 -1
  574. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-assisted-sprint.json +1 -1
  575. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-backstroke.json +1 -1
  576. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-breaststroke-kick.json +1 -1
  577. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-breaststroke.json +1 -1
  578. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-butterfly.json +1 -1
  579. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-catch-up-drill.json +1 -1
  580. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-choice-stroke.json +1 -1
  581. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-dive-start.json +1 -1
  582. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-dolphin-kick.json +1 -1
  583. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-drafting.json +1 -1
  584. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-fingertip-drag.json +1 -1
  585. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-freestyle.json +1 -1
  586. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-individual-medley.json +1 -1
  587. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-kick.json +1 -1
  588. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-pull.json +1 -1
  589. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-resisted-sprint.json +1 -1
  590. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-rotation-drill.json +1 -1
  591. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-sighting.json +1 -1
  592. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-single-arm-drill.json +1 -1
  593. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-stroke-transition.json +1 -1
  594. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-two-kick-one-pull.json +1 -1
  595. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-vigorous.json +1 -1
  596. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming.json +1 -1
  597. package/dist/web/server/seed/core/markdown/efforts/unconventional/clubbell-arm-cast.json +1 -1
  598. package/dist/web/server/seed/core/markdown/efforts/unconventional/clubbell-circles.json +1 -1
  599. package/dist/web/server/seed/core/markdown/efforts/unconventional/clubbell-mill.json +1 -1
  600. package/dist/web/server/seed/core/markdown/efforts/unconventional/clubbell-reverse-mill.json +1 -1
  601. package/dist/web/server/seed/core/markdown/efforts/unconventional/clubbell-shield-cast.json +1 -1
  602. package/dist/web/server/seed/core/markdown/efforts/unconventional/macebell-10-to-2-swing.json +1 -1
  603. package/dist/web/server/seed/core/markdown/efforts/unconventional/macebell-360-swing.json +1 -1
  604. package/dist/web/server/seed/core/markdown/efforts/unconventional/macebell-barbarian-squat.json +1 -1
  605. package/dist/web/server/seed/core/markdown/efforts/unconventional/macebell-flow.json +1 -1
  606. package/dist/web/server/seed/core/markdown/efforts/unconventional/macebell-gravedigger.json +1 -1
  607. package/dist/web/server/seed/core/markdown/efforts/unconventional/macebell-touchdown.json +1 -1
  608. package/dist/web/server/seed/core/markdown/efforts/unconventional/sandbag-bear-hug-carry.json +1 -1
  609. package/dist/web/server/seed/core/markdown/efforts/unconventional/sandbag-bear-hug-extension.json +1 -1
  610. package/dist/web/server/seed/core/markdown/efforts/unconventional/sandbag-over-shoulder.json +1 -1
  611. package/dist/web/server/seed/core/markdown/efforts/walking/walking-3-mph.json +1 -1
  612. package/dist/web/server/seed/core/markdown/equipment/air-bike.json +1 -1
  613. package/dist/web/server/seed/core/markdown/equipment/barbell.json +1 -1
  614. package/dist/web/server/seed/core/markdown/equipment/bench.json +1 -1
  615. package/dist/web/server/seed/core/markdown/equipment/bike-erg.json +1 -1
  616. package/dist/web/server/seed/core/markdown/equipment/climbing-rope.json +1 -1
  617. package/dist/web/server/seed/core/markdown/equipment/clubs.json +1 -1
  618. package/dist/web/server/seed/core/markdown/equipment/dumbbell.json +1 -1
  619. package/dist/web/server/seed/core/markdown/equipment/ghd.json +1 -1
  620. package/dist/web/server/seed/core/markdown/equipment/gymnastic-rings.json +1 -1
  621. package/dist/web/server/seed/core/markdown/equipment/jump-rope.json +1 -1
  622. package/dist/web/server/seed/core/markdown/equipment/kettlebell.json +1 -1
  623. package/dist/web/server/seed/core/markdown/equipment/macebell.json +1 -1
  624. package/dist/web/server/seed/core/markdown/equipment/medicine-ball.json +1 -1
  625. package/dist/web/server/seed/core/markdown/equipment/parallettes.json +1 -1
  626. package/dist/web/server/seed/core/markdown/equipment/plyo-box.json +1 -1
  627. package/dist/web/server/seed/core/markdown/equipment/pull-up-bar.json +1 -1
  628. package/dist/web/server/seed/core/markdown/equipment/rower.json +1 -1
  629. package/dist/web/server/seed/core/markdown/equipment/sandbag.json +1 -1
  630. package/dist/web/server/seed/core/markdown/equipment/ski-erg.json +1 -1
  631. package/dist/web/server/seed/core/markdown/equipment/slam-ball.json +1 -1
  632. package/dist/web/server/seed/core/markdown/equipment/sled.json +1 -1
  633. package/dist/web/server/seed/core/markdown/equipment/sledgehammer.json +1 -1
  634. package/dist/web/server/seed/core/markdown/equipment/weight-vest.json +1 -1
  635. package/dist/web/server/seed/core/report.html +13 -13
  636. package/package.json +10 -8
  637. package/dist/chunk-2EWCEE6N.mjs.map +0 -1
  638. package/dist/chunk-ES4ZZ447.mjs.map +0 -1
  639. package/dist/chunk-LNBKPHEP.mjs.map +0 -1
  640. package/dist/chunk-LWW4HK4G.mjs.map +0 -1
  641. package/dist/server-SHNWCIIM.mjs +0 -11
  642. package/dist/web/playground/assets/main-BChtcigM.js +0 -1149
  643. package/dist/web/playground/assets/main-DGz9PHS_.css +0 -2
  644. package/dist/web/playground/assets/vendor-Dz-Azkoq.js +0 -198
  645. package/dist/web/server/assets/main-BT4Llg8k.js +0 -1149
  646. package/dist/web/server/assets/main-DGz9PHS_.css +0 -2
  647. package/dist/web/server/assets/vendor-Dz-Azkoq.js +0 -198
@@ -5,8 +5,8 @@ if (typeof globalThis.require === 'undefined') {
5
5
  }
6
6
 
7
7
  // src/version.ts
8
- var VERSION = "0.53.2203";
8
+ var VERSION = "0.54.2205";
9
9
 
10
10
  export { VERSION };
11
- //# sourceMappingURL=chunk-ES4ZZ447.mjs.map
12
- //# sourceMappingURL=chunk-ES4ZZ447.mjs.map
11
+ //# sourceMappingURL=chunk-T7VB7PPO.mjs.map
12
+ //# sourceMappingURL=chunk-T7VB7PPO.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/version.ts"],"names":[],"mappings":";;;;;;;AAIO,IAAM,OAAA,GAAU","file":"chunk-T7VB7PPO.mjs","sourcesContent":["/**\n * Auto-generated build version metadata.\n * Do not edit directly; updated by scripts/stamp-version.ts\n */\nexport const VERSION = '0.54.2205';\nexport const GIT_SHA = '1a0df57';\nexport const BUILD_TIME = '2026-11-12T03:09:09.212Z';\nexport const SEMVER = {\n version: '0.54.2205',\n gitSha: '1a0df57',\n buildTime: '2026-11-12T03:09:09.212Z',\n} as const;\n"]}
@@ -1,12 +1,15 @@
1
1
  import { createRequire } from 'module';
2
+ import { createWodMcpServer } from './chunk-ZZVL6UGV.mjs';
2
3
  import { NodeFsFeedTree } from './chunk-FUISPA7A.mjs';
3
4
  import { resolve, sep, join } from 'path';
4
5
  import { stat, realpath } from 'fs/promises';
5
6
  import { realpathSync, createReadStream } from 'fs';
6
7
  import { Readable } from 'stream';
7
- import { StorageError, SqlStorage, wipeRows, wipeDomain, refreshDomain, handleDomainQuery, storeDefinition, MAX_BODY, getRow, listRows, countRows } from '@bitcobblers/wod-wiki-storage/sql';
8
+ import { SqlStorage, StorageError, wipeRows, wipeDomain, refreshDomain, handleDomainQuery, storeDefinition, MAX_BODY, getRow, listRows, countRows } from '@bitcobblers/wod-wiki-storage/sql';
8
9
  import { keyFromValue } from '@bitcobblers/wod-wiki-storage';
9
10
  import { MemoryFeedTree, checkUnpublishedFeedChanges, publishFeedFromStorage, FeedTreeError } from '@bitcobblers/wod-wiki-engine';
11
+ import { exportAgentCapabilitiesManifest } from '@bitcobblers/wod-wiki-engine/agent';
12
+ import { WebStandardStreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/webStandardStreamableHttp.js';
10
13
 
11
14
  if (typeof globalThis.require === 'undefined') {
12
15
  try { globalThis.require = createRequire(import.meta.url); } catch {}
@@ -23,6 +26,81 @@ var HttpError = class extends Error {
23
26
  status;
24
27
  code;
25
28
  };
29
+ var MCP_CORS_HEADERS = {
30
+ "access-control-allow-origin": "*",
31
+ "access-control-allow-methods": "GET, POST, DELETE, OPTIONS",
32
+ "access-control-allow-headers": "Content-Type, Accept, Authorization, Mcp-Session-Id, MCP-Protocol-Version, Last-Event-ID",
33
+ "access-control-expose-headers": "Mcp-Session-Id, MCP-Protocol-Version"
34
+ };
35
+ function withMcpCors(response) {
36
+ const headers = new Headers(response.headers);
37
+ for (const [k, v] of Object.entries(MCP_CORS_HEADERS)) {
38
+ if (!headers.has(k)) {
39
+ headers.set(k, v);
40
+ }
41
+ }
42
+ return new Response(response.body, {
43
+ status: response.status,
44
+ statusText: response.statusText,
45
+ headers
46
+ });
47
+ }
48
+ function normalizeAcceptForPost(request) {
49
+ if (request.method !== "POST") return request;
50
+ const accept = request.headers.get("accept") ?? "";
51
+ if (accept.includes("application/json") && accept.includes("text/event-stream")) {
52
+ return request;
53
+ }
54
+ const headers = new Headers(request.headers);
55
+ headers.set("accept", "application/json, text/event-stream");
56
+ return new Request(request, { headers });
57
+ }
58
+ async function handleMcpHttpRequest(request, options) {
59
+ if (request.method === "OPTIONS") {
60
+ return new Response(null, { status: 204, headers: MCP_CORS_HEADERS });
61
+ }
62
+ const expectedToken = options.authToken ?? process.env.WOD_MCP_TOKEN?.trim();
63
+ if (expectedToken) {
64
+ const authHeader = request.headers.get("authorization") ?? "";
65
+ const bearer = authHeader.startsWith("Bearer ") ? authHeader.slice("Bearer ".length).trim() : "";
66
+ if (bearer !== expectedToken) {
67
+ return withMcpCors(
68
+ new Response(
69
+ JSON.stringify({
70
+ jsonrpc: "2.0",
71
+ error: { code: -32001, message: "Unauthorized: missing or invalid Bearer token" },
72
+ id: null
73
+ }),
74
+ { status: 401, headers: { "content-type": "application/json" } }
75
+ )
76
+ );
77
+ }
78
+ }
79
+ const storage = new SqlStorage(options.db);
80
+ const server = createWodMcpServer({
81
+ storage,
82
+ feedTree: options.feedTree,
83
+ baseUrl: options.baseUrl,
84
+ readonly: options.readonly ?? process.env.WOD_MCP_READONLY === "1"
85
+ });
86
+ const transport = new WebStandardStreamableHTTPServerTransport({
87
+ sessionIdGenerator: void 0,
88
+ enableJsonResponse: true
89
+ });
90
+ await server.connect(transport);
91
+ try {
92
+ const normalizedReq = normalizeAcceptForPost(request);
93
+ const response = await transport.handleRequest(normalizedReq);
94
+ return withMcpCors(response);
95
+ } finally {
96
+ await transport.close().catch(() => {
97
+ });
98
+ await server.close().catch(() => {
99
+ });
100
+ }
101
+ }
102
+
103
+ // src/server/app.ts
26
104
  var json = (value, status) => new Response(JSON.stringify(value), { status, headers: { "content-type": "application/json" } });
27
105
  function streamFile(path) {
28
106
  const bun = globalThis.Bun;
@@ -285,10 +363,19 @@ async function servePublishedFeed(feedTree, method, relPath) {
285
363
  throw err;
286
364
  }
287
365
  }
288
- async function apiRoutes(db, feedTree, req, method, sub, url) {
366
+ async function apiRoutes(db, feedTree, req, method, sub, url, mcpOptions) {
289
367
  if (sub === "/health") {
290
368
  return json({ ok: true, driver: db.dialect }, 200);
291
369
  }
370
+ if (sub === "/mcp") {
371
+ return handleMcpHttpRequest(req, {
372
+ db,
373
+ feedTree,
374
+ baseUrl: url.origin,
375
+ readonly: mcpOptions?.readonly,
376
+ authToken: mcpOptions?.authToken
377
+ });
378
+ }
292
379
  if (sub === "/v1/feed/status" && method === "GET") {
293
380
  const storage = new SqlStorage(db);
294
381
  const status = await checkUnpublishedFeedChanges(storage, feedTree);
@@ -352,7 +439,20 @@ function createHandler(db, options) {
352
439
  const method = request.method === "HEAD" ? "GET" : request.method;
353
440
  const path = url.pathname;
354
441
  if (path === "/api" || path.startsWith("/api/")) {
355
- return db ? await apiRoutes(db, feedTree, request, method, path.slice("/api".length) || "/", url) : notFound();
442
+ return db ? await apiRoutes(
443
+ db,
444
+ feedTree,
445
+ request,
446
+ request.method === "OPTIONS" ? "OPTIONS" : method,
447
+ path.slice("/api".length) || "/",
448
+ url,
449
+ { readonly: options.mcpReadonly, authToken: options.mcpToken }
450
+ ) : notFound();
451
+ }
452
+ if (db && path === "/.well-known/agent-capabilities.json" && method === "GET") {
453
+ const res = await staticResponse(distRoot, method, path);
454
+ if (res.status === 200) return res;
455
+ return json(exportAgentCapabilitiesManifest(), 200);
356
456
  }
357
457
  if (db) {
358
458
  const feedAsset = isPublishedFeedAssetPath(path);
@@ -375,6 +475,6 @@ function createHandler(db, options) {
375
475
  };
376
476
  }
377
477
 
378
- export { createHandler };
379
- //# sourceMappingURL=chunk-2EWCEE6N.mjs.map
380
- //# sourceMappingURL=chunk-2EWCEE6N.mjs.map
478
+ export { createHandler, handleMcpHttpRequest };
479
+ //# sourceMappingURL=chunk-WLCUM7KO.mjs.map
480
+ //# sourceMappingURL=chunk-WLCUM7KO.mjs.map
@@ -0,0 +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-WLCUM7KO.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"]}
@@ -0,0 +1,144 @@
1
+ import { createRequire } from 'module';
2
+ import { VERSION } from './chunk-T7VB7PPO.mjs';
3
+ import { z } from 'zod';
4
+ import { McpServer, ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';
5
+ import { DOMAIN_AGENT_TOOLS, AGENT_STATIC_RESOURCES, readAgentResource, AGENT_RESOURCE_TEMPLATES, AGENT_PROMPTS, renderAgentPrompt } from '@bitcobblers/wod-wiki-engine/agent';
6
+
7
+ if (typeof globalThis.require === 'undefined') {
8
+ try { globalThis.require = createRequire(import.meta.url); } catch {}
9
+ }
10
+ function createWodMcpServer(options) {
11
+ const server = new McpServer(
12
+ {
13
+ name: "wod-wiki",
14
+ version: VERSION
15
+ },
16
+ {
17
+ capabilities: {
18
+ tools: {},
19
+ resources: {},
20
+ prompts: {}
21
+ }
22
+ }
23
+ );
24
+ const ctx = {
25
+ storage: options.storage,
26
+ feedTree: options.feedTree,
27
+ baseUrl: options.baseUrl,
28
+ onMutated: options.onMutated
29
+ // Over MCP HTTP/stdio, explicit confirm="<targetId>" inside tool arguments
30
+ // satisfies Tier 2 confirmation; when omitted, requireAgentConfirmation throws
31
+ // an actionable error instructing the caller to pass confirm="<targetId>".
32
+ };
33
+ for (const spec of DOMAIN_AGENT_TOOLS) {
34
+ if (options.readonly && spec.tier !== 0) {
35
+ continue;
36
+ }
37
+ server.registerTool(
38
+ spec.name,
39
+ {
40
+ title: spec.title,
41
+ description: spec.description,
42
+ inputSchema: spec.inputSchema,
43
+ annotations: spec.annotations
44
+ },
45
+ async (args) => {
46
+ try {
47
+ const parsed = spec.inputSchema.parse(args ?? {});
48
+ const result = await spec.execute(parsed, ctx);
49
+ return {
50
+ content: [
51
+ {
52
+ type: "text",
53
+ text: JSON.stringify(result, null, 2)
54
+ }
55
+ ],
56
+ structuredContent: result
57
+ };
58
+ } catch (err) {
59
+ const message = err instanceof Error ? err.message : String(err);
60
+ return {
61
+ isError: true,
62
+ content: [
63
+ {
64
+ type: "text",
65
+ text: message
66
+ }
67
+ ]
68
+ };
69
+ }
70
+ }
71
+ );
72
+ }
73
+ for (const resource of AGENT_STATIC_RESOURCES) {
74
+ server.registerResource(
75
+ resource.name,
76
+ resource.uri,
77
+ {
78
+ description: resource.description,
79
+ mimeType: resource.mimeType
80
+ },
81
+ async (uri) => {
82
+ const res = await readAgentResource(uri.toString(), ctx);
83
+ return {
84
+ contents: [
85
+ {
86
+ uri: res.uri,
87
+ mimeType: res.mimeType,
88
+ text: res.text
89
+ }
90
+ ]
91
+ };
92
+ }
93
+ );
94
+ }
95
+ for (const tmpl of AGENT_RESOURCE_TEMPLATES) {
96
+ const template = new ResourceTemplate(tmpl.uriTemplate, { list: void 0 });
97
+ server.registerResource(
98
+ tmpl.name,
99
+ template,
100
+ {
101
+ description: tmpl.description,
102
+ mimeType: tmpl.mimeType
103
+ },
104
+ async (uri) => {
105
+ const res = await readAgentResource(uri.toString(), ctx);
106
+ return {
107
+ contents: [
108
+ {
109
+ uri: res.uri,
110
+ mimeType: res.mimeType,
111
+ text: res.text
112
+ }
113
+ ]
114
+ };
115
+ }
116
+ );
117
+ }
118
+ for (const prompt of AGENT_PROMPTS) {
119
+ const argsShape = {};
120
+ for (const arg of prompt.arguments) {
121
+ argsShape[arg.name] = arg.required ? z.string().describe(arg.description) : z.string().optional().describe(arg.description);
122
+ }
123
+ server.registerPrompt(
124
+ prompt.name,
125
+ {
126
+ title: prompt.title,
127
+ description: prompt.description,
128
+ argsSchema: argsShape
129
+ },
130
+ async (args) => {
131
+ const rendered = renderAgentPrompt(prompt.name, args);
132
+ return {
133
+ description: rendered.description,
134
+ messages: rendered.messages
135
+ };
136
+ }
137
+ );
138
+ }
139
+ return server;
140
+ }
141
+
142
+ export { createWodMcpServer };
143
+ //# sourceMappingURL=chunk-ZZVL6UGV.mjs.map
144
+ //# sourceMappingURL=chunk-ZZVL6UGV.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/mcp/createWodMcpServer.ts"],"names":[],"mappings":"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","file":"chunk-ZZVL6UGV.mjs","sourcesContent":["import { z } from 'zod';\nimport { McpServer, ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { IStorage } from '@bitcobblers/wod-wiki-storage';\nimport type { FeedTree } from '@bitcobblers/wod-wiki-engine';\nimport {\n AGENT_PROMPTS,\n AGENT_RESOURCE_TEMPLATES,\n AGENT_STATIC_RESOURCES,\n DOMAIN_AGENT_TOOLS,\n readAgentResource,\n renderAgentPrompt,\n type AgentDomainContext,\n} from '@bitcobblers/wod-wiki-engine/agent';\nimport { VERSION } from '../version';\n\nexport interface CreateWodMcpServerOptions {\n storage: IStorage;\n feedTree?: FeedTree;\n baseUrl?: string;\n readonly?: boolean;\n onMutated?: () => Promise<void> | void;\n}\n\n/**\n * Creates a configured official `@modelcontextprotocol/sdk` `McpServer`\n * exposing all 22 WOD Wiki domain tools (or read-only Tier 0 tools when\n * `readonly: true`), `wod://*` resources, and guided workout prompts.\n */\nexport function createWodMcpServer(options: CreateWodMcpServerOptions): McpServer {\n const server = new McpServer(\n {\n name: 'wod-wiki',\n version: VERSION,\n },\n {\n capabilities: {\n tools: {},\n resources: {},\n prompts: {},\n },\n },\n );\n\n const ctx: AgentDomainContext = {\n storage: options.storage,\n feedTree: options.feedTree,\n baseUrl: options.baseUrl,\n onMutated: options.onMutated,\n // Over MCP HTTP/stdio, explicit confirm=\"<targetId>\" inside tool arguments\n // satisfies Tier 2 confirmation; when omitted, requireAgentConfirmation throws\n // an actionable error instructing the caller to pass confirm=\"<targetId>\".\n };\n\n for (const spec of DOMAIN_AGENT_TOOLS) {\n if (options.readonly && spec.tier !== 0) {\n continue;\n }\n\n server.registerTool(\n spec.name,\n {\n title: spec.title,\n description: spec.description,\n inputSchema: spec.inputSchema,\n annotations: spec.annotations,\n },\n async (args: unknown) => {\n try {\n const parsed = spec.inputSchema.parse(args ?? {});\n const result = await spec.execute(parsed, ctx);\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n structuredContent: result as Record<string, unknown>,\n };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return {\n isError: true,\n content: [\n {\n type: 'text' as const,\n text: message,\n },\n ],\n };\n }\n },\n );\n }\n\n for (const resource of AGENT_STATIC_RESOURCES) {\n server.registerResource(\n resource.name,\n resource.uri,\n {\n description: resource.description,\n mimeType: resource.mimeType,\n },\n async (uri) => {\n const res = await readAgentResource(uri.toString(), ctx);\n return {\n contents: [\n {\n uri: res.uri,\n mimeType: res.mimeType,\n text: res.text,\n },\n ],\n };\n },\n );\n }\n\n for (const tmpl of AGENT_RESOURCE_TEMPLATES) {\n const template = new ResourceTemplate(tmpl.uriTemplate, { list: undefined });\n server.registerResource(\n tmpl.name,\n template,\n {\n description: tmpl.description,\n mimeType: tmpl.mimeType,\n },\n async (uri) => {\n const res = await readAgentResource(uri.toString(), ctx);\n return {\n contents: [\n {\n uri: res.uri,\n mimeType: res.mimeType,\n text: res.text,\n },\n ],\n };\n },\n );\n }\n\n for (const prompt of AGENT_PROMPTS) {\n const argsShape: Record<string, z.ZodType> = {};\n for (const arg of prompt.arguments) {\n argsShape[arg.name] = arg.required\n ? z.string().describe(arg.description)\n : z.string().optional().describe(arg.description);\n }\n\n server.registerPrompt(\n prompt.name,\n {\n title: prompt.title,\n description: prompt.description,\n argsSchema: argsShape,\n },\n async (args) => {\n const rendered = renderAgentPrompt(prompt.name, args as Record<string, string | undefined>);\n return {\n description: rendered.description,\n messages: rendered.messages,\n };\n },\n );\n }\n\n return server;\n}\n"]}