Skip to content

Releases: casual-simulation/casualos

v3.2.15

20 Feb 20:43
Compare
Choose a tag to compare

πŸš€ Features

  • Added the ldraw and ldrawText subforms.
    • When paired with #form = "mesh", they both allow rendering a LDraw file as the bot's form.
    • ldraw - Renders the LDraw URL stored in #formAddress
    • ldrawText - Renders the LDraw text stored in #formAddress
  • Added the os.ldrawCountAddressBuildSteps(address) and os.ldrawCountTextBuildSteps(text) functions.
    • os.ldrawCountAddressBuildSteps(address) counts and returns the number of build steps that are in the LDraw file at the given URL. Returns a promise that resolves with the number of build steps that the file has.
    • os.ldrawCountTextBuildSteps(text) counts and returns the number of build steps that are in the given LDraw text. Returns a promise that resolves with the number of build steps that the file has.
  • Improved os.showUploadFiles() to return .mpd and .ldr files as text.
    • This makes it easier for users to work with LDraw files.

πŸ› Bug Fixes

  • Fixed an issue where public and local insts could not publish records.

v3.2.14

19 Feb 16:39
Compare
Choose a tag to compare

πŸ’₯ Breaking Changes

  • Changed how os.listData() works to require data.list access for the account marker instead of for each item individually.
    • This means that os.listData() will continue to work for users that have a record key or are admins (record owner or member of a studio), but it will no longer be possible to list publicRead data items through this function.
    • Instead, use the new os.listDataByMarker() function to list data based on a marker.
    • The reason for this change is to make the API more predictable. Previously, it was possible for os.listData() to return no results even if there were items after the given address. This is because a fixed number of items would be retrieved from the database and then checked to see if the user has access to it. If the user did not have access to any items, then an empty list would be returned, even if there are items that the user does have access to later in the database.
  • Changed os.listData() to throw a CausualOSError if the user is not authorized to list items.
    • Previously, an empty list would be returned. Now, an empty list is only returned if there are no items.
  • Removed os.grantRecordMarkerPermission() and os.revokeRecordMarkerPermission().
    • These functions have been replaced by os.grantPermission() and os.revokePermission().
  • Changed os.getCurrentInst() to always return the name of the inst that the bot exists in, instead of the first inst that was loaded into the session.

πŸš€ Features

  • Added the ability to organize records within a given marker.
    • Markers can be formatted as root:path.
      • root is known as the "root marker" and is what determines the security of a resource.
      • path is known as the "path marker" and is used to organize the resource.
    • It is still possible to format markers regularly. In this case, the marker doesn't have a path and is just a root.
      • All existing markers are treated this way.
    • For example, the markers secret and secret:documents both have the same root marker: secret.
      • This means that users need access to the secret root marker in order to access resources with either of these markers.
      • secret:documents has a path marker of documents, which means that it is organized separately from other markers.
    • The os.listDataByMarker() function is able to take advantage of this feature.
      • Calling os.listDataByMarker(recordName, "secret:photos") will only return data records with secret:photos, while calling os.listDataByMarker(recordName, "secret:documents") will only return data records with secret:documents.
  • Added os.grantPermission(recordName, permission, options?) and os.revokePermission(recordName, permissionId, options?).
    • os.grantPermission() creates a permission that grants the ability to perform an action (or set of actions) on a marker or resource to a user, inst, or role.
    • os.revokePermission() deletes the permission with the given ID.
  • Added the os.listDataByMarker(recordName, marker, startingAddress?, options?) function.
    • Useful for only listing data that has the given marker. Returns a promise that resolves with the total number of items that match the marker and up to 10 items.
    • Items are listed based on whether they exactly match one of the markers that are applied to the data items.
      • This means that secret:documents will match secret:documents, but listing by secret will not list secret:documents.
  • Added WebXR support for Apple Vision Pro.
    • A dialog will appear on Safari asking if you want to enter XR when trying to enable AR/VR through CasualOS. This is an extra security measure enforced by Safari.
    • visionOS currently only supports immersive-vr mode of WebXR sessions.
    • Added pinch select gesture detection for. This allows for pointer-based bot interaction on the Vision Pro since Safari does not implement select events while hand tracking in WebXR.
  • Categorized tags to seperate documentation pages.
  • Added the ability to support domain-level isolation for insts.
    • The VM_ORIGIN environment variable can now be configured to tell CasualOS to load insts into a unique HTTP Origin so that insts are isolated from each other.
    • VM_ORIGIN is The HTTP Origin that should be used to load the inst virtual machine. Useful for securely isolating insts from each other and from the frontend. Supports {{inst}} to customize the origin based on the inst that is being loaded. For example setting VM_ORIGIN to https://{{inst}}.example.com will cause ?staticInst=myInst to load inside https://myInst.example.com. Defaults to null, which means that no special origin is used.
  • Added the ability to request access to private insts that the user does not have permissions for.
  • Added the ability to customize the MIME type and bitrate of recordings made with experiment.beginRecording() and experiment.endRecording().
  • Added the ability to track rate limits for the WebSocket API separately from the HTTP API.
    • The websocketRateLimit property on the SERVER_CONFIG controls the websockets rate limits. If not specified, then the options from rateLimit will be used for websockets and HTTP.
    • Additionally, the websocketRateLimitPrefix in redis controls the namespace that values are stored at in Redis. If not specified, then the rateLimitPrefix will be used for both.
  • Added the os.getRecordsEndpoint() function to get the default records endpoint.
    • Records actions, like os.recordData(), os.getData(), os.recordFile(), etc. can be passed an endpoint which specifies which backend should be used for the request.
    • If no endpoint is specified, then a default is used.
    • os.getRecordsEndpoint() returns a promise that resolves to the endpoint that is used by default.
  • Added the os.showAccountInfo() function to show the "Account Information" dialog for users who are logged in.

