@overcrow/mcp 0.0.0 → 0.1.1

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 (489) 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 +768 -0
  15. package/dist/content/docs/en/creator-space.md +78 -0
  16. package/dist/content/docs/en/dev-channel.md +130 -0
  17. package/dist/content/docs/en/elements.md +469 -0
  18. package/dist/content/docs/en/forms.md +328 -0
  19. package/dist/content/docs/en/guide.md +252 -0
  20. package/dist/content/docs/en/index.md +85 -0
  21. package/dist/content/docs/en/limits.md +241 -0
  22. package/dist/content/docs/en/logic.md +446 -0
  23. package/dist/content/docs/en/manifest.md +388 -0
  24. package/dist/content/docs/en/mcp.md +165 -0
  25. package/dist/content/docs/en/package.md +131 -0
  26. package/dist/content/docs/en/publish-a-widget.md +94 -0
  27. package/dist/content/docs/en/publish-keys.md +95 -0
  28. package/dist/content/docs/en/publishing.md +167 -0
  29. package/dist/content/docs/en/reference.md +55 -0
  30. package/dist/content/docs/en/result-shapes.md +332 -0
  31. package/dist/content/docs/en/sdk.md +295 -0
  32. package/dist/content/docs/en/security.md +115 -0
  33. package/dist/content/docs/en/service-reference.md +344 -0
  34. package/dist/content/docs/en/services.md +517 -0
  35. package/dist/content/docs/en/style-properties.md +270 -0
  36. package/dist/content/docs/en/style.md +266 -0
  37. package/dist/content/docs/en/testing.md +400 -0
  38. package/dist/content/docs/en/verified-domain.md +46 -0
  39. package/dist/content/docs/en/view.md +338 -0
  40. package/dist/content/docs/en/widget-listing.md +65 -0
  41. package/dist/content/docs/en/widget-review.md +57 -0
  42. package/dist/content/docs/en/widget-statistics.md +134 -0
  43. package/dist/content/docs/en/widgets.md +76 -0
  44. package/dist/content/docs/fr/cli.md +802 -0
  45. package/dist/content/docs/fr/creator-space.md +83 -0
  46. package/dist/content/docs/fr/dev-channel.md +140 -0
  47. package/dist/content/docs/fr/elements.md +475 -0
  48. package/dist/content/docs/fr/forms.md +341 -0
  49. package/dist/content/docs/fr/guide.md +263 -0
  50. package/dist/content/docs/fr/index.md +90 -0
  51. package/dist/content/docs/fr/limits.md +244 -0
  52. package/dist/content/docs/fr/logic.md +461 -0
  53. package/dist/content/docs/fr/manifest.md +401 -0
  54. package/dist/content/docs/fr/mcp.md +173 -0
  55. package/dist/content/docs/fr/package.md +139 -0
  56. package/dist/content/docs/fr/publish-a-widget.md +101 -0
  57. package/dist/content/docs/fr/publish-keys.md +97 -0
  58. package/dist/content/docs/fr/publishing.md +177 -0
  59. package/dist/content/docs/fr/reference.md +59 -0
  60. package/dist/content/docs/fr/result-shapes.md +333 -0
  61. package/dist/content/docs/fr/sdk.md +301 -0
  62. package/dist/content/docs/fr/security.md +129 -0
  63. package/dist/content/docs/fr/service-reference.md +346 -0
  64. package/dist/content/docs/fr/services.md +540 -0
  65. package/dist/content/docs/fr/style-properties.md +272 -0
  66. package/dist/content/docs/fr/style.md +281 -0
  67. package/dist/content/docs/fr/testing.md +417 -0
  68. package/dist/content/docs/fr/verified-domain.md +49 -0
  69. package/dist/content/docs/fr/view.md +352 -0
  70. package/dist/content/docs/fr/widget-listing.md +69 -0
  71. package/dist/content/docs/fr/widget-review.md +59 -0
  72. package/dist/content/docs/fr/widget-statistics.md +141 -0
  73. package/dist/content/docs/fr/widgets.md +81 -0
  74. package/dist/content/examples/clock/LICENSE +21 -0
  75. package/dist/content/examples/clock/README.md +75 -0
  76. package/dist/content/examples/clock/listing.json +19 -0
  77. package/dist/content/examples/clock/locales/en.json +4 -0
  78. package/dist/content/examples/clock/locales/fr.json +4 -0
  79. package/dist/content/examples/clock/logic.ts +85 -0
  80. package/dist/content/examples/clock/manifest.json +44 -0
  81. package/dist/content/examples/clock/package.json +16 -0
  82. package/dist/content/examples/clock/style.ocss +26 -0
  83. package/dist/content/examples/clock/tests/hidden.scenario.json +68 -0
  84. package/dist/content/examples/clock/tests/load-logic.mjs +22 -0
  85. package/dist/content/examples/clock/tests/logic.test.mjs +89 -0
  86. package/dist/content/examples/clock/tests/options.scenario.json +108 -0
  87. package/dist/content/examples/clock/tests/preview.scenario.json +25 -0
  88. package/dist/content/examples/clock/tests/render.scenario.json +94 -0
  89. package/dist/content/examples/clock/tests/summer-time.scenario.json +74 -0
  90. package/dist/content/examples/clock/tests/ticks.scenario.json +120 -0
  91. package/dist/content/examples/clock/tsconfig.json +16 -0
  92. package/dist/content/examples/clock/view.ocml +8 -0
  93. package/dist/content/examples/countdown/LICENSE +20 -0
  94. package/dist/content/examples/countdown/listing.json +10 -0
  95. package/dist/content/examples/countdown/locales/en.json +15 -0
  96. package/dist/content/examples/countdown/locales/fr.json +15 -0
  97. package/dist/content/examples/countdown/logic.ts +179 -0
  98. package/dist/content/examples/countdown/manifest.json +34 -0
  99. package/dist/content/examples/countdown/package.json +15 -0
  100. package/dist/content/examples/countdown/style.ocss +94 -0
  101. package/dist/content/examples/countdown/tsconfig.json +16 -0
  102. package/dist/content/examples/countdown/view.ocml +42 -0
  103. package/dist/content/examples/fps/LICENSE +21 -0
  104. package/dist/content/examples/fps/README.md +64 -0
  105. package/dist/content/examples/fps/listing.json +19 -0
  106. package/dist/content/examples/fps/locales/en.json +11 -0
  107. package/dist/content/examples/fps/locales/fr.json +11 -0
  108. package/dist/content/examples/fps/logic.ts +64 -0
  109. package/dist/content/examples/fps/manifest.json +30 -0
  110. package/dist/content/examples/fps/package.json +16 -0
  111. package/dist/content/examples/fps/style.ocss +31 -0
  112. package/dist/content/examples/fps/submission.json +8 -0
  113. package/dist/content/examples/fps/tests/label.scenario.json +63 -0
  114. package/dist/content/examples/fps/tests/load-logic.mjs +22 -0
  115. package/dist/content/examples/fps/tests/logic.test.mjs +60 -0
  116. package/dist/content/examples/fps/tests/preview.scenario.json +29 -0
  117. package/dist/content/examples/fps/tests/refused.scenario.json +20 -0
  118. package/dist/content/examples/fps/tests/render.scenario.json +96 -0
  119. package/dist/content/examples/fps/tests/stale.scenario.json +91 -0
  120. package/dist/content/examples/fps/tests/unavailable.scenario.json +111 -0
  121. package/dist/content/examples/fps/tsconfig.json +16 -0
  122. package/dist/content/examples/fps/view.ocml +11 -0
  123. package/dist/content/examples/media/LICENSE +21 -0
  124. package/dist/content/examples/media/README.md +147 -0
  125. package/dist/content/examples/media/listing.json +19 -0
  126. package/dist/content/examples/media/locales/en.json +11 -0
  127. package/dist/content/examples/media/locales/fr.json +11 -0
  128. package/dist/content/examples/media/logic.ts +191 -0
  129. package/dist/content/examples/media/manifest.json +35 -0
  130. package/dist/content/examples/media/package.json +16 -0
  131. package/dist/content/examples/media/style.ocss +148 -0
  132. package/dist/content/examples/media/submission.json +12 -0
  133. package/dist/content/examples/media/tests/covers.scenario.json +144 -0
  134. package/dist/content/examples/media/tests/gesture.scenario.json +173 -0
  135. package/dist/content/examples/media/tests/load-logic.mjs +22 -0
  136. package/dist/content/examples/media/tests/logic.test.mjs +176 -0
  137. package/dist/content/examples/media/tests/marquee.scenario.json +127 -0
  138. package/dist/content/examples/media/tests/preview.scenario.json +52 -0
  139. package/dist/content/examples/media/tests/read-only.scenario.json +53 -0
  140. package/dist/content/examples/media/tests/refused.scenario.json +22 -0
  141. package/dist/content/examples/media/tests/refused.test.mjs +31 -0
  142. package/dist/content/examples/media/tests/render.scenario.json +136 -0
  143. package/dist/content/examples/media/tests/states.scenario.json +257 -0
  144. package/dist/content/examples/media/tests/unavailable.scenario.json +120 -0
  145. package/dist/content/examples/media/tsconfig.json +16 -0
  146. package/dist/content/examples/media/view.ocml +41 -0
  147. package/dist/content/examples/notes/LICENSE +21 -0
  148. package/dist/content/examples/notes/README.md +219 -0
  149. package/dist/content/examples/notes/listing.json +19 -0
  150. package/dist/content/examples/notes/locales/en.json +25 -0
  151. package/dist/content/examples/notes/locales/fr.json +25 -0
  152. package/dist/content/examples/notes/logic.ts +799 -0
  153. package/dist/content/examples/notes/manifest.json +40 -0
  154. package/dist/content/examples/notes/package.json +16 -0
  155. package/dist/content/examples/notes/style.ocss +469 -0
  156. package/dist/content/examples/notes/submission.json +12 -0
  157. package/dist/content/examples/notes/tests/checks.scenario.json +237 -0
  158. package/dist/content/examples/notes/tests/create.scenario.json +260 -0
  159. package/dist/content/examples/notes/tests/delete.scenario.json +342 -0
  160. package/dist/content/examples/notes/tests/drafts.scenario.json +714 -0
  161. package/dist/content/examples/notes/tests/editor.scenario.json +232 -0
  162. package/dist/content/examples/notes/tests/frame.scenario.json +93 -0
  163. package/dist/content/examples/notes/tests/interactive.scenario.json +344 -0
  164. package/dist/content/examples/notes/tests/limits.scenario.json +1351 -0
  165. package/dist/content/examples/notes/tests/load-logic.mjs +22 -0
  166. package/dist/content/examples/notes/tests/logic.test.mjs +514 -0
  167. package/dist/content/examples/notes/tests/preview.scenario.json +99 -0
  168. package/dist/content/examples/notes/tests/read-only.scenario.json +105 -0
  169. package/dist/content/examples/notes/tests/refused.scenario.json +33 -0
  170. package/dist/content/examples/notes/tests/save.scenario.json +378 -0
  171. package/dist/content/examples/notes/tests/states.scenario.json +640 -0
  172. package/dist/content/examples/notes/tests/typing.scenario.json +562 -0
  173. package/dist/content/examples/notes/tests/unavailable.scenario.json +246 -0
  174. package/dist/content/examples/notes/tsconfig.json +16 -0
  175. package/dist/content/examples/notes/view.ocml +154 -0
  176. package/dist/content/examples/performance/LICENSE +21 -0
  177. package/dist/content/examples/performance/README.md +134 -0
  178. package/dist/content/examples/performance/listing.json +19 -0
  179. package/dist/content/examples/performance/locales/en.json +20 -0
  180. package/dist/content/examples/performance/locales/fr.json +20 -0
  181. package/dist/content/examples/performance/logic.ts +210 -0
  182. package/dist/content/examples/performance/manifest.json +83 -0
  183. package/dist/content/examples/performance/package.json +16 -0
  184. package/dist/content/examples/performance/style.ocss +75 -0
  185. package/dist/content/examples/performance/submission.json +12 -0
  186. package/dist/content/examples/performance/tests/fahrenheit.scenario.json +110 -0
  187. package/dist/content/examples/performance/tests/horizontal.scenario.json +96 -0
  188. package/dist/content/examples/performance/tests/load-logic.mjs +22 -0
  189. package/dist/content/examples/performance/tests/logic.test.mjs +226 -0
  190. package/dist/content/examples/performance/tests/menu.scenario.json +170 -0
  191. package/dist/content/examples/performance/tests/no-fps-source.scenario.json +47 -0
  192. package/dist/content/examples/performance/tests/preview.scenario.json +45 -0
  193. package/dist/content/examples/performance/tests/refused.scenario.json +20 -0
  194. package/dist/content/examples/performance/tests/refused.test.mjs +19 -0
  195. package/dist/content/examples/performance/tests/region.scenario.json +89 -0
  196. package/dist/content/examples/performance/tests/render.scenario.json +112 -0
  197. package/dist/content/examples/performance/tests/sources.scenario.json +151 -0
  198. package/dist/content/examples/performance/tests/stale.scenario.json +111 -0
  199. package/dist/content/examples/performance/tests/telemetry-only.scenario.json +44 -0
  200. package/dist/content/examples/performance/tests/thresholds.scenario.json +147 -0
  201. package/dist/content/examples/performance/tests/waiting.scenario.json +105 -0
  202. package/dist/content/examples/performance/tsconfig.json +16 -0
  203. package/dist/content/examples/performance/view.ocml +18 -0
  204. package/dist/content/examples/playervox-journal/LICENSE +21 -0
  205. package/dist/content/examples/playervox-journal/README.md +150 -0
  206. package/dist/content/examples/playervox-journal/listing.json +19 -0
  207. package/dist/content/examples/playervox-journal/locales/en.json +25 -0
  208. package/dist/content/examples/playervox-journal/locales/fr.json +25 -0
  209. package/dist/content/examples/playervox-journal/logic.ts +556 -0
  210. package/dist/content/examples/playervox-journal/manifest.json +19 -0
  211. package/dist/content/examples/playervox-journal/package.json +16 -0
  212. package/dist/content/examples/playervox-journal/style.ocss +142 -0
  213. package/dist/content/examples/playervox-journal/submission.json +12 -0
  214. package/dist/content/examples/playervox-journal/tests/changes.scenario.json +482 -0
  215. package/dist/content/examples/playervox-journal/tests/delete.scenario.json +432 -0
  216. package/dist/content/examples/playervox-journal/tests/frame.scenario.json +169 -0
  217. package/dist/content/examples/playervox-journal/tests/load-logic.mjs +22 -0
  218. package/dist/content/examples/playervox-journal/tests/logic.test.mjs +349 -0
  219. package/dist/content/examples/playervox-journal/tests/paging.scenario.json +428 -0
  220. package/dist/content/examples/playervox-journal/tests/preview.scenario.json +184 -0
  221. package/dist/content/examples/playervox-journal/tests/read-only.scenario.json +157 -0
  222. package/dist/content/examples/playervox-journal/tests/refused.scenario.json +39 -0
  223. package/dist/content/examples/playervox-journal/tests/scale.scenario.json +286 -0
  224. package/dist/content/examples/playervox-journal/tests/signed-out.scenario.json +134 -0
  225. package/dist/content/examples/playervox-journal/tests/states.scenario.json +741 -0
  226. package/dist/content/examples/playervox-journal/tests/unavailable.scenario.json +183 -0
  227. package/dist/content/examples/playervox-journal/tsconfig.json +16 -0
  228. package/dist/content/examples/playervox-journal/view.ocml +52 -0
  229. package/dist/content/examples/playervox-rating/LICENSE +21 -0
  230. package/dist/content/examples/playervox-rating/README.md +166 -0
  231. package/dist/content/examples/playervox-rating/listing.json +19 -0
  232. package/dist/content/examples/playervox-rating/locales/en.json +35 -0
  233. package/dist/content/examples/playervox-rating/locales/fr.json +35 -0
  234. package/dist/content/examples/playervox-rating/logic.ts +581 -0
  235. package/dist/content/examples/playervox-rating/manifest.json +19 -0
  236. package/dist/content/examples/playervox-rating/package.json +16 -0
  237. package/dist/content/examples/playervox-rating/style.ocss +333 -0
  238. package/dist/content/examples/playervox-rating/submission.json +12 -0
  239. package/dist/content/examples/playervox-rating/tests/account.scenario.json +125 -0
  240. package/dist/content/examples/playervox-rating/tests/bounds.scenario.json +73 -0
  241. package/dist/content/examples/playervox-rating/tests/draft.scenario.json +199 -0
  242. package/dist/content/examples/playervox-rating/tests/form.scenario.json +142 -0
  243. package/dist/content/examples/playervox-rating/tests/load-logic.mjs +22 -0
  244. package/dist/content/examples/playervox-rating/tests/logic.test.mjs +346 -0
  245. package/dist/content/examples/playervox-rating/tests/offline.scenario.json +142 -0
  246. package/dist/content/examples/playervox-rating/tests/preview.scenario.json +44 -0
  247. package/dist/content/examples/playervox-rating/tests/publish-keyboard.scenario.json +221 -0
  248. package/dist/content/examples/playervox-rating/tests/publish-pointer.scenario.json +314 -0
  249. package/dist/content/examples/playervox-rating/tests/read-only.scenario.json +70 -0
  250. package/dist/content/examples/playervox-rating/tests/refused.scenario.json +45 -0
  251. package/dist/content/examples/playervox-rating/tests/states.scenario.json +362 -0
  252. package/dist/content/examples/playervox-rating/tsconfig.json +16 -0
  253. package/dist/content/examples/playervox-rating/view.ocml +62 -0
  254. package/dist/content/examples/playervox-reviews/LICENSE +21 -0
  255. package/dist/content/examples/playervox-reviews/README.md +194 -0
  256. package/dist/content/examples/playervox-reviews/listing.json +19 -0
  257. package/dist/content/examples/playervox-reviews/locales/en.json +32 -0
  258. package/dist/content/examples/playervox-reviews/locales/fr.json +32 -0
  259. package/dist/content/examples/playervox-reviews/logic.ts +822 -0
  260. package/dist/content/examples/playervox-reviews/manifest.json +30 -0
  261. package/dist/content/examples/playervox-reviews/package.json +16 -0
  262. package/dist/content/examples/playervox-reviews/style.ocss +260 -0
  263. package/dist/content/examples/playervox-reviews/submission.json +8 -0
  264. package/dist/content/examples/playervox-reviews/tests/account.scenario.json +249 -0
  265. package/dist/content/examples/playervox-reviews/tests/bounds.scenario.json +336 -0
  266. package/dist/content/examples/playervox-reviews/tests/changes.scenario.json +515 -0
  267. package/dist/content/examples/playervox-reviews/tests/filter.scenario.json +400 -0
  268. package/dist/content/examples/playervox-reviews/tests/frame.scenario.json +185 -0
  269. package/dist/content/examples/playervox-reviews/tests/keyboard.scenario.json +188 -0
  270. package/dist/content/examples/playervox-reviews/tests/load-logic.mjs +22 -0
  271. package/dist/content/examples/playervox-reviews/tests/logic.test.mjs +559 -0
  272. package/dist/content/examples/playervox-reviews/tests/offline-start.scenario.json +152 -0
  273. package/dist/content/examples/playervox-reviews/tests/offline.scenario.json +311 -0
  274. package/dist/content/examples/playervox-reviews/tests/paging.scenario.json +497 -0
  275. package/dist/content/examples/playervox-reviews/tests/preview.scenario.json +286 -0
  276. package/dist/content/examples/playervox-reviews/tests/reading.scenario.json +591 -0
  277. package/dist/content/examples/playervox-reviews/tests/refused.scenario.json +54 -0
  278. package/dist/content/examples/playervox-reviews/tests/scale.scenario.json +303 -0
  279. package/dist/content/examples/playervox-reviews/tests/states.scenario.json +700 -0
  280. package/dist/content/examples/playervox-reviews/tests/unavailable.scenario.json +192 -0
  281. package/dist/content/examples/playervox-reviews/tsconfig.json +16 -0
  282. package/dist/content/examples/playervox-reviews/view.ocml +110 -0
  283. package/dist/content/examples/playervox-score/LICENSE +21 -0
  284. package/dist/content/examples/playervox-score/README.md +131 -0
  285. package/dist/content/examples/playervox-score/listing.json +19 -0
  286. package/dist/content/examples/playervox-score/locales/en.json +23 -0
  287. package/dist/content/examples/playervox-score/locales/fr.json +23 -0
  288. package/dist/content/examples/playervox-score/logic.ts +430 -0
  289. package/dist/content/examples/playervox-score/manifest.json +47 -0
  290. package/dist/content/examples/playervox-score/package.json +16 -0
  291. package/dist/content/examples/playervox-score/style.ocss +247 -0
  292. package/dist/content/examples/playervox-score/submission.json +8 -0
  293. package/dist/content/examples/playervox-score/tests/grades.scenario.json +279 -0
  294. package/dist/content/examples/playervox-score/tests/load-logic.mjs +22 -0
  295. package/dist/content/examples/playervox-score/tests/logic.test.mjs +229 -0
  296. package/dist/content/examples/playervox-score/tests/options.scenario.json +302 -0
  297. package/dist/content/examples/playervox-score/tests/preview.scenario.json +68 -0
  298. package/dist/content/examples/playervox-score/tests/pulse.scenario.json +157 -0
  299. package/dist/content/examples/playervox-score/tests/refused.scenario.json +21 -0
  300. package/dist/content/examples/playervox-score/tests/signed-out.scenario.json +46 -0
  301. package/dist/content/examples/playervox-score/tests/states.scenario.json +450 -0
  302. package/dist/content/examples/playervox-score/tests/unavailable.scenario.json +84 -0
  303. package/dist/content/examples/playervox-score/tsconfig.json +16 -0
  304. package/dist/content/examples/playervox-score/view.ocml +51 -0
  305. package/dist/content/examples/session/LICENSE +21 -0
  306. package/dist/content/examples/session/README.md +57 -0
  307. package/dist/content/examples/session/listing.json +19 -0
  308. package/dist/content/examples/session/locales/en.json +3 -0
  309. package/dist/content/examples/session/locales/fr.json +3 -0
  310. package/dist/content/examples/session/logic.ts +26 -0
  311. package/dist/content/examples/session/manifest.json +19 -0
  312. package/dist/content/examples/session/package.json +16 -0
  313. package/dist/content/examples/session/style.ocss +16 -0
  314. package/dist/content/examples/session/submission.json +8 -0
  315. package/dist/content/examples/session/tests/hidden.scenario.json +45 -0
  316. package/dist/content/examples/session/tests/load-logic.mjs +22 -0
  317. package/dist/content/examples/session/tests/logic.test.mjs +37 -0
  318. package/dist/content/examples/session/tests/preview.scenario.json +28 -0
  319. package/dist/content/examples/session/tests/refused.scenario.json +20 -0
  320. package/dist/content/examples/session/tests/refused.test.mjs +16 -0
  321. package/dist/content/examples/session/tests/render.scenario.json +95 -0
  322. package/dist/content/examples/session/tests/ticks.scenario.json +139 -0
  323. package/dist/content/examples/session/tests/unknown.scenario.json +37 -0
  324. package/dist/content/examples/session/tsconfig.json +16 -0
  325. package/dist/content/examples/session/view.ocml +11 -0
  326. package/dist/content/examples/stopwatch/LICENSE +21 -0
  327. package/dist/content/examples/stopwatch/README.md +99 -0
  328. package/dist/content/examples/stopwatch/listing.json +19 -0
  329. package/dist/content/examples/stopwatch/locales/en.json +8 -0
  330. package/dist/content/examples/stopwatch/locales/fr.json +8 -0
  331. package/dist/content/examples/stopwatch/logic.ts +93 -0
  332. package/dist/content/examples/stopwatch/manifest.json +19 -0
  333. package/dist/content/examples/stopwatch/package.json +16 -0
  334. package/dist/content/examples/stopwatch/style.ocss +54 -0
  335. package/dist/content/examples/stopwatch/submission.json +12 -0
  336. package/dist/content/examples/stopwatch/tests/errors.scenario.json +121 -0
  337. package/dist/content/examples/stopwatch/tests/gesture.scenario.json +154 -0
  338. package/dist/content/examples/stopwatch/tests/hidden.scenario.json +57 -0
  339. package/dist/content/examples/stopwatch/tests/hundredths.scenario.json +173 -0
  340. package/dist/content/examples/stopwatch/tests/load-logic.mjs +22 -0
  341. package/dist/content/examples/stopwatch/tests/logic.test.mjs +99 -0
  342. package/dist/content/examples/stopwatch/tests/preview.scenario.json +36 -0
  343. package/dist/content/examples/stopwatch/tests/read-only.scenario.json +42 -0
  344. package/dist/content/examples/stopwatch/tests/read-only.test.mjs +18 -0
  345. package/dist/content/examples/stopwatch/tests/refused.scenario.json +22 -0
  346. package/dist/content/examples/stopwatch/tests/refused.test.mjs +18 -0
  347. package/dist/content/examples/stopwatch/tests/render.scenario.json +105 -0
  348. package/dist/content/examples/stopwatch/tests/states.scenario.json +246 -0
  349. package/dist/content/examples/stopwatch/tests/unknown.scenario.json +40 -0
  350. package/dist/content/examples/stopwatch/tsconfig.json +16 -0
  351. package/dist/content/examples/stopwatch/view.ocml +29 -0
  352. package/dist/content/examples/twitch-chat/LICENSE +21 -0
  353. package/dist/content/examples/twitch-chat/README.md +283 -0
  354. package/dist/content/examples/twitch-chat/listing.json +19 -0
  355. package/dist/content/examples/twitch-chat/locales/en.json +52 -0
  356. package/dist/content/examples/twitch-chat/locales/fr.json +52 -0
  357. package/dist/content/examples/twitch-chat/logic.ts +887 -0
  358. package/dist/content/examples/twitch-chat/manifest.json +33 -0
  359. package/dist/content/examples/twitch-chat/package.json +16 -0
  360. package/dist/content/examples/twitch-chat/style.ocss +544 -0
  361. package/dist/content/examples/twitch-chat/submission.json +12 -0
  362. package/dist/content/examples/twitch-chat/tests/account.scenario.json +325 -0
  363. package/dist/content/examples/twitch-chat/tests/burst.scenario.json +1866 -0
  364. package/dist/content/examples/twitch-chat/tests/channel-refused.scenario.json +372 -0
  365. package/dist/content/examples/twitch-chat/tests/channel.scenario.json +480 -0
  366. package/dist/content/examples/twitch-chat/tests/draft.scenario.json +279 -0
  367. package/dist/content/examples/twitch-chat/tests/fade.scenario.json +269 -0
  368. package/dist/content/examples/twitch-chat/tests/failures.scenario.json +420 -0
  369. package/dist/content/examples/twitch-chat/tests/favorites.scenario.json +376 -0
  370. package/dist/content/examples/twitch-chat/tests/frame.scenario.json +152 -0
  371. package/dist/content/examples/twitch-chat/tests/lifetime.scenario.json +186 -0
  372. package/dist/content/examples/twitch-chat/tests/load-logic.mjs +22 -0
  373. package/dist/content/examples/twitch-chat/tests/logic.test.mjs +1053 -0
  374. package/dist/content/examples/twitch-chat/tests/passive.scenario.json +536 -0
  375. package/dist/content/examples/twitch-chat/tests/preview.scenario.json +147 -0
  376. package/dist/content/examples/twitch-chat/tests/read-only.scenario.json +202 -0
  377. package/dist/content/examples/twitch-chat/tests/read-only.test.mjs +63 -0
  378. package/dist/content/examples/twitch-chat/tests/refused.scenario.json +65 -0
  379. package/dist/content/examples/twitch-chat/tests/refused.test.mjs +43 -0
  380. package/dist/content/examples/twitch-chat/tests/render.scenario.json +347 -0
  381. package/dist/content/examples/twitch-chat/tests/reply.scenario.json +384 -0
  382. package/dist/content/examples/twitch-chat/tests/send-refused.scenario.json +383 -0
  383. package/dist/content/examples/twitch-chat/tests/send.scenario.json +300 -0
  384. package/dist/content/examples/twitch-chat/tests/states.scenario.json +455 -0
  385. package/dist/content/examples/twitch-chat/tests/unavailable.scenario.json +256 -0
  386. package/dist/content/examples/twitch-chat/tests/unread.scenario.json +997 -0
  387. package/dist/content/examples/twitch-chat/tsconfig.json +16 -0
  388. package/dist/content/examples/twitch-chat/view.ocml +141 -0
  389. package/dist/content/examples/warframe-market/LICENSE +21 -0
  390. package/dist/content/examples/warframe-market/README.md +176 -0
  391. package/dist/content/examples/warframe-market/listing.json +19 -0
  392. package/dist/content/examples/warframe-market/locales/en.json +44 -0
  393. package/dist/content/examples/warframe-market/locales/fr.json +44 -0
  394. package/dist/content/examples/warframe-market/logic.ts +1265 -0
  395. package/dist/content/examples/warframe-market/manifest.json +92 -0
  396. package/dist/content/examples/warframe-market/package.json +16 -0
  397. package/dist/content/examples/warframe-market/style.ocss +422 -0
  398. package/dist/content/examples/warframe-market/submission.json +24 -0
  399. package/dist/content/examples/warframe-market/tests/bounds.scenario.json +60 -0
  400. package/dist/content/examples/warframe-market/tests/cached.scenario.json +70 -0
  401. package/dist/content/examples/warframe-market/tests/detail.scenario.json +251 -0
  402. package/dist/content/examples/warframe-market/tests/errors.scenario.json +105 -0
  403. package/dist/content/examples/warframe-market/tests/fixtures.json +295 -0
  404. package/dist/content/examples/warframe-market/tests/load-logic.mjs +22 -0
  405. package/dist/content/examples/warframe-market/tests/logic.test.mjs +505 -0
  406. package/dist/content/examples/warframe-market/tests/no-clipboard.scenario.json +104 -0
  407. package/dist/content/examples/warframe-market/tests/passive.scenario.json +87 -0
  408. package/dist/content/examples/warframe-market/tests/preview.scenario.json +146 -0
  409. package/dist/content/examples/warframe-market/tests/refresh.scenario.json +56 -0
  410. package/dist/content/examples/warframe-market/tests/refused.scenario.json +74 -0
  411. package/dist/content/examples/warframe-market/tests/render.scenario.json +210 -0
  412. package/dist/content/examples/warframe-market/tests/search.scenario.json +189 -0
  413. package/dist/content/examples/warframe-market/tests/unavailable.scenario.json +54 -0
  414. package/dist/content/examples/warframe-market/tsconfig.json +16 -0
  415. package/dist/content/examples/warframe-market/view.ocml +116 -0
  416. package/dist/content/examples/weather/LICENSE +20 -0
  417. package/dist/content/examples/weather/listing.json +10 -0
  418. package/dist/content/examples/weather/locales/en.json +9 -0
  419. package/dist/content/examples/weather/locales/fr.json +9 -0
  420. package/dist/content/examples/weather/logic.ts +62 -0
  421. package/dist/content/examples/weather/manifest.json +51 -0
  422. package/dist/content/examples/weather/package.json +15 -0
  423. package/dist/content/examples/weather/style.ocss +29 -0
  424. package/dist/content/examples/weather/submission.json +17 -0
  425. package/dist/content/examples/weather/tsconfig.json +16 -0
  426. package/dist/content/examples/weather/view.ocml +12 -0
  427. package/dist/content/index.json +3705 -0
  428. package/dist/content/reference/errors.json +1924 -0
  429. package/dist/content/reference/limits.json +1154 -0
  430. package/dist/content/reference/manifest.md +223 -0
  431. package/dist/content/reference/permissions.json +413 -0
  432. package/dist/content/templates/blank/locales/en.json +3 -0
  433. package/dist/content/templates/blank/locales/fr.json +3 -0
  434. package/dist/content/templates/blank/logic.ts +7 -0
  435. package/dist/content/templates/blank/manifest.json +16 -0
  436. package/dist/content/templates/blank/style.ocss +10 -0
  437. package/dist/content/templates/blank/tests/example.scenario.json +10 -0
  438. package/dist/content/templates/blank/view.ocml +6 -0
  439. package/dist/content/templates/chart/locales/en.json +3 -0
  440. package/dist/content/templates/chart/locales/fr.json +3 -0
  441. package/dist/content/templates/chart/logic.ts +27 -0
  442. package/dist/content/templates/chart/manifest.json +16 -0
  443. package/dist/content/templates/chart/style.ocss +27 -0
  444. package/dist/content/templates/chart/tests/example.scenario.json +10 -0
  445. package/dist/content/templates/chart/view.ocml +10 -0
  446. package/dist/content/templates/counter/locales/en.json +4 -0
  447. package/dist/content/templates/counter/locales/fr.json +4 -0
  448. package/dist/content/templates/counter/logic.ts +20 -0
  449. package/dist/content/templates/counter/manifest.json +16 -0
  450. package/dist/content/templates/counter/style.ocss +26 -0
  451. package/dist/content/templates/counter/tests/example.scenario.json +11 -0
  452. package/dist/content/templates/counter/view.ocml +13 -0
  453. package/dist/content/templates/list/locales/en.json +8 -0
  454. package/dist/content/templates/list/locales/fr.json +8 -0
  455. package/dist/content/templates/list/logic.ts +35 -0
  456. package/dist/content/templates/list/manifest.json +16 -0
  457. package/dist/content/templates/list/style.ocss +42 -0
  458. package/dist/content/templates/list/tests/example.scenario.json +10 -0
  459. package/dist/content/templates/list/view.ocml +17 -0
  460. package/dist/content/templates/shared/LICENSE +20 -0
  461. package/dist/content/templates/shared/package.json +14 -0
  462. package/dist/content/templates/shared/tsconfig.json +16 -0
  463. package/dist/content.js +68 -0
  464. package/dist/env.js +156 -0
  465. package/dist/fingerprint.js +32 -0
  466. package/dist/hidden.js +47 -0
  467. package/dist/ids.js +27 -0
  468. package/dist/index.js +82 -0
  469. package/dist/knowledge.js +222 -0
  470. package/dist/npm.js +149 -0
  471. package/dist/prompts.js +47 -0
  472. package/dist/resources.js +82 -0
  473. package/dist/run.js +120 -0
  474. package/dist/server.js +43 -0
  475. package/dist/session.js +205 -0
  476. package/dist/sources.js +218 -0
  477. package/dist/text.js +80 -0
  478. package/dist/texts.js +44 -0
  479. package/dist/tools/audit.js +105 -0
  480. package/dist/tools/build.js +453 -0
  481. package/dist/tools/common.js +122 -0
  482. package/dist/tools/docs.js +196 -0
  483. package/dist/tools/preview.js +87 -0
  484. package/dist/tools/project.js +183 -0
  485. package/dist/tools/setup.js +146 -0
  486. package/dist/tools/submission.js +369 -0
  487. package/dist/version.js +3 -0
  488. package/npm-shrinkwrap.json +402 -0
  489. package/package.json +50 -4
