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