πŸ› Bug Fixes

  • Fixed an issuse where os.showUploadFiles() dialog cuts off the "Upload" button when a lot of files are added.
  • Fixed an issue where fingers would trigger click interactions while dragging a bot with the same hand.
  • Fixed an issue where portalBackgroundAddress would render over miniMapPortalBot.
  • Fixed an issue where .click(), .focus(), and .blur() methods would not work on custom app HTML elements.
  • Fixed an issue where os.unregisterApp() would not trigger Preact cleanup code.
  • Fixed an issue where os.unloadInst() would not work when going from 2 instances to 1 instance.
  • Fixed an issue where menuPortal items would remain even if their inst was unloaded.
  • Fixed an issue where it was possible to have multiple login attempts at once by calling os.requestAuthBot() multiple times without waiting for one to complete.
  • Fixed some issues with experiment.beginRecording() and experiment.endRecording() where recording the screen with audio might fail in some cases.

v3.2.13

05 Feb 19:00
Compare
Choose a tag to compare

πŸš€ Features

  • Improved diagnostics for VR and AR features.

πŸ› Bug Fixes

  • Fixed an issue where ai.generateSkybox() would fail if an instances array was provided.

v3.2.12

02 Feb 19:38
Compare
Choose a tag to compare

πŸ’₯ Breaking Changes

  • Removed the ability to create avatars with ReadyPlayerMe.

πŸš€ Features

  • Added POST /api/v2/ai/skybox character limit prompt to match BlockadeLabs limit of 600 characters.
  • Added comID
    • comID is a set of features that allows studios to customize CasualOS based on their comID.
    • Studios can get a comID by obtaining a subscription that grants the comId feature to them.
    • Once a Studio has the feature, they can request the comID that they want from the Studio settings page.
    • They can also provide the following additional settings:
      • studio.name - The name of the Studio.
      • comID - The comID for the Studio. Studio admins can request a new comID for their studio.
      • comID.logoURL - The URL of the logo that should be displayed for the Studio and comID.
      • comID.allowedStudioCreators - The kinds of users that are allowed to create Studios within the comID. Possible options are "anyone" and "only-members".
      • comID.ab1BootstrapURL - The URL that specifies where the custom ab1 bootstrapper should be loaded from. If none is specified, then the default ab1 is loaded.
      • comID.allowedBiosOptions - The list of allowed BIOS options that can be presented to users. If none are specified, then the default list is used.
      • comID.defaultBiosOption - The BIOS option that is selected in the BIOS by default. If none is specified, then the default is used.
      • comID.automaticBiosOption - The BIOS option that will be automatically executed instead of displaying the BIOS. If none is specified, then the default is used.
      • comID.jitsiAppName - The name of the Jitsi App that should be used for the meetPortal. If none is specified, then the default is used.
      • comID.what3WordsApiKey - The API Key that should be used for os.convertGeolocationToWhat3Words(). If none is specified, then the default is used.
    • Setting comId or comID in the query tells CasualOS to use the settings that were configured on the related Studio settings page. Additionally, the logo of the studio will be displayed on the loading screens and BIOS.
  • Added some messaging to the sign up pages to inform users that valid emails are required in order to completely setup their accounts.

