@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,129 @@
1
+ # Sécurité
2
+
3
+ PlayerVox OverCrow traite chaque widget comme du code non fiable, widgets
4
+ intégrés PlayerVox compris : les mêmes vérifications du paquet, le même sandbox, les
5
+ mêmes permissions et le même consentement s’appliquent à un widget
6
+ PlayerVox et au vôtre. Cette page décrit ce que cela implique pour l’auteur
7
+ d’un widget.
8
+
9
+ ## Le sandbox
10
+
11
+ Chaque widget tourne derrière deux barrières.
12
+
13
+ 1. **La VM.** Votre `logic.js` s’exécute dans sa propre machine virtuelle
14
+ QuickJS, avec un tas plafonné, un budget de temps par tour, une pile et
15
+ des files limitées. Il n’y a ni `eval`, ni constructeur `Function`, ni
16
+ chargeur de modules, ni `WebAssembly`, ni mémoire partagée ; la seule
17
+ globale en plus d’ECMAScript est le SDK, figé. L’heure locale est UTC :
18
+ le SDK applique pour vous le décalage de l’utilisateur.
19
+ 2. **Le processus.** Chaque VM tourne dans son propre processus du système,
20
+ qui n’a besoin ni d’affichage, ni de GPU, ni de réseau, ni de fichiers :
21
+ son sandbox les lui retire tous. Sous Linux, des namespaces Bubblewrap,
22
+ une liste blanche seccomp qui tue le processus à toute tentative
23
+ d’ouvrir un fichier, un socket ou un autre processus, et un cgroup par
24
+ widget. Sous Windows, un AppContainer « Less Privileged » sans
25
+ capability, un Job Object par widget, et des mitigations de processus
26
+ qui interdisent le code dynamique et le système de fenêtres.
27
+
28
+ OverCrow dessine tout lui-même : la VM envoie une description de la vue,
29
+ jamais de pixels, et n’exécute jamais de code dans le processus d’OverCrow.
30
+ Le survol, le focus, l’état pressé et les transitions sont résolus par
31
+ OverCrow : un widget n’observe pas les mouvements du pointeur qu’il n’a pas
32
+ demandés par un événement.
33
+
34
+ Un dépassement de budget n’arrête que ce widget. OverCrow affiche une
35
+ erreur fixe dans son cadre et le relance après 1, 5 puis 15 secondes, trois
36
+ fois au plus ; une erreur de paquet ou de protocole attend que
37
+ l’utilisateur le réactive. Les chiffres figurent dans les
38
+ [limites](limits.md#logique).
39
+
40
+ ## Permissions et consentement
41
+
42
+ Un widget n’obtient rien qu’il n’ait déclaré dans `manifest.json`, et une
43
+ déclaration n’accorde rien à elle seule. À l’installation du widget, le
44
+ Centre de contrôle propose chaque permission cochée, et l’utilisateur peut
45
+ en décocher. Ensuite, l’utilisateur autorise ou retire chaque permission
46
+ dans le Centre de contrôle ; en retirer une redémarre le widget sans elle.
47
+ OverCrow vérifie de nouveau la permission à chaque appel
48
+ d’un service.
49
+
50
+ Quatre permissions ouvrent les services généraux : `network` (des routes
51
+ HTTPS exactes, par le broker d’OverCrow), `storage` (un stockage clé-valeur
52
+ pour ce seul widget), `clipboardWrite` (l’écriture de texte, pendant une
53
+ action de l’utilisateur) et `gameEvents` (des événements de jeu nommés).
54
+
55
+ Les capabilities donnent accès à des données et à des actions d’OverCrow et
56
+ des comptes de l’utilisateur. Une capability **sensible** révèle des
57
+ données personnelles ou le jeu en cours : un widget qui en déclare une ne
58
+ peut pas déclarer aussi `network` ni `clipboardWrite`, et son stockage ne
59
+ dure que le temps de son processus, pour que ces données ne puissent pas
60
+ quitter la machine par le widget.
61
+
62
+ Les connexions aux comptes (PlayerVox, Twitch) appartiennent à OverCrow :
63
+ la connexion, les codes et les jetons sont affichés et conservés par
64
+ OverCrow, et un widget ne reçoit que les données que décrit sa capability.
65
+
66
+ Chaque permission, chaque capability et les services qu’elle ouvre sont
67
+ décrits dans [services et permissions](services.md). Déclarez le strict
68
+ nécessaire : les relecteurs lisent chaque permission et chaque route, et
69
+ les utilisateurs les voient avant de donner leur accord. Les widgets
70
+ marqués `built-in` dans le catalogue signé (widgets PlayerVox uniquement)
71
+ démarrent avec leurs permissions déclarées accordées ; une mise à jour qui
72
+ en demande davantage exige l’accord de l’utilisateur, widgets intégrés
73
+ PlayerVox compris.
74
+
75
+ ## Actions de l’utilisateur
76
+
77
+ Les services qui changent quelque chose pour l’utilisateur ne peuvent être
78
+ appelés que pendant que la logique traite une vraie action de l’utilisateur
79
+ dans le widget : un clic, une touche, une modification, la validation d’un
80
+ formulaire. Un appel depuis un minuteur, une réponse de service ou une
81
+ ligne du menu d’options est refusé avec `gesture_required`. Les widgets ne
82
+ reçoivent d’entrées qu’en mode interactif d’OverCrow ; en mode passif, les
83
+ clics les traversent. Supprimer une note ou une session du journal demande
84
+ aussi une confirmation à l’utilisateur, dans une boîte de dialogue dessinée
85
+ par OverCrow. Voir
86
+ [les appels qui demandent une action de l’utilisateur](services.md#les-appels-qui-demandent-une-action-de-lutilisateur).
87
+
88
+ Ce que l’utilisateur écrit dans ses notes, dans un avis PlayerVox et dans
89
+ le chat ne passe jamais par votre logique : un `form` doté d’un `intent` envoie les
90
+ valeurs de ses propres champs de texte et curseurs, qu’OverCrow remplit,
91
+ modifie et valide lui-même. Votre logique peut les lire, pas les écrire.
92
+ Voir
93
+ [les formulaires qui écrivent des données de l’utilisateur](forms.md#les-formulaires-qui-écrivent-des-données-de-lutilisateur).
94
+
95
+ ## Ce qu’un widget ne peut pas faire
96
+
97
+ - Lire ou écrire des fichiers, ouvrir des sockets, joindre le réseau local
98
+ ou une adresse que son manifeste ne déclare pas.
99
+ - Lancer des processus, charger du code natif, compiler du code à
100
+ l’exécution ou télécharger du code : le seul code est le `logic.js` relu
101
+ du paquet.
102
+ - Voir les autres widgets, leur état, leur stockage ou leurs permissions,
103
+ ni la mémoire, la fenêtre ou les entrées du jeu. OverCrow ne s’injecte
104
+ jamais dans le jeu.
105
+ - Dessiner hors de son cadre, couvrir ou imiter le cadre, les menus ou les
106
+ confirmations d’OverCrow.
107
+ - Lire des jetons de compte, des cookies ou des identifiants.
108
+ - Lire le presse-papiers.
109
+ - Écrire des journaux en production : la sortie de `log.*` n’apparaît que
110
+ dans une session de développement locale.
111
+ - S’accorder une permission, ou utiliser une ligne de menu comme action de
112
+ l’utilisateur.
113
+
114
+ ## Ce qu’OverCrow vérifie
115
+
116
+ Chaque paquet est vérifié lors de son admission au catalogue, puis chaque
117
+ fois qu’OverCrow le démarre : le catalogue signé, le registre de ses
118
+ fichiers et la vue compilée doivent concorder, sinon le widget ne démarre
119
+ pas. Voir [le paquet](package.md#comment-overcrow-vérifie-un-paquet) et
120
+ [publication et revue](publishing.md).
121
+
122
+ Une version du catalogue peut être suspendue ou révoquée après sa
123
+ publication : OverCrow arrête alors la copie installée. Voir
124
+ [statuts des versions](publishing.md#statuts-des-versions).
125
+
126
+ ## Signaler une vulnérabilité
127
+
128
+ Signalez les vulnérabilités en privé, comme le décrit la
129
+ [politique de sécurité](../../../SECURITY.md) du dépôt.
@@ -0,0 +1,346 @@
1
+ # Référence des services
2
+
3
+ Tous les services que la logique d’un widget PlayerVox OverCrow peut
4
+ appeler, avec ce que chacun exige, le moment où il peut être appelé, ses
5
+ paramètres et son résultat. [Services et permissions](services.md) explique
6
+ le fonctionnement des appels, des abonnements, des erreurs et des actions de
7
+ l’utilisateur ; cette page en est la liste.
8
+
9
+ <!-- source: widgets/stopwatch/logic.ts -->
10
+ ```ts
11
+ if (canRead) {
12
+ state.stopwatch = next;
13
+ }
14
+ },
15
+ () => {},
16
+ );
17
+ }
18
+ ```
19
+
20
+ Dans le SDK, un service `stopwatch.subscribe` est la fonction
21
+ `stopwatch.subscribe` de l’espace de noms `stopwatch`. Un appel renvoie une
22
+ promesse de son résultat ; un abonnement prend un écouteur qui reçoit chaque
23
+ mise à jour.
24
+
25
+ ## Lire la fiche d’un service
26
+
27
+ - **Nature** : un *appel, à réponse unique* reçoit une seule réponse ; un
28
+ *abonnement* livre une valeur immédiatement, puis chaque nouvelle valeur.
29
+ - **Exige** : la permission ou la capability à déclarer dans
30
+ [le manifeste](manifest.md#permissions), et que l’utilisateur doit
31
+ accorder.
32
+ - **Quand l’appeler** : *À tout moment*, ou
33
+ [*Seulement pendant une action de l’utilisateur*](services.md#les-appels-qui-demandent-une-action-de-lutilisateur).
34
+ - **Paramètres** : les membres de l’objet à passer ; un `?` marque un membre
35
+ facultatif. Un type tel que « texte ≤ 128 octets » donne une
36
+ [limite](limits.md).
37
+ - **Résultat**, ou **Chaque mise à jour** pour un abonnement : ce que répond
38
+ le service, et les codes d’erreur qui lui sont propres. Tout service peut
39
+ aussi échouer avec les [codes d’erreur](services.md#erreurs) généraux.
40
+ - **Forme** : le type du résultat, décrit dans
41
+ [formes de résultat](result-shapes.md).
42
+
43
+ ## Services
44
+
45
+ <!-- generated:services -->
46
+ ### `storage.get`
47
+
48
+ - **Nature** : appel, à réponse unique
49
+ - **Exige** : permission `storage`
50
+ - **Quand l’appeler** : À tout moment
51
+ - **Paramètres** : `key` : texte ≤ 128 octets
52
+ - **Résultat** : la valeur JSON enregistrée, ou `null`
53
+ - **Forme** : JSON
54
+
55
+ ### `storage.set`
56
+
57
+ - **Nature** : appel, à réponse unique
58
+ - **Exige** : permission `storage`
59
+ - **Quand l’appeler** : À tout moment
60
+ - **Paramètres** : `key` : texte ≤ 128 octets ; `value` : JSON
61
+ - **Résultat** : `null` ; `quota_exceeded` au-delà de 256 Kio
62
+ - **Forme** : `null`
63
+
64
+ ### `storage.remove`
65
+
66
+ - **Nature** : appel, à réponse unique
67
+ - **Exige** : permission `storage`
68
+ - **Quand l’appeler** : À tout moment
69
+ - **Paramètres** : `key` : texte ≤ 128 octets
70
+ - **Résultat** : `null`
71
+
72
+ ### `storage.keys`
73
+
74
+ - **Nature** : appel, à réponse unique
75
+ - **Exige** : permission `storage`
76
+ - **Quand l’appeler** : À tout moment
77
+ - **Paramètres** : aucune
78
+ - **Résultat** : la liste des clés
79
+ - **Forme** : liste de textes
80
+
81
+ ### `http.fetch`
82
+
83
+ - **Nature** : appel, à réponse unique
84
+ - **Exige** : permission `network`
85
+ - **Quand l’appeler** : À tout moment
86
+ - **Paramètres** : `url` : texte ≤ 2 Kio ; `method` : `GET` \| `POST` \| `PUT` \| `PATCH` \| `DELETE` ; `contentType?` : `application/json` \| `text/plain` ; `as` : `json` \| `text` \| `bytes` \| `image`
87
+ - **Résultat** : `{ status, contentType }` avec le corps, d’une taille ≤ au `maxResponseBytes` de la règle (1 Mio quand il est absent), ou `{ status, asset }` à partir d’un corps ≤ 1 Mio
88
+ - **Forme** : [`HttpResponse`](result-shapes.md#httpresponse)
89
+
90
+ ### `clipboard.writeText`
91
+
92
+ - **Nature** : appel, à réponse unique
93
+ - **Exige** : permission `clipboardWrite`
94
+ - **Quand l’appeler** : Seulement pendant une action de l’utilisateur
95
+ - **Paramètres** : `text` : texte ≤ 16 Kio
96
+ - **Résultat** : `null`
97
+
98
+ ### `gameEvents.subscribe`
99
+
100
+ - **Nature** : abonnement
101
+ - **Exige** : permission `gameEvents`
102
+ - **Quand l’appeler** : À tout moment
103
+ - **Paramètres** : aucune
104
+ - **Chaque mise à jour** : `{ event, at }` pour chaque événement déclaré
105
+ - **Forme** : [`GameEvent`](result-shapes.md#gameevent)
106
+
107
+ ### `session.subscribe`
108
+
109
+ - **Nature** : abonnement
110
+ - **Exige** : capability `session.read`
111
+ - **Quand l’appeler** : À tout moment
112
+ - **Paramètres** : aucune
113
+ - **Chaque mise à jour** : `{ elapsedMs, at }` compté depuis le démarrage du processus du jeu, ou `null` sans jeu actif
114
+ - **Forme** : [`Session`](result-shapes.md#session) ou `null`
115
+
116
+ ### `telemetry.subscribe`
117
+
118
+ - **Nature** : abonnement
119
+ - **Exige** : capability `telemetry.read`
120
+ - **Quand l’appeler** : À tout moment
121
+ - **Paramètres** : aucune
122
+ - **Chaque mise à jour** : `{ cpu, ram, cpuTemperature, gpuTemperature, sources }`, ou `null` sans jeu actif : `cpu` est la part du jeu dans toute la machine, en % (0–100), `ram` sa mémoire résidente en octets, les températures sont en °C ou `null`, `sources` `{ cpuTemperature, gpuTemperature }` dit si l’hôte dispose de chaque capteur
123
+ - **Forme** : [`Telemetry`](result-shapes.md#telemetry) ou `null`
124
+
125
+ ### `fps.subscribe`
126
+
127
+ - **Nature** : abonnement
128
+ - **Exige** : capability `fps.read`
129
+ - **Quand l’appeler** : À tout moment
130
+ - **Paramètres** : aucune
131
+ - **Chaque mise à jour** : `{ fps, stale, status }` : `fps` est un nombre ou `null` ; l’hôte met `stale` 3 s après la dernière mesure ; `status` vaut `ready`, `waiting`, `unsupported`, `permission_denied`, `ambiguous`, `events_lost` ou `unavailable`
132
+ - **Forme** : [`Fps`](result-shapes.md#fps)
133
+
134
+ ### `media.subscribe`
135
+
136
+ - **Nature** : abonnement
137
+ - **Exige** : capability `media.read`
138
+ - **Quand l’appeler** : À tout moment
139
+ - **Paramètres** : `cover?` : booléen
140
+ - **Chaque mise à jour** : `null` sans lecteur, ou `{ player, title, artists, playing, canPrevious, canPlayPause, canNext, cover }` : `player` est un ID opaque, `artists` une liste, `cover` un identifiant `asset:` d’une image de 512 px au plus, ou `null`
141
+ - **Forme** : [`Media`](result-shapes.md#media) ou `null`
142
+
143
+ ### `media.previous`
144
+
145
+ - **Nature** : appel, à réponse unique
146
+ - **Exige** : capability `media.control`
147
+ - **Quand l’appeler** : Seulement pendant une action de l’utilisateur
148
+ - **Paramètres** : `player?` : texte ≤ 128 octets
149
+ - **Résultat** : `null` ; `stale_context` quand `player` n’est plus le lecteur courant
150
+ - **Forme** : `null`
151
+
152
+ ### `media.playPause`
153
+
154
+ - **Nature** : appel, à réponse unique
155
+ - **Exige** : capability `media.control`
156
+ - **Quand l’appeler** : Seulement pendant une action de l’utilisateur
157
+ - **Paramètres** : `player?` : texte ≤ 128 octets
158
+ - **Résultat** : `null` ; `stale_context` quand `player` n’est plus le lecteur courant
159
+ - **Forme** : `null`
160
+
161
+ ### `media.next`
162
+
163
+ - **Nature** : appel, à réponse unique
164
+ - **Exige** : capability `media.control`
165
+ - **Quand l’appeler** : Seulement pendant une action de l’utilisateur
166
+ - **Paramètres** : `player?` : texte ≤ 128 octets
167
+ - **Résultat** : `null` ; `stale_context` quand `player` n’est plus le lecteur courant
168
+ - **Forme** : `null`
169
+
170
+ ### `stopwatch.subscribe`
171
+
172
+ - **Nature** : abonnement
173
+ - **Exige** : capability `stopwatch.read`
174
+ - **Quand l’appeler** : À tout moment
175
+ - **Paramètres** : aucune
176
+ - **Chaque mise à jour** : `{ running, elapsedMs, at, shortcuts }`, ou `null` sans jeu actif ; `shortcuts` `{ toggle, reset, bound }` contient les raccourcis clavier, mis en forme par l’hôte
177
+ - **Forme** : [`Stopwatch`](result-shapes.md#stopwatch) ou `null`
178
+
179
+ ### `stopwatch.toggle`
180
+
181
+ - **Nature** : appel, à réponse unique
182
+ - **Exige** : capability `stopwatch.control`
183
+ - **Quand l’appeler** : Seulement pendant une action de l’utilisateur
184
+ - **Paramètres** : aucune
185
+ - **Résultat** : le nouvel état, comme dans `stopwatch.subscribe` ; `unavailable` quand l’hôte ne peut pas agir
186
+ - **Forme** : [`Stopwatch`](result-shapes.md#stopwatch) ou `null`
187
+
188
+ ### `stopwatch.reset`
189
+
190
+ - **Nature** : appel, à réponse unique
191
+ - **Exige** : capability `stopwatch.control`
192
+ - **Quand l’appeler** : Seulement pendant une action de l’utilisateur
193
+ - **Paramètres** : aucune
194
+ - **Résultat** : le nouvel état, comme dans `stopwatch.subscribe` ; `unavailable` quand l’hôte ne peut pas agir
195
+ - **Forme** : [`Stopwatch`](result-shapes.md#stopwatch) ou `null`
196
+
197
+ ### `notes.subscribe`
198
+
199
+ - **Nature** : abonnement
200
+ - **Exige** : capability `notes.read`
201
+ - **Quand l’appeler** : À tout moment
202
+ - **Paramètres** : aucune
203
+ - **Chaque mise à jour** : `{ active, notes }` de l’unique document de notes de l’utilisateur ; chaque note `{ id, title, body, items }`, chaque entrée `{ id, text, checked }`
204
+ - **Forme** : [`Notes`](result-shapes.md#notes)
205
+
206
+ ### `notes.create`
207
+
208
+ - **Nature** : appel, à réponse unique
209
+ - **Exige** : capability `notes.write`
210
+ - **Quand l’appeler** : Seulement pendant une action de l’utilisateur
211
+ - **Paramètres** : aucune
212
+ - **Résultat** : `{ note }`, une nouvelle note vide et active, intitulée `Note {n}` dans la langue de l’utilisateur ; `quota_exceeded` au-delà de 8
213
+ - **Forme** : [`CreatedNote`](result-shapes.md#creatednote)
214
+
215
+ ### `notes.select`
216
+
217
+ - **Nature** : appel, à réponse unique
218
+ - **Exige** : capability `notes.write`
219
+ - **Quand l’appeler** : Seulement pendant une action de l’utilisateur
220
+ - **Paramètres** : `note` : texte ≤ 128 octets
221
+ - **Résultat** : `null` ; l’hôte enregistre la note active
222
+ - **Forme** : `null`
223
+
224
+ ### `notes.setItem`
225
+
226
+ - **Nature** : appel, à réponse unique
227
+ - **Exige** : capability `notes.write`
228
+ - **Quand l’appeler** : Seulement pendant une action de l’utilisateur
229
+ - **Paramètres** : `note` : texte ≤ 128 octets ; `item` : texte ≤ 128 octets ; `checked` : booléen
230
+ - **Résultat** : `null`
231
+
232
+ ### `notes.delete`
233
+
234
+ - **Nature** : appel, à réponse unique ; l’utilisateur le confirme d’abord, dans une boîte de dialogue dessinée par OverCrow
235
+ - **Exige** : capability `notes.write`
236
+ - **Quand l’appeler** : Seulement pendant une action de l’utilisateur
237
+ - **Paramètres** : `note` : texte ≤ 128 octets
238
+ - **Résultat** : `null`, ou `cancelled` quand l’utilisateur refuse
239
+ - **Forme** : `null`
240
+
241
+ ### `playervox.score.subscribe`
242
+
243
+ - **Nature** : abonnement
244
+ - **Exige** : capability `playervox.score.read`
245
+ - **Quand l’appeler** : À tout moment
246
+ - **Paramètres** : aucune
247
+ - **Chaque mise à jour** : `{ state, name, score, grade, ratingsCount, criteria }` : `state` vaut `idle`, `unsupported`, `loading`, `ready`, `no_ratings`, `not_found` ou `unavailable` ; `criteria` `{ gameplay, art, tech }`, chacun de 0 à 100 ou `null`
248
+ - **Forme** : [`Score`](result-shapes.md#score)
249
+
250
+ ### `playervox.rating.subscribe`
251
+
252
+ - **Nature** : abonnement
253
+ - **Exige** : capability `playervox.rating.read`
254
+ - **Quand l’appeler** : À tout moment
255
+ - **Paramètres** : aucune
256
+ - **Chaque mise à jour** : `{ state, name, offline, rating }` : `state` vaut `idle`, `unsupported`, `loading`, `ready` ou `unavailable` ; `rating` est `null` avant la première note de l’utilisateur, ou `{ gameplay, art, tech, review, publishedAt, offsetMinutes }`. Rien n’est envoyé tant que le compte PlayerVox est déconnecté, en cours de connexion ou expiré. Une note publiée est renvoyée par l’abonnement. L’hôte remplit les contrôles de `playervox.rating.publish` à partir d’elle
257
+ - **Forme** : [`RatingState`](result-shapes.md#ratingstate)
258
+
259
+ ### `playervox.reviews.subscribe`
260
+
261
+ - **Nature** : abonnement
262
+ - **Exige** : capability `playervox.reviews.read`
263
+ - **Quand l’appeler** : À tout moment
264
+ - **Paramètres** : aucune
265
+ - **Chaque mise à jour** : `{ state, revision, offline }` : `state` vaut `idle`, `unsupported` ou `ready` ; `revision` change chaque fois que les avis à lire changent (autre jeu, autre compte PlayerVox, avis modifiés sur PlayerVox) : le widget relit alors sa page ; `offline` tant que PlayerVox est injoignable. Rien n’est envoyé tant que le compte PlayerVox est déconnecté, en cours de connexion ou expiré. C’est cet abonnement qui maintient en marche la source des avis de l’hôte
266
+ - **Forme** : [`ReviewsState`](result-shapes.md#reviewsstate)
267
+
268
+ ### `playervox.reviews.page`
269
+
270
+ - **Nature** : appel, à réponse unique
271
+ - **Exige** : capability `playervox.reviews.read`
272
+ - **Quand l’appeler** : À tout moment
273
+ - **Paramètres** : `page?` : entier de 1 à 100000 ; `followedOnly?` : booléen
274
+ - **Résultat** : `{ gameName, items, page, totalPages, count }` : trois avis du jeu actif par page, dans la langue de l’interface de l’hôte ; une page au-delà de la fin donne la dernière page ; chaque avis `{ id, author, grade, score, text, original, hidden, publishedAt, offsetMinutes }`, `text` traduit quand une traduction existe, `original` le texte non traduit d’un avis traduit ou `null`, tous deux coupés par l’hôte à 16 Kio. Chaque appel lit sa propre page : l’hôte ne garde ni position ni filtre communs à plusieurs widgets
275
+ - **Forme** : [`ReviewsPage`](result-shapes.md#reviewspage)
276
+
277
+ ### `journal.subscribe`
278
+
279
+ - **Nature** : abonnement
280
+ - **Exige** : capability `journal.read`
281
+ - **Quand l’appeler** : À tout moment
282
+ - **Paramètres** : aucune
283
+ - **Chaque mise à jour** : `null` sans jeu actif, ou `{ revision, notice }` : `revision` change chaque fois que le journal fusionné du jeu actif change (session enregistrée ou supprimée, sessions du cloud fusionnées, compte PlayerVox ou synchronisation modifiés) : le widget relit alors sa page ; `notice` vaut `null`, `offline`, `storage_unavailable`, `full`, `expired`, `busy` ou `unavailable`. C’est cet abonnement qui maintient en marche la source du journal de l’hôte
284
+ - **Forme** : [`JournalState`](result-shapes.md#journalstate) ou `null`
285
+
286
+ ### `journal.page`
287
+
288
+ - **Nature** : appel, à réponse unique
289
+ - **Exige** : capability `journal.read`
290
+ - **Quand l’appeler** : À tout moment
291
+ - **Paramètres** : `cursor?` : texte ≤ 128 octets
292
+ - **Résultat** : `{ gameName, items, page, next, previous }` : cinq sessions locales et du cloud du jeu actif, fusionnées et dédoublonnées, de la plus récente à la plus ancienne ; sans `cursor`, la première page ; chaque session `{ id, startedAt, offsetMinutes, durationMs, source }` ; les curseurs sont des identifiants de l’hôte qui restent valables pour le widget quoi que lisent les autres widgets, et un curseur au-delà de la fin donne la dernière page
293
+ - **Forme** : [`JournalPage`](result-shapes.md#journalpage)
294
+
295
+ ### `journal.delete`
296
+
297
+ - **Nature** : appel, à réponse unique ; l’utilisateur le confirme d’abord, dans une boîte de dialogue dessinée par OverCrow
298
+ - **Exige** : capability `journal.delete`
299
+ - **Quand l’appeler** : Seulement pendant une action de l’utilisateur
300
+ - **Paramètres** : `session` : texte ≤ 128 octets
301
+ - **Résultat** : `null`, ou `cancelled` quand l’utilisateur refuse ; `not_connected` pour une session du cloud tant que PlayerVox est déconnecté
302
+ - **Forme** : `null`
303
+
304
+ ### `twitch.chat.subscribe`
305
+
306
+ - **Nature** : abonnement
307
+ - **Exige** : capability `twitch.chat.read`
308
+ - **Quand l’appeler** : À tout moment
309
+ - **Paramètres** : aucune
310
+ - **Chaque mise à jour** : `{ account, channel, joinState, failure, favorites, canSend, generation, reset, messages, removed, skipped }` : `account` vaut `signed_out`, `pending`, `connected` ou `expired` (la connexion est affichée par l’hôte) ; `failure` est la catégorie fixe d’une connexion à la chaîne qui a échoué (`failed`) ; les messages arrivent par différences, au plus une mise à jour par 100 ms, avec `reset` après l’abonnement, un changement de génération ou un retour à l’affichage, et rien tant que le widget est masqué ; un chat plus rapide est échantillonné, `skipped` comptant les nouveaux messages laissés de côté ; chaque message `{ id, author, color, badges, fragments, reply, deleted, receivedAt }` avec au plus 16 fragments, les emotes et les badges étant des identifiants `asset:` pour le thème et l’échelle courants
311
+ - **Forme** : [`TwitchChat`](result-shapes.md#twitchchat)
312
+
313
+ ### `twitch.chat.join`
314
+
315
+ - **Nature** : appel, à réponse unique
316
+ - **Exige** : capability `twitch.chat.read`
317
+ - **Quand l’appeler** : Seulement pendant une action de l’utilisateur
318
+ - **Paramètres** : `channel` : texte ≤ 25 octets
319
+ - **Résultat** : `null` ; l’hôte retient la chaîne et la rejoint au démarrage du widget
320
+ - **Forme** : `null`
321
+
322
+ ### `twitch.chat.leave`
323
+
324
+ - **Nature** : appel, à réponse unique
325
+ - **Exige** : capability `twitch.chat.read`
326
+ - **Quand l’appeler** : Seulement pendant une action de l’utilisateur
327
+ - **Paramètres** : aucune
328
+ - **Résultat** : `null` ; l’hôte oublie la chaîne
329
+ - **Forme** : `null`
330
+
331
+ ### `twitch.chat.favorite`
332
+
333
+ - **Nature** : appel, à réponse unique
334
+ - **Exige** : capability `twitch.chat.read`
335
+ - **Quand l’appeler** : Seulement pendant une action de l’utilisateur
336
+ - **Paramètres** : `channel` : texte ≤ 25 octets ; `favorite` : booléen
337
+ - **Résultat** : `null` ; `quota_exceeded` au-delà de 20
338
+ - **Forme** : `null`
339
+ <!-- /generated:services -->
340
+
341
+ ## Les écritures qui passent par un formulaire
342
+
343
+ Enregistrer une note, publier la note d’un jeu sur PlayerVox et envoyer un
344
+ message de chat ne figurent pas dans cette liste : ce sont des intents d’écriture,
345
+ envoyés par un `form` à partir des valeurs que l’utilisateur a saisies. Voir
346
+ [les formulaires qui écrivent des données de l’utilisateur](forms.md#les-formulaires-qui-écrivent-des-données-de-lutilisateur).