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