@overcrow/mcp 0.0.0 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (461) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +91 -1
  3. package/dist/audit/index.js +103 -0
  4. package/dist/audit/lexer.js +417 -0
  5. package/dist/audit/project.js +200 -0
  6. package/dist/audit/rules.js +661 -0
  7. package/dist/bootstrap/download.js +229 -0
  8. package/dist/bootstrap/install.js +280 -0
  9. package/dist/bootstrap/pin.js +85 -0
  10. package/dist/bootstrap/pin.json +119 -0
  11. package/dist/bootstrap/zip.js +258 -0
  12. package/dist/cli.js +200 -0
  13. package/dist/confine.js +244 -0
  14. package/dist/content/docs/en/cli.md +353 -0
  15. package/dist/content/docs/en/dev-channel.md +130 -0
  16. package/dist/content/docs/en/elements.md +469 -0
  17. package/dist/content/docs/en/forms.md +328 -0
  18. package/dist/content/docs/en/guide.md +253 -0
  19. package/dist/content/docs/en/index.md +85 -0
  20. package/dist/content/docs/en/limits.md +241 -0
  21. package/dist/content/docs/en/logic.md +446 -0
  22. package/dist/content/docs/en/manifest.md +381 -0
  23. package/dist/content/docs/en/mcp.md +165 -0
  24. package/dist/content/docs/en/package.md +131 -0
  25. package/dist/content/docs/en/publishing.md +162 -0
  26. package/dist/content/docs/en/reference.md +55 -0
  27. package/dist/content/docs/en/result-shapes.md +332 -0
  28. package/dist/content/docs/en/sdk.md +295 -0
  29. package/dist/content/docs/en/security.md +115 -0
  30. package/dist/content/docs/en/service-reference.md +344 -0
  31. package/dist/content/docs/en/services.md +517 -0
  32. package/dist/content/docs/en/style-properties.md +270 -0
  33. package/dist/content/docs/en/style.md +266 -0
  34. package/dist/content/docs/en/testing.md +400 -0
  35. package/dist/content/docs/en/view.md +338 -0
  36. package/dist/content/docs/en/widgets.md +76 -0
  37. package/dist/content/docs/fr/cli.md +367 -0
  38. package/dist/content/docs/fr/dev-channel.md +140 -0
  39. package/dist/content/docs/fr/elements.md +475 -0
  40. package/dist/content/docs/fr/forms.md +341 -0
  41. package/dist/content/docs/fr/guide.md +264 -0
  42. package/dist/content/docs/fr/index.md +90 -0
  43. package/dist/content/docs/fr/limits.md +244 -0
  44. package/dist/content/docs/fr/logic.md +461 -0
  45. package/dist/content/docs/fr/manifest.md +392 -0
  46. package/dist/content/docs/fr/mcp.md +173 -0
  47. package/dist/content/docs/fr/package.md +139 -0
  48. package/dist/content/docs/fr/publishing.md +172 -0
  49. package/dist/content/docs/fr/reference.md +59 -0
  50. package/dist/content/docs/fr/result-shapes.md +333 -0
  51. package/dist/content/docs/fr/sdk.md +301 -0
  52. package/dist/content/docs/fr/security.md +129 -0
  53. package/dist/content/docs/fr/service-reference.md +346 -0
  54. package/dist/content/docs/fr/services.md +540 -0
  55. package/dist/content/docs/fr/style-properties.md +272 -0
  56. package/dist/content/docs/fr/style.md +281 -0
  57. package/dist/content/docs/fr/testing.md +417 -0
  58. package/dist/content/docs/fr/view.md +352 -0
  59. package/dist/content/docs/fr/widgets.md +81 -0
  60. package/dist/content/examples/clock/LICENSE +21 -0
  61. package/dist/content/examples/clock/README.md +75 -0
  62. package/dist/content/examples/clock/listing.json +19 -0
  63. package/dist/content/examples/clock/locales/en.json +4 -0
  64. package/dist/content/examples/clock/locales/fr.json +4 -0
  65. package/dist/content/examples/clock/logic.ts +85 -0
  66. package/dist/content/examples/clock/manifest.json +44 -0
  67. package/dist/content/examples/clock/package.json +16 -0
  68. package/dist/content/examples/clock/style.ocss +26 -0
  69. package/dist/content/examples/clock/tests/hidden.scenario.json +68 -0
  70. package/dist/content/examples/clock/tests/load-logic.mjs +22 -0
  71. package/dist/content/examples/clock/tests/logic.test.mjs +89 -0
  72. package/dist/content/examples/clock/tests/options.scenario.json +108 -0
  73. package/dist/content/examples/clock/tests/preview.scenario.json +25 -0
  74. package/dist/content/examples/clock/tests/render.scenario.json +94 -0
  75. package/dist/content/examples/clock/tests/summer-time.scenario.json +74 -0
  76. package/dist/content/examples/clock/tests/ticks.scenario.json +120 -0
  77. package/dist/content/examples/clock/tsconfig.json +16 -0
  78. package/dist/content/examples/clock/view.ocml +8 -0
  79. package/dist/content/examples/countdown/LICENSE +20 -0
  80. package/dist/content/examples/countdown/listing.json +10 -0
  81. package/dist/content/examples/countdown/locales/en.json +15 -0
  82. package/dist/content/examples/countdown/locales/fr.json +15 -0
  83. package/dist/content/examples/countdown/logic.ts +179 -0
  84. package/dist/content/examples/countdown/manifest.json +34 -0
  85. package/dist/content/examples/countdown/package.json +15 -0
  86. package/dist/content/examples/countdown/style.ocss +94 -0
  87. package/dist/content/examples/countdown/tsconfig.json +16 -0
  88. package/dist/content/examples/countdown/view.ocml +42 -0
  89. package/dist/content/examples/fps/LICENSE +21 -0
  90. package/dist/content/examples/fps/README.md +64 -0
  91. package/dist/content/examples/fps/listing.json +19 -0
  92. package/dist/content/examples/fps/locales/en.json +11 -0
  93. package/dist/content/examples/fps/locales/fr.json +11 -0
  94. package/dist/content/examples/fps/logic.ts +64 -0
  95. package/dist/content/examples/fps/manifest.json +30 -0
  96. package/dist/content/examples/fps/package.json +16 -0
  97. package/dist/content/examples/fps/style.ocss +31 -0
  98. package/dist/content/examples/fps/tests/label.scenario.json +63 -0
  99. package/dist/content/examples/fps/tests/load-logic.mjs +22 -0
  100. package/dist/content/examples/fps/tests/logic.test.mjs +60 -0
  101. package/dist/content/examples/fps/tests/preview.scenario.json +29 -0
  102. package/dist/content/examples/fps/tests/refused.scenario.json +20 -0
  103. package/dist/content/examples/fps/tests/render.scenario.json +96 -0
  104. package/dist/content/examples/fps/tests/stale.scenario.json +91 -0
  105. package/dist/content/examples/fps/tests/unavailable.scenario.json +111 -0
  106. package/dist/content/examples/fps/tsconfig.json +16 -0
  107. package/dist/content/examples/fps/view.ocml +11 -0
  108. package/dist/content/examples/media/LICENSE +21 -0
  109. package/dist/content/examples/media/README.md +147 -0
  110. package/dist/content/examples/media/listing.json +19 -0
  111. package/dist/content/examples/media/locales/en.json +11 -0
  112. package/dist/content/examples/media/locales/fr.json +11 -0
  113. package/dist/content/examples/media/logic.ts +191 -0
  114. package/dist/content/examples/media/manifest.json +35 -0
  115. package/dist/content/examples/media/package.json +16 -0
  116. package/dist/content/examples/media/style.ocss +148 -0
  117. package/dist/content/examples/media/tests/covers.scenario.json +144 -0
  118. package/dist/content/examples/media/tests/gesture.scenario.json +173 -0
  119. package/dist/content/examples/media/tests/load-logic.mjs +22 -0
  120. package/dist/content/examples/media/tests/logic.test.mjs +176 -0
  121. package/dist/content/examples/media/tests/marquee.scenario.json +127 -0
  122. package/dist/content/examples/media/tests/preview.scenario.json +52 -0
  123. package/dist/content/examples/media/tests/read-only.scenario.json +53 -0
  124. package/dist/content/examples/media/tests/refused.scenario.json +22 -0
  125. package/dist/content/examples/media/tests/refused.test.mjs +31 -0
  126. package/dist/content/examples/media/tests/render.scenario.json +136 -0
  127. package/dist/content/examples/media/tests/states.scenario.json +257 -0
  128. package/dist/content/examples/media/tests/unavailable.scenario.json +120 -0
  129. package/dist/content/examples/media/tsconfig.json +16 -0
  130. package/dist/content/examples/media/view.ocml +41 -0
  131. package/dist/content/examples/notes/LICENSE +21 -0
  132. package/dist/content/examples/notes/README.md +219 -0
  133. package/dist/content/examples/notes/listing.json +19 -0
  134. package/dist/content/examples/notes/locales/en.json +25 -0
  135. package/dist/content/examples/notes/locales/fr.json +25 -0
  136. package/dist/content/examples/notes/logic.ts +799 -0
  137. package/dist/content/examples/notes/manifest.json +40 -0
  138. package/dist/content/examples/notes/package.json +16 -0
  139. package/dist/content/examples/notes/style.ocss +469 -0
  140. package/dist/content/examples/notes/tests/checks.scenario.json +237 -0
  141. package/dist/content/examples/notes/tests/create.scenario.json +260 -0
  142. package/dist/content/examples/notes/tests/delete.scenario.json +342 -0
  143. package/dist/content/examples/notes/tests/drafts.scenario.json +714 -0
  144. package/dist/content/examples/notes/tests/editor.scenario.json +232 -0
  145. package/dist/content/examples/notes/tests/frame.scenario.json +93 -0
  146. package/dist/content/examples/notes/tests/interactive.scenario.json +344 -0
  147. package/dist/content/examples/notes/tests/limits.scenario.json +1351 -0
  148. package/dist/content/examples/notes/tests/load-logic.mjs +22 -0
  149. package/dist/content/examples/notes/tests/logic.test.mjs +514 -0
  150. package/dist/content/examples/notes/tests/preview.scenario.json +99 -0
  151. package/dist/content/examples/notes/tests/read-only.scenario.json +105 -0
  152. package/dist/content/examples/notes/tests/refused.scenario.json +33 -0
  153. package/dist/content/examples/notes/tests/save.scenario.json +378 -0
  154. package/dist/content/examples/notes/tests/states.scenario.json +640 -0
  155. package/dist/content/examples/notes/tests/typing.scenario.json +562 -0
  156. package/dist/content/examples/notes/tests/unavailable.scenario.json +246 -0
  157. package/dist/content/examples/notes/tsconfig.json +16 -0
  158. package/dist/content/examples/notes/view.ocml +154 -0
  159. package/dist/content/examples/performance/LICENSE +21 -0
  160. package/dist/content/examples/performance/README.md +134 -0
  161. package/dist/content/examples/performance/listing.json +19 -0
  162. package/dist/content/examples/performance/locales/en.json +20 -0
  163. package/dist/content/examples/performance/locales/fr.json +20 -0
  164. package/dist/content/examples/performance/logic.ts +210 -0
  165. package/dist/content/examples/performance/manifest.json +83 -0
  166. package/dist/content/examples/performance/package.json +16 -0
  167. package/dist/content/examples/performance/style.ocss +75 -0
  168. package/dist/content/examples/performance/tests/fahrenheit.scenario.json +110 -0
  169. package/dist/content/examples/performance/tests/horizontal.scenario.json +96 -0
  170. package/dist/content/examples/performance/tests/load-logic.mjs +22 -0
  171. package/dist/content/examples/performance/tests/logic.test.mjs +226 -0
  172. package/dist/content/examples/performance/tests/menu.scenario.json +170 -0
  173. package/dist/content/examples/performance/tests/no-fps-source.scenario.json +47 -0
  174. package/dist/content/examples/performance/tests/preview.scenario.json +45 -0
  175. package/dist/content/examples/performance/tests/refused.scenario.json +20 -0
  176. package/dist/content/examples/performance/tests/refused.test.mjs +19 -0
  177. package/dist/content/examples/performance/tests/region.scenario.json +89 -0
  178. package/dist/content/examples/performance/tests/render.scenario.json +112 -0
  179. package/dist/content/examples/performance/tests/sources.scenario.json +151 -0
  180. package/dist/content/examples/performance/tests/stale.scenario.json +111 -0
  181. package/dist/content/examples/performance/tests/telemetry-only.scenario.json +44 -0
  182. package/dist/content/examples/performance/tests/thresholds.scenario.json +147 -0
  183. package/dist/content/examples/performance/tests/waiting.scenario.json +105 -0
  184. package/dist/content/examples/performance/tsconfig.json +16 -0
  185. package/dist/content/examples/performance/view.ocml +18 -0
  186. package/dist/content/examples/playervox-journal/LICENSE +21 -0
  187. package/dist/content/examples/playervox-journal/README.md +150 -0
  188. package/dist/content/examples/playervox-journal/listing.json +19 -0
  189. package/dist/content/examples/playervox-journal/locales/en.json +25 -0
  190. package/dist/content/examples/playervox-journal/locales/fr.json +25 -0
  191. package/dist/content/examples/playervox-journal/logic.ts +556 -0
  192. package/dist/content/examples/playervox-journal/manifest.json +19 -0
  193. package/dist/content/examples/playervox-journal/package.json +16 -0
  194. package/dist/content/examples/playervox-journal/style.ocss +142 -0
  195. package/dist/content/examples/playervox-journal/tests/changes.scenario.json +482 -0
  196. package/dist/content/examples/playervox-journal/tests/delete.scenario.json +432 -0
  197. package/dist/content/examples/playervox-journal/tests/frame.scenario.json +169 -0
  198. package/dist/content/examples/playervox-journal/tests/load-logic.mjs +22 -0
  199. package/dist/content/examples/playervox-journal/tests/logic.test.mjs +349 -0
  200. package/dist/content/examples/playervox-journal/tests/paging.scenario.json +428 -0
  201. package/dist/content/examples/playervox-journal/tests/preview.scenario.json +184 -0
  202. package/dist/content/examples/playervox-journal/tests/read-only.scenario.json +157 -0
  203. package/dist/content/examples/playervox-journal/tests/refused.scenario.json +39 -0
  204. package/dist/content/examples/playervox-journal/tests/scale.scenario.json +286 -0
  205. package/dist/content/examples/playervox-journal/tests/signed-out.scenario.json +134 -0
  206. package/dist/content/examples/playervox-journal/tests/states.scenario.json +741 -0
  207. package/dist/content/examples/playervox-journal/tests/unavailable.scenario.json +183 -0
  208. package/dist/content/examples/playervox-journal/tsconfig.json +16 -0
  209. package/dist/content/examples/playervox-journal/view.ocml +52 -0
  210. package/dist/content/examples/playervox-rating/LICENSE +21 -0
  211. package/dist/content/examples/playervox-rating/README.md +166 -0
  212. package/dist/content/examples/playervox-rating/listing.json +19 -0
  213. package/dist/content/examples/playervox-rating/locales/en.json +35 -0
  214. package/dist/content/examples/playervox-rating/locales/fr.json +35 -0
  215. package/dist/content/examples/playervox-rating/logic.ts +581 -0
  216. package/dist/content/examples/playervox-rating/manifest.json +19 -0
  217. package/dist/content/examples/playervox-rating/package.json +16 -0
  218. package/dist/content/examples/playervox-rating/style.ocss +333 -0
  219. package/dist/content/examples/playervox-rating/tests/account.scenario.json +125 -0
  220. package/dist/content/examples/playervox-rating/tests/bounds.scenario.json +73 -0
  221. package/dist/content/examples/playervox-rating/tests/draft.scenario.json +199 -0
  222. package/dist/content/examples/playervox-rating/tests/form.scenario.json +142 -0
  223. package/dist/content/examples/playervox-rating/tests/load-logic.mjs +22 -0
  224. package/dist/content/examples/playervox-rating/tests/logic.test.mjs +346 -0
  225. package/dist/content/examples/playervox-rating/tests/offline.scenario.json +142 -0
  226. package/dist/content/examples/playervox-rating/tests/preview.scenario.json +44 -0
  227. package/dist/content/examples/playervox-rating/tests/publish-keyboard.scenario.json +221 -0
  228. package/dist/content/examples/playervox-rating/tests/publish-pointer.scenario.json +314 -0
  229. package/dist/content/examples/playervox-rating/tests/read-only.scenario.json +70 -0
  230. package/dist/content/examples/playervox-rating/tests/refused.scenario.json +45 -0
  231. package/dist/content/examples/playervox-rating/tests/states.scenario.json +362 -0
  232. package/dist/content/examples/playervox-rating/tsconfig.json +16 -0
  233. package/dist/content/examples/playervox-rating/view.ocml +62 -0
  234. package/dist/content/examples/playervox-reviews/LICENSE +21 -0
  235. package/dist/content/examples/playervox-reviews/README.md +194 -0
  236. package/dist/content/examples/playervox-reviews/listing.json +19 -0
  237. package/dist/content/examples/playervox-reviews/locales/en.json +32 -0
  238. package/dist/content/examples/playervox-reviews/locales/fr.json +32 -0
  239. package/dist/content/examples/playervox-reviews/logic.ts +822 -0
  240. package/dist/content/examples/playervox-reviews/manifest.json +30 -0
  241. package/dist/content/examples/playervox-reviews/package.json +16 -0
  242. package/dist/content/examples/playervox-reviews/style.ocss +260 -0
  243. package/dist/content/examples/playervox-reviews/tests/account.scenario.json +249 -0
  244. package/dist/content/examples/playervox-reviews/tests/bounds.scenario.json +336 -0
  245. package/dist/content/examples/playervox-reviews/tests/changes.scenario.json +515 -0
  246. package/dist/content/examples/playervox-reviews/tests/filter.scenario.json +400 -0
  247. package/dist/content/examples/playervox-reviews/tests/frame.scenario.json +185 -0
  248. package/dist/content/examples/playervox-reviews/tests/keyboard.scenario.json +188 -0
  249. package/dist/content/examples/playervox-reviews/tests/load-logic.mjs +22 -0
  250. package/dist/content/examples/playervox-reviews/tests/logic.test.mjs +559 -0
  251. package/dist/content/examples/playervox-reviews/tests/offline-start.scenario.json +152 -0
  252. package/dist/content/examples/playervox-reviews/tests/offline.scenario.json +311 -0
  253. package/dist/content/examples/playervox-reviews/tests/paging.scenario.json +497 -0
  254. package/dist/content/examples/playervox-reviews/tests/preview.scenario.json +286 -0
  255. package/dist/content/examples/playervox-reviews/tests/reading.scenario.json +591 -0
  256. package/dist/content/examples/playervox-reviews/tests/refused.scenario.json +54 -0
  257. package/dist/content/examples/playervox-reviews/tests/scale.scenario.json +303 -0
  258. package/dist/content/examples/playervox-reviews/tests/states.scenario.json +700 -0
  259. package/dist/content/examples/playervox-reviews/tests/unavailable.scenario.json +192 -0
  260. package/dist/content/examples/playervox-reviews/tsconfig.json +16 -0
  261. package/dist/content/examples/playervox-reviews/view.ocml +110 -0
  262. package/dist/content/examples/playervox-score/LICENSE +21 -0
  263. package/dist/content/examples/playervox-score/README.md +131 -0
  264. package/dist/content/examples/playervox-score/listing.json +19 -0
  265. package/dist/content/examples/playervox-score/locales/en.json +23 -0
  266. package/dist/content/examples/playervox-score/locales/fr.json +23 -0
  267. package/dist/content/examples/playervox-score/logic.ts +430 -0
  268. package/dist/content/examples/playervox-score/manifest.json +47 -0
  269. package/dist/content/examples/playervox-score/package.json +16 -0
  270. package/dist/content/examples/playervox-score/style.ocss +247 -0
  271. package/dist/content/examples/playervox-score/tests/grades.scenario.json +279 -0
  272. package/dist/content/examples/playervox-score/tests/load-logic.mjs +22 -0
  273. package/dist/content/examples/playervox-score/tests/logic.test.mjs +229 -0
  274. package/dist/content/examples/playervox-score/tests/options.scenario.json +302 -0
  275. package/dist/content/examples/playervox-score/tests/preview.scenario.json +68 -0
  276. package/dist/content/examples/playervox-score/tests/pulse.scenario.json +157 -0
  277. package/dist/content/examples/playervox-score/tests/refused.scenario.json +21 -0
  278. package/dist/content/examples/playervox-score/tests/signed-out.scenario.json +46 -0
  279. package/dist/content/examples/playervox-score/tests/states.scenario.json +450 -0
  280. package/dist/content/examples/playervox-score/tests/unavailable.scenario.json +84 -0
  281. package/dist/content/examples/playervox-score/tsconfig.json +16 -0
  282. package/dist/content/examples/playervox-score/view.ocml +51 -0
  283. package/dist/content/examples/session/LICENSE +21 -0
  284. package/dist/content/examples/session/README.md +57 -0
  285. package/dist/content/examples/session/listing.json +19 -0
  286. package/dist/content/examples/session/locales/en.json +3 -0
  287. package/dist/content/examples/session/locales/fr.json +3 -0
  288. package/dist/content/examples/session/logic.ts +26 -0
  289. package/dist/content/examples/session/manifest.json +19 -0
  290. package/dist/content/examples/session/package.json +16 -0
  291. package/dist/content/examples/session/style.ocss +16 -0
  292. package/dist/content/examples/session/tests/hidden.scenario.json +45 -0
  293. package/dist/content/examples/session/tests/load-logic.mjs +22 -0
  294. package/dist/content/examples/session/tests/logic.test.mjs +37 -0
  295. package/dist/content/examples/session/tests/preview.scenario.json +28 -0
  296. package/dist/content/examples/session/tests/refused.scenario.json +20 -0
  297. package/dist/content/examples/session/tests/refused.test.mjs +16 -0
  298. package/dist/content/examples/session/tests/render.scenario.json +95 -0
  299. package/dist/content/examples/session/tests/ticks.scenario.json +139 -0
  300. package/dist/content/examples/session/tests/unknown.scenario.json +37 -0
  301. package/dist/content/examples/session/tsconfig.json +16 -0
  302. package/dist/content/examples/session/view.ocml +11 -0
  303. package/dist/content/examples/stopwatch/LICENSE +21 -0
  304. package/dist/content/examples/stopwatch/README.md +99 -0
  305. package/dist/content/examples/stopwatch/listing.json +19 -0
  306. package/dist/content/examples/stopwatch/locales/en.json +8 -0
  307. package/dist/content/examples/stopwatch/locales/fr.json +8 -0
  308. package/dist/content/examples/stopwatch/logic.ts +93 -0
  309. package/dist/content/examples/stopwatch/manifest.json +19 -0
  310. package/dist/content/examples/stopwatch/package.json +16 -0
  311. package/dist/content/examples/stopwatch/style.ocss +54 -0
  312. package/dist/content/examples/stopwatch/tests/errors.scenario.json +121 -0
  313. package/dist/content/examples/stopwatch/tests/gesture.scenario.json +154 -0
  314. package/dist/content/examples/stopwatch/tests/hidden.scenario.json +57 -0
  315. package/dist/content/examples/stopwatch/tests/hundredths.scenario.json +173 -0
  316. package/dist/content/examples/stopwatch/tests/load-logic.mjs +22 -0
  317. package/dist/content/examples/stopwatch/tests/logic.test.mjs +99 -0
  318. package/dist/content/examples/stopwatch/tests/preview.scenario.json +36 -0
  319. package/dist/content/examples/stopwatch/tests/read-only.scenario.json +42 -0
  320. package/dist/content/examples/stopwatch/tests/read-only.test.mjs +18 -0
  321. package/dist/content/examples/stopwatch/tests/refused.scenario.json +22 -0
  322. package/dist/content/examples/stopwatch/tests/refused.test.mjs +18 -0
  323. package/dist/content/examples/stopwatch/tests/render.scenario.json +105 -0
  324. package/dist/content/examples/stopwatch/tests/states.scenario.json +246 -0
  325. package/dist/content/examples/stopwatch/tests/unknown.scenario.json +40 -0
  326. package/dist/content/examples/stopwatch/tsconfig.json +16 -0
  327. package/dist/content/examples/stopwatch/view.ocml +29 -0
  328. package/dist/content/examples/twitch-chat/LICENSE +21 -0
  329. package/dist/content/examples/twitch-chat/README.md +283 -0
  330. package/dist/content/examples/twitch-chat/listing.json +19 -0
  331. package/dist/content/examples/twitch-chat/locales/en.json +52 -0
  332. package/dist/content/examples/twitch-chat/locales/fr.json +52 -0
  333. package/dist/content/examples/twitch-chat/logic.ts +887 -0
  334. package/dist/content/examples/twitch-chat/manifest.json +33 -0
  335. package/dist/content/examples/twitch-chat/package.json +16 -0
  336. package/dist/content/examples/twitch-chat/style.ocss +544 -0
  337. package/dist/content/examples/twitch-chat/tests/account.scenario.json +325 -0
  338. package/dist/content/examples/twitch-chat/tests/burst.scenario.json +1866 -0
  339. package/dist/content/examples/twitch-chat/tests/channel-refused.scenario.json +372 -0
  340. package/dist/content/examples/twitch-chat/tests/channel.scenario.json +480 -0
  341. package/dist/content/examples/twitch-chat/tests/draft.scenario.json +279 -0
  342. package/dist/content/examples/twitch-chat/tests/fade.scenario.json +269 -0
  343. package/dist/content/examples/twitch-chat/tests/failures.scenario.json +420 -0
  344. package/dist/content/examples/twitch-chat/tests/favorites.scenario.json +376 -0
  345. package/dist/content/examples/twitch-chat/tests/frame.scenario.json +152 -0
  346. package/dist/content/examples/twitch-chat/tests/lifetime.scenario.json +186 -0
  347. package/dist/content/examples/twitch-chat/tests/load-logic.mjs +22 -0
  348. package/dist/content/examples/twitch-chat/tests/logic.test.mjs +1053 -0
  349. package/dist/content/examples/twitch-chat/tests/passive.scenario.json +536 -0
  350. package/dist/content/examples/twitch-chat/tests/preview.scenario.json +147 -0
  351. package/dist/content/examples/twitch-chat/tests/read-only.scenario.json +202 -0
  352. package/dist/content/examples/twitch-chat/tests/read-only.test.mjs +63 -0
  353. package/dist/content/examples/twitch-chat/tests/refused.scenario.json +65 -0
  354. package/dist/content/examples/twitch-chat/tests/refused.test.mjs +43 -0
  355. package/dist/content/examples/twitch-chat/tests/render.scenario.json +347 -0
  356. package/dist/content/examples/twitch-chat/tests/reply.scenario.json +384 -0
  357. package/dist/content/examples/twitch-chat/tests/send-refused.scenario.json +383 -0
  358. package/dist/content/examples/twitch-chat/tests/send.scenario.json +300 -0
  359. package/dist/content/examples/twitch-chat/tests/states.scenario.json +455 -0
  360. package/dist/content/examples/twitch-chat/tests/unavailable.scenario.json +256 -0
  361. package/dist/content/examples/twitch-chat/tests/unread.scenario.json +997 -0
  362. package/dist/content/examples/twitch-chat/tsconfig.json +16 -0
  363. package/dist/content/examples/twitch-chat/view.ocml +141 -0
  364. package/dist/content/examples/warframe-market/LICENSE +21 -0
  365. package/dist/content/examples/warframe-market/README.md +176 -0
  366. package/dist/content/examples/warframe-market/listing.json +19 -0
  367. package/dist/content/examples/warframe-market/locales/en.json +44 -0
  368. package/dist/content/examples/warframe-market/locales/fr.json +44 -0
  369. package/dist/content/examples/warframe-market/logic.ts +1265 -0
  370. package/dist/content/examples/warframe-market/manifest.json +92 -0
  371. package/dist/content/examples/warframe-market/package.json +16 -0
  372. package/dist/content/examples/warframe-market/style.ocss +422 -0
  373. package/dist/content/examples/warframe-market/tests/bounds.scenario.json +60 -0
  374. package/dist/content/examples/warframe-market/tests/cached.scenario.json +70 -0
  375. package/dist/content/examples/warframe-market/tests/detail.scenario.json +251 -0
  376. package/dist/content/examples/warframe-market/tests/errors.scenario.json +105 -0
  377. package/dist/content/examples/warframe-market/tests/fixtures.json +295 -0
  378. package/dist/content/examples/warframe-market/tests/load-logic.mjs +22 -0
  379. package/dist/content/examples/warframe-market/tests/logic.test.mjs +505 -0
  380. package/dist/content/examples/warframe-market/tests/no-clipboard.scenario.json +104 -0
  381. package/dist/content/examples/warframe-market/tests/passive.scenario.json +87 -0
  382. package/dist/content/examples/warframe-market/tests/preview.scenario.json +146 -0
  383. package/dist/content/examples/warframe-market/tests/refresh.scenario.json +56 -0
  384. package/dist/content/examples/warframe-market/tests/refused.scenario.json +74 -0
  385. package/dist/content/examples/warframe-market/tests/render.scenario.json +210 -0
  386. package/dist/content/examples/warframe-market/tests/search.scenario.json +189 -0
  387. package/dist/content/examples/warframe-market/tests/unavailable.scenario.json +54 -0
  388. package/dist/content/examples/warframe-market/tsconfig.json +16 -0
  389. package/dist/content/examples/warframe-market/view.ocml +116 -0
  390. package/dist/content/examples/weather/LICENSE +20 -0
  391. package/dist/content/examples/weather/listing.json +10 -0
  392. package/dist/content/examples/weather/locales/en.json +9 -0
  393. package/dist/content/examples/weather/locales/fr.json +9 -0
  394. package/dist/content/examples/weather/logic.ts +62 -0
  395. package/dist/content/examples/weather/manifest.json +51 -0
  396. package/dist/content/examples/weather/package.json +15 -0
  397. package/dist/content/examples/weather/style.ocss +29 -0
  398. package/dist/content/examples/weather/tsconfig.json +16 -0
  399. package/dist/content/examples/weather/view.ocml +12 -0
  400. package/dist/content/index.json +3601 -0
  401. package/dist/content/reference/errors.json +1712 -0
  402. package/dist/content/reference/limits.json +1154 -0
  403. package/dist/content/reference/manifest.md +223 -0
  404. package/dist/content/reference/permissions.json +413 -0
  405. package/dist/content/templates/blank/locales/en.json +3 -0
  406. package/dist/content/templates/blank/locales/fr.json +3 -0
  407. package/dist/content/templates/blank/logic.ts +7 -0
  408. package/dist/content/templates/blank/manifest.json +16 -0
  409. package/dist/content/templates/blank/style.ocss +10 -0
  410. package/dist/content/templates/blank/tests/example.scenario.json +10 -0
  411. package/dist/content/templates/blank/view.ocml +6 -0
  412. package/dist/content/templates/chart/locales/en.json +3 -0
  413. package/dist/content/templates/chart/locales/fr.json +3 -0
  414. package/dist/content/templates/chart/logic.ts +27 -0
  415. package/dist/content/templates/chart/manifest.json +16 -0
  416. package/dist/content/templates/chart/style.ocss +27 -0
  417. package/dist/content/templates/chart/tests/example.scenario.json +10 -0
  418. package/dist/content/templates/chart/view.ocml +10 -0
  419. package/dist/content/templates/counter/locales/en.json +4 -0
  420. package/dist/content/templates/counter/locales/fr.json +4 -0
  421. package/dist/content/templates/counter/logic.ts +20 -0
  422. package/dist/content/templates/counter/manifest.json +16 -0
  423. package/dist/content/templates/counter/style.ocss +26 -0
  424. package/dist/content/templates/counter/tests/example.scenario.json +11 -0
  425. package/dist/content/templates/counter/view.ocml +13 -0
  426. package/dist/content/templates/list/locales/en.json +8 -0
  427. package/dist/content/templates/list/locales/fr.json +8 -0
  428. package/dist/content/templates/list/logic.ts +35 -0
  429. package/dist/content/templates/list/manifest.json +16 -0
  430. package/dist/content/templates/list/style.ocss +42 -0
  431. package/dist/content/templates/list/tests/example.scenario.json +10 -0
  432. package/dist/content/templates/list/view.ocml +17 -0
  433. package/dist/content/templates/shared/LICENSE +20 -0
  434. package/dist/content/templates/shared/package.json +14 -0
  435. package/dist/content/templates/shared/tsconfig.json +16 -0
  436. package/dist/content.js +68 -0
  437. package/dist/env.js +156 -0
  438. package/dist/fingerprint.js +32 -0
  439. package/dist/ids.js +27 -0
  440. package/dist/index.js +82 -0
  441. package/dist/knowledge.js +222 -0
  442. package/dist/npm.js +149 -0
  443. package/dist/prompts.js +47 -0
  444. package/dist/resources.js +82 -0
  445. package/dist/run.js +120 -0
  446. package/dist/server.js +43 -0
  447. package/dist/session.js +205 -0
  448. package/dist/sources.js +218 -0
  449. package/dist/text.js +80 -0
  450. package/dist/texts.js +44 -0
  451. package/dist/tools/audit.js +105 -0
  452. package/dist/tools/build.js +453 -0
  453. package/dist/tools/common.js +122 -0
  454. package/dist/tools/docs.js +196 -0
  455. package/dist/tools/preview.js +87 -0
  456. package/dist/tools/project.js +178 -0
  457. package/dist/tools/setup.js +146 -0
  458. package/dist/tools/submission.js +369 -0
  459. package/dist/version.js +3 -0
  460. package/npm-shrinkwrap.json +402 -0
  461. package/package.json +50 -4
