@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,246 @@
1
+ {
2
+ "scenarioVersion": 1,
3
+ "name": "unavailable",
4
+ "description": "The host could not read the notes: the subscription ends, the widget says so, in French on a light panel here, and subscribes again 5 s later. The notes then show. A failure while a draft is open keeps the draft.",
5
+ "host": {
6
+ "locale": "fr",
7
+ "theme": "light"
8
+ },
9
+ "steps": [
10
+ {
11
+ "expect": {
12
+ "text": [
13
+ "Chargement des notes…"
14
+ ],
15
+ "image": "loading-light-fr",
16
+ "calls": [
17
+ {
18
+ "service": "notes.subscribe"
19
+ }
20
+ ]
21
+ }
22
+ },
23
+ {
24
+ "publish": {
25
+ "service": "notes.subscribe",
26
+ "error": "unavailable"
27
+ }
28
+ },
29
+ {
30
+ "expect": {
31
+ "text": [
32
+ "Impossible de charger ou d’enregistrer les notes. Réessayez."
33
+ ],
34
+ "image": "unavailable-light-fr"
35
+ }
36
+ },
37
+ {
38
+ "advance": {
39
+ "ms": 5000
40
+ }
41
+ },
42
+ {
43
+ "expect": {
44
+ "calls": [
45
+ {
46
+ "service": "notes.subscribe"
47
+ }
48
+ ]
49
+ }
50
+ },
51
+ {
52
+ "publish": {
53
+ "service": "notes.subscribe",
54
+ "value": {
55
+ "active": "note-1",
56
+ "notes": [
57
+ {
58
+ "id": "note-1",
59
+ "title": "Expedition",
60
+ "body": "Find the northern entrance before sunset.\nBring rope.",
61
+ "items": [
62
+ {
63
+ "id": "local-1",
64
+ "text": "Pack torches",
65
+ "checked": true
66
+ },
67
+ {
68
+ "id": "local-2",
69
+ "text": "Sharpen the blade",
70
+ "checked": false
71
+ },
72
+ {
73
+ "id": "local-3",
74
+ "text": "Buy healing potions for the whole party before leaving town",
75
+ "checked": false
76
+ }
77
+ ]
78
+ },
79
+ {
80
+ "id": "note-2",
81
+ "title": "Build ideas",
82
+ "body": "Fire sword first, then armor.",
83
+ "items": []
84
+ },
85
+ {
86
+ "id": "note-3",
87
+ "title": "A very long note title that must be cut in the selector and in the list",
88
+ "body": "",
89
+ "items": [
90
+ {
91
+ "id": "local-4",
92
+ "text": "One entry",
93
+ "checked": false
94
+ }
95
+ ]
96
+ },
97
+ {
98
+ "id": "note-4",
99
+ "title": "Route",
100
+ "body": "North gate, then the river.",
101
+ "items": [
102
+ {
103
+ "id": "local-5",
104
+ "text": "Buy a map",
105
+ "checked": true
106
+ }
107
+ ]
108
+ }
109
+ ]
110
+ }
111
+ }
112
+ },
113
+ {
114
+ "expect": {
115
+ "text": [
116
+ "Expedition"
117
+ ],
118
+ "image": "back-light-fr"
119
+ }
120
+ },
121
+ {
122
+ "host": {
123
+ "mode": "interactive",
124
+ "locale": "en",
125
+ "theme": "dark"
126
+ }
127
+ },
128
+ {
129
+ "pointer": {
130
+ "click": {
131
+ "label": "Edit current note"
132
+ }
133
+ }
134
+ },
135
+ {
136
+ "pointer": {
137
+ "click": {
138
+ "label": "Note title"
139
+ }
140
+ }
141
+ },
142
+ {
143
+ "key": {
144
+ "key": "End"
145
+ }
146
+ },
147
+ {
148
+ "text": " II"
149
+ },
150
+ {
151
+ "publish": {
152
+ "service": "notes.subscribe",
153
+ "error": "unavailable"
154
+ }
155
+ },
156
+ {
157
+ "expect": {
158
+ "text": [
159
+ "Notes could not be loaded or saved. Try again."
160
+ ],
161
+ "image": "unavailable-dark-en"
162
+ }
163
+ },
164
+ {
165
+ "advance": {
166
+ "ms": 5000
167
+ }
168
+ },
169
+ {
170
+ "publish": {
171
+ "service": "notes.subscribe",
172
+ "value": {
173
+ "active": "note-1",
174
+ "notes": [
175
+ {
176
+ "id": "note-1",
177
+ "title": "Expedition",
178
+ "body": "Find the northern entrance before sunset.\nBring rope.",
179
+ "items": [
180
+ {
181
+ "id": "local-1",
182
+ "text": "Pack torches",
183
+ "checked": true
184
+ },
185
+ {
186
+ "id": "local-2",
187
+ "text": "Sharpen the blade",
188
+ "checked": false
189
+ },
190
+ {
191
+ "id": "local-3",
192
+ "text": "Buy healing potions for the whole party before leaving town",
193
+ "checked": false
194
+ }
195
+ ]
196
+ },
197
+ {
198
+ "id": "note-2",
199
+ "title": "Build ideas",
200
+ "body": "Fire sword first, then armor.",
201
+ "items": []
202
+ },
203
+ {
204
+ "id": "note-3",
205
+ "title": "A very long note title that must be cut in the selector and in the list",
206
+ "body": "",
207
+ "items": [
208
+ {
209
+ "id": "local-4",
210
+ "text": "One entry",
211
+ "checked": false
212
+ }
213
+ ]
214
+ },
215
+ {
216
+ "id": "note-4",
217
+ "title": "Route",
218
+ "body": "North gate, then the river.",
219
+ "items": [
220
+ {
221
+ "id": "local-5",
222
+ "text": "Buy a map",
223
+ "checked": true
224
+ }
225
+ ]
226
+ }
227
+ ]
228
+ }
229
+ }
230
+ },
231
+ {
232
+ "expect": {
233
+ "text": [
234
+ "Expedition •",
235
+ "Save"
236
+ ],
237
+ "image": "draft-kept",
238
+ "calls": [
239
+ {
240
+ "service": "notes.subscribe"
241
+ }
242
+ ]
243
+ }
244
+ }
245
+ ]
246
+ }
@@ -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,154 @@
1
+ <!-- Notes: the active note of the user's notes document, and in
2
+ Interactive mode the selector, the checks and the editor (parity
3
+ sheet: playervox-overcrow docs/builtin-parity/notes.md).
4
+ Each editor is a form bound to the `notes.save` intent. Its title, its
5
+ body and its checklist rows belong to OverCrow, which fills them from
6
+ the stored note, keeps the draft and sends their values: they take no
7
+ `value` here. The logic only decides which rows a form has. A form
8
+ stays in the view, hidden, while its note has a draft. The form of a
9
+ new note is there from the click, without a target: its title takes
10
+ the focus, and OverCrow fills it when the note exists. -->
11
+ <box class="notes" label={t("label")}>
12
+ <if test={phase(state) == "loading"}>
13
+ <text class="status">{t("loading")}</text>
14
+ </if>
15
+ <if test={phase(state) == "unavailable"}>
16
+ <text class="error">{t(unavailableKey(state))}</text>
17
+ </if>
18
+ <if test={phase(state) == "ready"}>
19
+ <if test={editable(state)}>
20
+ <if test={noteCount(state) == 0}>
21
+ <button class="action primary add" on:activate={create}>
22
+ <icon class="action-icon" name="plus"/>
23
+ <text class="action-label">{t("add-note")}</text>
24
+ </button>
25
+ </if>
26
+ <else>
27
+ <box class="toolbar">
28
+ <button class="selector" label={t("choose")} disabled={noteCount(state) < 2} on:activate={toggleMenu}>
29
+ <text class="selector-label">{activeLabel(state)}</text>
30
+ <if test={state.busy > 0}>
31
+ <icon class="selector-icon spin" name="loader-circle"/>
32
+ </if>
33
+ <else>
34
+ <icon class={chevronClass(state)} name="chevron-down"/>
35
+ </else>
36
+ </button>
37
+ <button class="icon-button" label={t("edit-current")} tooltip={t("edit-current")} disabled={editing(state)} on:activate={edit(activeId(state))}>
38
+ <icon name="pencil"/>
39
+ </button>
40
+ <button class="icon-button" label={t("add-note")} disabled={full(state)} on:activate={create}>
41
+ <icon name="plus"/>
42
+ </button>
43
+ <button class="icon-button" label={t("delete-current")} tooltip={t("delete-current")} on:activate={remove(activeId(state))}>
44
+ <icon name="trash-2"/>
45
+ </button>
46
+ </box>
47
+ <if test={state.menu}>
48
+ <scroll class="list">
49
+ <for each={state.doc.notes} as="note" key={note.id}>
50
+ <box class="list-row">
51
+ <button class={listItemClass(state, note)} on:activate={select(note.id)}>
52
+ <text class="list-label">{noteLabel(state, note)}</text>
53
+ </button>
54
+ <button class="icon-button small" label={titled("edit-note", note.title)} tooltip={titled("edit-note", note.title)} on:activate={edit(note.id)}>
55
+ <icon name="pencil"/>
56
+ </button>
57
+ <button class="icon-button small" label={titled("delete-note", note.title)} tooltip={titled("delete-note", note.title)} on:activate={remove(note.id)}>
58
+ <icon name="trash-2"/>
59
+ </button>
60
+ </box>
61
+ </for>
62
+ </scroll>
63
+ </if>
64
+ </else>
65
+ </if>
66
+ <else>
67
+ <if test={showsNote(state) && activeId(state) != ""}>
68
+ <box class="heading">
69
+ <icon class="heading-icon" name="sticky-note"/>
70
+ <text class="heading-title">{activeTitle(state)}</text>
71
+ </box>
72
+ </if>
73
+ </else>
74
+ <if test={state.error != ""}>
75
+ <text class="error">{t(state.error)}</text>
76
+ </if>
77
+ <if test={!editing(state) && activeId(state) != ""}>
78
+ <scroll class="preview">
79
+ <if test={showsNote(state) && activeBody(state) != ""}>
80
+ <text class="body">{activeBody(state)}</text>
81
+ </if>
82
+ <if test={showsChecklist(state)}>
83
+ <if test={!showsNote(state) && editable(state)}>
84
+ <box class="heading">
85
+ <icon class="heading-icon" name="list-checks"/>
86
+ <text class="heading-title">{t("checklist")}</text>
87
+ </box>
88
+ </if>
89
+ <for each={previewItems(state)} as="item" key={item.id}>
90
+ <box class="item">
91
+ <if test={editable(state)}>
92
+ <checkbox class="item-check" checked={checked(state, item)} label={itemLabel(item)} on:change={check(activeId(state), item.id, event.value)}/>
93
+ </if>
94
+ <else>
95
+ <if test={checked(state, item)}>
96
+ <icon class="item-icon item-icon-done" name="circle-check" label={t("done")}/>
97
+ </if>
98
+ <else>
99
+ <icon class="item-icon" name="circle" label={t("todo")}/>
100
+ </else>
101
+ </else>
102
+ <text class={itemClass(state, item)}>{item.text}</text>
103
+ </box>
104
+ </for>
105
+ </if>
106
+ </scroll>
107
+ </if>
108
+ </if>
109
+ <for each={state.editors} as="editor" key={editor.key}>
110
+ <form class={editorClass(state, editor)} intent="notes.save" target={editor.note} on:submit={saved(editor.key, event.outcome, event.error)}>
111
+ <scroll class="fields">
112
+ <field class="title-field" name="title" autofocus placeholder={t("title-hint")} label={t("title-hint")} on:input={titleInput(editor.key, event.value)} on:keydown={keyed(editor.key, event.key, event.ctrl)}/>
113
+ <textarea class="body-field" name="body" rows={bodyRows(editor)} label={t("body-label")} on:input={bodyInput(editor.key, event.value)} on:keydown={keyed(editor.key, event.key, event.ctrl)}/>
114
+ <text class="meta">{t("checklist")}</text>
115
+ <box class="rows">
116
+ <for each={editor.rows} as="row" key={row.key}>
117
+ <box class="row">
118
+ <if test={rowStored(state, editor, row)}>
119
+ <checkbox class="row-check" checked={rowChecked(state, editor, row)} label={rowLabel(row)} on:change={check(editor.note, row.id, event.value)}/>
120
+ </if>
121
+ <else>
122
+ <icon class="row-new" name="circle"/>
123
+ </else>
124
+ <field class="row-field" name="item" placeholder={rowHint(editor, row)} label={t("item-hint")} on:input={rowInput(editor.key, row.key, event.value)} on:keydown={keyed(editor.key, event.key, event.ctrl)}/>
125
+ <if test={lastEmpty(editor, row)}>
126
+ <box class="row-space"/>
127
+ </if>
128
+ <else>
129
+ <button class="icon-button small" label={t("remove-entry")} tooltip={t("remove-entry")} on:activate={dropRow(editor.key, row.key)}>
130
+ <icon name="x"/>
131
+ </button>
132
+ </else>
133
+ </box>
134
+ </for>
135
+ </box>
136
+ <if test={rowsFull(editor)}>
137
+ <text class="hint">{t("checklist-full")}</text>
138
+ </if>
139
+ </scroll>
140
+ <separator class="rule"/>
141
+ <if test={untitled(editor)}>
142
+ <text class="hint">{t("add-title")}</text>
143
+ </if>
144
+ <box class="actions">
145
+ <button class={saveClass(state, editor)} submit disabled={!canSave(state, editor)} on:activate={saving(editor.key)}>
146
+ <text class="action-label">{t("save")}</text>
147
+ </button>
148
+ <button class="action" on:activate={cancel(editor.key)}>
149
+ <text class="action-label">{t("cancel")}</text>
150
+ </button>
151
+ </box>
152
+ </form>
153
+ </for>
154
+ </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,134 @@
1
+ # Performance
2
+
3
+ `com.playervox.overcrow.performance` — the game's CPU share and memory, the
4
+ temperatures of this computer's CPU and GPU, and the game's frame rate. A
5
+ built-in of OverCrow, written against the public `@overcrow/sdk` and
6
+ packaged with `overcrow-widget` like any creator's widget. MIT.
7
+
8
+ ## What it shows
9
+
10
+ One row per metric, in this order, as a two-column list (vertical, the
11
+ default) or on one line separated by `·` (horizontal):
12
+
13
+ | Row | EN / FR label | Value | Amber | Red |
14
+ | --- | --- | --- | --- | --- |
15
+ | Game CPU | CPU | share of all logical processors, `23.0 %`, at most 100 | ≥ 80 % | ≥ 95 % |
16
+ | Game memory | RAM | resident memory in binary gigabytes, `3.0 GB` | never | never |
17
+ | CPU temperature | CPU° | `61.0 °C` or `141.8 °F` | ≥ 80 °C | ≥ 90 °C |
18
+ | GPU temperature | GPU° | the same | ≥ 80 °C | ≥ 90 °C |
19
+ | Frame rate | FPS | an integer, `144` | never | never |
20
+
21
+ - A row shows only when its menu toggle is on **and** OverCrow has a
22
+ reading: no dash, no "N/A". The first sample after the game starts has
23
+ no CPU share yet; the row appears a second or two later.
24
+ - Temperatures compare with their thresholds in °C, even when shown in
25
+ °F, and convert before rounding.
26
+ - A reading the host keeps through a gap of its source (the frame rate
27
+ between two samples included) shows exactly as it was: a value shown
28
+ never disappears and shows no sign of its age.
29
+ - Numbers follow the number format of OverCrow's settings, not the
30
+ language: `us` 1,234.5 (the default), `fr` 1 234,5, `de` 1.234,5.
31
+ - With nothing to show: "Waiting for game data…" / "En attente des données
32
+ du jeu…"; with every metric switched off: "No metric selected" /
33
+ "Aucune mesure sélectionnée".
34
+
35
+ Values use the interface font with tabular figures. Hovering a row in
36
+ Interactive mode explains it ("Game CPU use across all logical
37
+ processors.", "Observed presentation rate."…); each value's
38
+ accessible name says what it is ("CPU temperature 61.0 °C").
39
+
40
+ ## Platforms
41
+
42
+ | | Linux | Windows |
43
+ | --- | --- | --- |
44
+ | Game CPU and memory | every process of the game (same Steam app, or the game and its children) | the attached process only |
45
+ | CPU temperature | `k10temp`, `zenpower` or `coretemp` sensors | none: the row and its menu toggle do not appear |
46
+ | GPU temperature | `amdgpu` sensors | the graphics driver's reading, when it gives one |
47
+ | Frame rate | X11 and XWayland game windows | OverCrow's FPS service |
48
+
49
+ A sensor OverCrow cannot read, or two sensors of the same kind that
50
+ disagree, give no reading: the row stays away.
51
+
52
+ ## Menu
53
+
54
+ | Row | Type | Default |
55
+ | --- | --- | --- |
56
+ | Layout / Disposition | choice `layout`: Vertical, Horizontal | Vertical |
57
+ | Shown values / Valeurs affichées | group `shown-values`: the five toggles below, in a side flyout | — |
58
+ | Temperature / Température | choice `temperature-unit`: Celsius (°C), Fahrenheit (°F) | Celsius |
59
+
60
+ The "Shown values" flyout:
61
+
62
+ | Row | Type | Default |
63
+ | --- | --- | --- |
64
+ | CPU / CPU | toggle `show-cpu` | on |
65
+ | RAM / RAM | toggle `show-ram` | on |
66
+ | CPU temperature / Température CPU | toggle `show-cpu-temperature`, `requires: telemetry.cpuTemperature` | on |
67
+ | GPU temperature / Température GPU | toggle `show-gpu-temperature`, `requires: telemetry.gpuTemperature` | on |
68
+ | FPS / FPS | toggle `show-fps`, `requires: fps` | on |
69
+
70
+ OverCrow hides a `requires` row while it has no such source. The flyout
71
+ names each value alone (it was "Show CPU" / "Afficher le CPU"… at the
72
+ first level): its title already says what the toggles do, and short
73
+ labels stay whole in the flyout, where a longer one would end with "…". A group only arranges
74
+ the menu: each toggle keeps its ID, so values saved before the toggles
75
+ moved into the flyout still apply.
76
+
77
+ ## Permissions
78
+
79
+ - `telemetry.read`: the game's CPU share and resident memory, and the
80
+ computer's temperatures. Not sensitive.
81
+ - `fps.read`: the game's frame rate. Not sensitive.
82
+
83
+ The widget stores nothing: its menu values are OverCrow's.
84
+
85
+ ## How it works
86
+
87
+ `telemetry.subscribe` gives `{ cpu, ram, cpuTemperature, gpuTemperature,
88
+ sources }`, or `null` without a game; the host normalizes the CPU share
89
+ to the whole machine and keeps each temperature to its sensor's
90
+ thousandth of a degree. `fps.subscribe` gives `{ fps, stale, status }`;
91
+ the host keeps the game's last rate through a gap of its capture, so the
92
+ widget runs no timer and does not draw `stale`. The widget
93
+ subscribes to the frame rate only while the FPS row is switched on:
94
+ OverCrow measures the frame rate only for a subscriber, so switching the
95
+ row off also stops the measurement.
96
+
97
+ ## Tests
98
+
99
+ - `tests/logic.test.mjs`, `tests/refused.test.mjs`: the logic on
100
+ `@overcrow/sdk/testing` (rows and their order, units, thresholds, the
101
+ °F vectors, number formats, a rate kept through a gap, messages, the menu and
102
+ the FPS subscription).
103
+ - Scenarios with their reference images:
104
+ - `render`: every row, vertical, in both themes and languages at 100
105
+ and 150 %;
106
+ - `horizontal`: the one-line layout, the same matrix, a frame rate kept
107
+ through a gap;
108
+ - `thresholds`: below, amber and red, in both themes, and °F;
109
+ - `fahrenheit`: the conversion vectors and a negative temperature;
110
+ - `region`: the `us`, `fr` and `de` number formats;
111
+ - `stale`: a frame rate kept through a gap, unchanged, then a fresh
112
+ value, then none;
113
+ - `sources`: Windows (no CPU temperature), no sensor, the first
114
+ sample without CPU; `no-fps-source`;
115
+ - `waiting`, `menu` (every toggle, both choices, "No metric selected",
116
+ the FPS subscription ending and starting again), `refused`,
117
+ `telemetry-only`.
118
+
119
+ ## Cost
120
+
121
+ Measured on 2026-09-30 with OverCrow's release build, on an AMD Ryzen 7
122
+ 5800X3D Linux workstation and in a Windows 11 virtual machine (2 vCPU):
123
+
124
+ | | Linux | Windows (VM) |
125
+ | --- | --- | --- |
126
+ | Widget start, warm, into the overlay's runtime | 7.0 ms (p50), 8.1 ms at most | VM ready in 15–19 ms (p50) |
127
+ | VM memory | 0.59 MiB private, 0.78 MiB PSS | 0.88 MiB private working set, 1.16 MiB private commit |
128
+ | Private memory in all (VM, sandbox helpers, overlay share) | under 6 MB | — |
129
+ | CPU, readings held | 0.03 % of one core, no frame | — |
130
+ | CPU, a telemetry sample and an FPS reading each second | 0.08 % of one core: 3 frames a second, 0.26 ms at p95 | — |
131
+ | VM CPU | one short turn per sample | — |
132
+
133
+ The egui panel it replaces drew one frame per sample too (0.05 ms each,
134
+ painting only), inside the overlay's own process.
@@ -0,0 +1,19 @@
1
+ {
2
+ "author": "PlayerVox",
3
+ "spdxLicense": "MIT",
4
+ "sourceUrl": "https://github.com/Valhallab/playervox-overcrow-releases/tree/main/widgets/performance",
5
+ "preview": "assets/preview.png",
6
+ "defaultLocale": "en",
7
+ "localizations": [
8
+ {
9
+ "locale": "en",
10
+ "name": "Performance",
11
+ "description": "Game CPU and memory, plus the temperatures this computer exposes."
12
+ },
13
+ {
14
+ "locale": "fr",
15
+ "name": "Performances",
16
+ "description": "CPU et mémoire du jeu, et les températures que cet ordinateur expose."
17
+ }
18
+ ]
19
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "label": "Performance",
3
+ "waiting": "Waiting for game data…",
4
+ "no-metric": "No metric selected",
5
+ "cpu": "CPU",
6
+ "ram": "RAM",
7
+ "cpu-temperature": "CPU°",
8
+ "gpu-temperature": "GPU°",
9
+ "fps": "FPS",
10
+ "hint-cpu": "Game CPU use across all logical processors.",
11
+ "hint-ram": "Game resident memory.",
12
+ "hint-cpu-temperature": "Host CPU temperature.",
13
+ "hint-gpu-temperature": "Host GPU temperature.",
14
+ "hint-fps": "Observed presentation rate.",
15
+ "name-cpu": "Game CPU use {value} {unit}",
16
+ "name-ram": "Game memory {value} {unit}",
17
+ "name-cpu-temperature": "CPU temperature {value} {unit}",
18
+ "name-gpu-temperature": "GPU temperature {value} {unit}",
19
+ "name-fps": "{value} frames per second"
20
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "label": "Performances",
3
+ "waiting": "En attente des données du jeu…",
4
+ "no-metric": "Aucune mesure sélectionnée",
5
+ "cpu": "CPU",
6
+ "ram": "RAM",
7
+ "cpu-temperature": "CPU°",
8
+ "gpu-temperature": "GPU°",
9
+ "fps": "FPS",
10
+ "hint-cpu": "Utilisation du CPU par le jeu sur l’ensemble des processeurs logiques.",
11
+ "hint-ram": "Mémoire résidente du jeu.",
12
+ "hint-cpu-temperature": "Température du CPU de l’ordinateur.",
13
+ "hint-gpu-temperature": "Température du GPU de l’ordinateur.",
14
+ "hint-fps": "Rythme de présentation observé.",
15
+ "name-cpu": "Utilisation du CPU par le jeu {value} {unit}",
16
+ "name-ram": "Mémoire du jeu {value} {unit}",
17
+ "name-cpu-temperature": "Température CPU {value} {unit}",
18
+ "name-gpu-temperature": "Température GPU {value} {unit}",
19
+ "name-fps": "{value} images par seconde"
20
+ }