Releases: casual-simulation/casualos
Releases Β· casual-simulation/casualos
v3.2.15
π Features
- Added the
ldraw
andldrawText
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
- When paired with
- Added the
os.ldrawCountAddressBuildSteps(address)
andos.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
π₯ Breaking Changes
- Changed how
os.listData()
works to requiredata.list
access for theaccount
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 listpublicRead
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.
- This means that
- Changed
os.listData()
to throw aCausualOSError
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()
andos.revokeRecordMarkerPermission()
.- These functions have been replaced by
os.grantPermission()
andos.revokePermission()
.
- These functions have been replaced by
- 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
andsecret: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 ofdocuments
, which means that it is organized separately from other markers.
- This means that users need access to the
- The
os.listDataByMarker()
function is able to take advantage of this feature.- Calling
os.listDataByMarker(recordName, "secret:photos")
will only return data records withsecret:photos
, while callingos.listDataByMarker(recordName, "secret:documents")
will only return data records withsecret:documents
.
- Calling
- Markers can be formatted as
- Added
os.grantPermission(recordName, permission, options?)
andos.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 matchsecret:documents
, but listing bysecret
will not listsecret:documents
.
- This means that
- 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 settingVM_ORIGIN
tohttps://{{inst}}.example.com
will cause?staticInst=myInst
to load insidehttps://myInst.example.com
. Defaults to null, which means that no special origin is used.
- The
- 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()
andexperiment.endRecording()
. - Added the ability to track rate limits for the WebSocket API separately from the HTTP API.
- The
websocketRateLimit
property on theSERVER_CONFIG
controls the websockets rate limits. If not specified, then the options fromrateLimit
will be used for websockets and HTTP. - Additionally, the
websocketRateLimitPrefix
inredis
controls the namespace that values are stored at in Redis. If not specified, then therateLimitPrefix
will be used for both.
- The
- 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.
- Records actions, like
- 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 overminiMapPortalBot
. - 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()
andexperiment.endRecording()
where recording the screen with audio might fail in some cases.
v3.2.13
π 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
π₯ 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 foros.convertGeolocationToWhat3Words()
. If none is specified, then the default is used.
- Setting
comId
orcomID
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
π₯ Breaking Changes
- Changed the
BIOS_OPTIONS
environment variable to default tojoin 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 toenter join code
. - Added buttons for the
sign in
,sign up
, andsign 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
, andredis.connectionExpireMode
options in SERVER_CONFIG. - Defaults:
redis.tempInstRecordsLifetimeSeconds
defaults to60 * 60 * 24
(24 hours)redis.tempInstRecordsLifetimeExpireMode
defaults tonull
redis.connectionExpireSeconds
defaults to60 * 60 * 3
(3 hours)redis.connectionExpireMode
defaults tonull
- Configurable by the
π 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
π₯ Breaking Changes
- Changed the
BIOS_OPTIONS
environment variable to default toenter join code,local inst,studio inst,free inst,sign in,sign up,sign out
.
π Features
- Added new BIOS options.
local inst
- Works exactly likestatic inst
.local
- Shorthandlocal inst
.free inst
- Works exactly likepublic inst
.free
- Shorthand forfree inst
.studio inst
- Works exactly likeprivate inst
.studio
- Shorthand forstudio 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
π 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
π 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
π₯ Breaking Changes
- The
SessionSelector
parameter forremote(action, selector?)
has changed.- Before,
session
,username
, anddevice
were valid properties. - Now they are
sessionId
,userId
, andconnectionId
.
- Before,
- 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 alwaysv2
.- 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
, andaux-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.
- It is now possible to load a private inst using the
- Added the
permalink
tag to theconfigBot
.- 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.
- This tag contains a permanent link to the current inst. That is, the
- Added the
record
tag to theconfigBot
.- 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
, andhemisphereLight
subtypes. - Added
formLightIntensity
tag. - Added
formLightTarget
tag. - Added
formLightDistance
tag. - Added
formLightAngle
tag. - Added
formLightPenumbra
tag. - Added
formLightDecay
tag. - Added
formLightGroundColor
tag.
- Added
- 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.
- Works just like
- 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.
- If no value is specified, then
- Added the
privacyFeatures
tag to theauthBot
. 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
π 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.