@@ -0,0 +1,162 @@
1
+ # Publishing and review
2
+
3
+ Widgets reach PlayerVox OverCrow users through the signed widget catalog:
4
+ OverCrow installs only what that catalog lists. This page goes from a
5
+ widget's source directory to a listed version. Neither a pull request nor a
6
+ merge publishes anything: publication is a separate step of the maintainers,
7
+ outside CI.
8
+
9
+ ## The submission
10
+
11
+ A submission is a widget source directory under `widgets/<dir>/` of the
12
+ [public repository](https://github.com/Valhallab/playervox-overcrow-releases),
13
+ in a pull request to its `candidate` branch:
14
+
15
+ ```text
16
+ widgets/<dir>/
17
+ manifest.json view.ocml style.ocss? logic.ts | logic.js
18
+ locales/en.json + locales/fr.json? assets/**? LICENSE
19
+ listing.json (marketplace text, never packaged)
20
+ ```
21
+
22
+ You submit sources, not a package: the catalog always ships the package
23
+ rebuilt from the reviewed sources.
24
+
25
+ Package IDs under `com.playervox` are reserved for widgets published by
26
+ PlayerVox. Use a reverse-DNS ID under a domain you control, and keep it:
27
+ the ID is the widget's identity in the catalog.
28
+
29
+ ## The listing
30
+
31
+ `listing.json` holds what the marketplace shows:
32
+
33
+ <!-- source: docs/content/examples/weather/listing.json -->
34
+ ```json
35
+ {
36
+ "author": "Example Studio",
37
+ "spdxLicense": "MIT",
38
+ "sourceUrl": "https://github.com/example/weather-widget",
39
+ "defaultLocale": "en",
40
+ "localizations": [
41
+ { "locale": "en", "name": "Weather", "description": "The temperature of a city, refreshed every 30 minutes." },
42
+ { "locale": "fr", "name": "Météo", "description": "La température d’une ville, actualisée toutes les 30 minutes." }
43
+ ]
44
+ }
45
+ ```
46
+
47
+ <!-- generated:listing-fields -->
48
+ | Field | Type | Required | Meaning |
49
+ | --- | --- | --- | --- |
50
+ | `author` | text ≤ 128 bytes | yes | Plain text, trimmed, without `<` or `>`. |
51
+ | `spdxLicense` | text ≤ 64 bytes | yes | SPDX expression characters `[A-Za-z0-9.+-]`. |
52
+ | `sourceUrl` | text ≤ 2 KiB | yes | Canonical HTTPS URL of the reviewed source, without port, query or fragment. |
53
+ | `defaultLocale` | `locale` | yes | One of the localizations. |
54
+ | `localizations` | list of `Localization` ≤ 16 | yes | `{ locale, name, description }` with distinct `xx` or `xx-YY` locales; name ≤ 128 bytes, description ≤ 512 bytes. |
55
+ <!-- /generated:listing-fields -->
56
+
57
+ - `author`, names and descriptions are plain, trimmed text without `<` or
58
+ `>`; locales are `xx` or `xx-YY`, one of them `defaultLocale`.
59
+ - `spdxLicense` is an SPDX expression; the package's `LICENSE` holds its
60
+ text. PlayerVox widgets use MIT. The policy for third-party licenses is
61
+ not decided yet: a valid expression is reviewed, not approved by the
62
+ metadata ([licensing](../../../LICENSING.md)).
63
+ - `sourceUrl` is a canonical HTTPS URL of the reviewed source, without
64
+ port, query or fragment.
65
+ - `preview` (optional) names a PNG packaged under `assets/`, at most
66
+ 256 KiB, for example `"preview": "assets/preview.png"`. The Control
67
+ Center and the marketplace show it whole in a 4:3 box, centred on the
68
+ colour `#1e242e`, at 1.5 pixels per screen point at most: render the
69
+ widget at 150 % (`"scale": 1500` in a scenario) and give the image a 4:3
70
+ shape, and it appears at its real size, never cropped or enlarged.
71
+
72
+ ## Admission: run it yourself
73
+
74
+ ```sh
75
+ overcrow-widget admit widgets/<dir>
76
+ overcrow-widget admit widgets/<dir> --package dist/<id>-<version>.ocpkg
77
+ overcrow-widget admit widgets/<dir> --format json
78
+ ```
79
+
80
+ `admit` is exactly the static admission of the marketplace. It never runs
81
+ your code or `tsc`:
82
+
83
+ 1. it builds the directory as `package` does: every source, style, logic
84
+ and package check, then OverCrow's own package reader;
85
+ 2. with `--package`, your archive's compiled view must be byte for byte
86
+ what `view.ocml` compiles to;
87
+ 3. it checks the schema bounds, the reserved IDs, `listing.json`, the
88
+ preview and, for PlayerVox widgets, the MIT license;
89
+ 4. it lists the authority the widget requests for the reviewer: sensitive
90
+ capabilities, every network route, clipboard writes, storage and game
91
+ events.
92
+
93
+ The command ends with status 1 when the submission would be refused. Its
94
+ codes are listed with the [`admit` command](cli.md#admit).
95
+
96
+ On a pull request, the admission tool is built from the reviewed base
97
+ branch, never from your revision, and it reads your files as data: your
98
+ JavaScript, TypeScript, build commands, tests and scripts are never
99
+ executed there. A pull request may not change the tools of the admission
100
+ themselves.
101
+
102
+ ## Review
103
+
104
+ A maintainer reads the admission report and the source, then merges into
105
+ `candidate`. Reviewers check:
106
+
107
+ - **Identity.** A new ID under a domain the author controls. A new version
108
+ for any change: published versions are immutable, and a version lower
109
+ than a listed one is refused.
110
+ - **Reproducibility.** The package is rebuilt from the reviewed sources.
111
+ - **Authority.** Every capability, above all the sensitive ones; every
112
+ network route, which must serve the widget's stated purpose; clipboard
113
+ writes, storage and game events. See
114
+ [services and permissions](services.md).
115
+ - **Listing.** Exact, plain text in every locale; a canonical source URL; a
116
+ preview that shows the widget.
117
+ - **License.** `LICENSE` matches `spdxLicense`, and every bundled asset,
118
+ font or third-party code keeps its notice.
119
+
120
+ On the merge, the exact revision is admitted again and a receipt binds the
121
+ admitted package to the reviewed commit. Accepting a submission signs and
122
+ publishes nothing.
123
+
124
+ ## The catalog
125
+
126
+ The maintainers prepare the next catalog from admitted revisions and sign it
127
+ outside CI with the catalog key, whose public half is in
128
+ [`keys/`](../../../keys/). The catalog:
129
+
130
+ - lists each version with the SHA-256 and the size of its package; a
131
+ published version never changes, and a change is a new version;
132
+ - carries a strictly increasing sequence number and expires after at most
133
+ 90 days: OverCrow refuses an older sequence and an expired catalog;
134
+ - tags PlayerVox reference widgets `built-in` (only `com.playervox.*` IDs):
135
+ they are installed on a new profile with their declared permissions
136
+ granted, except for an update that asks for more.
137
+
138
+ OverCrow verifies the signature, the package digest, its ledger and its
139
+ compiled view before installing, and again each time it starts the widget.
140
+ See [the package](package.md#how-overcrow-checks-a-package).
141
+
142
+ ## Updates
143
+
144
+ A new version of your widget is a new submission with a higher `version`:
145
+ a published version is never replaced. An update whose manifest asks for
146
+ more than the installed version (a network rule, a game event, a
147
+ capability, storage or the clipboard) needs the user's approval in the
148
+ Control Center before it runs.
149
+
150
+ ## Version statuses
151
+
152
+ Each listed version has a status:
153
+
154
+ | Status | Meaning |
155
+ | --- | --- |
156
+ | `verified` | Installable. |
157
+ | `security-suspended` | Suspected of compromise; not installed or updated to, and an installed copy is stopped. Reversible in a later catalog. |
158
+ | `revoked` | Permanent: never installed again, and an installed copy is stopped. |
159
+
160
+ Omitting a version from a catalog never changes its status. A catalog
161
+ signature never bypasses package validation, the user's consent or the
162
+ sandbox.
@@ -0,0 +1,55 @@
1
+ # Reference
2
+
3
+ The reference of PlayerVox OverCrow widgets lists every element, style
4
+ property, service and SDK function of widget API v1. This page says where
5
+ each answer is. The pages of "Write a widget" explain how the parts work
6
+ together; the pages below are the ones to keep open while you write.
7
+
8
+ | Question | Page |
9
+ | --- | --- |
10
+ | What goes in `manifest.json`? | [The manifest](manifest.md) |
11
+ | Which elements, attributes and events can a view use? | [Elements and attributes](elements.md) |
12
+ | Which style properties and values are accepted? | [Style properties and tokens](style-properties.md) |
13
+ | Which design tokens and icons exist? | [Design tokens](style-properties.md#design-tokens), [icons](style-properties.md#icons) |
14
+ | Which functions does `@overcrow/sdk` export? | [SDK reference](sdk.md) |
15
+ | How do I format times, dates and numbers? | [Time, dates and numbers](sdk.md#time-dates-and-numbers) |
16
+ | What does each permission and capability allow? | [Services and permissions](services.md) |
17
+ | What are the parameters and the result of a service? | [Service reference](service-reference.md), [result shapes](result-shapes.md) |
18
+ | What does an error code mean? | [Errors](services.md#errors) |
19
+ | Which fields does a write intent take? | [The intents](forms.md#the-intents) |
20
+ | What are the limits (sizes, counts, budgets)? | [Limits](limits.md) |
21
+ | What does each command and diagnostic of the CLI do? | [The command-line tool](cli.md) |
22
+ | How is a test scenario written? | [Testing a widget](testing.md#scenarios) |
23
+ | What is inside a `.ocpkg`? | [The package](package.md) |
24
+
25
+ ## How the reference stays exact
26
+
27
+ - The tables of elements, attributes, style properties, tokens, services,
28
+ result shapes and limits are **generated from the widget schema**, the
29
+ same tables that OverCrow and the command-line tool compile into their
30
+ validators. A check fails when a page differs from the schema, in English
31
+ or in French.
32
+ - The **SDK types** are generated from the same schema, so a wrong element,
33
+ icon, capability or service parameter is a TypeScript error in your
34
+ logic.
35
+ - The **SDK reference** is checked by the SDK's tests: every export of
36
+ `@overcrow/sdk` is listed there.
37
+ - Every **code example** of these pages is an excerpt of a project that the
38
+ command-line tool checks, packages and admits on each change: a template,
39
+ a reference widget or one of the two examples.
40
+
41
+ ## Versions
42
+
43
+ These pages describe widget API v1 (`"apiVersion": 1` in the manifest) and
44
+ `@overcrow/sdk` 1.0.
45
+
46
+ ## Specifications for implementers
47
+
48
+ Three specifications, in the public repository, are written for those who
49
+ implement a host or another tool rather than a widget: the complete
50
+ [generated schema reference](../../widget-schema-v1.md), which also covers
51
+ the protocol between OverCrow and the widget's process and the catalog's
52
+ payloads; the
53
+ [wire protocol of the development channel](../../dev-channel.md); and the
54
+ [archive and catalog format](../../widget-package-v1.md). A widget author
55
+ does not need them.
@@ -0,0 +1,332 @@
1
+ # Result shapes
2
+
3
+ What the services of PlayerVox OverCrow answer: the shape of each result
4
+ and of each subscription update. The SDK exports a TypeScript type of the
5
+ same name for each shape, so the logic never describes them by hand.
6
+
7
+ <!-- source: widgets/stopwatch/logic.ts -->
8
+ ```ts
9
+ declare module "@overcrow/sdk" {
10
+ interface WidgetState {
11
+ /** The latest state, or `null` while it is unknown. */
12
+ stopwatch: Stopwatch | null;
13
+ /** The buttons take input only in Interactive mode. */
14
+ interactive: boolean;
15
+ }
16
+ }
17
+ ```
18
+
19
+ The Stopwatch widget keeps the latest `Stopwatch` value in its state, and
20
+ the view reads its members:
21
+
22
+ <!-- source: widgets/stopwatch/view.ocml -->
23
+ ```xml
24
+ <elapsed class="value" base={state.stopwatch.elapsedMs} at={state.stopwatch.at} running={state.stopwatch.running} format="hh:mm:ss.cc"/>
25
+ ```
26
+
27
+ ## How to read a shape
28
+
29
+ - A shape is an exact record: every member is present, and a member
30
+ without a value is `null`, never absent.
31
+ - "text or `null`" means that the member may be `null`: test it before you
32
+ show it.
33
+ - An integer is below 2^53, so it is exact in JavaScript. Times are in
34
+ milliseconds: "Unix milliseconds" count from 1970 in UTC, as `Date.now()`
35
+ does.
36
+ - A member that goes with `offsetMinutes` is a timestamp to format with
37
+ that UTC offset; see
38
+ [time, dates and numbers](logic.md#time-dates-and-numbers).
39
+ - An `asset:` handle is an image that OverCrow holds for the widget: bind
40
+ it to the `src` of an `image` or an `avatar`, or draw it on a canvas. It
41
+ is not a URL and cannot be read as bytes.
42
+ - A subscription whose shape is "… or `null`" delivers `null` when there is
43
+ nothing to show: no active game, no media player.
44
+
45
+ Which service gives which shape is in the
46
+ [service reference](service-reference.md).
47
+
48
+ ## Shapes
49
+
50
+ <!-- generated:result-shapes -->
51
+ ### `HttpResponse`
52
+
53
+ Answer of `http.fetch`. `{ status, contentType }` or `{ status, asset }`
54
+
55
+ | Member | Shape | Meaning |
56
+ | --- | --- | --- |
57
+ | `status` | integer | HTTP status. |
58
+ | `contentType` | text or `null` | Response media type; the SDK adds the decoded body, `body`. |
59
+
60
+ | Member | Shape | Meaning |
61
+ | --- | --- | --- |
62
+ | `status` | integer | HTTP status. |
63
+ | `asset` | `asset:` handle | The decoded image (`as: "image"`). |
64
+
65
+ ### `GameEvent`
66
+
67
+ One game event. `{ event, at }`
68
+
69
+ | Member | Shape | Meaning |
70
+ | --- | --- | --- |
71
+ | `event` | text | A declared game event. |
72
+ | `at` | integer | Host monotonic clock in ms. |
73
+
74
+ ### `Session`
75
+
76
+ Duration of the active game session. `{ elapsedMs, at }`
77
+
78
+ | Member | Shape | Meaning |
79
+ | --- | --- | --- |
80
+ | `elapsedMs` | integer | Time since the game process started. |
81
+ | `at` | integer | Host monotonic clock in ms at which `elapsedMs` was measured. |
82
+
83
+ ### `Telemetry`
84
+
85
+ Resource use of the active game. `{ cpu, ram, cpuTemperature, gpuTemperature, sources }`
86
+
87
+ | Member | Shape | Meaning |
88
+ | --- | --- | --- |
89
+ | `cpu` | number or `null` | The game's share of the whole machine in %, from 0 to 100. |
90
+ | `ram` | integer or `null` | Resident bytes of the game. |
91
+ | `cpuTemperature` | number or `null` | °C. |
92
+ | `gpuTemperature` | number or `null` | °C. |
93
+ | `sources` | `{ cpuTemperature, gpuTemperature }` | Sensors the host has. |
94
+ | `sources.cpuTemperature` | boolean | The host has a CPU sensor. |
95
+ | `sources.gpuTemperature` | boolean | The host has a GPU sensor. |
96
+
97
+ ### `Fps`
98
+
99
+ Frame rate of the active game. `{ fps, stale, status }`
100
+
101
+ | Member | Shape | Meaning |
102
+ | --- | --- | --- |
103
+ | `fps` | integer or `null` | Frames per second. |
104
+ | `stale` | boolean | No sample for 3 s. |
105
+ | `status` | `ready` \| `waiting` \| `unsupported` \| `permission_denied` \| `ambiguous` \| `events_lost` \| `unavailable` | Measurement state. |
106
+
107
+ ### `Stopwatch`
108
+
109
+ The manual stopwatch. `{ running, elapsedMs, at, shortcuts }`
110
+
111
+ | Member | Shape | Meaning |
112
+ | --- | --- | --- |
113
+ | `running` | boolean | It is counting. |
114
+ | `elapsedMs` | integer | Elapsed time at `at`. |
115
+ | `at` | integer | Host monotonic clock in ms at which `elapsedMs` was measured. |
116
+ | `shortcuts` | `{ toggle, reset, bound }` | Stopwatch shortcuts. |
117
+ | `shortcuts.toggle` | text | Host-formatted key chord. |
118
+ | `shortcuts.reset` | text | Host-formatted key chord. |
119
+ | `shortcuts.bound` | boolean | The shortcuts are active. |
120
+
121
+ ### `Media`
122
+
123
+ The current media player. `{ player, title, artists, playing, canPrevious, canPlayPause, canNext, cover }`
124
+
125
+ | Member | Shape | Meaning |
126
+ | --- | --- | --- |
127
+ | `player` | text | Opaque ID of the current player. |
128
+ | `title` | text or `null` | Track title. |
129
+ | `artists` | list of text | Artists. |
130
+ | `playing` | boolean | Playing. |
131
+ | `canPrevious` | boolean | The player supports previous. |
132
+ | `canPlayPause` | boolean | The player supports play/pause. |
133
+ | `canNext` | boolean | The player supports next. |
134
+ | `cover` | `asset:` handle or `null` | Cover art, at most 512 px. |
135
+
136
+ ### `NoteItem`
137
+
138
+ One checklist item. `{ id, text, checked }`
139
+
140
+ | Member | Shape | Meaning |
141
+ | --- | --- | --- |
142
+ | `id` | text or `null` | Item ID. |
143
+ | `text` | text | Text. |
144
+ | `checked` | boolean | Checked. |
145
+
146
+ ### `Note`
147
+
148
+ One note. `{ id, title, body, items }`
149
+
150
+ | Member | Shape | Meaning |
151
+ | --- | --- | --- |
152
+ | `id` | text or `null` | Note ID. |
153
+ | `title` | text | Title. |
154
+ | `body` | text | Body text. |
155
+ | `items` | list of [`NoteItem`](#noteitem) | Checklist. |
156
+
157
+ ### `Notes`
158
+
159
+ The user's notes document. `{ active, notes }`
160
+
161
+ | Member | Shape | Meaning |
162
+ | --- | --- | --- |
163
+ | `active` | text or `null` | ID of the active note. |
164
+ | `notes` | list of [`Note`](#note) | Notes. |
165
+
166
+ ### `CreatedNote`
167
+
168
+ Answer of `notes.create`. `{ note }`
169
+
170
+ | Member | Shape | Meaning |
171
+ | --- | --- | --- |
172
+ | `note` | [`Note`](#note) | The new note. |
173
+
174
+ ### `Score`
175
+
176
+ PlayerVox score of the active game. `{ state, name, score, grade, ratingsCount, criteria }`
177
+
178
+ | Member | Shape | Meaning |
179
+ | --- | --- | --- |
180
+ | `state` | `idle` \| `unsupported` \| `loading` \| `ready` \| `no_ratings` \| `not_found` \| `unavailable` | Score state: `idle` without an active game, `unsupported` for a game without a Steam app ID, `loading` until the game's first answer (never the previous game's score), `ready` and `no_ratings` with the score, `not_found` for a game PlayerVox cannot match, `unavailable` while the host retries. Every state but `ready` and `no_ratings` has a `null` name and score, grade `--`, no ratings and `null` criteria. |
181
+ | `name` | text or `null` | Game name. |
182
+ | `score` | number or `null` | 0–100. |
183
+ | `grade` | `S+` \| `S` \| `A` \| `B` \| `C` \| `D` \| `F` \| `--` | Grade of the score. |
184
+ | `ratingsCount` | integer | Number of ratings. |
185
+ | `criteria` | `{ gameplay, art, tech }` | Criteria scores. |
186
+ | `criteria.gameplay` | number or `null` | 0–100. |
187
+ | `criteria.art` | number or `null` | 0–100. |
188
+ | `criteria.tech` | number or `null` | 0–100. |
189
+
190
+ ### `Rating`
191
+
192
+ The user's PlayerVox rating of the active game. `{ gameplay, art, tech, review, publishedAt, offsetMinutes }`
193
+
194
+ | Member | Shape | Meaning |
195
+ | --- | --- | --- |
196
+ | `gameplay` | integer | 0–100. |
197
+ | `art` | integer | 0–100. |
198
+ | `tech` | integer | 0–100. |
199
+ | `review` | text or `null` | Review text. |
200
+ | `publishedAt` | integer or `null` | Unix milliseconds. |
201
+ | `offsetMinutes` | integer or `null` | UTC offset in minutes to show the timestamp with. |
202
+
203
+ ### `RatingState`
204
+
205
+ The user's own rating of the active game, with its state. `{ state, name, offline, rating }`
206
+
207
+ | Member | Shape | Meaning |
208
+ | --- | --- | --- |
209
+ | `state` | `idle` \| `unsupported` \| `loading` \| `ready` \| `unavailable` | Rating state: `idle` without an active game, `unsupported` for a game without a Steam app ID, `loading` until the first answer for this game and account (never the previous game's rating), `ready` with the rating, `unavailable` while the host retries a failed read. Every state but `ready` has a `null` name and rating. |
210
+ | `name` | text or `null` | Game name on PlayerVox. |
211
+ | `offline` | boolean | PlayerVox is unreachable: the rating is the last one read, and `playervox.rating.publish` answers `not_connected`. |
212
+ | `rating` | [`Rating`](#rating) or `null` | The user's rating; `null` before the first one. |
213
+
214
+ ### `Review`
215
+
216
+ One player review. `{ id, author, grade, score, text, original, hidden, publishedAt, offsetMinutes }`
217
+
218
+ | Member | Shape | Meaning |
219
+ | --- | --- | --- |
220
+ | `id` | text | Review ID. |
221
+ | `author` | text | Author name. |
222
+ | `grade` | `S+` \| `S` \| `A` \| `B` \| `C` \| `D` \| `F` \| `--` | Grade. |
223
+ | `score` | integer | 0–100. |
224
+ | `text` | text or `null` | Text, translated when a translation exists. |
225
+ | `original` | text or `null` | Untranslated text when `text` is a translation; `null` otherwise. |
226
+ | `hidden` | boolean | Hidden by the community: show the text only once the user asks for it. |
227
+ | `publishedAt` | integer | Unix milliseconds. |
228
+ | `offsetMinutes` | integer | UTC offset in minutes to show the timestamp with. |
229
+
230
+ ### `ReviewsState`
231
+
232
+ The player reviews of the active game: what to read, not the reviews. `{ state, revision, offline }`
233
+
234
+ | Member | Shape | Meaning |
235
+ | --- | --- | --- |
236
+ | `state` | `idle` \| `unsupported` \| `ready` | `idle` without an active game, `unsupported` for a game without a Steam app ID, `ready` when `playervox.reviews.page` reads the game's reviews. |
237
+ | `revision` | integer | Changes whenever the reviews to read change: another game, another PlayerVox account, or reviews changed on PlayerVox. |
238
+ | `offline` | boolean | PlayerVox is unreachable: `playervox.reviews.page` answers `not_connected`. |
239
+
240
+ ### `ReviewsPage`
241
+
242
+ A page of player reviews. `{ gameName, items, page, totalPages, count }`
243
+
244
+ | Member | Shape | Meaning |
245
+ | --- | --- | --- |
246
+ | `gameName` | text | Game name on PlayerVox. |
247
+ | `items` | list of [`Review`](#review) | Reviews. |
248
+ | `page` | integer | Page number. |
249
+ | `totalPages` | integer | Number of pages. |
250
+ | `count` | integer | Number of reviews. |
251
+
252
+ ### `JournalSession`
253
+
254
+ One journal session. `{ id, startedAt, offsetMinutes, durationMs, source }`
255
+
256
+ | Member | Shape | Meaning |
257
+ | --- | --- | --- |
258
+ | `id` | text | Session ID. |
259
+ | `startedAt` | integer | Unix milliseconds. |
260
+ | `offsetMinutes` | integer | UTC offset in minutes to show the timestamp with. |
261
+ | `durationMs` | integer | Duration. |
262
+ | `source` | `local` \| `cloud` | Where the session is stored. |
263
+
264
+ ### `JournalState`
265
+
266
+ The journal of the active game. `{ revision, notice }`
267
+
268
+ | Member | Shape | Meaning |
269
+ | --- | --- | --- |
270
+ | `revision` | integer | Changes whenever the merged journal of the active game changes. |
271
+ | `notice` | `offline` \| `storage_unavailable` \| `full` \| `expired` \| `busy` \| `unavailable` or `null` | Journal condition to show above the sessions: `offline` sync is offline (local sessions remain), `storage_unavailable` the local journal cannot be read, `full` the local journal is full, `expired` the PlayerVox sign-in expired, `busy` PlayerVox asks to retry later, `unavailable` any other failure; `null` when none. |
272
+
273
+ ### `JournalPage`
274
+
275
+ A page of the game journal. `{ gameName, items, page, next, previous }`
276
+
277
+ | Member | Shape | Meaning |
278
+ | --- | --- | --- |
279
+ | `gameName` | text | Active game; empty when the host has no name. |
280
+ | `items` | list of [`JournalSession`](#journalsession) | Sessions, newest first. |
281
+ | `page` | integer | Page number, from 1. |
282
+ | `next` | text or `null` | Cursor of the next page. |
283
+ | `previous` | text or `null` | Cursor of the previous page. |
284
+
285
+ ### `ChatFragment`
286
+
287
+ A text run or an emote of a chat message. `{ text }` or `{ emote, alt }`
288
+
289
+ | Member | Shape | Meaning |
290
+ | --- | --- | --- |
291
+ | `text` | text | Text run. |
292
+
293
+ | Member | Shape | Meaning |
294
+ | --- | --- | --- |
295
+ | `emote` | `asset:` handle | Emote image. |
296
+ | `alt` | text | Emote name. |
297
+
298
+ ### `ChatMessage`
299
+
300
+ One chat message. `{ id, author, color, badges, fragments, reply, deleted, receivedAt }`
301
+
302
+ | Member | Shape | Meaning |
303
+ | --- | --- | --- |
304
+ | `id` | text | Message ID. |
305
+ | `author` | text | Author name. |
306
+ | `color` | text or `null` | Author colour `#rrggbb`. |
307
+ | `badges` | list of `asset:` handle | Badge images. |
308
+ | `fragments` | list of [`ChatFragment`](#chatfragment) | Content runs. |
309
+ | `reply` | `{ author, text }` or `null` | The message replied to. |
310
+ | `reply.author` | text | Author replied to. |
311
+ | `reply.text` | text | Text replied to. |
312
+ | `deleted` | boolean | Deleted by a moderator. |
313
+ | `receivedAt` | integer | When the host received the message, in Unix milliseconds of the host's clock: compare it with `Date.now()` to age a message (the fade of Passive mode), also after a `reset`. |
314
+
315
+ ### `TwitchChat`
316
+
317
+ Twitch chat state. `{ account, channel, joinState, failure, favorites, canSend, generation, reset, messages, removed, skipped }`
318
+
319
+ | Member | Shape | Meaning |
320
+ | --- | --- | --- |
321
+ | `account` | `signed_out` \| `pending` \| `connected` \| `expired` | Twitch account state; sign-in is drawn by the host. |
322
+ | `channel` | text or `null` | Joined channel login. |
323
+ | `joinState` | `idle` \| `connecting` \| `joined` \| `reconnecting` \| `failed` | Channel connection state. |
324
+ | `failure` | `channel_unavailable` \| `connection` \| `provider` \| `limit` or `null` | Why `joinState` is `failed`, as a fixed category: the channel does not exist or refuses the account, the connection failed, Twitch answered something unexpected, or another widget holds the host's one chat connection (`limit`). `null` in every other state. An account failure is not here: the host draws it. |
325
+ | `favorites` | list of text | Favorite channels. |
326
+ | `canSend` | boolean | A message can be sent now. |
327
+ | `generation` | integer | Changes with the channel or account. |
328
+ | `reset` | boolean | `messages` replaces the whole list. |
329
+ | `messages` | list of [`ChatMessage`](#chatmessage) | Messages, oldest first: the whole list with `reset`; otherwise the new messages, to append, and the changed ones, which replace the message of the same `id` in place. |
330
+ | `removed` | list of text | IDs of removed messages. |
331
+ | `skipped` | integer | New messages the host left out since the previous update, because the chat is faster than it delivers; 0 with `reset`. A removal is never left out. |
332
+ <!-- /generated:result-shapes -->