@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.
- package/LICENSE +21 -0
- package/README.md +91 -1
- 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 +50 -4
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
{
|
|
2
|
+
"scenarioVersion": 1,
|
|
3
|
+
"name": "unavailable",
|
|
4
|
+
"description": "The host's journal source fails: the subscription ends with unavailable, the widget shows it without the last sessions, subscribes again 5 s later and reads the journal the restarted source reports.",
|
|
5
|
+
"fixtures": {
|
|
6
|
+
"calls": {
|
|
7
|
+
"journal.page": [
|
|
8
|
+
{
|
|
9
|
+
"value": {
|
|
10
|
+
"gameName": "Portal 2",
|
|
11
|
+
"items": [
|
|
12
|
+
{
|
|
13
|
+
"id": "00000000-0000-4000-8000-000000000013",
|
|
14
|
+
"startedAt": 1789929000000,
|
|
15
|
+
"offsetMinutes": 120,
|
|
16
|
+
"durationMs": 2700000,
|
|
17
|
+
"source": "local"
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"id": "00000000-0000-4000-8000-000000000012",
|
|
21
|
+
"startedAt": 1789844700000,
|
|
22
|
+
"offsetMinutes": 120,
|
|
23
|
+
"durationMs": 7920000,
|
|
24
|
+
"source": "cloud"
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"id": "00000000-0000-4000-8000-000000000011",
|
|
28
|
+
"startedAt": 1789629300000,
|
|
29
|
+
"offsetMinutes": 120,
|
|
30
|
+
"durationMs": 480000,
|
|
31
|
+
"source": "local"
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"id": "00000000-0000-4000-8000-000000000010",
|
|
35
|
+
"startedAt": 1789214400000,
|
|
36
|
+
"offsetMinutes": 120,
|
|
37
|
+
"durationMs": 14400000,
|
|
38
|
+
"source": "cloud"
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"id": "00000000-0000-4000-8000-000000000009",
|
|
42
|
+
"startedAt": 1788640920000,
|
|
43
|
+
"offsetMinutes": 120,
|
|
44
|
+
"durationMs": 3660000,
|
|
45
|
+
"source": "local"
|
|
46
|
+
}
|
|
47
|
+
],
|
|
48
|
+
"page": 1,
|
|
49
|
+
"next": "c2",
|
|
50
|
+
"previous": null
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
"value": {
|
|
55
|
+
"gameName": "Portal 2",
|
|
56
|
+
"items": [
|
|
57
|
+
{
|
|
58
|
+
"id": "00000000-0000-4000-8000-000000000013",
|
|
59
|
+
"startedAt": 1789929000000,
|
|
60
|
+
"offsetMinutes": 120,
|
|
61
|
+
"durationMs": 2700000,
|
|
62
|
+
"source": "local"
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"id": "00000000-0000-4000-8000-000000000012",
|
|
66
|
+
"startedAt": 1789844700000,
|
|
67
|
+
"offsetMinutes": 120,
|
|
68
|
+
"durationMs": 7920000,
|
|
69
|
+
"source": "cloud"
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"id": "00000000-0000-4000-8000-000000000011",
|
|
73
|
+
"startedAt": 1789629300000,
|
|
74
|
+
"offsetMinutes": 120,
|
|
75
|
+
"durationMs": 480000,
|
|
76
|
+
"source": "local"
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
"id": "00000000-0000-4000-8000-000000000010",
|
|
80
|
+
"startedAt": 1789214400000,
|
|
81
|
+
"offsetMinutes": 120,
|
|
82
|
+
"durationMs": 14400000,
|
|
83
|
+
"source": "cloud"
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
"id": "00000000-0000-4000-8000-000000000009",
|
|
87
|
+
"startedAt": 1788640920000,
|
|
88
|
+
"offsetMinutes": 120,
|
|
89
|
+
"durationMs": 3660000,
|
|
90
|
+
"source": "local"
|
|
91
|
+
}
|
|
92
|
+
],
|
|
93
|
+
"page": 1,
|
|
94
|
+
"next": "c2",
|
|
95
|
+
"previous": null
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
]
|
|
99
|
+
},
|
|
100
|
+
"subscriptions": {
|
|
101
|
+
"journal.subscribe": {
|
|
102
|
+
"revision": 1,
|
|
103
|
+
"notice": null
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
},
|
|
107
|
+
"steps": [
|
|
108
|
+
{
|
|
109
|
+
"expect": {
|
|
110
|
+
"text": [
|
|
111
|
+
"Portal 2"
|
|
112
|
+
],
|
|
113
|
+
"state": "running",
|
|
114
|
+
"calls": [
|
|
115
|
+
{
|
|
116
|
+
"service": "journal.subscribe",
|
|
117
|
+
"outcome": "ok"
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
"service": "journal.page",
|
|
121
|
+
"outcome": "ok"
|
|
122
|
+
}
|
|
123
|
+
]
|
|
124
|
+
}
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
"publish": {
|
|
128
|
+
"service": "journal.subscribe",
|
|
129
|
+
"error": "unavailable"
|
|
130
|
+
}
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
"expect": {
|
|
134
|
+
"text": [
|
|
135
|
+
"The journal is unavailable. Retrying automatically."
|
|
136
|
+
],
|
|
137
|
+
"noText": [
|
|
138
|
+
"Portal 2",
|
|
139
|
+
"Page 1"
|
|
140
|
+
],
|
|
141
|
+
"image": "unavailable"
|
|
142
|
+
}
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
"advance": {
|
|
146
|
+
"ms": 4999
|
|
147
|
+
}
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
"expect": {
|
|
151
|
+
"calls": []
|
|
152
|
+
}
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
"advance": {
|
|
156
|
+
"ms": 1
|
|
157
|
+
}
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
"expect": {
|
|
161
|
+
"text": [
|
|
162
|
+
"Portal 2",
|
|
163
|
+
"Page 1"
|
|
164
|
+
],
|
|
165
|
+
"noText": [
|
|
166
|
+
"The journal is unavailable. Retrying automatically."
|
|
167
|
+
],
|
|
168
|
+
"calls": [
|
|
169
|
+
{
|
|
170
|
+
"service": "journal.subscribe",
|
|
171
|
+
"outcome": "ok"
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
"service": "journal.page",
|
|
175
|
+
"params": {},
|
|
176
|
+
"outcome": "ok"
|
|
177
|
+
}
|
|
178
|
+
],
|
|
179
|
+
"image": "recovered"
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
]
|
|
183
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2023",
|
|
4
|
+
"lib": ["ES2023"],
|
|
5
|
+
"types": [],
|
|
6
|
+
"module": "ES2022",
|
|
7
|
+
"moduleResolution": "bundler",
|
|
8
|
+
"strict": true,
|
|
9
|
+
"noEmit": true,
|
|
10
|
+
"isolatedModules": true,
|
|
11
|
+
"verbatimModuleSyntax": true,
|
|
12
|
+
"noUncheckedIndexedAccess": true,
|
|
13
|
+
"exactOptionalPropertyTypes": true
|
|
14
|
+
},
|
|
15
|
+
"include": ["logic.ts"]
|
|
16
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
<!-- PlayerVox Journal: the finished sessions of the active game, five per
|
|
2
|
+
page, with the trash and paging buttons in Interactive mode (parity
|
|
3
|
+
sheet: playervox-overcrow docs/builtin-parity/playervox-journal.md).
|
|
4
|
+
The host confirms a deletion in its own chrome. -->
|
|
5
|
+
<box class="journal" label={t("label")}>
|
|
6
|
+
<box class="header">
|
|
7
|
+
<text class="title">{t("label")}</text>
|
|
8
|
+
<canvas ref="mark" class="mark" label={t("mark")}/>
|
|
9
|
+
</box>
|
|
10
|
+
<if test={message(state.problem, state.notice) != ""}>
|
|
11
|
+
<text class="message">{message(state.problem, state.notice)}</text>
|
|
12
|
+
</if>
|
|
13
|
+
<if test={state.phase == "loading"}>
|
|
14
|
+
<text class="status">{t("loading")}</text>
|
|
15
|
+
</if>
|
|
16
|
+
<if test={state.phase == "idle"}>
|
|
17
|
+
<text class="status">{t("waiting")}</text>
|
|
18
|
+
</if>
|
|
19
|
+
<if test={state.phase == "ready"}>
|
|
20
|
+
<if test={gameName(state.page) != ""}>
|
|
21
|
+
<text class="game" tooltip={cutBytes(gameName(state.page), 256)}>{gameName(state.page)}</text>
|
|
22
|
+
</if>
|
|
23
|
+
<if test={state.page.items.length == 0}>
|
|
24
|
+
<text class="status">{t("empty")}</text>
|
|
25
|
+
</if>
|
|
26
|
+
<for each={rows(state.page)} as="row" key={row.id}>
|
|
27
|
+
<separator class="rule"/>
|
|
28
|
+
<box class="row" label={row.label}>
|
|
29
|
+
<text class="start">{row.start}</text>
|
|
30
|
+
<text class="duration">{row.duration}</text>
|
|
31
|
+
<if test={canRemove(state.interactive)}>
|
|
32
|
+
<button class="control" label={t("delete")} tooltip={t("delete")} disabled={state.busy} on:activate={remove(row.id)}>
|
|
33
|
+
<icon name="trash"/>
|
|
34
|
+
</button>
|
|
35
|
+
</if>
|
|
36
|
+
</box>
|
|
37
|
+
</for>
|
|
38
|
+
<if test={paged(state.page)}>
|
|
39
|
+
<box class="footer">
|
|
40
|
+
<if test={state.interactive}>
|
|
41
|
+
<button class="control" label={t("previous")} tooltip={t("previous")} disabled={state.busy || state.page.previous == null} on:activate={turn("previous")}>
|
|
42
|
+
<icon name="chevron-left"/>
|
|
43
|
+
</button>
|
|
44
|
+
<button class="control" label={t("next")} tooltip={t("next")} disabled={state.busy || state.page.next == null} on:activate={turn("next")}>
|
|
45
|
+
<icon name="chevron-right"/>
|
|
46
|
+
</button>
|
|
47
|
+
</if>
|
|
48
|
+
<text class="page">{pageLabel(state.page)}</text>
|
|
49
|
+
</box>
|
|
50
|
+
</if>
|
|
51
|
+
</if>
|
|
52
|
+
</box>
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Valhallab SASU
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
6
|
+
this software and associated documentation files (the "Software"), to deal in
|
|
7
|
+
the Software without restriction, including without limitation the rights to
|
|
8
|
+
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
|
9
|
+
the Software, and to permit persons to whom the Software is furnished to do so,
|
|
10
|
+
subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
# My rating (PlayerVox Rating)
|
|
2
|
+
|
|
3
|
+
`com.playervox.overcrow.playervox.rating` — your own PlayerVox rating of the
|
|
4
|
+
Steam game you play: its grade badge (S+ to F) and score out of 100, and in
|
|
5
|
+
Interactive mode a form with three criteria (Gameplay, Art, Technology) and
|
|
6
|
+
an optional review, to publish or update the rating on PlayerVox. It needs
|
|
7
|
+
your PlayerVox account. A built-in of OverCrow, written against the public
|
|
8
|
+
`@overcrow/sdk` and packaged with `overcrow-widget` like any creator's
|
|
9
|
+
widget. MIT.
|
|
10
|
+
|
|
11
|
+
## What it shows
|
|
12
|
+
|
|
13
|
+
| State | Shows |
|
|
14
|
+
| --- | --- |
|
|
15
|
+
| Rated | the game's name, the badge, "93 /100", "Your published rating" / "Votre note publiée" |
|
|
16
|
+
| Not rated yet | the game's name, a neutral `--` badge, "-- /100", "Not rated yet" / "Pas encore noté" |
|
|
17
|
+
| Waiting for PlayerVox | a `--` badge and "Loading…" / "Chargement…": after a game switch too, never the previous game's rating |
|
|
18
|
+
| No game | "Waiting for a game" / "En attente du jeu" |
|
|
19
|
+
| A game without a Steam app ID | "Game not linked" / "Jeu non associé", "Steam game required" / "Jeu Steam requis" |
|
|
20
|
+
| The rating cannot be read | "Rating unavailable" / "Note indisponible", "PlayerVox is unavailable for this game right now." |
|
|
21
|
+
| Offline | the last rating read; OverCrow adds its own notice under the content |
|
|
22
|
+
| No account, a sign-in in progress, an expired session | nothing of the widget: OverCrow covers it with its account panel (link or create an account, reopen the browser, cancel) |
|
|
23
|
+
| No permission to read | "Rating unavailable", "Allow access to your rating in the Control Center.": the widget asks OverCrow nothing |
|
|
24
|
+
|
|
25
|
+
The score is the mean of the three criteria, rounded half away from zero
|
|
26
|
+
(96, 88 and 94 show "93"); the grade is the mean's: S+ ≥ 90, S ≥ 80, A ≥ 70,
|
|
27
|
+
B ≥ 60, C ≥ 40, D ≥ 20, else F. The badge and the PlayerVox mark are drawn
|
|
28
|
+
from the source shared with PlayerVox Score
|
|
29
|
+
([widgets-shared](../../widgets-shared/README.md)); the badge pulses once
|
|
30
|
+
when a published rating shows or changes, never for a draft.
|
|
31
|
+
|
|
32
|
+
In Passive mode the widget shows only the published rating: no form, no
|
|
33
|
+
draft.
|
|
34
|
+
|
|
35
|
+
## The form (Interactive mode)
|
|
36
|
+
|
|
37
|
+
| Control | |
|
|
38
|
+
| --- | --- |
|
|
39
|
+
| Gameplay, Art / Artistique, Technology / Technique | sliders from 0 to 100 by 1, their value beside them |
|
|
40
|
+
| REVIEW · OPTIONAL / AVIS · FACULTATIF | a text area, "What stood out to you?", at most 2000 characters |
|
|
41
|
+
| The button | "Publish my rating" before the first rating, "Update my rating" after; "Saving…" while OverCrow sends it; "Saved on PlayerVox" once stored, until the next change |
|
|
42
|
+
|
|
43
|
+
- **The form is OverCrow's.** Its sliders and its review are host-owned
|
|
44
|
+
controls of a `form` bound to the `playervox.rating.publish` intent: the
|
|
45
|
+
view gives them no `value`. OverCrow fills them with your published
|
|
46
|
+
rating, or with 50 / 50 / 50 and an empty review before the first one,
|
|
47
|
+
and tells the logic each value through the control's `input` event. The
|
|
48
|
+
logic only follows them, to show the draft's mean and to know whether
|
|
49
|
+
something changed.
|
|
50
|
+
- **Publishing** takes your gesture: a click on the button, Enter or Space
|
|
51
|
+
on it, or Ctrl+Enter in the review. OverCrow then sends the values of
|
|
52
|
+
its own controls; the logic never supplies them and cannot submit the
|
|
53
|
+
form itself. An unchanged review is not sent again; an emptied one
|
|
54
|
+
removes the published review.
|
|
55
|
+
- **The button is active** when PlayerVox is reachable and there is
|
|
56
|
+
something to send: a first rating, or a change. While the score beside
|
|
57
|
+
the badge is a draft's, the caption reads "Unpublished draft" /
|
|
58
|
+
"Brouillon non publié".
|
|
59
|
+
- **The draft is kept by OverCrow**: through Passive mode (the form stays
|
|
60
|
+
in the view, hidden), through a failed publication, and when the rating
|
|
61
|
+
changes elsewhere while you edit. An untouched form follows the new
|
|
62
|
+
rating. Another game, or another PlayerVox user, starts from its own
|
|
63
|
+
rating.
|
|
64
|
+
- **Once stored**, the rating comes back through the subscription: the
|
|
65
|
+
widget reads nothing again.
|
|
66
|
+
- **Offline**, the form shows "Offline · Your changes stay here until you
|
|
67
|
+
save them." and takes no input.
|
|
68
|
+
|
|
69
|
+
### When a publication fails
|
|
70
|
+
|
|
71
|
+
The draft stays, the button comes back, and a message shows above it:
|
|
72
|
+
|
|
73
|
+
| OverCrow's answer | Message |
|
|
74
|
+
| --- | --- |
|
|
75
|
+
| `invalid_request` (PlayerVox refused the values, or the game is not released) | "Check the values and try saving again." |
|
|
76
|
+
| `not_connected` (the session ended) | "Your connection expired. Link your account again." |
|
|
77
|
+
| `busy` (another publication is in flight, or too many requests) | "An operation is already in progress. Please try again shortly." |
|
|
78
|
+
| `stale_context` (the game or the account changed meanwhile) | "The account or game changed. Review your changes before saving." |
|
|
79
|
+
| `permission_denied` | "This action is not available for your account." |
|
|
80
|
+
| `unavailable`, `timeout` (no answer from PlayerVox within 30 s) and any other | "PlayerVox is unavailable for this game right now." |
|
|
81
|
+
|
|
82
|
+
Should OverCrow give no answer at all, the button comes back after 40 s
|
|
83
|
+
with the last message.
|
|
84
|
+
|
|
85
|
+
## Controls
|
|
86
|
+
|
|
87
|
+
Tab moves through the three sliders, the review and the button. On a
|
|
88
|
+
slider: the arrow keys move by 1, Page Up and Page Down by 10, Home and
|
|
89
|
+
End to the ends; a click or a drag on the track sets it. The keyboard goes
|
|
90
|
+
to the widget the pointer rests on.
|
|
91
|
+
|
|
92
|
+
## Menu
|
|
93
|
+
|
|
94
|
+
No row of its own.
|
|
95
|
+
|
|
96
|
+
## Size
|
|
97
|
+
|
|
98
|
+
350 px wide by default, from 280 px; the height fits the content: the
|
|
99
|
+
summary alone in Passive mode, the form below it in Interactive mode.
|
|
100
|
+
|
|
101
|
+
## Permissions
|
|
102
|
+
|
|
103
|
+
- `playervox.rating.read`: your own rating of the active game, with the
|
|
104
|
+
game's name. Sensitive.
|
|
105
|
+
- `playervox.rating.write`: publish a rating and a review through the
|
|
106
|
+
host-bound form. Sensitive.
|
|
107
|
+
|
|
108
|
+
As sensitive capabilities rule out the network and the clipboard, the
|
|
109
|
+
widget declares neither, and no storage: it keeps nothing. OverCrow reads
|
|
110
|
+
the rating and sends the publication with your PlayerVox session
|
|
111
|
+
(`api.playervox.com`); it reads the rating only while this widget
|
|
112
|
+
subscribes. With the read permission alone the widget shows the rating and
|
|
113
|
+
no form.
|
|
114
|
+
|
|
115
|
+
## Tests
|
|
116
|
+
|
|
117
|
+
- `tests/logic.test.mjs`: the logic on `@overcrow/sdk/testing`: every state's
|
|
118
|
+
text, the draft's mean and rounding, when the button is active, the
|
|
119
|
+
Publish, Saving, Saved cycle, each failure's message, the 40 s bound, one
|
|
120
|
+
pulse per new published rating, the retry of a failed subscription.
|
|
121
|
+
- Scenarios, played in OverCrow's headless runtime
|
|
122
|
+
(`overcrow-widget test --runtime …`), with their reference images in
|
|
123
|
+
`tests/reference/`:
|
|
124
|
+
|
|
125
|
+
| Scenario | Covers |
|
|
126
|
+
| --- | --- |
|
|
127
|
+
| `states` | every state in Passive mode, dark English and light French, 100 % and 150 % |
|
|
128
|
+
| `form` | the form filled by OverCrow, rated and not rated yet, both themes and languages, 150 %, 280 px wide |
|
|
129
|
+
| `publish-keyboard` | Tab, an arrow key, Enter on the button, then Ctrl+Enter in the review: what OverCrow sends, Saved |
|
|
130
|
+
| `publish-pointer` | a first rating with the pointer, then Saving with no answer, `unavailable`, `busy`, `timeout`, `stale_context` and `not_connected` |
|
|
131
|
+
| `offline` | the last rating, OverCrow's notice, a form that takes no input, then online again |
|
|
132
|
+
| `account` | OverCrow's account panel signed out, pending and expired, in both modes; no input reaches the widget |
|
|
133
|
+
| `draft` | the draft through Passive mode and a rating published elsewhere; an untouched form follows; another game |
|
|
134
|
+
| `bounds` | a long game name; a review cut at 2000 characters by OverCrow's field |
|
|
135
|
+
| `refused` | no grant: no call, "Rating unavailable" |
|
|
136
|
+
| `read-only` | the read grant alone: the rating, never the form |
|
|
137
|
+
|
|
138
|
+
A publication refused because no gesture made it (`gesture_required`)
|
|
139
|
+
cannot be played by a scenario, where every submission is a gesture:
|
|
140
|
+
OverCrow tests it with this package in its own repository.
|
|
141
|
+
|
|
142
|
+
## Cost
|
|
143
|
+
|
|
144
|
+
Measured on 2026-10-01 with OverCrow's release build, on an AMD Ryzen 7
|
|
145
|
+
5800X3D Linux workstation and in a Windows 11 virtual machine (2 vCPU),
|
|
146
|
+
with a published rating and its review:
|
|
147
|
+
|
|
148
|
+
| | Linux | Windows (VM) |
|
|
149
|
+
| --- | --- | --- |
|
|
150
|
+
| Widget start, warm, into the overlay's runtime | 8.7 ms (p50), 8.8 ms at most | VM ready in 14–15 ms (p50) |
|
|
151
|
+
| VM memory | 0.79 MiB private, 0.97 MiB PSS | 1.15 MiB private working set, 1.43 MiB private commit |
|
|
152
|
+
| Private memory in all (VM, sandbox helpers, overlay share) | 8.7–11.2 MB | — |
|
|
153
|
+
| CPU at rest, Passive mode | 0.05 % of one core, no frame | — |
|
|
154
|
+
| CPU at rest, the form open | 0.03–0.05 % of one core, no frame | — |
|
|
155
|
+
| CPU, a slider changed and the rating published every 2 s | 0.30 % of one core: the frames of the keys, the outcome and the badge's pulse (about 36 frames of 0.10 ms), then none | — |
|
|
156
|
+
| CPU, hidden, a new rating every 2 s | 0.05 % of one core | — |
|
|
157
|
+
| VM CPU | one short turn per rating or form value; none at rest | — |
|
|
158
|
+
|
|
159
|
+
A rating changes when you publish one: the 2 s load is a stress. The
|
|
160
|
+
private memory is above OverCrow's 8 MB goal per widget by up to 3 MB and
|
|
161
|
+
far under its 80 MB ceiling. The egui widget it replaces painted in the
|
|
162
|
+
overlay's own process (0.05 ms a frame in Passive mode, 0.09 ms with its
|
|
163
|
+
form) and repainted each second while a publication was pending; OverCrow
|
|
164
|
+
read the rating whenever that widget was enabled, and now only while this
|
|
165
|
+
widget subscribes. Scenarios render the same images on Linux and Windows,
|
|
166
|
+
pixel for pixel.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"author": "PlayerVox",
|
|
3
|
+
"spdxLicense": "MIT",
|
|
4
|
+
"sourceUrl": "https://github.com/Valhallab/playervox-overcrow-releases/tree/main/widgets/playervox-rating",
|
|
5
|
+
"preview": "assets/preview.png",
|
|
6
|
+
"defaultLocale": "en",
|
|
7
|
+
"localizations": [
|
|
8
|
+
{
|
|
9
|
+
"locale": "en",
|
|
10
|
+
"name": "My rating",
|
|
11
|
+
"description": "Your own PlayerVox rating of the Steam game you play: its grade and score, and in Interactive mode three criteria and an optional review to publish or update. Needs your PlayerVox account."
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
"locale": "fr",
|
|
15
|
+
"name": "Ma note",
|
|
16
|
+
"description": "Votre note PlayerVox du jeu Steam auquel vous jouez : son grade et son score, et en mode interactif trois critères et un avis facultatif à publier ou mettre à jour. Nécessite votre compte PlayerVox."
|
|
17
|
+
}
|
|
18
|
+
]
|
|
19
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"label": "My PlayerVox rating",
|
|
3
|
+
"title": "My rating",
|
|
4
|
+
"mark": "PlayerVox",
|
|
5
|
+
"waiting": "Waiting for a game",
|
|
6
|
+
"unsupported": "Game not linked",
|
|
7
|
+
"steam-required": "Steam game required",
|
|
8
|
+
"loading": "Loading…",
|
|
9
|
+
"unavailable": "Rating unavailable",
|
|
10
|
+
"retrying": "PlayerVox is unavailable for this game right now.",
|
|
11
|
+
"no-permission": "Allow access to your rating in the Control Center.",
|
|
12
|
+
"unrated": "Not rated yet",
|
|
13
|
+
"published": "Your published rating",
|
|
14
|
+
"draft": "Unpublished draft",
|
|
15
|
+
"gameplay": "Gameplay",
|
|
16
|
+
"art": "Art",
|
|
17
|
+
"tech": "Technology",
|
|
18
|
+
"grade": "Grade",
|
|
19
|
+
"no-grade": "No grade",
|
|
20
|
+
"review-optional": "REVIEW · OPTIONAL",
|
|
21
|
+
"review-label": "Review, optional",
|
|
22
|
+
"review-hint": "What stood out to you?",
|
|
23
|
+
"publish": "Publish my rating",
|
|
24
|
+
"update": "Update my rating",
|
|
25
|
+
"saving": "Saving…",
|
|
26
|
+
"saved": "Saved on PlayerVox",
|
|
27
|
+
"publish-hint": "Your rating and review will be visible on PlayerVox.",
|
|
28
|
+
"offline": "Offline · Your changes stay here until you save them.",
|
|
29
|
+
"error-invalid": "Check the values and try saving again.",
|
|
30
|
+
"error-expired": "Your connection expired. Link your account again.",
|
|
31
|
+
"error-busy": "An operation is already in progress. Please try again shortly.",
|
|
32
|
+
"error-stale": "The account or game changed. Review your changes before saving.",
|
|
33
|
+
"error-forbidden": "This action is not available for your account.",
|
|
34
|
+
"error-unavailable": "PlayerVox is unavailable for this game right now."
|
|
35
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"label": "Ma note PlayerVox",
|
|
3
|
+
"title": "Ma note",
|
|
4
|
+
"mark": "PlayerVox",
|
|
5
|
+
"waiting": "En attente du jeu",
|
|
6
|
+
"unsupported": "Jeu non associé",
|
|
7
|
+
"steam-required": "Jeu Steam requis",
|
|
8
|
+
"loading": "Chargement…",
|
|
9
|
+
"unavailable": "Note indisponible",
|
|
10
|
+
"retrying": "PlayerVox est indisponible pour ce jeu pour le moment.",
|
|
11
|
+
"no-permission": "Autorisez l’accès à votre note dans le Centre de contrôle.",
|
|
12
|
+
"unrated": "Pas encore noté",
|
|
13
|
+
"published": "Votre note publiée",
|
|
14
|
+
"draft": "Brouillon non publié",
|
|
15
|
+
"gameplay": "Gameplay",
|
|
16
|
+
"art": "Artistique",
|
|
17
|
+
"tech": "Technique",
|
|
18
|
+
"grade": "Note",
|
|
19
|
+
"no-grade": "Pas de note",
|
|
20
|
+
"review-optional": "AVIS · FACULTATIF",
|
|
21
|
+
"review-label": "Avis, facultatif",
|
|
22
|
+
"review-hint": "Qu’est-ce qui vous a marqué ?",
|
|
23
|
+
"publish": "Publier ma note",
|
|
24
|
+
"update": "Mettre à jour ma note",
|
|
25
|
+
"saving": "Enregistrement…",
|
|
26
|
+
"saved": "Enregistré sur PlayerVox",
|
|
27
|
+
"publish-hint": "Votre note et votre avis seront visibles sur PlayerVox.",
|
|
28
|
+
"offline": "Hors ligne · Vos modifications restent ici jusqu’à leur enregistrement.",
|
|
29
|
+
"error-invalid": "Vérifiez les valeurs et réessayez d’enregistrer.",
|
|
30
|
+
"error-expired": "Votre connexion a expiré. Reliez votre compte.",
|
|
31
|
+
"error-busy": "Une opération est en cours. Réessayez dans un instant.",
|
|
32
|
+
"error-stale": "Le compte ou le jeu a changé. Vérifiez vos modifications avant d’enregistrer.",
|
|
33
|
+
"error-forbidden": "Cette action n’est pas disponible pour votre compte.",
|
|
34
|
+
"error-unavailable": "PlayerVox est indisponible pour ce jeu pour le moment."
|
|
35
|
+
}
|