@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,295 @@
1
+ # SDK reference
2
+
3
+ `@overcrow/sdk` 1.0 is the API of the logic of a PlayerVox OverCrow
4
+ widget: the state, the data of the host, services, timers, drawing, the
5
+ options menu, messages, logs and formatting. This page lists every export
6
+ of the package. [The logic](logic.md) and
7
+ [services and permissions](services.md) explain how to use them.
8
+
9
+ The SDK is on npm, and the command below adds it to a project. A project
10
+ made by `overcrow-widget init` already lists it: run `npm install` there.
11
+
12
+ ```sh
13
+ npm install --save-dev --save-exact @overcrow/sdk@1.0.0
14
+ ```
15
+
16
+ <!-- source: widgets/clock/logic.ts -->
17
+ ```ts
18
+ import {
19
+ formatDate,
20
+ formatTime,
21
+ initState,
22
+ onHost,
23
+ option,
24
+ t,
25
+ timers,
26
+ type DateOrder,
27
+ type Timer,
28
+ } from "@overcrow/sdk";
29
+ ```
30
+
31
+ The SDK is bundled into the widget's `logic.js` when it is packaged, and
32
+ runs inside the widget's VM; loading it anywhere else throws an error.
33
+ Unused parts are removed from the bundle. It is a convenience, not a
34
+ security boundary: OverCrow checks every call, parameter and value that
35
+ leaves the VM.
36
+
37
+ | Export | Kind | Summary |
38
+ | --- | --- | --- |
39
+ | `SDK_VERSION` | constant | `"1.0.0"`. |
40
+ | `RUNTIME_SURFACE` | constant | `"0.1"`, the version of the VM's built-in interface that this SDK needs. |
41
+
42
+ ## State and view
43
+
44
+ | Export | Kind | Summary |
45
+ | --- | --- | --- |
46
+ | `state` | constant | The widget state object. Change it; after each turn the VM evaluates the view again and sends only the differences. |
47
+ | `WidgetState` | interface | Type of `state`; declare its members by module augmentation. Undeclared members are `unknown`. |
48
+ | `initState(initial)` | function | Copies `initial` into `state` and returns `state` typed as `initial`. Call it once, while the module loads. |
49
+ | `registerView(table)` | function | Registers the compiled expressions and handlers of the view. The command-line tool generates this call: a widget never writes it. |
50
+ | `ViewTable` | type | The table that `registerView` takes. |
51
+ | `Expression` | type | `(state, scope) => value`: a compiled expression of the view. |
52
+ | `Handler` | type | `(state, scope, event) => void`: a compiled handler of the view. |
53
+ | `NodeEvent<E>` | interface | `{ type, detail }` of an event; `detail` is `EventDetailMap[E]`. |
54
+ | `Scope` | interface | The names in scope of an expression: `for` items, component properties. |
55
+
56
+ <!-- source: templates/chart/logic.ts -->
57
+ ```ts
58
+ declare module "@overcrow/sdk" {
59
+ interface WidgetState {
60
+ values: number[];
61
+ }
62
+ }
63
+
64
+ const state = initState({ values: [50] as number[] });
65
+ ```
66
+
67
+ ## Host data
68
+
69
+ | Export | Kind | Summary |
70
+ | --- | --- | --- |
71
+ | `host` | constant | Frozen object whose members always read the latest values sent by OverCrow. |
72
+ | `HostData` | interface | Type of `host`: `locale`, `messages`, `theme`, `region`, `scale` (in thousandths), `viewport`, `mode`, `visible`, `options`, `grants`. |
73
+ | `onHost(listener)` | function | Calls `listener` with the names of the `host` members that OverCrow just sent (`options` after a menu change, `visible` when shown or hidden, `region`…), before the view is evaluated again. Returns `{ cancel() }`. |
74
+ | `HostKey` | type | The name of a member of `HostData`. |
75
+ | `HostListener` | type | A listener of `onHost`. |
76
+ | `Viewport` | interface | `{ width, height }`, in logical pixels. |
77
+ | `hasGrant(capability)` | function | Whether the user granted a capability. |
78
+ | `option(id, fallback)` | function | The stored value of a row of the options menu, or `fallback` when there is none or it has another type. |
79
+ | `MenuValue` | type | `boolean \| number \| string`. |
80
+ | `Widened<T>` | type | The result type of `option`: a `false` fallback gives `boolean`. |
81
+
82
+ <!-- source: widgets/clock/logic.ts -->
83
+ ```ts
84
+ onHost((changed) => {
85
+ if (changed.includes("options")) {
86
+ const values = menuValues();
87
+ const unitChanged = values.seconds !== state.seconds;
88
+ Object.assign(state, values);
89
+ if (unitChanged) {
90
+ start();
91
+ }
92
+ }
93
+ // A new UTC offset (time zone or summer time) shows at once.
94
+ if (changed.includes("region")) {
95
+ tick();
96
+ }
97
+ });
98
+ ```
99
+
100
+ ## Services
101
+
102
+ Every service answers through OverCrow, which checks its permission or
103
+ capability, its parameters and the user action at each call.
104
+
105
+ | Export | Kind | Summary |
106
+ | --- | --- | --- |
107
+ | `storage` | namespace | `get({ key })`, `set({ key, value })`, `remove({ key })`, `keys()`. Permission `storage`. |
108
+ | `http` | namespace | `fetch(url, { as, method?, body?, contentType? })`. Permission `network`. |
109
+ | `clipboard` | namespace | `writeText({ text })`, during a user action. Permission `clipboardWrite`. |
110
+ | `gameEvents` | namespace | `subscribe(listener)`. Permission `gameEvents`. |
111
+ | `session` | namespace | `subscribe(listener)`. Capability `session.read`. |
112
+ | `telemetry` | namespace | `subscribe(listener)`. Capability `telemetry.read`. |
113
+ | `fps` | namespace | `subscribe(listener)`. Capability `fps.read`. |
114
+ | `media` | namespace | `subscribe({ cover? }, listener)`; `previous`, `playPause`, `next({ player? })` during a user action. |
115
+ | `stopwatch` | namespace | `subscribe(listener)`; `toggle()`, `reset()` during a user action. |
116
+ | `notes` | namespace | `subscribe(listener)`; `create()`, `select({ note })`, `setItem({ note, item, checked })`, `delete({ note })` during a user action. |
117
+ | `playervox` | namespace | `score.subscribe`, `rating.subscribe`, `reviews.subscribe`, `reviews.page({ page?, followedOnly? })`. |
118
+ | `journal` | namespace | `subscribe(listener)`; `page({ cursor? })`; `delete({ session })` during a user action, after the user's confirmation. |
119
+ | `twitch` | namespace | `chat.subscribe(listener)`; `chat.join({ channel })`, `chat.leave()`, `chat.favorite({ channel, favorite })` during a user action. |
120
+ | `call(service, params?)` | function | Calls any service that answers once, by its name. |
121
+ | `subscribe(service, params, listener)` | function | Subscribes to any subscription service, by its name. |
122
+ | `ServiceError` | class | The rejection of a failed call: `code` is a `ServiceErrorCode`. |
123
+ | `Listener<T>` | type | `(update: SubscriptionUpdate<T>) => void`. |
124
+ | `SubscriptionUpdate<T>` | type | `{ ok: true, value, final }` or `{ ok: false, error, final: true }`. |
125
+ | `Subscription` | interface | `cancel()`; calling it again does nothing. |
126
+ | `ServiceParams<N>` | type | The parameters of service `N`. |
127
+ | `ServiceResult<N>` | type | The result, or the update, of service `N`. |
128
+ | `FetchOptions<A>` | interface | The options of `http.fetch`. |
129
+ | `FetchResponse<A>` | type | `{ status, contentType, body }`, or `{ status, asset }` for `as: "image"`. |
130
+ | `BodyType` | type | `"json" \| "text" \| "bytes" \| "image"`. |
131
+ | `BodyTypes` | interface | The decoded body of each body type. |
132
+ | `HttpMethod` | type | The methods of network rules. |
133
+ | `HttpServices` | interface | Type of `http`. |
134
+
135
+ The listener always comes last, and a service without parameters takes
136
+ none:
137
+
138
+ <!-- source: widgets/fps/logic.ts -->
139
+ ```ts
140
+ fps.subscribe((update) => {
141
+ Object.assign(state, reading(update));
142
+ });
143
+ ```
144
+
145
+ <!-- source: widgets/media/logic.ts -->
146
+ ```ts
147
+ const current = media.subscribe({ cover: state.showCover }, (update) => {
148
+ if (update.ok) {
149
+ state.media = update.value;
150
+ state.unavailable = false;
151
+ return;
152
+ }
153
+ // The subscription ended: the host's source failed. Show it and ask
154
+ // again later; hidden, the timer waits until the widget shows.
155
+ if (subscription === current) {
156
+ subscription = null;
157
+ state.media = null;
158
+ state.unavailable = true;
159
+ retry = timers.after(RETRY_MS, subscribe);
160
+ }
161
+ });
162
+ ```
163
+
164
+ `http.fetch` sends a string body as `text/plain` and any other body as
165
+ JSON, unless `contentType` says otherwise, and decodes the answer as `as`
166
+ asks. A response without a body gives `null`, `""` or an empty
167
+ `ArrayBuffer`.
168
+
169
+ The types of the other namespaces are generated from the schema:
170
+ `ClipboardServices`, `FpsServices`, `GameEventsServices`,
171
+ `JournalServices`, `MediaServices`, `NotesServices`, `PlayervoxServices`,
172
+ `SessionServices`, `StopwatchServices`, `StorageServices`,
173
+ `TelemetryServices` and `TwitchServices`. Each service is described in the
174
+ [service reference](service-reference.md).
175
+
176
+ ## Timers
177
+
178
+ | Export | Kind | Summary |
179
+ | --- | --- | --- |
180
+ | `timers` | namespace | `after(ms, callback)`, `every(ms, callback)`, `atEach(unit, callback)`. |
181
+ | `Timer` | interface | `cancel()`; calling it again does nothing. |
182
+
183
+ - At most 16 timers, never shorter than 100 ms: a shorter interval is
184
+ raised to it.
185
+ - No timer ticks while the widget is hidden. A repeating timer skips the
186
+ hidden ticks; a one-shot timer that fell due while hidden ticks once when
187
+ the widget is shown again.
188
+ - `atEach("second" | "minute" | "hour" | "day", callback)` calls `callback`
189
+ at each boundary of the user's local time, and once when the widget is
190
+ shown again. It also wakes when the user's UTC offset changes.
191
+
192
+ <!-- source: widgets/media/logic.ts -->
193
+ ```ts
194
+ retry = timers.after(RETRY_MS, subscribe);
195
+ ```
196
+
197
+ ## Drawing, menu, messages and log
198
+
199
+ | Export | Kind | Summary |
200
+ | --- | --- | --- |
201
+ | `draw(ref, commands)` | function | Replaces the commands of the `canvas` whose `ref` is given. |
202
+ | `onMenu(handler)` | function | Receives the ID of each `action` row of the options menu that the user chooses. |
203
+ | `t(key, params?)` | function | The message of the active language, with each `{name}` replaced by `params.name`; the key itself when there is no message. |
204
+ | `MessageParams` | type | `Record<string, string \| number>`. |
205
+ | `log` | namespace | `debug`, `info`, `warn`, `error(text)`: shown by `overcrow-widget dev`, dropped for an installed widget. |
206
+
207
+ The draw commands are typed tuples, listed in
208
+ [drawing](logic.md#drawing).
209
+
210
+ <!-- source: docs/content/examples/countdown/logic.ts -->
211
+ ```ts
212
+ dots.push(["circle", 6 + index * 14, 6, 4], ["fill", "var(--color-accent)"]);
213
+ ```
214
+
215
+ ## Time, dates and numbers
216
+
217
+ The VM has no `Intl`, and its local time is UTC: `Date` never gives the
218
+ user's time. These helpers format from `host.region`. Numbers follow the
219
+ user's number format (`1,234.5`, `1 234,5` or `1.234,5`), whatever the
220
+ interface language; dates are numeric, in the user's date order; times are
221
+ 24-hour. Each helper also accepts its region values as options, so it runs
222
+ in a unit test outside the VM.
223
+
224
+ | Export | Kind | Summary |
225
+ | --- | --- | --- |
226
+ | `localTime(ms, offsetMinutes?)` | function | The `LocalTime` fields of an instant in the user's UTC offset, or in the `offsetMinutes` of a service timestamp. |
227
+ | `formatTime(ms, options?)` | function | `14:08`, or `14:08:42` with `seconds: true`. |
228
+ | `formatDate(ms, options?)` | function | `17/07/2026` (`dmy`), `07/17/2026` (`mdy`), `2026-07-17` (`ymd`). |
229
+ | `formatNumber(value, options?)` | function | The separators of the user's number format; `minimumFractionDigits`, `maximumFractionDigits` (3 by default), `grouping`. |
230
+ | `formatDuration(ms, options?)` | function | `04:05`, `1:02:03`, `04:05.67` with `hundredths: true`; truncated, as a stopwatch shows it. |
231
+ | `delayToNext(unit, nowMs, region?)` | function | The milliseconds to the next boundary of local time, never past the next change of UTC offset. |
232
+ | `LocalTime` | interface | `year`, `month` (1 to 12), `day`, `weekday` (0 is Sunday), `hour`, `minute`, `second`, `millisecond`. |
233
+ | `TimeUnit` | type | `"second" \| "minute" \| "hour" \| "day"`. |
234
+ | `TimeOptions` | interface | `offsetMinutes`. |
235
+ | `DateOptions` | interface | `offsetMinutes`, `order`. |
236
+ | `ClockOptions` | interface | `offsetMinutes`, `seconds`. |
237
+ | `NumberOptions` | interface | The options of `formatNumber`. |
238
+ | `DurationOptions` | interface | `hours`, `hundredths`, `format`. |
239
+
240
+ <!-- source: widgets/clock/logic.ts -->
241
+ ```ts
242
+ export function clockDate(now: number, order: DateOrder): string {
243
+ return formatDate(now, { order });
244
+ }
245
+ ```
246
+
247
+ Month and weekday names, 12-hour clocks and plural rules are not part of
248
+ 1.0.
249
+
250
+ ## Generated types
251
+
252
+ These types are generated from the widget schema, so they always match
253
+ what OverCrow accepts.
254
+
255
+ | Export | Summary |
256
+ | --- | --- |
257
+ | `ServiceName`, `CallServiceName`, `SubscribeServiceName`, `GestureServiceName` | The service names: all of them, those that answer once, the subscriptions, and those that need a user action. |
258
+ | `ServiceParamsMap`, `ServiceResultMap` | The parameters and the result of each service. |
259
+ | `ServiceErrorCode`, `ServiceErrorPayload` | The [error codes](services.md#errors), and the `{ code }` value that carries one. |
260
+ | `Session`, `Telemetry`, `Fps`, `Stopwatch`, `Media`, `Notes`, `Note`, `NoteItem`, `CreatedNote`, `Score`, `Rating`, `RatingState`, `Review`, `ReviewsState`, `ReviewsPage`, `JournalState`, `JournalPage`, `JournalSession`, `TwitchChat`, `ChatMessage`, `ChatFragment`, `GameEvent`, `HttpResponse` | The [result shapes](result-shapes.md). |
261
+ | `Permission`, `Capability`, `SensitiveCapability`, `CapabilityServices`, `PermissionServices` | The permissions and capabilities of the manifest, and the services each one allows. |
262
+ | `Locale`, `Theme`, `Mode`, `Region`, `NumberFormat`, `DateOrder` | The values of `host`. |
263
+ | `EventName`, `GestureEventName`, `EventDetailMap`, `NamedKey` | The events of the view, those that are user actions, their details, and the named keys of `keydown`. |
264
+ | `DrawCommand`, `DrawCommandName`, `Color` | The canvas commands and colours. |
265
+ | `TokenName`, `ColorToken`, `LengthToken`, `FontSizeToken`, `FontFamilyToken`, `TimeToken`, `ShadowToken` | The [design tokens](style-properties.md#design-tokens). |
266
+ | `IconName` | The names of the [icons](style-properties.md#icons). |
267
+ | `MenuRowType`, `HostFeature` | The row types of the options menu, and the data sources of `requires`. |
268
+ | `JsonValue`, `AssetHandle`, `ImageSource` | Any JSON value; an image handle given by a service; an image of the package or such a handle. |
269
+
270
+ ## Limit constants
271
+
272
+ The [limits](limits.md) a widget's logic works against are exported as
273
+ constants, so the code never repeats a number: `MAX_TIMERS`,
274
+ `MIN_TIMER_INTERVAL_MS`, `MAX_SERVICE_CALLS_IN_FLIGHT`,
275
+ `MAX_SUBSCRIPTIONS`, `MAX_STORAGE_KEYS`, `MAX_STORAGE_KEY_BYTES`,
276
+ `MAX_STORAGE_VALUE_BYTES`, `STORAGE_QUOTA_BYTES`, `MAX_REQUEST_URL_BYTES`,
277
+ `MAX_HTTP_REQUEST_BYTES`, `MAX_HTTP_RESPONSE_BYTES`,
278
+ `MAX_HTTP_DECLARED_RESPONSE_BYTES`, `MAX_CLIPBOARD_BYTES`,
279
+ `MAX_OBJECT_ID_BYTES`, `MAX_NOTES`, `MAX_NOTE_ITEMS`,
280
+ `MAX_NOTE_TITLE_BYTES`, `MAX_NOTE_BODY_BYTES`, `MAX_NOTE_ITEM_BYTES`,
281
+ `MAX_REVIEW_CHARS`, `MAX_CHAT_CHANNEL_BYTES`, `MAX_CHAT_MESSAGE_CHARS`,
282
+ `MAX_CHAT_FRAGMENTS`, `MAX_CHAT_FAVORITES`, `MAX_DRAW_COMMANDS`,
283
+ `MAX_DRAW_STATE_DEPTH`, `MAX_PATH_POINTS`, `MAX_PATCH_BYTES`,
284
+ `MAX_SCENE_NODES`, `MAX_CHILDREN`, `MAX_NODE_TEXT_BYTES`,
285
+ `MAX_ATTRIBUTE_TEXT_BYTES`, `MAX_LABEL_BYTES`, `MAX_FIELD_TEXT_BYTES`,
286
+ `MAX_LOCALE_ENTRIES`, `MAX_LOG_BYTES`, `VM_HEAP_BYTES`,
287
+ `VM_MAX_HEAP_BYTES`, `VM_TURN_BUDGET_MS`, `VM_JOBS_PER_TURN` and
288
+ `VM_MESSAGES_PER_TURN`.
289
+
290
+ ## Unit tests: `@overcrow/sdk/testing`
291
+
292
+ A second entry point, never bundled into a widget, replaces OverCrow in a
293
+ unit test of the logic: `installRuntime()` gives virtual time, settles the
294
+ service calls and pushes the subscription values. See
295
+ [unit tests](testing.md#unit-tests).
@@ -0,0 +1,115 @@
1
+ # Security
2
+
3
+ PlayerVox OverCrow treats every widget as untrusted code, built-ins
4
+ included: the same package checks, the same sandbox, the same permissions
5
+ and the same consent apply to a PlayerVox widget and to yours. This page
6
+ describes what that means for a widget author.
7
+
8
+ ## The sandbox
9
+
10
+ Each widget runs behind two barriers.
11
+
12
+ 1. **The VM.** Your `logic.js` runs in its own QuickJS virtual machine with
13
+ a heap ceiling, a time budget per turn, a bounded stack and bounded
14
+ queues. There is no `eval`, no `Function` constructor, no module loader,
15
+ no `WebAssembly` and no shared memory; the only global besides
16
+ ECMAScript is the frozen SDK. Local time is UTC: the SDK applies the
17
+ user's offset for you.
18
+ 2. **The process.** Each VM runs in its own operating-system process that
19
+ needs no display, GPU, network or files, so its sandbox takes all of them
20
+ away. On Linux, Bubblewrap namespaces, a seccomp allowlist that kills the
21
+ process on any attempt to open a file, a socket or another process, and
22
+ a cgroup per widget. On Windows, a Less Privileged AppContainer without
23
+ capabilities, a Job Object per widget, and process mitigations that
24
+ forbid dynamic code and the window system.
25
+
26
+ OverCrow draws everything itself: the VM sends a description of the view,
27
+ never pixels, and never runs code in OverCrow's process. Hover, focus,
28
+ pressed states and transitions are resolved by OverCrow, so a widget does
29
+ not observe pointer motion it has not asked for through an event.
30
+
31
+ Going over a budget ends only that widget. OverCrow shows a fixed error in
32
+ its frame and restarts it after 1, 5 and 15 seconds, at most three times;
33
+ a package or protocol error waits for the user to enable it again. The
34
+ numbers are in [limits](limits.md#logic).
35
+
36
+ ## Permissions and consent
37
+
38
+ A widget gets nothing it has not declared in `manifest.json`, and a
39
+ declaration grants nothing by itself. When the widget is installed, the
40
+ Control Center proposes each permission checked, and the user may uncheck
41
+ any. Later, the user allows or takes back each permission in the Control
42
+ Center; taking one back restarts the widget without it.
43
+ OverCrow checks the permission again at every call of a service.
44
+
45
+ Four permissions open general services: `network` (exact HTTPS routes,
46
+ through OverCrow's broker), `storage` (a key-value store for this widget
47
+ only), `clipboardWrite` (writing text, during a user action) and
48
+ `gameEvents` (named game events).
49
+
50
+ Capabilities give access to data and actions of OverCrow and of the user's
51
+ accounts. A **sensitive** capability reveals personal data or the game
52
+ being played: a widget that declares one cannot also declare `network` or
53
+ `clipboardWrite`, and its storage lasts only as long as its process, so the
54
+ data cannot leave the machine through the widget.
55
+
56
+ Account connections (PlayerVox, Twitch) belong to OverCrow: sign-in, codes
57
+ and tokens are drawn and kept by OverCrow, and a widget receives only the
58
+ data its capability describes.
59
+
60
+ Each permission, each capability and the services it opens are described
61
+ in [services and permissions](services.md). Declare the least you need:
62
+ reviewers read every permission and route, and users see them before they
63
+ consent. Widgets tagged `built-in` in the signed catalog (PlayerVox widgets
64
+ only) start with their declared permissions granted; an update that asks
65
+ for more needs the user's consent, built-ins included.
66
+
67
+ ## User actions
68
+
69
+ Services that change something for the user can be called only while the
70
+ logic handles a real action of the user in the widget: a click, a key, an
71
+ edit, a submitted form. A call from a timer, from a service answer or from
72
+ a row of the options menu is refused with `gesture_required`. Widgets
73
+ receive input only in OverCrow's Interactive mode; in Passive mode they are
74
+ click-through. Deleting a note or a journal session also asks the user to
75
+ confirm in a dialog drawn by OverCrow. See
76
+ [calls that need a user action](services.md#calls-that-need-a-user-action).
77
+
78
+ What the user writes to notes, ratings and chat never passes through your
79
+ logic: a `form` with an `intent` sends the values of its own text fields and
80
+ sliders, which OverCrow fills, edits and submits itself. Your logic can read
81
+ them, not set them. See
82
+ [forms that write user data](forms.md#forms-that-write-user-data).
83
+
84
+ ## What a widget cannot do
85
+
86
+ - Read or write files, open sockets, reach the local network or any address
87
+ its manifest does not declare.
88
+ - Start processes, load native code, compile code at runtime or fetch code:
89
+ the only code is the reviewed `logic.js` of the package.
90
+ - See other widgets, their state, storage or permissions, or the game's
91
+ memory, window or input. OverCrow never injects into the game.
92
+ - Draw outside its frame, cover or imitate OverCrow's frame, menus or
93
+ confirmations.
94
+ - Read account tokens, cookies or credentials.
95
+ - Read the clipboard.
96
+ - Write to logs in production: `log.*` output appears only in a local
97
+ development session.
98
+ - Grant itself a permission, or use a menu row as a user action.
99
+
100
+ ## What OverCrow verifies
101
+
102
+ Every package is checked when it is admitted to the catalog and again each
103
+ time OverCrow starts it: the signed catalog, the ledger of its files and
104
+ the compiled view must match, or the widget does not start. See
105
+ [the package](package.md#how-overcrow-checks-a-package) and
106
+ [publishing and review](publishing.md).
107
+
108
+ A version of the catalog can be suspended or revoked after its
109
+ publication: OverCrow then stops the installed copy. See
110
+ [version statuses](publishing.md#version-statuses).
111
+
112
+ ## Reporting a vulnerability
113
+
114
+ Report vulnerabilities privately, as described in the repository's
115
+ [security policy](../../../SECURITY.md).