πŸ› Bug Fixes

  • Fixed an issuse where os.startFormAnimation() does not support starting paused animations with an initialTime greater than 0.

v3.2.11

29 Jan 19:23
Compare
Choose a tag to compare

πŸ’₯ Breaking Changes

  • Changed the BIOS_OPTIONS environment variable to default to join inst,local inst,studio inst,free inst,sign in,sign up,sign out.

πŸš€ Features

  • Added portalHDRAddress tag.
  • Added the join inst BIOS option as an alternative to enter join code.
  • Added buttons for the sign in, sign up, and sign out BIOS options.
  • Added the ability to automatically expire temporary inst data (tempShared space data) and websocket connections.
    • Configurable by the redis.tempInstRecordsLifetimeSeconds, redis.tempInstRecordsLifetimeExpireMode, redis.connectionExpireSeconds, and redis.connectionExpireMode options in SERVER_CONFIG.
    • Defaults:
      • redis.tempInstRecordsLifetimeSeconds defaults to 60 * 60 * 24 (24 hours)
      • redis.tempInstRecordsLifetimeExpireMode defaults to null
      • redis.connectionExpireSeconds defaults to 60 * 60 * 3 (3 hours)
      • redis.connectionExpireMode defaults to null

πŸ› Bug Fixes

  • Fixed an issue where branch info was being duplicated for temporary branches.
  • Fixed an issue where 'onSpaceRateLimitExceeded' was missing from 'Add New Tag' autocomplete list.

v3.2.10

17 Jan 00:17
Compare
Choose a tag to compare

πŸ’₯ Breaking Changes

  • Changed the BIOS_OPTIONS environment variable to default to enter join code,local inst,studio inst,free inst,sign in,sign up,sign out.

πŸš€ Features

  • Added new BIOS options.
    • local inst - Works exactly like static inst.
    • local - Shorthand local inst.
    • free inst - Works exactly like public inst.
    • free - Shorthand for free inst.
    • studio inst - Works exactly like private inst.
    • studio - Shorthand for studio inst.

πŸ› Bug Fixes

  • Fixed an issue where using the keyboard to select a tag in the sheetPortal would cause the page to refresh.
  • Fixed an issue where loading a studio inst for the first time after creating an account could fail.
  • Fixed an issue where gridPortal input did not work in the OculusBrowser.

v3.2.9

03 Jan 02:48
Compare
Choose a tag to compare

πŸ› Bug Fixes

  • Fixed some visual issues with studio subscriptions.
  • Fixed an issue where it was possible for a studio to have default user features when subscribed.

v3.2.8

29 Dec 17:28
Compare
Choose a tag to compare

πŸ› Bug Fixes

  • Fix issues with Docker ARM32 and ARM64 builds.
  • Fixed an issue where objects could not be stored as data if a max data size was set.

v3.2.7

22 Dec 16:55
Compare
Choose a tag to compare

πŸ’₯ Breaking Changes

  • The SessionSelector parameter for remote(action, selector?) has changed.
    • Before, session, username, and device were valid properties.
    • Now they are sessionId, userId, and connectionId.
  • The following obsolete functions have been removed:
    • os.checkout()
    • os.finishCheckout()
    • os.instances()
    • os.instStatuses()
    • server.setupServer()
    • os.setupInst()
    • server.backupToGithub()
    • server.backupAsDownload()
    • server.finishCheckout()
    • server.markHistory()
    • server.browseHistory()
    • server.restoreHistoryMark()
    • server.restoreHistoryMarkToServer()
    • server.restoreHistoryMarkToInst()
    • server.serverStatuses()
    • server.servers()
    • server.stories()
    • server.loadFile()
    • server.saveFile()
    • crypto.createCertificate()
    • crypto.signTag()
    • crypto.verifyTag()
    • crypto.revokeCertificate()
    • All the server.rpioXYZ functions.
    • All the server.serialXYZ functions.
    • All the adminSpace functions.
  • SHARED_PARTITIONS_VERSION is now always v2.
  • Removed all the causal-tree packages.
    • They are no longer needed since YJS does such a good job.
  • Merged all the websocket and data synchronization code into aux-common, aux-records, and aux-server.
  • Changed SERVER_CONFIG.subscriptions.subscriptions.defaultSubscription to be used to indicate that the subscription should be automatically given to users who do not have an active subscription.