@@ -0,0 +1,183 @@
1
+ {
2
+ "scenarioVersion": 1,
3
+ "name": "unavailable",
4
+ "description": "The host's journal source fails: the subscription ends with unavailable, the widget shows it without the last sessions, subscribes again 5 s later and reads the journal the restarted source reports.",
5
+ "fixtures": {
6
+ "calls": {
7
+ "journal.page": [
8
+ {
9
+ "value": {
10
+ "gameName": "Portal 2",
11
+ "items": [
12
+ {
13
+ "id": "00000000-0000-4000-8000-000000000013",
14
+ "startedAt": 1789929000000,
15
+ "offsetMinutes": 120,
16
+ "durationMs": 2700000,
17
+ "source": "local"
18
+ },
19
+ {
20
+ "id": "00000000-0000-4000-8000-000000000012",
21
+ "startedAt": 1789844700000,
22
+ "offsetMinutes": 120,
23
+ "durationMs": 7920000,
24
+ "source": "cloud"
25
+ },
26
+ {
27
+ "id": "00000000-0000-4000-8000-000000000011",
28
+ "startedAt": 1789629300000,
29
+ "offsetMinutes": 120,
30
+ "durationMs": 480000,
31
+ "source": "local"
32
+ },
33
+ {
34
+ "id": "00000000-0000-4000-8000-000000000010",
35
+ "startedAt": 1789214400000,
36
+ "offsetMinutes": 120,
37
+ "durationMs": 14400000,
38
+ "source": "cloud"
39
+ },
40
+ {
41
+ "id": "00000000-0000-4000-8000-000000000009",
42
+ "startedAt": 1788640920000,
43
+ "offsetMinutes": 120,
44
+ "durationMs": 3660000,
45
+ "source": "local"
46
+ }
47
+ ],
48
+ "page": 1,
49
+ "next": "c2",
50
+ "previous": null
51
+ }
52
+ },
53
+ {
54
+ "value": {
55
+ "gameName": "Portal 2",
56
+ "items": [
57
+ {
58
+ "id": "00000000-0000-4000-8000-000000000013",
59
+ "startedAt": 1789929000000,
60
+ "offsetMinutes": 120,
61
+ "durationMs": 2700000,
62
+ "source": "local"
63
+ },
64
+ {
65
+ "id": "00000000-0000-4000-8000-000000000012",
66
+ "startedAt": 1789844700000,
67
+ "offsetMinutes": 120,
68
+ "durationMs": 7920000,
69
+ "source": "cloud"
70
+ },
71
+ {
72
+ "id": "00000000-0000-4000-8000-000000000011",
73
+ "startedAt": 1789629300000,
74
+ "offsetMinutes": 120,
75
+ "durationMs": 480000,
76
+ "source": "local"
77
+ },
78
+ {
79
+ "id": "00000000-0000-4000-8000-000000000010",
80
+ "startedAt": 1789214400000,
81
+ "offsetMinutes": 120,
82
+ "durationMs": 14400000,
83
+ "source": "cloud"
84
+ },
85
+ {
86
+ "id": "00000000-0000-4000-8000-000000000009",
87
+ "startedAt": 1788640920000,
88
+ "offsetMinutes": 120,
89
+ "durationMs": 3660000,
90
+ "source": "local"
91
+ }
92
+ ],
93
+ "page": 1,
94
+ "next": "c2",
95
+ "previous": null
96
+ }
97
+ }
98
+ ]
99
+ },
100
+ "subscriptions": {
101
+ "journal.subscribe": {
102
+ "revision": 1,
103
+ "notice": null
104
+ }
105
+ }
106
+ },
107
+ "steps": [
108
+ {
109
+ "expect": {
110
+ "text": [
111
+ "Portal 2"
112
+ ],
113
+ "state": "running",
114
+ "calls": [
115
+ {
116
+ "service": "journal.subscribe",
117
+ "outcome": "ok"
118
+ },
119
+ {
120
+ "service": "journal.page",
121
+ "outcome": "ok"
122
+ }
123
+ ]
124
+ }
125
+ },
126
+ {
127
+ "publish": {
128
+ "service": "journal.subscribe",
129
+ "error": "unavailable"
130
+ }
131
+ },
132
+ {
133
+ "expect": {
134
+ "text": [
135
+ "The journal is unavailable. Retrying automatically."
136
+ ],
137
+ "noText": [
138
+ "Portal 2",
139
+ "Page 1"
140
+ ],
141
+ "image": "unavailable"
142
+ }
143
+ },
144
+ {
145
+ "advance": {
146
+ "ms": 4999
147
+ }
148
+ },
149
+ {
150
+ "expect": {
151
+ "calls": []
152
+ }
153
+ },
154
+ {
155
+ "advance": {
156
+ "ms": 1
157
+ }
158
+ },
159
+ {
160
+ "expect": {
161
+ "text": [
162
+ "Portal 2",
163
+ "Page 1"
164
+ ],
165
+ "noText": [
166
+ "The journal is unavailable. Retrying automatically."
167
+ ],
168
+ "calls": [
169
+ {
170
+ "service": "journal.subscribe",
171
+ "outcome": "ok"
172
+ },
173
+ {
174
+ "service": "journal.page",
175
+ "params": {},
176
+ "outcome": "ok"
177
+ }
178
+ ],
179
+ "image": "recovered"
180
+ }
181
+ }
182
+ ]
183
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2023",
4
+ "lib": ["ES2023"],
5
+ "types": [],
6
+ "module": "ES2022",
7
+ "moduleResolution": "bundler",
8
+ "strict": true,
9
+ "noEmit": true,
10
+ "isolatedModules": true,
11
+ "verbatimModuleSyntax": true,
12
+ "noUncheckedIndexedAccess": true,
13
+ "exactOptionalPropertyTypes": true
14
+ },
15
+ "include": ["logic.ts"]
16
+ }
@@ -0,0 +1,52 @@
1
+ <!-- PlayerVox Journal: the finished sessions of the active game, five per
2
+ page, with the trash and paging buttons in Interactive mode (parity
3
+ sheet: playervox-overcrow docs/builtin-parity/playervox-journal.md).
4
+ The host confirms a deletion in its own chrome. -->
5
+ <box class="journal" label={t("label")}>
6
+ <box class="header">
7
+ <text class="title">{t("label")}</text>
8
+ <canvas ref="mark" class="mark" label={t("mark")}/>
9
+ </box>
10
+ <if test={message(state.problem, state.notice) != ""}>
11
+ <text class="message">{message(state.problem, state.notice)}</text>
12
+ </if>
13
+ <if test={state.phase == "loading"}>
14
+ <text class="status">{t("loading")}</text>
15
+ </if>
16
+ <if test={state.phase == "idle"}>
17
+ <text class="status">{t("waiting")}</text>
18
+ </if>
19
+ <if test={state.phase == "ready"}>
20
+ <if test={gameName(state.page) != ""}>
21
+ <text class="game" tooltip={cutBytes(gameName(state.page), 256)}>{gameName(state.page)}</text>
22
+ </if>
23
+ <if test={state.page.items.length == 0}>
24
+ <text class="status">{t("empty")}</text>
25
+ </if>
26
+ <for each={rows(state.page)} as="row" key={row.id}>
27
+ <separator class="rule"/>
28
+ <box class="row" label={row.label}>
29
+ <text class="start">{row.start}</text>
30
+ <text class="duration">{row.duration}</text>
31
+ <if test={canRemove(state.interactive)}>
32
+ <button class="control" label={t("delete")} tooltip={t("delete")} disabled={state.busy} on:activate={remove(row.id)}>
33
+ <icon name="trash"/>
34
+ </button>
35
+ </if>
36
+ </box>
37
+ </for>
38
+ <if test={paged(state.page)}>
39
+ <box class="footer">
40
+ <if test={state.interactive}>
41
+ <button class="control" label={t("previous")} tooltip={t("previous")} disabled={state.busy || state.page.previous == null} on:activate={turn("previous")}>
42
+ <icon name="chevron-left"/>
43
+ </button>
44
+ <button class="control" label={t("next")} tooltip={t("next")} disabled={state.busy || state.page.next == null} on:activate={turn("next")}>
45
+ <icon name="chevron-right"/>
46
+ </button>
47
+ </if>
48
+ <text class="page">{pageLabel(state.page)}</text>
49
+ </box>
50
+ </if>
51
+ </if>
52
+ </box>
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Valhallab SASU
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
6
+ this software and associated documentation files (the "Software"), to deal in
7
+ the Software without restriction, including without limitation the rights to
8
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
9
+ the Software, and to permit persons to whom the Software is furnished to do so,
10
+ subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,166 @@
1
+ # My rating (PlayerVox Rating)
2
+
3
+ `com.playervox.overcrow.playervox.rating` — your own PlayerVox rating of the
4
+ Steam game you play: its grade badge (S+ to F) and score out of 100, and in
5
+ Interactive mode a form with three criteria (Gameplay, Art, Technology) and
6
+ an optional review, to publish or update the rating on PlayerVox. It needs
7
+ your PlayerVox account. A built-in of OverCrow, written against the public
8
+ `@overcrow/sdk` and packaged with `overcrow-widget` like any creator's
9
+ widget. MIT.
10
+
11
+ ## What it shows
12
+
13
+ | State | Shows |
14
+ | --- | --- |
15
+ | Rated | the game's name, the badge, "93 /100", "Your published rating" / "Votre note publiée" |
16
+ | Not rated yet | the game's name, a neutral `--` badge, "-- /100", "Not rated yet" / "Pas encore noté" |
17
+ | Waiting for PlayerVox | a `--` badge and "Loading…" / "Chargement…": after a game switch too, never the previous game's rating |
18
+ | No game | "Waiting for a game" / "En attente du jeu" |
19
+ | A game without a Steam app ID | "Game not linked" / "Jeu non associé", "Steam game required" / "Jeu Steam requis" |
20
+ | The rating cannot be read | "Rating unavailable" / "Note indisponible", "PlayerVox is unavailable for this game right now." |
21
+ | Offline | the last rating read; OverCrow adds its own notice under the content |
22
+ | No account, a sign-in in progress, an expired session | nothing of the widget: OverCrow covers it with its account panel (link or create an account, reopen the browser, cancel) |
23
+ | No permission to read | "Rating unavailable", "Allow access to your rating in the Control Center.": the widget asks OverCrow nothing |
24
+
25
+ The score is the mean of the three criteria, rounded half away from zero
26
+ (96, 88 and 94 show "93"); the grade is the mean's: S+ ≥ 90, S ≥ 80, A ≥ 70,
27
+ B ≥ 60, C ≥ 40, D ≥ 20, else F. The badge and the PlayerVox mark are drawn
28
+ from the source shared with PlayerVox Score
29
+ ([widgets-shared](../../widgets-shared/README.md)); the badge pulses once
30
+ when a published rating shows or changes, never for a draft.
31
+
32
+ In Passive mode the widget shows only the published rating: no form, no
33
+ draft.
34
+
35
+ ## The form (Interactive mode)
36
+
37
+ | Control | |
38
+ | --- | --- |
39
+ | Gameplay, Art / Artistique, Technology / Technique | sliders from 0 to 100 by 1, their value beside them |
40
+ | REVIEW · OPTIONAL / AVIS · FACULTATIF | a text area, "What stood out to you?", at most 2000 characters |
41
+ | The button | "Publish my rating" before the first rating, "Update my rating" after; "Saving…" while OverCrow sends it; "Saved on PlayerVox" once stored, until the next change |
42
+
43
+ - **The form is OverCrow's.** Its sliders and its review are host-owned
44
+ controls of a `form` bound to the `playervox.rating.publish` intent: the
45
+ view gives them no `value`. OverCrow fills them with your published
46
+ rating, or with 50 / 50 / 50 and an empty review before the first one,
47
+ and tells the logic each value through the control's `input` event. The
48
+ logic only follows them, to show the draft's mean and to know whether
49
+ something changed.
50
+ - **Publishing** takes your gesture: a click on the button, Enter or Space
51
+ on it, or Ctrl+Enter in the review. OverCrow then sends the values of
52
+ its own controls; the logic never supplies them and cannot submit the
53
+ form itself. An unchanged review is not sent again; an emptied one
54
+ removes the published review.
55
+ - **The button is active** when PlayerVox is reachable and there is
56
+ something to send: a first rating, or a change. While the score beside
57
+ the badge is a draft's, the caption reads "Unpublished draft" /
58
+ "Brouillon non publié".
59
+ - **The draft is kept by OverCrow**: through Passive mode (the form stays
60
+ in the view, hidden), through a failed publication, and when the rating
61
+ changes elsewhere while you edit. An untouched form follows the new
62
+ rating. Another game, or another PlayerVox user, starts from its own
63
+ rating.
64
+ - **Once stored**, the rating comes back through the subscription: the
65
+ widget reads nothing again.
66
+ - **Offline**, the form shows "Offline · Your changes stay here until you
67
+ save them." and takes no input.
68
+
69
+ ### When a publication fails
70
+
71
+ The draft stays, the button comes back, and a message shows above it:
72
+
73
+ | OverCrow's answer | Message |
74
+ | --- | --- |
75
+ | `invalid_request` (PlayerVox refused the values, or the game is not released) | "Check the values and try saving again." |
76
+ | `not_connected` (the session ended) | "Your connection expired. Link your account again." |
77
+ | `busy` (another publication is in flight, or too many requests) | "An operation is already in progress. Please try again shortly." |
78
+ | `stale_context` (the game or the account changed meanwhile) | "The account or game changed. Review your changes before saving." |
79
+ | `permission_denied` | "This action is not available for your account." |
80
+ | `unavailable`, `timeout` (no answer from PlayerVox within 30 s) and any other | "PlayerVox is unavailable for this game right now." |
81
+
82
+ Should OverCrow give no answer at all, the button comes back after 40 s
83
+ with the last message.
84
+
85
+ ## Controls
86
+
87
+ Tab moves through the three sliders, the review and the button. On a
88
+ slider: the arrow keys move by 1, Page Up and Page Down by 10, Home and
89
+ End to the ends; a click or a drag on the track sets it. The keyboard goes
90
+ to the widget the pointer rests on.
91
+
92
+ ## Menu
93
+
94
+ No row of its own.
95
+
96
+ ## Size
97
+
98
+ 350 px wide by default, from 280 px; the height fits the content: the
99
+ summary alone in Passive mode, the form below it in Interactive mode.
100
+
101
+ ## Permissions
102
+
103
+ - `playervox.rating.read`: your own rating of the active game, with the
104
+ game's name. Sensitive.
105
+ - `playervox.rating.write`: publish a rating and a review through the
106
+ host-bound form. Sensitive.
107
+
108
+ As sensitive capabilities rule out the network and the clipboard, the
109
+ widget declares neither, and no storage: it keeps nothing. OverCrow reads
110
+ the rating and sends the publication with your PlayerVox session
111
+ (`api.playervox.com`); it reads the rating only while this widget
112
+ subscribes. With the read permission alone the widget shows the rating and
113
+ no form.
114
+
115
+ ## Tests
116
+
117
+ - `tests/logic.test.mjs`: the logic on `@overcrow/sdk/testing`: every state's
118
+ text, the draft's mean and rounding, when the button is active, the
119
+ Publish, Saving, Saved cycle, each failure's message, the 40 s bound, one
120
+ pulse per new published rating, the retry of a failed subscription.
121
+ - Scenarios, played in OverCrow's headless runtime
122
+ (`overcrow-widget test --runtime …`), with their reference images in
123
+ `tests/reference/`:
124
+
125
+ | Scenario | Covers |
126
+ | --- | --- |
127
+ | `states` | every state in Passive mode, dark English and light French, 100 % and 150 % |
128
+ | `form` | the form filled by OverCrow, rated and not rated yet, both themes and languages, 150 %, 280 px wide |
129
+ | `publish-keyboard` | Tab, an arrow key, Enter on the button, then Ctrl+Enter in the review: what OverCrow sends, Saved |
130
+ | `publish-pointer` | a first rating with the pointer, then Saving with no answer, `unavailable`, `busy`, `timeout`, `stale_context` and `not_connected` |
131
+ | `offline` | the last rating, OverCrow's notice, a form that takes no input, then online again |
132
+ | `account` | OverCrow's account panel signed out, pending and expired, in both modes; no input reaches the widget |
133
+ | `draft` | the draft through Passive mode and a rating published elsewhere; an untouched form follows; another game |
134
+ | `bounds` | a long game name; a review cut at 2000 characters by OverCrow's field |
135
+ | `refused` | no grant: no call, "Rating unavailable" |
136
+ | `read-only` | the read grant alone: the rating, never the form |
137
+
138
+ A publication refused because no gesture made it (`gesture_required`)
139
+ cannot be played by a scenario, where every submission is a gesture:
140
+ OverCrow tests it with this package in its own repository.
141
+
142
+ ## Cost
143
+
144
+ Measured on 2026-10-01 with OverCrow's release build, on an AMD Ryzen 7
145
+ 5800X3D Linux workstation and in a Windows 11 virtual machine (2 vCPU),
146
+ with a published rating and its review:
147
+
148
+ | | Linux | Windows (VM) |
149
+ | --- | --- | --- |
150
+ | Widget start, warm, into the overlay's runtime | 8.7 ms (p50), 8.8 ms at most | VM ready in 14–15 ms (p50) |
151
+ | VM memory | 0.79 MiB private, 0.97 MiB PSS | 1.15 MiB private working set, 1.43 MiB private commit |
152
+ | Private memory in all (VM, sandbox helpers, overlay share) | 8.7–11.2 MB | — |
153
+ | CPU at rest, Passive mode | 0.05 % of one core, no frame | — |
154
+ | CPU at rest, the form open | 0.03–0.05 % of one core, no frame | — |
155
+ | CPU, a slider changed and the rating published every 2 s | 0.30 % of one core: the frames of the keys, the outcome and the badge's pulse (about 36 frames of 0.10 ms), then none | — |
156
+ | CPU, hidden, a new rating every 2 s | 0.05 % of one core | — |
157
+ | VM CPU | one short turn per rating or form value; none at rest | — |
158
+
159
+ A rating changes when you publish one: the 2 s load is a stress. The
160
+ private memory is above OverCrow's 8 MB goal per widget by up to 3 MB and
161
+ far under its 80 MB ceiling. The egui widget it replaces painted in the
162
+ overlay's own process (0.05 ms a frame in Passive mode, 0.09 ms with its
163
+ form) and repainted each second while a publication was pending; OverCrow
164
+ read the rating whenever that widget was enabled, and now only while this
165
+ widget subscribes. Scenarios render the same images on Linux and Windows,
166
+ pixel for pixel.
@@ -0,0 +1,19 @@
1
+ {
2
+ "author": "PlayerVox",
3
+ "spdxLicense": "MIT",
4
+ "sourceUrl": "https://github.com/Valhallab/playervox-overcrow-releases/tree/main/widgets/playervox-rating",
5
+ "preview": "assets/preview.png",
6
+ "defaultLocale": "en",
7
+ "localizations": [
8
+ {
9
+ "locale": "en",
10
+ "name": "My rating",
11
+ "description": "Your own PlayerVox rating of the Steam game you play: its grade and score, and in Interactive mode three criteria and an optional review to publish or update. Needs your PlayerVox account."
12
+ },
13
+ {
14
+ "locale": "fr",
15
+ "name": "Ma note",
16
+ "description": "Votre note PlayerVox du jeu Steam auquel vous jouez : son grade et son score, et en mode interactif trois critères et un avis facultatif à publier ou mettre à jour. Nécessite votre compte PlayerVox."
17
+ }
18
+ ]
19
+ }
@@ -0,0 +1,35 @@
1
+ {
2
+ "label": "My PlayerVox rating",
3
+ "title": "My rating",
4
+ "mark": "PlayerVox",
5
+ "waiting": "Waiting for a game",
6
+ "unsupported": "Game not linked",
7
+ "steam-required": "Steam game required",
8
+ "loading": "Loading…",
9
+ "unavailable": "Rating unavailable",
10
+ "retrying": "PlayerVox is unavailable for this game right now.",
11
+ "no-permission": "Allow access to your rating in the Control Center.",
12
+ "unrated": "Not rated yet",
13
+ "published": "Your published rating",
14
+ "draft": "Unpublished draft",
15
+ "gameplay": "Gameplay",
16
+ "art": "Art",
17
+ "tech": "Technology",
18
+ "grade": "Grade",
19
+ "no-grade": "No grade",
20
+ "review-optional": "REVIEW · OPTIONAL",
21
+ "review-label": "Review, optional",
22
+ "review-hint": "What stood out to you?",
23
+ "publish": "Publish my rating",
24
+ "update": "Update my rating",
25
+ "saving": "Saving…",
26
+ "saved": "Saved on PlayerVox",
27
+ "publish-hint": "Your rating and review will be visible on PlayerVox.",
28
+ "offline": "Offline · Your changes stay here until you save them.",
29
+ "error-invalid": "Check the values and try saving again.",
30
+ "error-expired": "Your connection expired. Link your account again.",
31
+ "error-busy": "An operation is already in progress. Please try again shortly.",
32
+ "error-stale": "The account or game changed. Review your changes before saving.",
33
+ "error-forbidden": "This action is not available for your account.",
34
+ "error-unavailable": "PlayerVox is unavailable for this game right now."
35
+ }
@@ -0,0 +1,35 @@
1
+ {
2
+ "label": "Ma note PlayerVox",
3
+ "title": "Ma note",
4
+ "mark": "PlayerVox",
5
+ "waiting": "En attente du jeu",
6
+ "unsupported": "Jeu non associé",
7
+ "steam-required": "Jeu Steam requis",
8
+ "loading": "Chargement…",
9
+ "unavailable": "Note indisponible",
10
+ "retrying": "PlayerVox est indisponible pour ce jeu pour le moment.",
11
+ "no-permission": "Autorisez l’accès à votre note dans le Centre de contrôle.",
12
+ "unrated": "Pas encore noté",
13
+ "published": "Votre note publiée",
14
+ "draft": "Brouillon non publié",
15
+ "gameplay": "Gameplay",
16
+ "art": "Artistique",
17
+ "tech": "Technique",
18
+ "grade": "Note",
19
+ "no-grade": "Pas de note",
20
+ "review-optional": "AVIS · FACULTATIF",
21
+ "review-label": "Avis, facultatif",
22
+ "review-hint": "Qu’est-ce qui vous a marqué ?",
23
+ "publish": "Publier ma note",
24
+ "update": "Mettre à jour ma note",
25
+ "saving": "Enregistrement…",
26
+ "saved": "Enregistré sur PlayerVox",
27
+ "publish-hint": "Votre note et votre avis seront visibles sur PlayerVox.",
28
+ "offline": "Hors ligne · Vos modifications restent ici jusqu’à leur enregistrement.",
29
+ "error-invalid": "Vérifiez les valeurs et réessayez d’enregistrer.",
30
+ "error-expired": "Votre connexion a expiré. Reliez votre compte.",
31
+ "error-busy": "Une opération est en cours. Réessayez dans un instant.",
32
+ "error-stale": "Le compte ou le jeu a changé. Vérifiez vos modifications avant d’enregistrer.",
33
+ "error-forbidden": "Cette action n’est pas disponible pour votre compte.",
34
+ "error-unavailable": "PlayerVox est indisponible pour ce jeu pour le moment."
35
+ }