@bitcobblers/wod-wiki-tools 0.53.2204 → 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 (645) 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-SLCRIGUR.mjs → chunk-KXNK4PIB.mjs} +168 -28
  9. package/dist/chunk-KXNK4PIB.mjs.map +1 -0
  10. package/dist/{chunk-5NNSHRMZ.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-TCRNXYQU.mjs → scaffoldFeed-D55NINVJ.mjs} +3 -3
  24. package/dist/{scaffoldFeed-TCRNXYQU.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 +3 -0
  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-wql/SKILL.md +63 -0
  36. package/dist/web/playground/ai-skills/agent-parity.md +41 -0
  37. package/dist/web/playground/ai-skills/cli.md +127 -0
  38. package/dist/web/playground/ai-skills/wql.md +63 -0
  39. package/dist/web/playground/assets/main-BH_SMMzT.css +2 -0
  40. package/dist/web/playground/assets/main-vYMBKnsB.js +1152 -0
  41. package/dist/web/playground/assets/{statementBuilderFlow-CQWO7k9W.js → statementBuilderFlow-D8GG8Y7r.js} +2 -2
  42. package/dist/web/playground/assets/vendor-BUlwHBNF.js +255 -0
  43. package/dist/web/playground/assets/{vendor-codemirror-B4BeZarI.js → vendor-codemirror-Bh6hyz5v.js} +11 -11
  44. package/dist/web/playground/index.html +4 -4
  45. package/dist/web/playground/llms-full.txt +1444 -0
  46. package/dist/web/playground/llms.txt +67 -0
  47. package/dist/web/{server/seed/core/chunks/canvas.deac64e3.json → playground/seed/core/chunks/canvas.b0bc465b.json} +1 -1
  48. package/dist/web/playground/seed/core/chunks/{dashboards.08301ab4.json → dashboards.af9a29e4.json} +1 -1
  49. package/dist/web/playground/seed/core/chunks/{efforts.47f650fe.json → efforts.902271f9.json} +1 -1
  50. package/dist/web/playground/seed/core/chunks/{equipment.79146d31.json → equipment.dbdc1af3.json} +1 -1
  51. package/dist/web/playground/seed/core/indexes/notebooks/canvas.json +180 -180
  52. package/dist/web/playground/seed/core/indexes/notebooks/dashboards.json +16 -16
  53. package/dist/web/playground/seed/core/indexes/notebooks/efforts.json +326 -326
  54. package/dist/web/playground/seed/core/indexes/notebooks/equipment.json +50 -50
  55. package/dist/web/playground/seed/core/manifest.json +27 -27
  56. package/dist/web/playground/seed/core/markdown/canvas/ai-first/README.json +1 -1
  57. package/dist/web/playground/seed/core/markdown/canvas/guide/README.json +4 -4
  58. package/dist/web/playground/seed/core/markdown/canvas/guide/clock.json +1 -1
  59. package/dist/web/playground/seed/core/markdown/canvas/guide/dashboards.json +1 -1
  60. package/dist/web/playground/seed/core/markdown/canvas/guide/metrics-summaries.json +2 -2
  61. package/dist/web/playground/seed/core/markdown/canvas/guide/metrics.json +12 -12
  62. package/dist/web/playground/seed/core/markdown/canvas/guide/protocols.json +20 -20
  63. package/dist/web/playground/seed/core/markdown/canvas/guide/sessions.json +33 -33
  64. package/dist/web/playground/seed/core/markdown/canvas/guide/start.json +11 -11
  65. package/dist/web/playground/seed/core/markdown/canvas/guide/structure.json +25 -25
  66. package/dist/web/playground/seed/core/markdown/canvas/guide/wql.json +5 -5
  67. package/dist/web/playground/seed/core/markdown/canvas/home/sample-script.json +4 -4
  68. package/dist/web/playground/seed/core/markdown/canvas/home/welcome-1.json +2 -2
  69. package/dist/web/playground/seed/core/markdown/canvas/syntax/actions-comments.json +4 -4
  70. package/dist/web/playground/seed/core/markdown/canvas/syntax/alternating-emom.json +5 -5
  71. package/dist/web/playground/seed/core/markdown/canvas/syntax/basic-emom.json +4 -4
  72. package/dist/web/playground/seed/core/markdown/canvas/syntax/calculated-metrics.json +4 -4
  73. package/dist/web/playground/seed/core/markdown/canvas/syntax/classic-amrap.json +6 -6
  74. package/dist/web/playground/seed/core/markdown/canvas/syntax/complex-barbell-cycling.json +4 -4
  75. package/dist/web/playground/seed/core/markdown/canvas/syntax/complex-full-session.json +10 -10
  76. package/dist/web/playground/seed/core/markdown/canvas/syntax/complex-nested-protocols.json +7 -7
  77. package/dist/web/playground/seed/core/markdown/canvas/syntax/complex-partner-workout.json +7 -7
  78. package/dist/web/playground/seed/core/markdown/canvas/syntax/complex-swimming.json +5 -5
  79. package/dist/web/playground/seed/core/markdown/canvas/syntax/core-rules.json +4 -4
  80. package/dist/web/playground/seed/core/markdown/canvas/syntax/custom-and-calculated-metrics.json +4 -4
  81. package/dist/web/playground/seed/core/markdown/canvas/syntax/custom-intervals.json +4 -4
  82. package/dist/web/playground/seed/core/markdown/canvas/syntax/custom-metrics-1.json +4 -4
  83. package/dist/web/playground/seed/core/markdown/canvas/syntax/custom-metrics-2.json +5 -5
  84. package/dist/web/playground/seed/core/markdown/canvas/syntax/custom-metrics-3.json +3 -3
  85. package/dist/web/playground/seed/core/markdown/canvas/syntax/custom-metrics-4.json +4 -4
  86. package/dist/web/playground/seed/core/markdown/canvas/syntax/custom-metrics-5.json +4 -4
  87. package/dist/web/playground/seed/core/markdown/canvas/syntax/dialect-climb-bouldering.json +2 -2
  88. package/dist/web/playground/seed/core/markdown/canvas/syntax/dialect-climb-hangboard.json +2 -2
  89. package/dist/web/playground/seed/core/markdown/canvas/syntax/dialect-climb-sport.json +2 -2
  90. package/dist/web/playground/seed/core/markdown/canvas/syntax/dialect-log.json +4 -4
  91. package/dist/web/playground/seed/core/markdown/canvas/syntax/dialect-plan.json +8 -8
  92. package/dist/web/playground/seed/core/markdown/canvas/syntax/dialect-wod.json +5 -5
  93. package/dist/web/playground/seed/core/markdown/canvas/syntax/distance-intervals.json +3 -3
  94. package/dist/web/playground/seed/core/markdown/canvas/syntax/document-1.json +4 -4
  95. package/dist/web/playground/seed/core/markdown/canvas/syntax/document-2.json +5 -5
  96. package/dist/web/playground/seed/core/markdown/canvas/syntax/document-3.json +10 -10
  97. package/dist/web/playground/seed/core/markdown/canvas/syntax/document-4.json +5 -5
  98. package/dist/web/playground/seed/core/markdown/canvas/syntax/effort-notes.json +5 -5
  99. package/dist/web/playground/seed/core/markdown/canvas/syntax/frontmatter-summaries.json +4 -4
  100. package/dist/web/playground/seed/core/markdown/canvas/syntax/groups-1.json +5 -5
  101. package/dist/web/playground/seed/core/markdown/canvas/syntax/groups-2.json +6 -6
  102. package/dist/web/playground/seed/core/markdown/canvas/syntax/groups-3.json +3 -3
  103. package/dist/web/playground/seed/core/markdown/canvas/syntax/groups-4.json +3 -3
  104. package/dist/web/playground/seed/core/markdown/canvas/syntax/longer-duration.json +4 -4
  105. package/dist/web/playground/seed/core/markdown/canvas/syntax/longer-intervals.json +4 -4
  106. package/dist/web/playground/seed/core/markdown/canvas/syntax/measurements.json +7 -7
  107. package/dist/web/playground/seed/core/markdown/canvas/syntax/metrics-1.json +5 -5
  108. package/dist/web/playground/seed/core/markdown/canvas/syntax/metrics-2.json +7 -7
  109. package/dist/web/playground/seed/core/markdown/canvas/syntax/metrics-3.json +8 -8
  110. package/dist/web/playground/seed/core/markdown/canvas/syntax/metrics-4.json +6 -6
  111. package/dist/web/playground/seed/core/markdown/canvas/syntax/metrics-5.json +5 -5
  112. package/dist/web/playground/seed/core/markdown/canvas/syntax/mixed-sections.json +10 -10
  113. package/dist/web/playground/seed/core/markdown/canvas/syntax/mixed-timers.json +5 -5
  114. package/dist/web/playground/seed/core/markdown/canvas/syntax/multiple-amrap-windows.json +7 -7
  115. package/dist/web/playground/seed/core/markdown/canvas/syntax/multiple-sets.json +4 -4
  116. package/dist/web/playground/seed/core/markdown/canvas/syntax/named-groups.json +6 -6
  117. package/dist/web/playground/seed/core/markdown/canvas/syntax/protocols-1.json +6 -6
  118. package/dist/web/playground/seed/core/markdown/canvas/syntax/protocols-2.json +4 -4
  119. package/dist/web/playground/seed/core/markdown/canvas/syntax/protocols-3.json +6 -6
  120. package/dist/web/playground/seed/core/markdown/canvas/syntax/protocols-4.json +3 -3
  121. package/dist/web/playground/seed/core/markdown/canvas/syntax/protocols-5.json +4 -4
  122. package/dist/web/playground/seed/core/markdown/canvas/syntax/single-movement.json +3 -3
  123. package/dist/web/playground/seed/core/markdown/canvas/syntax/supplemental-1.json +4 -4
  124. package/dist/web/playground/seed/core/markdown/canvas/syntax/supplemental-2.json +5 -5
  125. package/dist/web/playground/seed/core/markdown/canvas/syntax/supplemental-3.json +4 -4
  126. package/dist/web/playground/seed/core/markdown/canvas/syntax/supplemental-4.json +4 -4
  127. package/dist/web/playground/seed/core/markdown/canvas/syntax/time-cap.json +6 -6
  128. package/dist/web/playground/seed/core/markdown/canvas/syntax/timer-modifiers.json +6 -6
  129. package/dist/web/playground/seed/core/markdown/canvas/syntax/timers-1.json +6 -6
  130. package/dist/web/playground/seed/core/markdown/canvas/syntax/timers-2.json +4 -4
  131. package/dist/web/playground/seed/core/markdown/canvas/syntax/timers-3.json +4 -4
  132. package/dist/web/playground/seed/core/markdown/canvas/syntax/timers-4.json +4 -4
  133. package/dist/web/playground/seed/core/markdown/canvas/syntax/timers-5.json +5 -5
  134. package/dist/web/playground/seed/core/markdown/canvas/syntax/timers-rest.json +4 -4
  135. package/dist/web/playground/seed/core/markdown/canvas/wql-presets/aggregate-by-effort.json +2 -2
  136. package/dist/web/playground/seed/core/markdown/canvas/wql-presets/aggregate-by-week.json +2 -2
  137. package/dist/web/playground/seed/core/markdown/canvas/wql-presets/content-fran.json +2 -2
  138. package/dist/web/playground/seed/core/markdown/canvas/wql-presets/filter-combos.json +2 -2
  139. package/dist/web/playground/seed/core/markdown/canvas/wql-presets/pipes-limit.json +2 -2
  140. package/dist/web/playground/seed/core/markdown/canvas/wql-presets/session-rpe.json +2 -2
  141. package/dist/web/playground/seed/core/markdown/canvas/wql-presets/source-journal.json +2 -2
  142. package/dist/web/playground/seed/core/markdown/canvas/wql-presets/tis-trend.json +2 -2
  143. package/dist/web/playground/seed/core/markdown/canvas/wql-presets/where-join.json +2 -2
  144. package/dist/web/playground/seed/core/markdown/dashboards/benchmark-pr-board.json +6 -6
  145. package/dist/web/playground/seed/core/markdown/dashboards/finger-strength-v8.json +5 -5
  146. package/dist/web/playground/seed/core/markdown/dashboards/polarized-base-marathon.json +9 -9
  147. package/dist/web/playground/seed/core/markdown/dashboards/recovery-readiness.json +7 -7
  148. package/dist/web/playground/seed/core/markdown/dashboards/road-to-560-total.json +9 -9
  149. package/dist/web/playground/seed/core/markdown/dashboards/training-block-review.json +11 -11
  150. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/air-squat.json +1 -1
  151. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/box-jump.json +1 -1
  152. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/broad-jump.json +1 -1
  153. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/burpee-box-jump-over.json +1 -1
  154. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/burpee-over-dumbbell.json +1 -1
  155. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/burpee.json +1 -1
  156. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/dumbbell-squat-clean.json +1 -1
  157. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/ghd-sit-up.json +1 -1
  158. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/ground-kong.json +1 -1
  159. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/jumping-jack.json +1 -1
  160. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/kong-walk.json +1 -1
  161. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/lunge.json +1 -1
  162. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/overhead-squat.json +1 -1
  163. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/parkour-roll.json +1 -1
  164. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/parkour-squat.json +1 -1
  165. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/pistol-squat.json +1 -1
  166. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/plank.json +1 -1
  167. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/precision-burpee.json +1 -1
  168. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/precision-jump.json +1 -1
  169. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/quadrupedal-movement.json +1 -1
  170. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/russian-twist.json +1 -1
  171. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/sit-up.json +1 -1
  172. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/squat-clean.json +1 -1
  173. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/squat-hold.json +1 -1
  174. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/squat-snatch.json +1 -1
  175. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/tuck-jump.json +1 -1
  176. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/wall-ball.json +1 -1
  177. package/dist/web/playground/seed/core/markdown/efforts/bodyweight/wall-burpee.json +1 -1
  178. package/dist/web/playground/seed/core/markdown/efforts/cycling/assault-bike.json +1 -1
  179. package/dist/web/playground/seed/core/markdown/efforts/cycling/cycling-moderate.json +1 -1
  180. package/dist/web/playground/seed/core/markdown/efforts/cycling/cycling-vigorous.json +1 -1
  181. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/assisted-pull-up.json +1 -1
  182. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/burpee-pull-up.json +1 -1
  183. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/chest-to-bar-pull-up.json +1 -1
  184. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/dip.json +1 -1
  185. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/double-under.json +1 -1
  186. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/handstand-hold.json +1 -1
  187. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/handstand-push-up.json +1 -1
  188. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/handstand-walk.json +1 -1
  189. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/jump-rope.json +1 -1
  190. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/jumping-pull-up.json +1 -1
  191. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/jumping-push-up.json +1 -1
  192. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/l-sit-pull-up.json +1 -1
  193. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/muscle-up.json +1 -1
  194. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/pull-up.json +1 -1
  195. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/push-up.json +1 -1
  196. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/reverse-wall-dip.json +1 -1
  197. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/rope-climb.json +1 -1
  198. package/dist/web/playground/seed/core/markdown/efforts/gymnastics/toes-to-bar.json +1 -1
  199. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-arm-bar.json +1 -1
  200. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-around-the-world.json +1 -1
  201. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-bent-over-row.json +1 -1
  202. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-clean-and-jerk.json +1 -1
  203. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-clean-and-press.json +1 -1
  204. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-clean.json +1 -1
  205. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-deadlift.json +1 -1
  206. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-floor-press.json +1 -1
  207. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-front-squat.json +1 -1
  208. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-goblet-squat.json +1 -1
  209. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-gorilla-row.json +1 -1
  210. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-halo.json +1 -1
  211. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-jerk.json +1 -1
  212. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-overhead-squat.json +1 -1
  213. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-press.json +1 -1
  214. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-snatch.json +1 -1
  215. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-swing.json +1 -1
  216. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/kettlebell-windmill.json +1 -1
  217. package/dist/web/playground/seed/core/markdown/efforts/kettlebell/turkish-get-up.json +1 -1
  218. package/dist/web/playground/seed/core/markdown/efforts/recovery/rest.json +1 -1
  219. package/dist/web/playground/seed/core/markdown/efforts/recovery/stretching.json +1 -1
  220. package/dist/web/playground/seed/core/markdown/efforts/rowing/rowing-sprint.json +1 -1
  221. package/dist/web/playground/seed/core/markdown/efforts/rowing/rowing.json +1 -1
  222. package/dist/web/playground/seed/core/markdown/efforts/rowing/ski-erg.json +1 -1
  223. package/dist/web/playground/seed/core/markdown/efforts/running/backward-running.json +1 -1
  224. package/dist/web/playground/seed/core/markdown/efforts/running/running-6-mph.json +1 -1
  225. package/dist/web/playground/seed/core/markdown/efforts/running/running-8-mph.json +1 -1
  226. package/dist/web/playground/seed/core/markdown/efforts/running/running-sprint.json +1 -1
  227. package/dist/web/playground/seed/core/markdown/efforts/snatch.json +2 -2
  228. package/dist/web/playground/seed/core/markdown/efforts/strength/back-squat.json +1 -1
  229. package/dist/web/playground/seed/core/markdown/efforts/strength/bench-press.json +1 -1
  230. package/dist/web/playground/seed/core/markdown/efforts/strength/box-step-up.json +1 -1
  231. package/dist/web/playground/seed/core/markdown/efforts/strength/carioca.json +1 -1
  232. package/dist/web/playground/seed/core/markdown/efforts/strength/clean-and-jerk.json +1 -1
  233. package/dist/web/playground/seed/core/markdown/efforts/strength/cluster.json +1 -1
  234. package/dist/web/playground/seed/core/markdown/efforts/strength/dead-hang.json +1 -1
  235. package/dist/web/playground/seed/core/markdown/efforts/strength/deadlift.json +1 -1
  236. package/dist/web/playground/seed/core/markdown/efforts/strength/devils-press.json +1 -1
  237. package/dist/web/playground/seed/core/markdown/efforts/strength/dumbbell-box-step-up.json +1 -1
  238. package/dist/web/playground/seed/core/markdown/efforts/strength/dumbbell-clean.json +1 -1
  239. package/dist/web/playground/seed/core/markdown/efforts/strength/dumbbell-fly.json +1 -1
  240. package/dist/web/playground/seed/core/markdown/efforts/strength/dumbbell-row.json +1 -1
  241. package/dist/web/playground/seed/core/markdown/efforts/strength/dumbbell-snatch.json +1 -1
  242. package/dist/web/playground/seed/core/markdown/efforts/strength/dumbbell-thruster.json +1 -1
  243. package/dist/web/playground/seed/core/markdown/efforts/strength/elbows-to-knees.json +1 -1
  244. package/dist/web/playground/seed/core/markdown/efforts/strength/farmer-carry.json +1 -1
  245. package/dist/web/playground/seed/core/markdown/efforts/strength/frog-stand.json +1 -1
  246. package/dist/web/playground/seed/core/markdown/efforts/strength/front-squat.json +1 -1
  247. package/dist/web/playground/seed/core/markdown/efforts/strength/good-morning.json +1 -1
  248. package/dist/web/playground/seed/core/markdown/efforts/strength/hanging-leg-raise.json +1 -1
  249. package/dist/web/playground/seed/core/markdown/efforts/strength/hollow-rock.json +1 -1
  250. package/dist/web/playground/seed/core/markdown/efforts/strength/knees-to-elbows.json +1 -1
  251. package/dist/web/playground/seed/core/markdown/efforts/strength/l-sit.json +1 -1
  252. package/dist/web/playground/seed/core/markdown/efforts/strength/man-maker.json +1 -1
  253. package/dist/web/playground/seed/core/markdown/efforts/strength/medicine-ball-clean.json +1 -1
  254. package/dist/web/playground/seed/core/markdown/efforts/strength/overhead-press.json +1 -1
  255. package/dist/web/playground/seed/core/markdown/efforts/strength/parkour-vault.json +1 -1
  256. package/dist/web/playground/seed/core/markdown/efforts/strength/pig-flip.json +1 -1
  257. package/dist/web/playground/seed/core/markdown/efforts/strength/power-clean.json +1 -1
  258. package/dist/web/playground/seed/core/markdown/efforts/strength/power-snatch.json +1 -1
  259. package/dist/web/playground/seed/core/markdown/efforts/strength/push-jerk.json +1 -1
  260. package/dist/web/playground/seed/core/markdown/efforts/strength/push-press.json +1 -1
  261. package/dist/web/playground/seed/core/markdown/efforts/strength/romanian-deadlift.json +1 -1
  262. package/dist/web/playground/seed/core/markdown/efforts/strength/single-leg-deadlift.json +1 -1
  263. package/dist/web/playground/seed/core/markdown/efforts/strength/skull-crusher.json +1 -1
  264. package/dist/web/playground/seed/core/markdown/efforts/strength/slam-ball.json +1 -1
  265. package/dist/web/playground/seed/core/markdown/efforts/strength/sled-pull.json +1 -1
  266. package/dist/web/playground/seed/core/markdown/efforts/strength/sled-push.json +1 -1
  267. package/dist/web/playground/seed/core/markdown/efforts/strength/sumo-deadlift.json +1 -1
  268. package/dist/web/playground/seed/core/markdown/efforts/strength/thruster.json +1 -1
  269. package/dist/web/playground/seed/core/markdown/efforts/strength/triceps-extension.json +1 -1
  270. package/dist/web/playground/seed/core/markdown/efforts/strength/v-sit-hold.json +1 -1
  271. package/dist/web/playground/seed/core/markdown/efforts/strength/wall-walk.json +1 -1
  272. package/dist/web/playground/seed/core/markdown/efforts/strength/yoga-sun-salutation.json +1 -1
  273. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-assisted-sprint.json +1 -1
  274. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-backstroke.json +1 -1
  275. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-breaststroke-kick.json +1 -1
  276. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-breaststroke.json +1 -1
  277. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-butterfly.json +1 -1
  278. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-catch-up-drill.json +1 -1
  279. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-choice-stroke.json +1 -1
  280. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-dive-start.json +1 -1
  281. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-dolphin-kick.json +1 -1
  282. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-drafting.json +1 -1
  283. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-fingertip-drag.json +1 -1
  284. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-freestyle.json +1 -1
  285. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-individual-medley.json +1 -1
  286. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-kick.json +1 -1
  287. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-pull.json +1 -1
  288. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-resisted-sprint.json +1 -1
  289. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-rotation-drill.json +1 -1
  290. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-sighting.json +1 -1
  291. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-single-arm-drill.json +1 -1
  292. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-stroke-transition.json +1 -1
  293. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-two-kick-one-pull.json +1 -1
  294. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming-vigorous.json +1 -1
  295. package/dist/web/playground/seed/core/markdown/efforts/swimming/swimming.json +1 -1
  296. package/dist/web/playground/seed/core/markdown/efforts/unconventional/clubbell-arm-cast.json +1 -1
  297. package/dist/web/playground/seed/core/markdown/efforts/unconventional/clubbell-circles.json +1 -1
  298. package/dist/web/playground/seed/core/markdown/efforts/unconventional/clubbell-mill.json +1 -1
  299. package/dist/web/playground/seed/core/markdown/efforts/unconventional/clubbell-reverse-mill.json +1 -1
  300. package/dist/web/playground/seed/core/markdown/efforts/unconventional/clubbell-shield-cast.json +1 -1
  301. package/dist/web/playground/seed/core/markdown/efforts/unconventional/macebell-10-to-2-swing.json +1 -1
  302. package/dist/web/playground/seed/core/markdown/efforts/unconventional/macebell-360-swing.json +1 -1
  303. package/dist/web/playground/seed/core/markdown/efforts/unconventional/macebell-barbarian-squat.json +1 -1
  304. package/dist/web/playground/seed/core/markdown/efforts/unconventional/macebell-flow.json +1 -1
  305. package/dist/web/playground/seed/core/markdown/efforts/unconventional/macebell-gravedigger.json +1 -1
  306. package/dist/web/playground/seed/core/markdown/efforts/unconventional/macebell-touchdown.json +1 -1
  307. package/dist/web/playground/seed/core/markdown/efforts/unconventional/sandbag-bear-hug-carry.json +1 -1
  308. package/dist/web/playground/seed/core/markdown/efforts/unconventional/sandbag-bear-hug-extension.json +1 -1
  309. package/dist/web/playground/seed/core/markdown/efforts/unconventional/sandbag-over-shoulder.json +1 -1
  310. package/dist/web/playground/seed/core/markdown/efforts/walking/walking-3-mph.json +1 -1
  311. package/dist/web/playground/seed/core/markdown/equipment/air-bike.json +1 -1
  312. package/dist/web/playground/seed/core/markdown/equipment/barbell.json +1 -1
  313. package/dist/web/playground/seed/core/markdown/equipment/bench.json +1 -1
  314. package/dist/web/playground/seed/core/markdown/equipment/bike-erg.json +1 -1
  315. package/dist/web/playground/seed/core/markdown/equipment/climbing-rope.json +1 -1
  316. package/dist/web/playground/seed/core/markdown/equipment/clubs.json +1 -1
  317. package/dist/web/playground/seed/core/markdown/equipment/dumbbell.json +1 -1
  318. package/dist/web/playground/seed/core/markdown/equipment/ghd.json +1 -1
  319. package/dist/web/playground/seed/core/markdown/equipment/gymnastic-rings.json +1 -1
  320. package/dist/web/playground/seed/core/markdown/equipment/jump-rope.json +1 -1
  321. package/dist/web/playground/seed/core/markdown/equipment/kettlebell.json +1 -1
  322. package/dist/web/playground/seed/core/markdown/equipment/macebell.json +1 -1
  323. package/dist/web/playground/seed/core/markdown/equipment/medicine-ball.json +1 -1
  324. package/dist/web/playground/seed/core/markdown/equipment/parallettes.json +1 -1
  325. package/dist/web/playground/seed/core/markdown/equipment/plyo-box.json +1 -1
  326. package/dist/web/playground/seed/core/markdown/equipment/pull-up-bar.json +1 -1
  327. package/dist/web/playground/seed/core/markdown/equipment/rower.json +1 -1
  328. package/dist/web/playground/seed/core/markdown/equipment/sandbag.json +1 -1
  329. package/dist/web/playground/seed/core/markdown/equipment/ski-erg.json +1 -1
  330. package/dist/web/playground/seed/core/markdown/equipment/slam-ball.json +1 -1
  331. package/dist/web/playground/seed/core/markdown/equipment/sled.json +1 -1
  332. package/dist/web/playground/seed/core/markdown/equipment/sledgehammer.json +1 -1
  333. package/dist/web/playground/seed/core/markdown/equipment/weight-vest.json +1 -1
  334. package/dist/web/playground/seed/core/report.html +13 -13
  335. package/dist/web/server/ai-skills/agent-parity.md +41 -0
  336. package/dist/web/server/ai-skills/cli.md +127 -0
  337. package/dist/web/server/ai-skills/wql.md +63 -0
  338. package/dist/web/server/assets/main-BH_SMMzT.css +2 -0
  339. package/dist/web/server/assets/main-D0W-D5YL.js +1152 -0
  340. package/dist/web/server/assets/{statementBuilderFlow-C7x-7JGx.js → statementBuilderFlow-CtmmV_Yv.js} +2 -2
  341. package/dist/web/server/assets/vendor-BUlwHBNF.js +255 -0
  342. package/dist/web/server/assets/{vendor-codemirror-B4BeZarI.js → vendor-codemirror-Bh6hyz5v.js} +11 -11
  343. package/dist/web/server/index.html +4 -4
  344. package/dist/web/server/llms-full.txt +1444 -0
  345. package/dist/web/server/llms.txt +67 -0
  346. package/dist/web/{playground/seed/core/chunks/canvas.deac64e3.json → server/seed/core/chunks/canvas.b0bc465b.json} +1 -1
  347. package/dist/web/server/seed/core/chunks/{dashboards.08301ab4.json → dashboards.af9a29e4.json} +1 -1
  348. package/dist/web/server/seed/core/chunks/{efforts.47f650fe.json → efforts.902271f9.json} +1 -1
  349. package/dist/web/server/seed/core/chunks/{equipment.79146d31.json → equipment.dbdc1af3.json} +1 -1
  350. package/dist/web/server/seed/core/indexes/notebooks/canvas.json +180 -180
  351. package/dist/web/server/seed/core/indexes/notebooks/dashboards.json +16 -16
  352. package/dist/web/server/seed/core/indexes/notebooks/efforts.json +326 -326
  353. package/dist/web/server/seed/core/indexes/notebooks/equipment.json +50 -50
  354. package/dist/web/server/seed/core/manifest.json +27 -27
  355. package/dist/web/server/seed/core/markdown/canvas/ai-first/README.json +1 -1
  356. package/dist/web/server/seed/core/markdown/canvas/guide/README.json +4 -4
  357. package/dist/web/server/seed/core/markdown/canvas/guide/clock.json +1 -1
  358. package/dist/web/server/seed/core/markdown/canvas/guide/dashboards.json +1 -1
  359. package/dist/web/server/seed/core/markdown/canvas/guide/metrics-summaries.json +2 -2
  360. package/dist/web/server/seed/core/markdown/canvas/guide/metrics.json +12 -12
  361. package/dist/web/server/seed/core/markdown/canvas/guide/protocols.json +20 -20
  362. package/dist/web/server/seed/core/markdown/canvas/guide/sessions.json +33 -33
  363. package/dist/web/server/seed/core/markdown/canvas/guide/start.json +11 -11
  364. package/dist/web/server/seed/core/markdown/canvas/guide/structure.json +25 -25
  365. package/dist/web/server/seed/core/markdown/canvas/guide/wql.json +5 -5
  366. package/dist/web/server/seed/core/markdown/canvas/home/sample-script.json +4 -4
  367. package/dist/web/server/seed/core/markdown/canvas/home/welcome-1.json +2 -2
  368. package/dist/web/server/seed/core/markdown/canvas/syntax/actions-comments.json +4 -4
  369. package/dist/web/server/seed/core/markdown/canvas/syntax/alternating-emom.json +5 -5
  370. package/dist/web/server/seed/core/markdown/canvas/syntax/basic-emom.json +4 -4
  371. package/dist/web/server/seed/core/markdown/canvas/syntax/calculated-metrics.json +4 -4
  372. package/dist/web/server/seed/core/markdown/canvas/syntax/classic-amrap.json +6 -6
  373. package/dist/web/server/seed/core/markdown/canvas/syntax/complex-barbell-cycling.json +4 -4
  374. package/dist/web/server/seed/core/markdown/canvas/syntax/complex-full-session.json +10 -10
  375. package/dist/web/server/seed/core/markdown/canvas/syntax/complex-nested-protocols.json +7 -7
  376. package/dist/web/server/seed/core/markdown/canvas/syntax/complex-partner-workout.json +7 -7
  377. package/dist/web/server/seed/core/markdown/canvas/syntax/complex-swimming.json +5 -5
  378. package/dist/web/server/seed/core/markdown/canvas/syntax/core-rules.json +4 -4
  379. package/dist/web/server/seed/core/markdown/canvas/syntax/custom-and-calculated-metrics.json +4 -4
  380. package/dist/web/server/seed/core/markdown/canvas/syntax/custom-intervals.json +4 -4
  381. package/dist/web/server/seed/core/markdown/canvas/syntax/custom-metrics-1.json +4 -4
  382. package/dist/web/server/seed/core/markdown/canvas/syntax/custom-metrics-2.json +5 -5
  383. package/dist/web/server/seed/core/markdown/canvas/syntax/custom-metrics-3.json +3 -3
  384. package/dist/web/server/seed/core/markdown/canvas/syntax/custom-metrics-4.json +4 -4
  385. package/dist/web/server/seed/core/markdown/canvas/syntax/custom-metrics-5.json +4 -4
  386. package/dist/web/server/seed/core/markdown/canvas/syntax/dialect-climb-bouldering.json +2 -2
  387. package/dist/web/server/seed/core/markdown/canvas/syntax/dialect-climb-hangboard.json +2 -2
  388. package/dist/web/server/seed/core/markdown/canvas/syntax/dialect-climb-sport.json +2 -2
  389. package/dist/web/server/seed/core/markdown/canvas/syntax/dialect-log.json +4 -4
  390. package/dist/web/server/seed/core/markdown/canvas/syntax/dialect-plan.json +8 -8
  391. package/dist/web/server/seed/core/markdown/canvas/syntax/dialect-wod.json +5 -5
  392. package/dist/web/server/seed/core/markdown/canvas/syntax/distance-intervals.json +3 -3
  393. package/dist/web/server/seed/core/markdown/canvas/syntax/document-1.json +4 -4
  394. package/dist/web/server/seed/core/markdown/canvas/syntax/document-2.json +5 -5
  395. package/dist/web/server/seed/core/markdown/canvas/syntax/document-3.json +10 -10
  396. package/dist/web/server/seed/core/markdown/canvas/syntax/document-4.json +5 -5
  397. package/dist/web/server/seed/core/markdown/canvas/syntax/effort-notes.json +5 -5
  398. package/dist/web/server/seed/core/markdown/canvas/syntax/frontmatter-summaries.json +4 -4
  399. package/dist/web/server/seed/core/markdown/canvas/syntax/groups-1.json +5 -5
  400. package/dist/web/server/seed/core/markdown/canvas/syntax/groups-2.json +6 -6
  401. package/dist/web/server/seed/core/markdown/canvas/syntax/groups-3.json +3 -3
  402. package/dist/web/server/seed/core/markdown/canvas/syntax/groups-4.json +3 -3
  403. package/dist/web/server/seed/core/markdown/canvas/syntax/longer-duration.json +4 -4
  404. package/dist/web/server/seed/core/markdown/canvas/syntax/longer-intervals.json +4 -4
  405. package/dist/web/server/seed/core/markdown/canvas/syntax/measurements.json +7 -7
  406. package/dist/web/server/seed/core/markdown/canvas/syntax/metrics-1.json +5 -5
  407. package/dist/web/server/seed/core/markdown/canvas/syntax/metrics-2.json +7 -7
  408. package/dist/web/server/seed/core/markdown/canvas/syntax/metrics-3.json +8 -8
  409. package/dist/web/server/seed/core/markdown/canvas/syntax/metrics-4.json +6 -6
  410. package/dist/web/server/seed/core/markdown/canvas/syntax/metrics-5.json +5 -5
  411. package/dist/web/server/seed/core/markdown/canvas/syntax/mixed-sections.json +10 -10
  412. package/dist/web/server/seed/core/markdown/canvas/syntax/mixed-timers.json +5 -5
  413. package/dist/web/server/seed/core/markdown/canvas/syntax/multiple-amrap-windows.json +7 -7
  414. package/dist/web/server/seed/core/markdown/canvas/syntax/multiple-sets.json +4 -4
  415. package/dist/web/server/seed/core/markdown/canvas/syntax/named-groups.json +6 -6
  416. package/dist/web/server/seed/core/markdown/canvas/syntax/protocols-1.json +6 -6
  417. package/dist/web/server/seed/core/markdown/canvas/syntax/protocols-2.json +4 -4
  418. package/dist/web/server/seed/core/markdown/canvas/syntax/protocols-3.json +6 -6
  419. package/dist/web/server/seed/core/markdown/canvas/syntax/protocols-4.json +3 -3
  420. package/dist/web/server/seed/core/markdown/canvas/syntax/protocols-5.json +4 -4
  421. package/dist/web/server/seed/core/markdown/canvas/syntax/single-movement.json +3 -3
  422. package/dist/web/server/seed/core/markdown/canvas/syntax/supplemental-1.json +4 -4
  423. package/dist/web/server/seed/core/markdown/canvas/syntax/supplemental-2.json +5 -5
  424. package/dist/web/server/seed/core/markdown/canvas/syntax/supplemental-3.json +4 -4
  425. package/dist/web/server/seed/core/markdown/canvas/syntax/supplemental-4.json +4 -4
  426. package/dist/web/server/seed/core/markdown/canvas/syntax/time-cap.json +6 -6
  427. package/dist/web/server/seed/core/markdown/canvas/syntax/timer-modifiers.json +6 -6
  428. package/dist/web/server/seed/core/markdown/canvas/syntax/timers-1.json +6 -6
  429. package/dist/web/server/seed/core/markdown/canvas/syntax/timers-2.json +4 -4
  430. package/dist/web/server/seed/core/markdown/canvas/syntax/timers-3.json +4 -4
  431. package/dist/web/server/seed/core/markdown/canvas/syntax/timers-4.json +4 -4
  432. package/dist/web/server/seed/core/markdown/canvas/syntax/timers-5.json +5 -5
  433. package/dist/web/server/seed/core/markdown/canvas/syntax/timers-rest.json +4 -4
  434. package/dist/web/server/seed/core/markdown/canvas/wql-presets/aggregate-by-effort.json +2 -2
  435. package/dist/web/server/seed/core/markdown/canvas/wql-presets/aggregate-by-week.json +2 -2
  436. package/dist/web/server/seed/core/markdown/canvas/wql-presets/content-fran.json +2 -2
  437. package/dist/web/server/seed/core/markdown/canvas/wql-presets/filter-combos.json +2 -2
  438. package/dist/web/server/seed/core/markdown/canvas/wql-presets/pipes-limit.json +2 -2
  439. package/dist/web/server/seed/core/markdown/canvas/wql-presets/session-rpe.json +2 -2
  440. package/dist/web/server/seed/core/markdown/canvas/wql-presets/source-journal.json +2 -2
  441. package/dist/web/server/seed/core/markdown/canvas/wql-presets/tis-trend.json +2 -2
  442. package/dist/web/server/seed/core/markdown/canvas/wql-presets/where-join.json +2 -2
  443. package/dist/web/server/seed/core/markdown/dashboards/benchmark-pr-board.json +6 -6
  444. package/dist/web/server/seed/core/markdown/dashboards/finger-strength-v8.json +5 -5
  445. package/dist/web/server/seed/core/markdown/dashboards/polarized-base-marathon.json +9 -9
  446. package/dist/web/server/seed/core/markdown/dashboards/recovery-readiness.json +7 -7
  447. package/dist/web/server/seed/core/markdown/dashboards/road-to-560-total.json +9 -9
  448. package/dist/web/server/seed/core/markdown/dashboards/training-block-review.json +11 -11
  449. package/dist/web/server/seed/core/markdown/efforts/bodyweight/air-squat.json +1 -1
  450. package/dist/web/server/seed/core/markdown/efforts/bodyweight/box-jump.json +1 -1
  451. package/dist/web/server/seed/core/markdown/efforts/bodyweight/broad-jump.json +1 -1
  452. package/dist/web/server/seed/core/markdown/efforts/bodyweight/burpee-box-jump-over.json +1 -1
  453. package/dist/web/server/seed/core/markdown/efforts/bodyweight/burpee-over-dumbbell.json +1 -1
  454. package/dist/web/server/seed/core/markdown/efforts/bodyweight/burpee.json +1 -1
  455. package/dist/web/server/seed/core/markdown/efforts/bodyweight/dumbbell-squat-clean.json +1 -1
  456. package/dist/web/server/seed/core/markdown/efforts/bodyweight/ghd-sit-up.json +1 -1
  457. package/dist/web/server/seed/core/markdown/efforts/bodyweight/ground-kong.json +1 -1
  458. package/dist/web/server/seed/core/markdown/efforts/bodyweight/jumping-jack.json +1 -1
  459. package/dist/web/server/seed/core/markdown/efforts/bodyweight/kong-walk.json +1 -1
  460. package/dist/web/server/seed/core/markdown/efforts/bodyweight/lunge.json +1 -1
  461. package/dist/web/server/seed/core/markdown/efforts/bodyweight/overhead-squat.json +1 -1
  462. package/dist/web/server/seed/core/markdown/efforts/bodyweight/parkour-roll.json +1 -1
  463. package/dist/web/server/seed/core/markdown/efforts/bodyweight/parkour-squat.json +1 -1
  464. package/dist/web/server/seed/core/markdown/efforts/bodyweight/pistol-squat.json +1 -1
  465. package/dist/web/server/seed/core/markdown/efforts/bodyweight/plank.json +1 -1
  466. package/dist/web/server/seed/core/markdown/efforts/bodyweight/precision-burpee.json +1 -1
  467. package/dist/web/server/seed/core/markdown/efforts/bodyweight/precision-jump.json +1 -1
  468. package/dist/web/server/seed/core/markdown/efforts/bodyweight/quadrupedal-movement.json +1 -1
  469. package/dist/web/server/seed/core/markdown/efforts/bodyweight/russian-twist.json +1 -1
  470. package/dist/web/server/seed/core/markdown/efforts/bodyweight/sit-up.json +1 -1
  471. package/dist/web/server/seed/core/markdown/efforts/bodyweight/squat-clean.json +1 -1
  472. package/dist/web/server/seed/core/markdown/efforts/bodyweight/squat-hold.json +1 -1
  473. package/dist/web/server/seed/core/markdown/efforts/bodyweight/squat-snatch.json +1 -1
  474. package/dist/web/server/seed/core/markdown/efforts/bodyweight/tuck-jump.json +1 -1
  475. package/dist/web/server/seed/core/markdown/efforts/bodyweight/wall-ball.json +1 -1
  476. package/dist/web/server/seed/core/markdown/efforts/bodyweight/wall-burpee.json +1 -1
  477. package/dist/web/server/seed/core/markdown/efforts/cycling/assault-bike.json +1 -1
  478. package/dist/web/server/seed/core/markdown/efforts/cycling/cycling-moderate.json +1 -1
  479. package/dist/web/server/seed/core/markdown/efforts/cycling/cycling-vigorous.json +1 -1
  480. package/dist/web/server/seed/core/markdown/efforts/gymnastics/assisted-pull-up.json +1 -1
  481. package/dist/web/server/seed/core/markdown/efforts/gymnastics/burpee-pull-up.json +1 -1
  482. package/dist/web/server/seed/core/markdown/efforts/gymnastics/chest-to-bar-pull-up.json +1 -1
  483. package/dist/web/server/seed/core/markdown/efforts/gymnastics/dip.json +1 -1
  484. package/dist/web/server/seed/core/markdown/efforts/gymnastics/double-under.json +1 -1
  485. package/dist/web/server/seed/core/markdown/efforts/gymnastics/handstand-hold.json +1 -1
  486. package/dist/web/server/seed/core/markdown/efforts/gymnastics/handstand-push-up.json +1 -1
  487. package/dist/web/server/seed/core/markdown/efforts/gymnastics/handstand-walk.json +1 -1
  488. package/dist/web/server/seed/core/markdown/efforts/gymnastics/jump-rope.json +1 -1
  489. package/dist/web/server/seed/core/markdown/efforts/gymnastics/jumping-pull-up.json +1 -1
  490. package/dist/web/server/seed/core/markdown/efforts/gymnastics/jumping-push-up.json +1 -1
  491. package/dist/web/server/seed/core/markdown/efforts/gymnastics/l-sit-pull-up.json +1 -1
  492. package/dist/web/server/seed/core/markdown/efforts/gymnastics/muscle-up.json +1 -1
  493. package/dist/web/server/seed/core/markdown/efforts/gymnastics/pull-up.json +1 -1
  494. package/dist/web/server/seed/core/markdown/efforts/gymnastics/push-up.json +1 -1
  495. package/dist/web/server/seed/core/markdown/efforts/gymnastics/reverse-wall-dip.json +1 -1
  496. package/dist/web/server/seed/core/markdown/efforts/gymnastics/rope-climb.json +1 -1
  497. package/dist/web/server/seed/core/markdown/efforts/gymnastics/toes-to-bar.json +1 -1
  498. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-arm-bar.json +1 -1
  499. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-around-the-world.json +1 -1
  500. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-bent-over-row.json +1 -1
  501. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-clean-and-jerk.json +1 -1
  502. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-clean-and-press.json +1 -1
  503. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-clean.json +1 -1
  504. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-deadlift.json +1 -1
  505. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-floor-press.json +1 -1
  506. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-front-squat.json +1 -1
  507. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-goblet-squat.json +1 -1
  508. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-gorilla-row.json +1 -1
  509. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-halo.json +1 -1
  510. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-jerk.json +1 -1
  511. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-overhead-squat.json +1 -1
  512. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-press.json +1 -1
  513. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-snatch.json +1 -1
  514. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-swing.json +1 -1
  515. package/dist/web/server/seed/core/markdown/efforts/kettlebell/kettlebell-windmill.json +1 -1
  516. package/dist/web/server/seed/core/markdown/efforts/kettlebell/turkish-get-up.json +1 -1
  517. package/dist/web/server/seed/core/markdown/efforts/recovery/rest.json +1 -1
  518. package/dist/web/server/seed/core/markdown/efforts/recovery/stretching.json +1 -1
  519. package/dist/web/server/seed/core/markdown/efforts/rowing/rowing-sprint.json +1 -1
  520. package/dist/web/server/seed/core/markdown/efforts/rowing/rowing.json +1 -1
  521. package/dist/web/server/seed/core/markdown/efforts/rowing/ski-erg.json +1 -1
  522. package/dist/web/server/seed/core/markdown/efforts/running/backward-running.json +1 -1
  523. package/dist/web/server/seed/core/markdown/efforts/running/running-6-mph.json +1 -1
  524. package/dist/web/server/seed/core/markdown/efforts/running/running-8-mph.json +1 -1
  525. package/dist/web/server/seed/core/markdown/efforts/running/running-sprint.json +1 -1
  526. package/dist/web/server/seed/core/markdown/efforts/snatch.json +2 -2
  527. package/dist/web/server/seed/core/markdown/efforts/strength/back-squat.json +1 -1
  528. package/dist/web/server/seed/core/markdown/efforts/strength/bench-press.json +1 -1
  529. package/dist/web/server/seed/core/markdown/efforts/strength/box-step-up.json +1 -1
  530. package/dist/web/server/seed/core/markdown/efforts/strength/carioca.json +1 -1
  531. package/dist/web/server/seed/core/markdown/efforts/strength/clean-and-jerk.json +1 -1
  532. package/dist/web/server/seed/core/markdown/efforts/strength/cluster.json +1 -1
  533. package/dist/web/server/seed/core/markdown/efforts/strength/dead-hang.json +1 -1
  534. package/dist/web/server/seed/core/markdown/efforts/strength/deadlift.json +1 -1
  535. package/dist/web/server/seed/core/markdown/efforts/strength/devils-press.json +1 -1
  536. package/dist/web/server/seed/core/markdown/efforts/strength/dumbbell-box-step-up.json +1 -1
  537. package/dist/web/server/seed/core/markdown/efforts/strength/dumbbell-clean.json +1 -1
  538. package/dist/web/server/seed/core/markdown/efforts/strength/dumbbell-fly.json +1 -1
  539. package/dist/web/server/seed/core/markdown/efforts/strength/dumbbell-row.json +1 -1
  540. package/dist/web/server/seed/core/markdown/efforts/strength/dumbbell-snatch.json +1 -1
  541. package/dist/web/server/seed/core/markdown/efforts/strength/dumbbell-thruster.json +1 -1
  542. package/dist/web/server/seed/core/markdown/efforts/strength/elbows-to-knees.json +1 -1
  543. package/dist/web/server/seed/core/markdown/efforts/strength/farmer-carry.json +1 -1
  544. package/dist/web/server/seed/core/markdown/efforts/strength/frog-stand.json +1 -1
  545. package/dist/web/server/seed/core/markdown/efforts/strength/front-squat.json +1 -1
  546. package/dist/web/server/seed/core/markdown/efforts/strength/good-morning.json +1 -1
  547. package/dist/web/server/seed/core/markdown/efforts/strength/hanging-leg-raise.json +1 -1
  548. package/dist/web/server/seed/core/markdown/efforts/strength/hollow-rock.json +1 -1
  549. package/dist/web/server/seed/core/markdown/efforts/strength/knees-to-elbows.json +1 -1
  550. package/dist/web/server/seed/core/markdown/efforts/strength/l-sit.json +1 -1
  551. package/dist/web/server/seed/core/markdown/efforts/strength/man-maker.json +1 -1
  552. package/dist/web/server/seed/core/markdown/efforts/strength/medicine-ball-clean.json +1 -1
  553. package/dist/web/server/seed/core/markdown/efforts/strength/overhead-press.json +1 -1
  554. package/dist/web/server/seed/core/markdown/efforts/strength/parkour-vault.json +1 -1
  555. package/dist/web/server/seed/core/markdown/efforts/strength/pig-flip.json +1 -1
  556. package/dist/web/server/seed/core/markdown/efforts/strength/power-clean.json +1 -1
  557. package/dist/web/server/seed/core/markdown/efforts/strength/power-snatch.json +1 -1
  558. package/dist/web/server/seed/core/markdown/efforts/strength/push-jerk.json +1 -1
  559. package/dist/web/server/seed/core/markdown/efforts/strength/push-press.json +1 -1
  560. package/dist/web/server/seed/core/markdown/efforts/strength/romanian-deadlift.json +1 -1
  561. package/dist/web/server/seed/core/markdown/efforts/strength/single-leg-deadlift.json +1 -1
  562. package/dist/web/server/seed/core/markdown/efforts/strength/skull-crusher.json +1 -1
  563. package/dist/web/server/seed/core/markdown/efforts/strength/slam-ball.json +1 -1
  564. package/dist/web/server/seed/core/markdown/efforts/strength/sled-pull.json +1 -1
  565. package/dist/web/server/seed/core/markdown/efforts/strength/sled-push.json +1 -1
  566. package/dist/web/server/seed/core/markdown/efforts/strength/sumo-deadlift.json +1 -1
  567. package/dist/web/server/seed/core/markdown/efforts/strength/thruster.json +1 -1
  568. package/dist/web/server/seed/core/markdown/efforts/strength/triceps-extension.json +1 -1
  569. package/dist/web/server/seed/core/markdown/efforts/strength/v-sit-hold.json +1 -1
  570. package/dist/web/server/seed/core/markdown/efforts/strength/wall-walk.json +1 -1
  571. package/dist/web/server/seed/core/markdown/efforts/strength/yoga-sun-salutation.json +1 -1
  572. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-assisted-sprint.json +1 -1
  573. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-backstroke.json +1 -1
  574. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-breaststroke-kick.json +1 -1
  575. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-breaststroke.json +1 -1
  576. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-butterfly.json +1 -1
  577. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-catch-up-drill.json +1 -1
  578. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-choice-stroke.json +1 -1
  579. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-dive-start.json +1 -1
  580. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-dolphin-kick.json +1 -1
  581. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-drafting.json +1 -1
  582. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-fingertip-drag.json +1 -1
  583. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-freestyle.json +1 -1
  584. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-individual-medley.json +1 -1
  585. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-kick.json +1 -1
  586. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-pull.json +1 -1
  587. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-resisted-sprint.json +1 -1
  588. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-rotation-drill.json +1 -1
  589. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-sighting.json +1 -1
  590. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-single-arm-drill.json +1 -1
  591. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-stroke-transition.json +1 -1
  592. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-two-kick-one-pull.json +1 -1
  593. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming-vigorous.json +1 -1
  594. package/dist/web/server/seed/core/markdown/efforts/swimming/swimming.json +1 -1
  595. package/dist/web/server/seed/core/markdown/efforts/unconventional/clubbell-arm-cast.json +1 -1
  596. package/dist/web/server/seed/core/markdown/efforts/unconventional/clubbell-circles.json +1 -1
  597. package/dist/web/server/seed/core/markdown/efforts/unconventional/clubbell-mill.json +1 -1
  598. package/dist/web/server/seed/core/markdown/efforts/unconventional/clubbell-reverse-mill.json +1 -1
  599. package/dist/web/server/seed/core/markdown/efforts/unconventional/clubbell-shield-cast.json +1 -1
  600. package/dist/web/server/seed/core/markdown/efforts/unconventional/macebell-10-to-2-swing.json +1 -1
  601. package/dist/web/server/seed/core/markdown/efforts/unconventional/macebell-360-swing.json +1 -1
  602. package/dist/web/server/seed/core/markdown/efforts/unconventional/macebell-barbarian-squat.json +1 -1
  603. package/dist/web/server/seed/core/markdown/efforts/unconventional/macebell-flow.json +1 -1
  604. package/dist/web/server/seed/core/markdown/efforts/unconventional/macebell-gravedigger.json +1 -1
  605. package/dist/web/server/seed/core/markdown/efforts/unconventional/macebell-touchdown.json +1 -1
  606. package/dist/web/server/seed/core/markdown/efforts/unconventional/sandbag-bear-hug-carry.json +1 -1
  607. package/dist/web/server/seed/core/markdown/efforts/unconventional/sandbag-bear-hug-extension.json +1 -1
  608. package/dist/web/server/seed/core/markdown/efforts/unconventional/sandbag-over-shoulder.json +1 -1
  609. package/dist/web/server/seed/core/markdown/efforts/walking/walking-3-mph.json +1 -1
  610. package/dist/web/server/seed/core/markdown/equipment/air-bike.json +1 -1
  611. package/dist/web/server/seed/core/markdown/equipment/barbell.json +1 -1
  612. package/dist/web/server/seed/core/markdown/equipment/bench.json +1 -1
  613. package/dist/web/server/seed/core/markdown/equipment/bike-erg.json +1 -1
  614. package/dist/web/server/seed/core/markdown/equipment/climbing-rope.json +1 -1
  615. package/dist/web/server/seed/core/markdown/equipment/clubs.json +1 -1
  616. package/dist/web/server/seed/core/markdown/equipment/dumbbell.json +1 -1
  617. package/dist/web/server/seed/core/markdown/equipment/ghd.json +1 -1
  618. package/dist/web/server/seed/core/markdown/equipment/gymnastic-rings.json +1 -1
  619. package/dist/web/server/seed/core/markdown/equipment/jump-rope.json +1 -1
  620. package/dist/web/server/seed/core/markdown/equipment/kettlebell.json +1 -1
  621. package/dist/web/server/seed/core/markdown/equipment/macebell.json +1 -1
  622. package/dist/web/server/seed/core/markdown/equipment/medicine-ball.json +1 -1
  623. package/dist/web/server/seed/core/markdown/equipment/parallettes.json +1 -1
  624. package/dist/web/server/seed/core/markdown/equipment/plyo-box.json +1 -1
  625. package/dist/web/server/seed/core/markdown/equipment/pull-up-bar.json +1 -1
  626. package/dist/web/server/seed/core/markdown/equipment/rower.json +1 -1
  627. package/dist/web/server/seed/core/markdown/equipment/sandbag.json +1 -1
  628. package/dist/web/server/seed/core/markdown/equipment/ski-erg.json +1 -1
  629. package/dist/web/server/seed/core/markdown/equipment/slam-ball.json +1 -1
  630. package/dist/web/server/seed/core/markdown/equipment/sled.json +1 -1
  631. package/dist/web/server/seed/core/markdown/equipment/sledgehammer.json +1 -1
  632. package/dist/web/server/seed/core/markdown/equipment/weight-vest.json +1 -1
  633. package/dist/web/server/seed/core/report.html +13 -13
  634. package/package.json +10 -8
  635. package/dist/chunk-2EWCEE6N.mjs.map +0 -1
  636. package/dist/chunk-5NNSHRMZ.mjs.map +0 -1
  637. package/dist/chunk-LNBKPHEP.mjs.map +0 -1
  638. package/dist/chunk-SLCRIGUR.mjs.map +0 -1
  639. package/dist/server-SHNWCIIM.mjs +0 -11
  640. package/dist/web/playground/assets/main-DGz9PHS_.css +0 -2
  641. package/dist/web/playground/assets/main-DfHqNhwO.js +0 -1149
  642. package/dist/web/playground/assets/vendor-Dz-Azkoq.js +0 -198
  643. package/dist/web/server/assets/main-DGz9PHS_.css +0 -2
  644. package/dist/web/server/assets/main-VXFEU44Q.js +0 -1149
  645. package/dist/web/server/assets/vendor-Dz-Azkoq.js +0 -198
package/dist/bin/wod.cjs CHANGED
@@ -5,15 +5,20 @@ var wodWikiLang = require('@bitcobblers/wod-wiki-lang');
5
5
  var wod_wiki_engine_star = require('@bitcobblers/wod-wiki-engine');
6
6
  var fs = require('fs');
7
7
  var path = require('path');
8
+ var wodWikiStorage = require('@bitcobblers/wod-wiki-storage');
9
+ var agent = require('@bitcobblers/wod-wiki-engine/agent');
8
10
  var child_process = require('child_process');
9
11
  var wodWikiCore = require('@bitcobblers/wod-wiki-core');
10
12
  var wodWikiWql = require('@bitcobblers/wod-wiki-wql');
11
13
  var crypto = require('crypto');
14
+ var zod = require('zod');
15
+ var mcp_js = require('@modelcontextprotocol/sdk/server/mcp.js');
16
+ var webStandardStreamableHttp_js = require('@modelcontextprotocol/sdk/server/webStandardStreamableHttp.js');
17
+ var sql = require('@bitcobblers/wod-wiki-storage/sql');
12
18
  var promises = require('fs/promises');
13
19
  var stream = require('stream');
14
- var sql = require('@bitcobblers/wod-wiki-storage/sql');
15
- var wodWikiStorage = require('@bitcobblers/wod-wiki-storage');
16
20
  var http = require('http');
21
+ var stdio_js = require('@modelcontextprotocol/sdk/server/stdio.js');
17
22
 
18
23
  var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
19
24
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
@@ -440,7 +445,7 @@ var init_report = __esm({
440
445
  var VERSION;
441
446
  var init_version = __esm({
442
447
  "src/version.ts"() {
443
- VERSION = "0.53.2204";
448
+ VERSION = "0.54.2205";
444
449
  }
445
450
  });
446
451
 
@@ -706,6 +711,590 @@ var init_skills = __esm({
706
711
  }
707
712
  });
708
713
 
714
+ // src/cli/agentCommands.ts
715
+ var agentCommands_exports = {};
716
+ __export(agentCommands_exports, {
717
+ runAgentNounVerbCommand: () => runAgentNounVerbCommand
718
+ });
719
+ async function openStorageSession(env) {
720
+ if (env.parsed.serverUrl) {
721
+ const trimmed = env.parsed.serverUrl.replace(/\/+$/, "");
722
+ const apiBase = trimmed.endsWith("/api") ? trimmed : `${trimmed}/api`;
723
+ const baseUrl = trimmed.endsWith("/api") ? trimmed.slice(0, -4) : trimmed;
724
+ const storage = new wodWikiStorage.ApiStorage(apiBase);
725
+ return {
726
+ storage,
727
+ feedTree: new wod_wiki_engine_star.MemoryFeedTree(),
728
+ baseUrl,
729
+ label: baseUrl,
730
+ close: () => storage.close()
731
+ };
732
+ }
733
+ const dbConfig = env.resolveDbConfig();
734
+ const dbHandle = await openCliDb(dbConfig);
735
+ const feedTree = dbConfig.kind === "sqlite" ? new NodeFsFeedTree(`${dbConfig.path}.feed`) : new wod_wiki_engine_star.MemoryFeedTree();
736
+ return {
737
+ storage: dbHandle.storage,
738
+ feedTree,
739
+ baseUrl: "",
740
+ label: dbHandle.path,
741
+ close: () => dbHandle.close()
742
+ };
743
+ }
744
+ function parseSetPairs(pairs) {
745
+ const out = {};
746
+ for (const pair of pairs) {
747
+ const idx = pair.indexOf("=");
748
+ if (idx <= 0) {
749
+ throw new Error(`Invalid --set "${pair}" (expected fieldId=value)`);
750
+ }
751
+ const key = pair.slice(0, idx).trim();
752
+ const rawVal = pair.slice(idx + 1).trim();
753
+ if (!key || !rawVal) {
754
+ throw new Error(`Invalid --set "${pair}" (expected fieldId=value)`);
755
+ }
756
+ const num = Number(rawVal);
757
+ out[key] = Number.isFinite(num) ? num : rawVal;
758
+ }
759
+ return out;
760
+ }
761
+ function toNotebookId(slugOrId) {
762
+ if (!slugOrId) return void 0;
763
+ return slugOrId.startsWith("notebook/") ? slugOrId : `notebook/${slugOrId}`;
764
+ }
765
+ function slugifyName(input) {
766
+ return input.trim().toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
767
+ }
768
+ async function readContentArg(fileOrDash, inlineMarkdown, readStdin2) {
769
+ if (inlineMarkdown !== void 0) return inlineMarkdown;
770
+ if (!fileOrDash || fileOrDash === "-") {
771
+ return readStdin2();
772
+ }
773
+ const fs = nodeFs();
774
+ if (!fs.existsSync(fileOrDash)) {
775
+ throw new Error(`File not found: ${fileOrDash}`);
776
+ }
777
+ return fs.readFileSync(fileOrDash, "utf-8");
778
+ }
779
+ function emitSuccess(env, toolName, data, humanSummary) {
780
+ if (env.parsed.json) {
781
+ env.writeOut(
782
+ JSON.stringify(
783
+ {
784
+ ok: true,
785
+ tool: toolName,
786
+ data
787
+ },
788
+ null,
789
+ 2
790
+ )
791
+ );
792
+ } else {
793
+ env.writeOut(humanSummary);
794
+ }
795
+ return 0;
796
+ }
797
+ function emitError(env, error) {
798
+ if (error instanceof agent.AgentConfirmationRequiredError) {
799
+ const payload = {
800
+ ok: false,
801
+ code: error.code,
802
+ exitCode: 4,
803
+ action: error.action,
804
+ targetId: error.targetId,
805
+ error: error.message,
806
+ hint: `Re-run with --yes "${error.targetId}" to confirm.`
807
+ };
808
+ if (env.parsed.json) {
809
+ env.writeOut(JSON.stringify(payload, null, 2));
810
+ } else {
811
+ env.writeErr(
812
+ `[wod] Confirmation required (${error.action}): ${error.message} Pass --yes "${error.targetId}" to confirm.`
813
+ );
814
+ }
815
+ return 4;
816
+ }
817
+ const message = error instanceof Error ? error.message : String(error);
818
+ if (env.parsed.json) {
819
+ env.writeOut(
820
+ JSON.stringify(
821
+ {
822
+ ok: false,
823
+ code: "RUNTIME_ERROR",
824
+ error: message
825
+ },
826
+ null,
827
+ 2
828
+ )
829
+ );
830
+ } else {
831
+ env.writeErr(`[wod] Error: ${message}`);
832
+ }
833
+ return 1;
834
+ }
835
+ async function runAgentNounVerbCommand(env) {
836
+ const { parsed } = env;
837
+ const noun = parsed.subcommand;
838
+ const verb = parsed.target;
839
+ const arg1 = parsed.target2;
840
+ const arg2 = parsed.target3;
841
+ try {
842
+ if (noun === "tools") {
843
+ const action = verb ?? "list";
844
+ const manifest = agent.exportAgentCapabilitiesManifest();
845
+ if (action === "manifest") {
846
+ env.writeOut(JSON.stringify(manifest, null, 2));
847
+ return 0;
848
+ }
849
+ if (action === "list") {
850
+ if (parsed.json) {
851
+ return emitSuccess(env, "wod_tools_list", manifest.domainTools, "");
852
+ }
853
+ for (const t of manifest.domainTools) {
854
+ env.writeOut(`${t.name.padEnd(26)} [Tier ${t.tier}] ${t.cliEquivalent}`);
855
+ }
856
+ env.writeOut(`[wod tools] ${manifest.domainTools.length} portable domain tools`);
857
+ return 0;
858
+ }
859
+ throw new Error(`Unknown tools action "${action}" (expected: list | manifest)`);
860
+ }
861
+ if (noun === "doctor") {
862
+ let backendKind = "sqlite";
863
+ let backendTarget = "";
864
+ let dbReady = false;
865
+ let noteCount = 0;
866
+ let sessionCount = 0;
867
+ if (parsed.serverUrl) {
868
+ backendKind = "api";
869
+ backendTarget = parsed.serverUrl;
870
+ const session2 = await openStorageSession(env);
871
+ try {
872
+ noteCount = (await session2.storage.readonly("notes").getAll()).length;
873
+ sessionCount = (await session2.storage.readonly("sessions").getAll()).length;
874
+ dbReady = true;
875
+ } finally {
876
+ await session2.close();
877
+ }
878
+ } else {
879
+ const cfg = env.resolveDbConfig();
880
+ backendKind = cfg.kind;
881
+ backendTarget = cfg.kind === "sqlite" ? cfg.path : cfg.kind;
882
+ try {
883
+ const db = await openCliDb(cfg, { initialize: false });
884
+ try {
885
+ noteCount = (await db.storage.readonly("notes").getAll()).length;
886
+ sessionCount = (await db.storage.readonly("sessions").getAll()).length;
887
+ dbReady = true;
888
+ } finally {
889
+ await db.close();
890
+ }
891
+ } catch {
892
+ dbReady = false;
893
+ }
894
+ }
895
+ const { bundledSkillsRoot: bundledSkillsRoot2, listBundledSkills: listBundledSkills2 } = await Promise.resolve().then(() => (init_skills(), skills_exports));
896
+ const skillsRoot = bundledSkillsRoot2();
897
+ const skills = skillsRoot ? listBundledSkills2(skillsRoot).map((s) => s.name) : [];
898
+ const report = {
899
+ version: VERSION,
900
+ backendKind,
901
+ backendTarget,
902
+ databaseInitialized: dbReady,
903
+ noteCount,
904
+ sessionCount,
905
+ domainToolCount: agent.DOMAIN_AGENT_TOOLS.length,
906
+ bundledSkills: skills
907
+ };
908
+ return emitSuccess(
909
+ env,
910
+ "wod_doctor",
911
+ report,
912
+ `[wod doctor] v${VERSION} \xB7 backend=${backendKind} (${dbReady ? "ready" : "uninitialized"}) \xB7 ${noteCount} notes \xB7 ${sessionCount} sessions \xB7 ${agent.DOMAIN_AGENT_TOOLS.length} tools \xB7 ${skills.length} skills`
913
+ );
914
+ }
915
+ const session = await openStorageSession(env);
916
+ const ctx = {
917
+ storage: session.storage,
918
+ feedTree: session.feedTree,
919
+ baseUrl: session.baseUrl
920
+ };
921
+ try {
922
+ if (noun === "note") {
923
+ if (verb === "list" || !verb) {
924
+ const out = await agent.wodNoteListTool.execute(
925
+ {
926
+ notebookId: toNotebookId(parsed.notebook),
927
+ tag: parsed.tag,
928
+ search: parsed.search,
929
+ limit: parsed.limit
930
+ },
931
+ ctx
932
+ );
933
+ return emitSuccess(
934
+ env,
935
+ agent.wodNoteListTool.name,
936
+ out,
937
+ out.notes.map((n) => `${n.id} ${(n.date ? new Date(n.date).toISOString().slice(0, 10) : "").padEnd(10)} ${n.title}`).join("\n") || "[wod note list] 0 notes"
938
+ );
939
+ }
940
+ if (verb === "get") {
941
+ const noteId = arg1 ?? parsed.noteId;
942
+ if (!noteId) throw new Error("Usage: wod note get <noteId>");
943
+ const out = await agent.wodNoteGetTool.execute({ noteId }, ctx);
944
+ return emitSuccess(
945
+ env,
946
+ agent.wodNoteGetTool.name,
947
+ out,
948
+ parsed.format === "table" ? `${out.id} ${out.title}
949
+
950
+ ${out.rawContent}` : out.rawContent
951
+ );
952
+ }
953
+ if (verb === "create" || verb === "update" || verb === "upsert") {
954
+ const noteId = verb === "update" ? arg1 ?? parsed.noteId : parsed.noteId;
955
+ const fileArg = verb === "update" ? arg2 : arg1;
956
+ let content = await readContentArg(fileArg, parsed.markdown, env.readStdin);
957
+ if (parsed.tags.length > 0 && !content.trimStart().startsWith("---")) {
958
+ content = `---
959
+ tags:
960
+ ${parsed.tags.map((t) => ` - ${t}`).join("\n")}
961
+ ---
962
+
963
+ ${content}`;
964
+ }
965
+ const out = await agent.wodNoteUpsertTool.execute(
966
+ {
967
+ noteId,
968
+ title: parsed.title,
969
+ content,
970
+ notebookId: toNotebookId(parsed.notebook),
971
+ journalDate: parsed.date,
972
+ sport: parsed.sport
973
+ },
974
+ ctx
975
+ );
976
+ return emitSuccess(
977
+ env,
978
+ agent.wodNoteUpsertTool.name,
979
+ out,
980
+ `[wod note ${verb}] ${out.noteId}${out.created ? " (created)" : " (updated)"} \u2014 ${out.blockCount} block(s)`
981
+ );
982
+ }
983
+ if (verb === "clone") {
984
+ const sourceNoteId = arg1 ?? parsed.noteId;
985
+ if (!sourceNoteId) {
986
+ throw new Error("Usage: wod note clone <sourceNoteId> [--date YYYY-MM-DD] [--notebook <slug>]");
987
+ }
988
+ const out = await agent.wodNoteCloneTool.execute(
989
+ {
990
+ sourceNoteId,
991
+ title: parsed.title,
992
+ targetNotebookId: toNotebookId(parsed.notebook),
993
+ journalDate: parsed.date
994
+ },
995
+ ctx
996
+ );
997
+ return emitSuccess(
998
+ env,
999
+ agent.wodNoteCloneTool.name,
1000
+ out,
1001
+ `[wod note clone] ${sourceNoteId} \u2192 ${out.noteId}`
1002
+ );
1003
+ }
1004
+ if (verb === "delete") {
1005
+ const noteId = arg1 ?? parsed.noteId;
1006
+ if (!noteId) throw new Error("Usage: wod note delete <noteId> --yes <noteId>");
1007
+ const out = await agent.wodNoteDeleteTool.execute({ noteId, confirmId: parsed.yes }, ctx);
1008
+ return emitSuccess(
1009
+ env,
1010
+ agent.wodNoteDeleteTool.name,
1011
+ out,
1012
+ `[wod note delete] deleted=${out.deleted} note=${out.noteId}`
1013
+ );
1014
+ }
1015
+ throw new Error(`Unknown note verb "${verb}" (expected: list | get | create | update | clone | delete)`);
1016
+ }
1017
+ if (noun === "journal") {
1018
+ if (verb === "day" || !verb) {
1019
+ const date = arg1 ?? parsed.date ?? "today";
1020
+ const out = await agent.wodJournalDayTool.execute({ date }, ctx);
1021
+ return emitSuccess(
1022
+ env,
1023
+ agent.wodJournalDayTool.name,
1024
+ out,
1025
+ `[wod journal day ${out.date}] ${out.noteCount} scheduled note(s), ${out.sessionCount} session(s)`
1026
+ );
1027
+ }
1028
+ if (verb === "add") {
1029
+ const date = arg1 ?? parsed.date ?? "today";
1030
+ const sourceNoteId = parsed.sourceNoteId ?? parsed.noteId;
1031
+ if (sourceNoteId && !parsed.markdown && !arg2) {
1032
+ const cloned = await agent.wodNoteCloneTool.execute(
1033
+ {
1034
+ sourceNoteId,
1035
+ title: parsed.title,
1036
+ targetNotebookId: toNotebookId(parsed.notebook ?? "journal"),
1037
+ journalDate: date
1038
+ },
1039
+ ctx
1040
+ );
1041
+ return emitSuccess(
1042
+ env,
1043
+ agent.wodNoteCloneTool.name,
1044
+ cloned,
1045
+ `[wod journal add] cloned ${sourceNoteId} \u2192 ${cloned.noteId} on ${date}`
1046
+ );
1047
+ }
1048
+ const content = await readContentArg(arg2, parsed.markdown, env.readStdin);
1049
+ const out = await agent.wodJournalAddTool.execute(
1050
+ {
1051
+ date,
1052
+ title: parsed.title,
1053
+ content,
1054
+ sport: parsed.sport,
1055
+ notebookId: toNotebookId(parsed.notebook)
1056
+ },
1057
+ ctx
1058
+ );
1059
+ return emitSuccess(
1060
+ env,
1061
+ agent.wodJournalAddTool.name,
1062
+ out,
1063
+ `[wod journal add] scheduled note ${out.noteId} on ${out.date}`
1064
+ );
1065
+ }
1066
+ throw new Error(`Unknown journal verb "${verb}" (expected: day | add)`);
1067
+ }
1068
+ if (noun === "notebook") {
1069
+ if (verb === "list" || !verb) {
1070
+ const out = await agent.wodNotebookListTool.execute({ origin: "all" }, ctx);
1071
+ return emitSuccess(
1072
+ env,
1073
+ agent.wodNotebookListTool.name,
1074
+ out,
1075
+ out.notebooks.map((nb) => `${nb.slug.padEnd(20)} (${nb.noteCount} notes) \u2014 ${nb.name}`).join("\n") || "[wod notebook list] 0 notebooks"
1076
+ );
1077
+ }
1078
+ if (verb === "create" || verb === "save" || verb === "update") {
1079
+ const slugOrId = arg1 ?? parsed.notebook;
1080
+ const name = parsed.title ?? parsed.dbName ?? slugOrId;
1081
+ if (!name) throw new Error('Usage: wod notebook save <slug> --title "<Name>"');
1082
+ const notebookId = toNotebookId(slugOrId ?? slugifyName(name));
1083
+ const existing = notebookId ? await session.storage.readonly("notes").get(notebookId) : void 0;
1084
+ const action = verb === "create" || !existing ? "create" : "update";
1085
+ const out = await agent.wodNotebookSaveTool.execute(
1086
+ {
1087
+ action,
1088
+ notebookId,
1089
+ name,
1090
+ description: parsed.description,
1091
+ noteId: parsed.noteId
1092
+ },
1093
+ ctx
1094
+ );
1095
+ return emitSuccess(
1096
+ env,
1097
+ agent.wodNotebookSaveTool.name,
1098
+ out,
1099
+ `[wod notebook ${verb}] ${out.notebookId ?? slugOrId ?? name}`
1100
+ );
1101
+ }
1102
+ if (verb === "promote" || verb === "detach") {
1103
+ const slugOrId = arg1 ?? parsed.notebook;
1104
+ const noteId = arg2 ?? parsed.noteId;
1105
+ if (!slugOrId || !noteId) {
1106
+ throw new Error(`Usage: wod notebook ${verb} <slug> <noteId>`);
1107
+ }
1108
+ const out = await agent.wodNotebookSaveTool.execute(
1109
+ {
1110
+ action: verb,
1111
+ notebookId: toNotebookId(slugOrId),
1112
+ noteId
1113
+ },
1114
+ ctx
1115
+ );
1116
+ return emitSuccess(
1117
+ env,
1118
+ agent.wodNotebookSaveTool.name,
1119
+ out,
1120
+ `[wod notebook ${verb}] note ${out.noteId} \u2192 ${(out.notebookIds ?? []).join(", ")}`
1121
+ );
1122
+ }
1123
+ if (verb === "delete") {
1124
+ const slugOrId = arg1 ?? parsed.notebook;
1125
+ if (!slugOrId) throw new Error("Usage: wod notebook delete <slug> --yes <notebook/slug>");
1126
+ const notebookId = toNotebookId(slugOrId);
1127
+ const confirmId = parsed.yes === slugOrId ? notebookId : parsed.yes;
1128
+ const out = await agent.wodNotebookDeleteTool.execute({ notebookId, confirmId }, ctx);
1129
+ return emitSuccess(
1130
+ env,
1131
+ agent.wodNotebookDeleteTool.name,
1132
+ out,
1133
+ `[wod notebook delete] deleted ${out.notebookId}`
1134
+ );
1135
+ }
1136
+ throw new Error(`Unknown notebook verb "${verb}" (expected: list | create | save | update | promote | detach | delete)`);
1137
+ }
1138
+ if (noun === "session") {
1139
+ if (verb === "list" || !verb) {
1140
+ const out = await agent.wodSessionListTool.execute(
1141
+ {
1142
+ noteId: parsed.noteId,
1143
+ limit: parsed.limit
1144
+ },
1145
+ ctx
1146
+ );
1147
+ return emitSuccess(
1148
+ env,
1149
+ agent.wodSessionListTool.name,
1150
+ out,
1151
+ out.sessions.map(
1152
+ (s) => `${s.id} ${new Date(s.startTime).toISOString().slice(0, 10)} note=${s.noteId} completed=${s.completed}`
1153
+ ).join("\n") || "[wod session list] 0 sessions"
1154
+ );
1155
+ }
1156
+ if (verb === "get") {
1157
+ const sessionId = arg1;
1158
+ if (!sessionId) throw new Error("Usage: wod session get <sessionId>");
1159
+ const out = await agent.wodSessionGetTool.execute({ sessionId }, ctx);
1160
+ return emitSuccess(
1161
+ env,
1162
+ agent.wodSessionGetTool.name,
1163
+ out,
1164
+ `[wod session get] ${out.session.id} \u2014 ${out.eventCount} event(s), duration=${out.session.duration}ms`
1165
+ );
1166
+ }
1167
+ if (verb === "run") {
1168
+ const noteId = parsed.noteId ?? arg1;
1169
+ const source = !noteId ? await readContentArg(arg1, parsed.markdown, env.readStdin) : void 0;
1170
+ const out = await agent.wodSessionRunHeadlessTool.execute(
1171
+ {
1172
+ noteId,
1173
+ blockId: parsed.blockId,
1174
+ source,
1175
+ title: parsed.title,
1176
+ sport: parsed.sport,
1177
+ journalDate: parsed.date,
1178
+ collectibles: parsed.setPairs.length > 0 ? parseSetPairs(parsed.setPairs) : void 0
1179
+ },
1180
+ ctx
1181
+ );
1182
+ return emitSuccess(
1183
+ env,
1184
+ agent.wodSessionRunHeadlessTool.name,
1185
+ out,
1186
+ `[wod session run] session ${out.sessionId} on note ${out.noteId} (${out.eventCount} events, ${out.summaryCount} summaries)`
1187
+ );
1188
+ }
1189
+ if (verb === "delete") {
1190
+ const sessionId = arg1;
1191
+ if (!sessionId) throw new Error("Usage: wod session delete <sessionId> --yes <sessionId>");
1192
+ const out = await agent.wodSessionDeleteTool.execute({ sessionId, confirmId: parsed.yes }, ctx);
1193
+ return emitSuccess(
1194
+ env,
1195
+ agent.wodSessionDeleteTool.name,
1196
+ out,
1197
+ `[wod session delete] deleted=${out.deleted} session=${out.sessionId}`
1198
+ );
1199
+ }
1200
+ throw new Error(`Unknown session verb "${verb}" (expected: list | get | run | delete)`);
1201
+ }
1202
+ if (noun === "catalog" || noun === "tag") {
1203
+ const defaultKind = noun === "tag" ? "tag" : "effort";
1204
+ if (verb === "list" || verb === "lookup" || !verb) {
1205
+ const kind = (noun === "tag" ? "tag" : arg1) ?? defaultKind;
1206
+ const out = await agent.wodCatalogLookupTool.execute(
1207
+ {
1208
+ kind,
1209
+ search: parsed.search ?? (noun === "tag" ? arg1 : arg2),
1210
+ slug: parsed.slug,
1211
+ notebookId: toNotebookId(parsed.notebook),
1212
+ limit: parsed.limit
1213
+ },
1214
+ ctx
1215
+ );
1216
+ return emitSuccess(
1217
+ env,
1218
+ agent.wodCatalogLookupTool.name,
1219
+ out,
1220
+ `[wod ${noun} ${verb ?? "list"}] ${out.items.length} ${out.kind} item(s)`
1221
+ );
1222
+ }
1223
+ if (verb === "get") {
1224
+ const kind = noun === "tag" ? "tag" : arg1 ?? "effort";
1225
+ const slug = noun === "tag" ? arg1 : arg2;
1226
+ const out = await agent.wodCatalogLookupTool.execute({ kind, slug }, ctx);
1227
+ return emitSuccess(
1228
+ env,
1229
+ agent.wodCatalogLookupTool.name,
1230
+ out,
1231
+ JSON.stringify(out.items[0] ?? null, null, 2)
1232
+ );
1233
+ }
1234
+ if (verb === "upsert" || verb === "create") {
1235
+ const kind = noun === "tag" ? "tag" : arg1 ?? "effort";
1236
+ const label = (noun === "tag" ? arg1 : arg2) ?? parsed.title ?? parsed.slug;
1237
+ if (!label) {
1238
+ throw new Error(
1239
+ `Usage: wod ${noun} upsert ${noun === "tag" ? "<label> [--category <tagType>]" : "<effort|equipment|tag> <name>"}`
1240
+ );
1241
+ }
1242
+ const slug = parsed.slug ?? slugifyName(label);
1243
+ const out = await agent.wodCatalogUpsertTool.execute(
1244
+ {
1245
+ kind,
1246
+ slug,
1247
+ label,
1248
+ targetNotebookId: toNotebookId(parsed.notebook),
1249
+ markdown: parsed.markdown,
1250
+ category: parsed.category ?? parsed.tagType,
1251
+ aliases: parsed.aliases.length > 0 ? parsed.aliases : void 0
1252
+ },
1253
+ ctx
1254
+ );
1255
+ return emitSuccess(
1256
+ env,
1257
+ agent.wodCatalogUpsertTool.name,
1258
+ out,
1259
+ `[wod ${noun} upsert] ${out.kind} ${out.slug} (${out.ownerNoteId})`
1260
+ );
1261
+ }
1262
+ throw new Error(`Unknown ${noun} verb "${verb}" (expected: list | lookup | get | upsert)`);
1263
+ }
1264
+ if (noun === "feed") {
1265
+ const action = verb ?? "list";
1266
+ const out = await agent.wodFeedManageTool.execute(
1267
+ {
1268
+ action,
1269
+ notebookSlug: parsed.notebook,
1270
+ name: parsed.title,
1271
+ description: parsed.description
1272
+ },
1273
+ ctx
1274
+ );
1275
+ return emitSuccess(
1276
+ env,
1277
+ agent.wodFeedManageTool.name,
1278
+ out,
1279
+ `[wod feed ${action}] ok`
1280
+ );
1281
+ }
1282
+ throw new Error(`Unhandled agent command group "${noun}"`);
1283
+ } finally {
1284
+ await session.close();
1285
+ }
1286
+ } catch (err) {
1287
+ return emitError(env, err);
1288
+ }
1289
+ }
1290
+ var init_agentCommands = __esm({
1291
+ "src/cli/agentCommands.ts"() {
1292
+ init_db();
1293
+ init_nodeFeedTree();
1294
+ init_version();
1295
+ }
1296
+ });
1297
+
709
1298
  // src/seedbuild/contract.ts
710
1299
  var contract_exports = {};
711
1300
  var init_contract = __esm({
@@ -1519,6 +2108,221 @@ var init_errors = __esm({
1519
2108
  };
1520
2109
  }
1521
2110
  });
2111
+ function createWodMcpServer(options) {
2112
+ const server = new mcp_js.McpServer(
2113
+ {
2114
+ name: "wod-wiki",
2115
+ version: VERSION
2116
+ },
2117
+ {
2118
+ capabilities: {
2119
+ tools: {},
2120
+ resources: {},
2121
+ prompts: {}
2122
+ }
2123
+ }
2124
+ );
2125
+ const ctx = {
2126
+ storage: options.storage,
2127
+ feedTree: options.feedTree,
2128
+ baseUrl: options.baseUrl,
2129
+ onMutated: options.onMutated
2130
+ // Over MCP HTTP/stdio, explicit confirm="<targetId>" inside tool arguments
2131
+ // satisfies Tier 2 confirmation; when omitted, requireAgentConfirmation throws
2132
+ // an actionable error instructing the caller to pass confirm="<targetId>".
2133
+ };
2134
+ for (const spec of agent.DOMAIN_AGENT_TOOLS) {
2135
+ if (options.readonly && spec.tier !== 0) {
2136
+ continue;
2137
+ }
2138
+ server.registerTool(
2139
+ spec.name,
2140
+ {
2141
+ title: spec.title,
2142
+ description: spec.description,
2143
+ inputSchema: spec.inputSchema,
2144
+ annotations: spec.annotations
2145
+ },
2146
+ async (args) => {
2147
+ try {
2148
+ const parsed = spec.inputSchema.parse(args ?? {});
2149
+ const result = await spec.execute(parsed, ctx);
2150
+ return {
2151
+ content: [
2152
+ {
2153
+ type: "text",
2154
+ text: JSON.stringify(result, null, 2)
2155
+ }
2156
+ ],
2157
+ structuredContent: result
2158
+ };
2159
+ } catch (err) {
2160
+ const message = err instanceof Error ? err.message : String(err);
2161
+ return {
2162
+ isError: true,
2163
+ content: [
2164
+ {
2165
+ type: "text",
2166
+ text: message
2167
+ }
2168
+ ]
2169
+ };
2170
+ }
2171
+ }
2172
+ );
2173
+ }
2174
+ for (const resource of agent.AGENT_STATIC_RESOURCES) {
2175
+ server.registerResource(
2176
+ resource.name,
2177
+ resource.uri,
2178
+ {
2179
+ description: resource.description,
2180
+ mimeType: resource.mimeType
2181
+ },
2182
+ async (uri) => {
2183
+ const res = await agent.readAgentResource(uri.toString(), ctx);
2184
+ return {
2185
+ contents: [
2186
+ {
2187
+ uri: res.uri,
2188
+ mimeType: res.mimeType,
2189
+ text: res.text
2190
+ }
2191
+ ]
2192
+ };
2193
+ }
2194
+ );
2195
+ }
2196
+ for (const tmpl of agent.AGENT_RESOURCE_TEMPLATES) {
2197
+ const template = new mcp_js.ResourceTemplate(tmpl.uriTemplate, { list: void 0 });
2198
+ server.registerResource(
2199
+ tmpl.name,
2200
+ template,
2201
+ {
2202
+ description: tmpl.description,
2203
+ mimeType: tmpl.mimeType
2204
+ },
2205
+ async (uri) => {
2206
+ const res = await agent.readAgentResource(uri.toString(), ctx);
2207
+ return {
2208
+ contents: [
2209
+ {
2210
+ uri: res.uri,
2211
+ mimeType: res.mimeType,
2212
+ text: res.text
2213
+ }
2214
+ ]
2215
+ };
2216
+ }
2217
+ );
2218
+ }
2219
+ for (const prompt of agent.AGENT_PROMPTS) {
2220
+ const argsShape = {};
2221
+ for (const arg of prompt.arguments) {
2222
+ argsShape[arg.name] = arg.required ? zod.z.string().describe(arg.description) : zod.z.string().optional().describe(arg.description);
2223
+ }
2224
+ server.registerPrompt(
2225
+ prompt.name,
2226
+ {
2227
+ title: prompt.title,
2228
+ description: prompt.description,
2229
+ argsSchema: argsShape
2230
+ },
2231
+ async (args) => {
2232
+ const rendered = agent.renderAgentPrompt(prompt.name, args);
2233
+ return {
2234
+ description: rendered.description,
2235
+ messages: rendered.messages
2236
+ };
2237
+ }
2238
+ );
2239
+ }
2240
+ return server;
2241
+ }
2242
+ var init_createWodMcpServer = __esm({
2243
+ "src/mcp/createWodMcpServer.ts"() {
2244
+ init_version();
2245
+ }
2246
+ });
2247
+ function withMcpCors(response) {
2248
+ const headers = new Headers(response.headers);
2249
+ for (const [k, v] of Object.entries(MCP_CORS_HEADERS)) {
2250
+ if (!headers.has(k)) {
2251
+ headers.set(k, v);
2252
+ }
2253
+ }
2254
+ return new Response(response.body, {
2255
+ status: response.status,
2256
+ statusText: response.statusText,
2257
+ headers
2258
+ });
2259
+ }
2260
+ function normalizeAcceptForPost(request) {
2261
+ if (request.method !== "POST") return request;
2262
+ const accept = request.headers.get("accept") ?? "";
2263
+ if (accept.includes("application/json") && accept.includes("text/event-stream")) {
2264
+ return request;
2265
+ }
2266
+ const headers = new Headers(request.headers);
2267
+ headers.set("accept", "application/json, text/event-stream");
2268
+ return new Request(request, { headers });
2269
+ }
2270
+ async function handleMcpHttpRequest(request, options) {
2271
+ if (request.method === "OPTIONS") {
2272
+ return new Response(null, { status: 204, headers: MCP_CORS_HEADERS });
2273
+ }
2274
+ const expectedToken = options.authToken ?? process.env.WOD_MCP_TOKEN?.trim();
2275
+ if (expectedToken) {
2276
+ const authHeader = request.headers.get("authorization") ?? "";
2277
+ const bearer = authHeader.startsWith("Bearer ") ? authHeader.slice("Bearer ".length).trim() : "";
2278
+ if (bearer !== expectedToken) {
2279
+ return withMcpCors(
2280
+ new Response(
2281
+ JSON.stringify({
2282
+ jsonrpc: "2.0",
2283
+ error: { code: -32001, message: "Unauthorized: missing or invalid Bearer token" },
2284
+ id: null
2285
+ }),
2286
+ { status: 401, headers: { "content-type": "application/json" } }
2287
+ )
2288
+ );
2289
+ }
2290
+ }
2291
+ const storage = new sql.SqlStorage(options.db);
2292
+ const server = createWodMcpServer({
2293
+ storage,
2294
+ feedTree: options.feedTree,
2295
+ baseUrl: options.baseUrl,
2296
+ readonly: options.readonly ?? process.env.WOD_MCP_READONLY === "1"
2297
+ });
2298
+ const transport = new webStandardStreamableHttp_js.WebStandardStreamableHTTPServerTransport({
2299
+ sessionIdGenerator: void 0,
2300
+ enableJsonResponse: true
2301
+ });
2302
+ await server.connect(transport);
2303
+ try {
2304
+ const normalizedReq = normalizeAcceptForPost(request);
2305
+ const response = await transport.handleRequest(normalizedReq);
2306
+ return withMcpCors(response);
2307
+ } finally {
2308
+ await transport.close().catch(() => {
2309
+ });
2310
+ await server.close().catch(() => {
2311
+ });
2312
+ }
2313
+ }
2314
+ var MCP_CORS_HEADERS;
2315
+ var init_httpHandler = __esm({
2316
+ "src/mcp/httpHandler.ts"() {
2317
+ init_createWodMcpServer();
2318
+ MCP_CORS_HEADERS = {
2319
+ "access-control-allow-origin": "*",
2320
+ "access-control-allow-methods": "GET, POST, DELETE, OPTIONS",
2321
+ "access-control-allow-headers": "Content-Type, Accept, Authorization, Mcp-Session-Id, MCP-Protocol-Version, Last-Event-ID",
2322
+ "access-control-expose-headers": "Mcp-Session-Id, MCP-Protocol-Version"
2323
+ };
2324
+ }
2325
+ });
1522
2326
  function streamFile(path) {
1523
2327
  const bun = globalThis.Bun;
1524
2328
  if (bun?.file) return bun.file(path);
@@ -1750,10 +2554,19 @@ async function servePublishedFeed(feedTree, method, relPath) {
1750
2554
  throw err;
1751
2555
  }
1752
2556
  }
1753
- async function apiRoutes(db, feedTree, req, method, sub, url) {
2557
+ async function apiRoutes(db, feedTree, req, method, sub, url, mcpOptions) {
1754
2558
  if (sub === "/health") {
1755
2559
  return json({ ok: true, driver: db.dialect }, 200);
1756
2560
  }
2561
+ if (sub === "/mcp") {
2562
+ return handleMcpHttpRequest(req, {
2563
+ db,
2564
+ feedTree,
2565
+ baseUrl: url.origin,
2566
+ readonly: mcpOptions?.readonly,
2567
+ authToken: mcpOptions?.authToken
2568
+ });
2569
+ }
1757
2570
  if (sub === "/v1/feed/status" && method === "GET") {
1758
2571
  const storage = new sql.SqlStorage(db);
1759
2572
  const status = await wod_wiki_engine_star.checkUnpublishedFeedChanges(storage, feedTree);
@@ -1817,7 +2630,20 @@ function createHandler(db, options) {
1817
2630
  const method = request.method === "HEAD" ? "GET" : request.method;
1818
2631
  const path = url.pathname;
1819
2632
  if (path === "/api" || path.startsWith("/api/")) {
1820
- return db ? await apiRoutes(db, feedTree, request, method, path.slice("/api".length) || "/", url) : notFound();
2633
+ return db ? await apiRoutes(
2634
+ db,
2635
+ feedTree,
2636
+ request,
2637
+ request.method === "OPTIONS" ? "OPTIONS" : method,
2638
+ path.slice("/api".length) || "/",
2639
+ url,
2640
+ { readonly: options.mcpReadonly, authToken: options.mcpToken }
2641
+ ) : notFound();
2642
+ }
2643
+ if (db && path === "/.well-known/agent-capabilities.json" && method === "GET") {
2644
+ const res = await staticResponse(distRoot, method, path);
2645
+ if (res.status === 200) return res;
2646
+ return json(agent.exportAgentCapabilitiesManifest(), 200);
1821
2647
  }
1822
2648
  if (db) {
1823
2649
  const feedAsset = isPublishedFeedAssetPath(path);
@@ -1844,6 +2670,7 @@ var init_app = __esm({
1844
2670
  "src/server/app.ts"() {
1845
2671
  init_errors();
1846
2672
  init_nodeFeedTree();
2673
+ init_httpHandler();
1847
2674
  json = (value, status) => new Response(JSON.stringify(value), { status, headers: { "content-type": "application/json" } });
1848
2675
  plain = (body, status) => new Response(body, { status, headers: { "content-type": "text/plain; charset=utf-8" } });
1849
2676
  notFound = () => json({ error: "not found" }, 404);
@@ -2005,7 +2832,12 @@ async function runCliServer(mode, options, writeOut) {
2005
2832
  try {
2006
2833
  const dist = resolveDist(mode, options);
2007
2834
  const feedDir = mode === "server" && options.database?.kind === "sqlite" ? `${options.database.path}.feed` : void 0;
2008
- const handler = createHandler(db?.db ?? null, { playgroundDist: dist, feedDir });
2835
+ const handler = createHandler(db?.db ?? null, {
2836
+ playgroundDist: dist,
2837
+ feedDir,
2838
+ mcpReadonly: options.mcpReadonly === true || options.env.WOD_MCP_READONLY === "1",
2839
+ mcpToken: options.env.WOD_MCP_TOKEN?.trim()
2840
+ });
2009
2841
  server = await startHttpServer(handler, host, port);
2010
2842
  if (mode === "server") {
2011
2843
  writeOut(`wod server: http://${host}:${port} \u2014 ${dbLabel} \xB7 dist ${dist}`);
@@ -2042,6 +2874,76 @@ var init_server = __esm({
2042
2874
  init_app();
2043
2875
  }
2044
2876
  });
2877
+
2878
+ // src/cli/mcp.ts
2879
+ var mcp_exports = {};
2880
+ __export(mcp_exports, {
2881
+ runMcpStdio: () => runMcpStdio
2882
+ });
2883
+ async function runMcpStdio(options) {
2884
+ const logErr = options.writeErr ?? ((msg) => process.stderr.write(`${msg}
2885
+ `));
2886
+ let dbHandle;
2887
+ let storage;
2888
+ let feedTree;
2889
+ let baseUrl = "";
2890
+ if (options.serverUrl) {
2891
+ const trimmed = options.serverUrl.replace(/\/+$/, "");
2892
+ const apiBase = trimmed.endsWith("/api") ? trimmed : `${trimmed}/api`;
2893
+ storage = new wodWikiStorage.ApiStorage(apiBase);
2894
+ feedTree = new wod_wiki_engine_star.MemoryFeedTree();
2895
+ baseUrl = trimmed.endsWith("/api") ? trimmed.slice(0, -4) : trimmed;
2896
+ } else {
2897
+ if (!options.database) {
2898
+ logErr("[wod mcp] Error: Missing database configuration");
2899
+ return 1;
2900
+ }
2901
+ dbHandle = await openCliDb(options.database);
2902
+ storage = dbHandle.storage;
2903
+ feedTree = options.database.kind === "sqlite" ? new NodeFsFeedTree(`${options.database.path}.feed`) : new wod_wiki_engine_star.MemoryFeedTree();
2904
+ }
2905
+ const server = createWodMcpServer({
2906
+ storage,
2907
+ feedTree,
2908
+ baseUrl,
2909
+ readonly: options.readonly
2910
+ });
2911
+ const transport = new stdio_js.StdioServerTransport();
2912
+ await server.connect(transport);
2913
+ return new Promise((resolve4) => {
2914
+ let closed = false;
2915
+ const finish = async (code) => {
2916
+ if (closed) return;
2917
+ closed = true;
2918
+ await server.close().catch(() => {
2919
+ });
2920
+ if (dbHandle) {
2921
+ await dbHandle.close().catch(() => {
2922
+ });
2923
+ }
2924
+ resolve4(code);
2925
+ };
2926
+ transport.onclose = () => {
2927
+ void finish(0);
2928
+ };
2929
+ transport.onerror = (err) => {
2930
+ logErr(`[wod mcp] Transport error: ${err.message}`);
2931
+ };
2932
+ process.once("SIGINT", () => {
2933
+ void finish(0);
2934
+ });
2935
+ process.once("SIGTERM", () => {
2936
+ void finish(0);
2937
+ });
2938
+ });
2939
+ }
2940
+ var init_mcp = __esm({
2941
+ "src/cli/mcp.ts"() {
2942
+ init_db();
2943
+ init_nodeFeedTree();
2944
+ init_createWodMcpServer();
2945
+ }
2946
+ });
2045
2947
  function getPathUtils() {
2046
2948
  if (typeof globalThis.process?.versions?.node === "undefined" && !("Bun" in globalThis)) {
2047
2949
  throw new Error("Path resolution is only supported in Node / Bun environments");
@@ -4072,7 +4974,23 @@ var VALUE_FLAGS = [
4072
4974
  ["--env-file", "envFile"],
4073
4975
  ["--host", "host"],
4074
4976
  ["--port", "port"],
4075
- ["--dist", "dist"]
4977
+ ["--dist", "dist"],
4978
+ ["--server", "serverUrl"],
4979
+ ["--note", "noteId"],
4980
+ ["--source-note", "sourceNoteId"],
4981
+ ["--block", "blockId"],
4982
+ ["--notebook", "notebook"],
4983
+ ["--date", "date"],
4984
+ ["--title", "title"],
4985
+ ["--description", "description"],
4986
+ ["--markdown", "markdown"],
4987
+ ["--search", "search"],
4988
+ ["--tag", "tag"],
4989
+ ["--slug", "slug"],
4990
+ ["--category", "category"],
4991
+ ["--type", "tagType"],
4992
+ ["--url", "url"],
4993
+ ["--feed-id", "feedId"]
4076
4994
  ];
4077
4995
  function readValueFlag(args, i, flag) {
4078
4996
  const inline = args[i].startsWith(`${flag}=`);
@@ -4089,7 +5007,10 @@ function parseCliArgs(args) {
4089
5007
  const result = {
4090
5008
  format: "json",
4091
5009
  packs: [],
4092
- sources: []
5010
+ sources: [],
5011
+ tags: [],
5012
+ aliases: [],
5013
+ setPairs: []
4093
5014
  };
4094
5015
  const valueArgs = result;
4095
5016
  let i = 0;
@@ -4197,8 +5118,50 @@ function parseCliArgs(args) {
4197
5118
  const v = Number(arg.slice("--seed-version=".length));
4198
5119
  if (Number.isSafeInteger(v) && v >= 0) result.seedVersion = v;
4199
5120
  i++;
5121
+ } else if (arg === "--json") {
5122
+ result.json = true;
5123
+ result.format = "json";
5124
+ i++;
5125
+ } else if (arg === "--no-save") {
5126
+ result.noSave = true;
5127
+ i++;
5128
+ } else if (arg === "--mcp-readonly" || arg === "--readonly") {
5129
+ result.mcpReadonly = true;
5130
+ i++;
5131
+ } else if (arg === "--validate-only") {
5132
+ result.validateOnly = true;
5133
+ i++;
5134
+ } else if (arg === "--limit") {
5135
+ const v = Number(args[++i]);
5136
+ if (Number.isSafeInteger(v) && v > 0) result.limit = v;
5137
+ i++;
5138
+ } else if (arg.startsWith("--limit=")) {
5139
+ const v = Number(arg.slice("--limit=".length));
5140
+ if (Number.isSafeInteger(v) && v > 0) result.limit = v;
5141
+ i++;
5142
+ } else if (arg === "--tags") {
5143
+ const raw = args[++i] ?? "";
5144
+ result.tags.push(...raw.split(",").map((t) => t.trim()).filter(Boolean));
5145
+ i++;
5146
+ } else if (arg.startsWith("--tags=")) {
5147
+ result.tags.push(...arg.slice("--tags=".length).split(",").map((t) => t.trim()).filter(Boolean));
5148
+ i++;
5149
+ } else if (arg === "--alias") {
5150
+ const raw = args[++i];
5151
+ if (raw) result.aliases.push(raw);
5152
+ i++;
5153
+ } else if (arg.startsWith("--alias=")) {
5154
+ result.aliases.push(arg.slice("--alias=".length));
5155
+ i++;
5156
+ } else if (arg === "--set") {
5157
+ const raw = args[++i];
5158
+ if (raw) result.setPairs.push(raw);
5159
+ i++;
5160
+ } else if (arg.startsWith("--set=")) {
5161
+ result.setPairs.push(arg.slice("--set=".length));
5162
+ i++;
4200
5163
  } else if (!result.subcommand) {
4201
- if (arg === "parse" || arg === "run" || arg === "query" || arg === "download" || arg === "export" || arg === "import" || arg === "publish" || arg === "build" || arg === "seed" || arg === "reset" || arg === "init" || arg === "db" || arg === "server" || arg === "serve" || arg === "playground" || arg === "init-feed" || arg === "skills" || arg === "help" || arg === "version") {
5164
+ if (arg === "parse" || arg === "run" || arg === "query" || arg === "download" || arg === "export" || arg === "import" || arg === "publish" || arg === "build" || arg === "seed" || arg === "reset" || arg === "init" || arg === "db" || arg === "server" || arg === "serve" || arg === "playground" || arg === "init-feed" || arg === "skills" || arg === "note" || arg === "journal" || arg === "notebook" || arg === "session" || arg === "catalog" || arg === "tag" || arg === "feed" || arg === "mcp" || arg === "tools" || arg === "doctor" || arg === "help" || arg === "version") {
4202
5165
  result.subcommand = arg;
4203
5166
  } else {
4204
5167
  result.target = arg;
@@ -4210,6 +5173,9 @@ function parseCliArgs(args) {
4210
5173
  } else if (!result.target2) {
4211
5174
  result.target2 = arg;
4212
5175
  i++;
5176
+ } else if (!result.target3) {
5177
+ result.target3 = arg;
5178
+ i++;
4213
5179
  } else {
4214
5180
  i++;
4215
5181
  }
@@ -4320,9 +5286,22 @@ DB OPTIONS (for 'wod db'):
4320
5286
  actions; credentials are never printed to stdout
4321
5287
 
4322
5288
  wod server [options]
4323
- Serve the app (HTTP API + packaged frontend; alias: serve)
5289
+ Serve the app (HTTP API + /api/mcp + packaged frontend; alias: serve)
4324
5290
  wod playground [options]
4325
- Serve the local playground (browser IndexedDB build)
5291
+ Serve the local playground (browser IndexedDB build + WebMCP)
5292
+ wod mcp [--readonly] [--server <url>]
5293
+ Start the official MCP server over stdio for Claude/Cursor/Codex
5294
+
5295
+ AGENT NOUN-VERB COMMANDS (all support --json and --server <url>):
5296
+ wod note <list|get|create|update|clone|delete> [args]
5297
+ wod journal <day|add> [date] [options]
5298
+ wod notebook <list|save|delete> [slug] [options]
5299
+ wod session <list|get|run|delete> [id] [options]
5300
+ wod catalog <lookup|get|upsert> [effort|equipment|tag|tag-type] [name]
5301
+ wod tag <list|upsert> [label] [--type <tagType>]
5302
+ wod feed <list|status|subscribe|sync|unsubscribe|publish> [options]
5303
+ wod tools <list|manifest> [--json]
5304
+ wod doctor [--json]
4326
5305
 
4327
5306
  SUBCOMMANDS:
4328
5307
  parse <file | -> Parse Whiteboard Script, create a note in the database
@@ -4453,6 +5432,7 @@ EXIT CODES:
4453
5432
  1 - General / Runtime error
4454
5433
  2 - Parse / Syntax error
4455
5434
  3 - Language Pack load error
5435
+ 4 - Destructive confirmation required (pass --yes <targetId>)
4456
5436
  `;
4457
5437
  }
4458
5438
  function printUsage(writer) {
@@ -4586,22 +5566,32 @@ async function cliMain(argv = process.argv.slice(2), io = {}) {
4586
5566
  }
4587
5567
  const noteSource = cliNoteSource(source, parsed.target, parsed.sport);
4588
5568
  const ir = runParse(source, { sport: parsed.sport, sourceLabel: `cli:wod parse ${parsed.target}` });
4589
- const identity = wod_wiki_engine_star.extractNoteIdentity(source);
4590
- const tags = wod_wiki_engine_star.extractTypedTags(source);
4591
- const db = await openCliDb(cliDb());
4592
- try {
4593
- const persisted = await persistNote(db, {
4594
- source: noteSource,
4595
- sourceLabel: parsed.target,
4596
- noteId: identity?.noteId,
4597
- title: identity?.title,
4598
- tags
4599
- });
4600
- writeOut(
4601
- `[wod parse] note ${persisted.noteId}${persisted.created ? "" : " (updated)"} \u2014 ${persisted.blocks} blocks, ${persisted.efforts} efforts${persisted.tags > 0 ? `, ${persisted.tags} tags` : ""} \u2192 ${db.path}`
4602
- );
4603
- } finally {
4604
- await db.close();
5569
+ if (!parsed.noSave) {
5570
+ const identity = wod_wiki_engine_star.extractNoteIdentity(source);
5571
+ const tags = wod_wiki_engine_star.extractTypedTags(source);
5572
+ const db = await openCliDb(cliDb());
5573
+ try {
5574
+ const persisted = await persistNote(db, {
5575
+ source: noteSource,
5576
+ sourceLabel: parsed.target,
5577
+ noteId: identity?.noteId,
5578
+ title: identity?.title,
5579
+ tags
5580
+ });
5581
+ if (!parsed.json) {
5582
+ writeOut(
5583
+ `[wod parse] note ${persisted.noteId}${persisted.created ? "" : " (updated)"} \u2014 ${persisted.blocks} blocks, ${persisted.efforts} efforts${persisted.tags > 0 ? `, ${persisted.tags} tags` : ""} \u2192 ${db.path}`
5584
+ );
5585
+ } else if (!parsed.output) {
5586
+ deliverOutput(JSON.stringify({ ok: true, persisted, ir }, null, 2));
5587
+ }
5588
+ } finally {
5589
+ await db.close();
5590
+ }
5591
+ } else if (parsed.json && !parsed.output) {
5592
+ deliverOutput(formatParseOutput(ir, "json", true));
5593
+ } else if (!parsed.output) {
5594
+ writeOut(`[wod parse] valid Whiteboard Script (--no-save)`);
4605
5595
  }
4606
5596
  if (parsed.output) {
4607
5597
  const pretty = Boolean(process.stdout.isTTY);
@@ -4611,8 +5601,18 @@ async function cliMain(argv = process.argv.slice(2), io = {}) {
4611
5601
  return 0;
4612
5602
  }
4613
5603
  if (parsed.subcommand === "run") {
5604
+ if (parsed.noteId && !parsed.target) {
5605
+ const { runAgentNounVerbCommand: runAgentNounVerbCommand2 } = await Promise.resolve().then(() => (init_agentCommands(), agentCommands_exports));
5606
+ return runAgentNounVerbCommand2({
5607
+ parsed: { ...parsed, subcommand: "session", target: "run", target2: parsed.noteId },
5608
+ resolveDbConfig: cliDb,
5609
+ readStdin: getStdin,
5610
+ writeOut,
5611
+ writeErr
5612
+ });
5613
+ }
4614
5614
  if (!parsed.target) {
4615
- writeErr('[wod run] Error: Missing input file or "-" for stdin');
5615
+ writeErr('[wod run] Error: Missing input file, "-" for stdin, or --note <noteId>');
4616
5616
  return 1;
4617
5617
  }
4618
5618
  let source;
@@ -4668,6 +5668,18 @@ async function cliMain(argv = process.argv.slice(2), io = {}) {
4668
5668
  writeErr("[wod query] Error: Missing WQL query argument");
4669
5669
  return 1;
4670
5670
  }
5671
+ if (parsed.validateOnly) {
5672
+ const { wodValidateWqlTool } = await import('@bitcobblers/wod-wiki-engine/agent');
5673
+ const validation = await wodValidateWqlTool.execute({ query: parsed.target }, {
5674
+ storage: void 0
5675
+ });
5676
+ if (parsed.json || parsed.format === "json") {
5677
+ deliverOutput(JSON.stringify(validation, null, 2));
5678
+ } else {
5679
+ writeOut(validation.valid ? `[wod query] valid (${validation.family ?? "wql"})` : `[wod query] invalid: ${validation.error}`);
5680
+ }
5681
+ return validation.valid ? 0 : 2;
5682
+ }
4671
5683
  const useDb = !parsed.corpus && !parsed.stdinLog && !parsed.stdinFacts;
4672
5684
  let stdinLogContent;
4673
5685
  let stdinFactsContent;
@@ -4995,10 +6007,20 @@ async function cliMain(argv = process.argv.slice(2), io = {}) {
4995
6007
  );
4996
6008
  return 1;
4997
6009
  }
6010
+ if (parsed.yes !== void 0 && parsed.yes !== "RESET") {
6011
+ writeErr("[wod reset] Invalid --yes value (expected: --yes RESET)");
6012
+ return 4;
6013
+ }
4998
6014
  const target = config.path;
4999
6015
  if (nodeFs().existsSync(target)) {
5000
6016
  nodeFs().unlinkSync(target);
5001
- writeOut(`[wod reset] removed ${target}`);
6017
+ if (parsed.json) {
6018
+ writeOut(JSON.stringify({ ok: true, removed: true, path: target }, null, 2));
6019
+ } else {
6020
+ writeOut(`[wod reset] removed ${target}`);
6021
+ }
6022
+ } else if (parsed.json) {
6023
+ writeOut(JSON.stringify({ ok: true, removed: false, path: target }, null, 2));
5002
6024
  } else {
5003
6025
  writeOut(`[wod reset] nothing to reset \u2014 ${target} does not exist`);
5004
6026
  }
@@ -5043,9 +6065,29 @@ async function cliMain(argv = process.argv.slice(2), io = {}) {
5043
6065
  if (parsed.host !== void 0) options.host = parsed.host;
5044
6066
  if (parsed.port !== void 0) options.port = parsed.port;
5045
6067
  if (parsed.dist !== void 0) options.dist = parsed.dist;
6068
+ if (parsed.mcpReadonly === true) options.mcpReadonly = true;
5046
6069
  await runCliServer2(mode, options, writeOut);
5047
6070
  return 0;
5048
6071
  }
6072
+ if (parsed.subcommand === "mcp") {
6073
+ const { runMcpStdio: runMcpStdio2 } = await Promise.resolve().then(() => (init_mcp(), mcp_exports));
6074
+ return runMcpStdio2({
6075
+ database: parsed.serverUrl ? void 0 : cliDb(),
6076
+ serverUrl: parsed.serverUrl,
6077
+ readonly: parsed.mcpReadonly === true || cliEnv().WOD_MCP_READONLY === "1",
6078
+ writeErr
6079
+ });
6080
+ }
6081
+ if (parsed.subcommand === "note" || parsed.subcommand === "journal" || parsed.subcommand === "notebook" || parsed.subcommand === "session" || parsed.subcommand === "catalog" || parsed.subcommand === "tag" || parsed.subcommand === "feed" || parsed.subcommand === "tools" || parsed.subcommand === "doctor") {
6082
+ const { runAgentNounVerbCommand: runAgentNounVerbCommand2 } = await Promise.resolve().then(() => (init_agentCommands(), agentCommands_exports));
6083
+ return runAgentNounVerbCommand2({
6084
+ parsed,
6085
+ resolveDbConfig: cliDb,
6086
+ readStdin: getStdin,
6087
+ writeOut,
6088
+ writeErr
6089
+ });
6090
+ }
5049
6091
  writeErr(`[wod] Unknown subcommand "${parsed.subcommand}"`);
5050
6092
  return 1;
5051
6093
  } catch (error) {