πŸš€ Improvements

  • Added a "BIOS" screen at startup.
    • This screen only shows when no inst has been specified in the URL.
    • It allows the user to select what kind of inst they want to create and sign in.
    • The screen can be skippped by providing the bios query parameter. It accepts one of the following values:
      • static inst - Generates a static inst (device only). Static insts support local device storage, but do not sync across devices or browsers.
      • private inst - Generates a private inst that is synced to the cloud.
      • public inst - Generates a temporary public inst. This used to be the default.
      • enter join code - Show the BIOS screen box with the "enter join code" option already selected.
      • sign in - Show the BIOS screen with the "sign in" option already selected.
      • sign up - Show the BIOS screen with the "sign up" option already selected.
      • sign out - Show the BIOS screen with the "sign out" option already selected.
  • Added private insts.
    • It is now possible to load a private inst using the owner query parameter. It supports the following values:
      • player - Use the currently logged in user as the owner.
      • public - Use the temporary public partition as the owner.
      • The name of a record.
      • The ID of a user.
      • The ID of a studio.
    • If the owner query parameter is specified but no inst is specified, then the BIOS screen will be shown.
    • If the inst query parameter is specified but no owner is specified, then a temporary public inst will be loaded.
  • Added the permalink tag to the configBot.
    • This tag contains a permanent link to the current inst. That is, the owner query param is replaced with the actual record that the inst was loaded from.
    • This make it useful for sharing an exact link to the current inst.
  • Added the record tag to the configBot.
    • This tag contains the name of the record that the inst was loaded from.
    • If the inst is a temporary public inst, then this tag is omitted from the configBot.
  • Improved os.listUserStudios() to include the subscription tier of each studio.
  • Added light form.
    • Added pointLight, ambientLight, directionalLight, spotLight, and hemisphereLight subtypes.
    • Added formLightIntensity tag.
    • Added formLightTarget tag.
    • Added formLightDistance tag.
    • Added formLightAngle tag.
    • Added formLightPenumbra tag.
    • Added formLightDecay tag.
    • Added formLightGroundColor tag.
  • Added menu items password subtype.
  • Added the os.requestAuthBotInBackground() function.
    • Works just like os.requestAuthBot() except that the user will not be prompted to login.
    • Returns the user's auth bot if they are signed in.
    • Returns null if the user is not signed in.
  • Added the REQUIRE_PRIVO_LOGIN environment variable during build to control whether login with Privo is required.
  • Added the DEFAULT_BIOS_OPTION environment variable during build to control which BIOS option is selected by default.
  • Added the AUTOMATIC_BIOS_OPTION environment variable during build to specify the BIOS option that should be executed by default. Setting this to a valid BIOS value will skip the BIOS screen.
  • Added the AUTH_WEBSOCKET_ENDPOINT environment variable during build to control the websocket endpoint that the auth site looks for.
  • Added the ability to limit how large data records can be in tiers.data.maxItemSizeInBytes.
    • If no value is specified, then 500000 (500KB) is used.
    • null can be used to remove the limit.
  • Added the privacyFeatures tag to the authBot. It is an object with the following properties:
    • publishData - A boolean that specifies whether the user is allowed to publish any data at all.
    • allowPublicData - A boolean that specifies whether the user is allowed to publish or access public data.
    • allowAI - A boolean that specifies whether the user is allowed to access AI features.
    • allowPublicInsts - A boolean that specifies whether the user is allowed to access public insts.
  • Added the os.reportInst() function.
    • Opens the "Report Inst" dialog that gives the user an opportunity to describe what they are seeing and report it.
    • Returns a promise that resolves when the inst has been reported.

πŸ› Bug Fixes

  • Fixed an issue where os.getCurrentInst would not work properly if multiple instances are loaded
  • Fixed an issue where work state was not retained in systemPortal after switching to diff panel
  • Fixed an issue where setting cube bots with scale 0 did not receive pointer events
  • Fixed an issue where labels were broken when setting labelPosition and labelAlignment to left or right
  • Attempted to fix an issue where the code editor could get desynced from the actual bot script state.
  • Fixed an issue where using os.enablePointOfView() with IMU data would not produce correct rotations.

v3.2.6

01 Sep 14:58
Compare
Choose a tag to compare

πŸš€ Improvements

  • Updated to support Node.js 18.x.
  • Improved the build process to inject the SERVER_CONFIG environment variable into the resulting JS bundle instead of requiring the CloudFormation inject it into the Lambda functions itself.