Releases: casual-simulation/casualos
Releases Β· casual-simulation/casualos
v3.3.15
π Features
- Added the ability to use CasualOS URLs in
<video>
HTML custom app elements.- This makes it possible to use LiveKit tracks in a custom app.
- Tip: Utilize the
autoplay
attribute to automatically play video from a track.
π Bug Fixes
- Fixed an issue in
LivekitManager
where media permissions for the camera and microphone were not requested before joining a room. Resulting in silent fails for Google Chrome users. ThejoinRoom
method now includes a preliminary step to check and request these permissions, ensuring a smoother user experience.
v3.3.14
π Features
- Added the ability to manually configure the buffer rate for
os.beginAudioRecording()
.
π Bug Fixes
- Fixed an issue where bots were not removed from the sheetPortal when an inst was unloaded.
v3.3.13
π Features
-
Added
ai.chat.allowedModels
feature to enforce model usage limits, restricting access to specific models based on configuration. -
Added shared documents.
-
Shared documents utilize insts to be able to share data without using bots and tags.
-
Additionally, shared documents can be loaded and unloaded at will.
-
The following functions have been added:
os.getSharedDocument(name)
- Gets a document that is stored in the current inst.os.getSharedDocument(recordName, inst, name)
- Gets a document that is stored in the specified inst.os.getLocalDocument(name)
- Gets a document that is stored on this device.os.getMemoryDocument()
- Gets a document that is stored in memory and cleared upon refresh.
-
Usage:
// Get a document stored in this inst named "test" const doc = await os.getSharedDocument('test'); // maps work like the Map type (see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map) const inventory = doc.getMap<number>('inventory'); inventory.set('spoons', 2); inventory.set('forks', 3); os.log('Number of spoons: ' + inventory.get('spoons')); // arrays work like regular JavaScript arrays: const shoppingList = doc.getArray<string>('shoppingList'); shoppingList.push('cereal', 'milk', 'eggs'); os.log('Shopping list:', inventory.toArray()); // Text is a special type that makes it easy to work with long strings const blogPost = doc.getText('blogPost'); blogPost.insert(0, 'Hello, world!'); os.log('Blog Post:
-
', blogPost.toString());
```
π Bug Fixes
- Fixed an issue where CasualOS would prompt for login when trying to join a room using
os.joinRoom()
.
v3.3.12
π Features
- Added the
moderator
user role.- This will make it much easier for us to moderate content and help ensure that we're creating safe platforms.
π Bug Fixes
- Better handle scenarios when an email address is already taken on Privo's side.
- Fixed an issue where manually setting a
sessionKey
andconnectionKey
in the URL might not actually log the user in.
v3.3.11
π Features
- Added webhook records.
- When enabled, webhook records make it possible to run AUX code inside a server.
- Webhook records work using a request/response model.
- When a request is made to execute the webhook, it grabs the configured target AUX file from another record and then executes it.
- A webhook gets its state from one of 3 different targets:
data
: The webhook will use the bots from a data record.file
: The webhook will use the bots from a file record.inst
: The webhook will use the bots from an inst record.- Only supports reading from insts for now.
- Webhooks are secured by markers, just like regular records.
publicRead
: ThepublicRead
marker can be used to allow anyone to execute the webhook.private
: Theprivate
marker can be used to only allow the record members to execute the webhook.- The following actions are allowed for webhooks:
create
read
update
delete
list
run
- Webhooks have their own user ID.
- By default, webhooks don't have access to anything except public records.
- To allow webhooks to access other records, they need to be granted access to those resources.
- You can find a webhook's user ID by calling
os.getWebhook()
or by inspecting the webhook through the admin panel.
- Additionally, the following functions have been added:
os.recordWebhook(recordName, webhook)
os.getWebhook(recordName, address)
os.runWebhook(recordName, address, input)
os.listWebhooks(recordName, address?)
os.listWebhooksByMarker(recordName, marker, address?)
os.eraseWebhook(recordName, address)
- Webhooks have the following limitations:
- 15 seconds maximum runtime (including lambda cold start and initialization).
- Most OS functions do nothing. (
os.toast()
,os.showInput()
, etc.)- The most notable exception to this are records-related actions (
os.recordData()
).
- The most notable exception to this are records-related actions (
- Webhooks do not automatically install abCore. They only use the bots that are stored in the target.
- Webhooks always act like static insts.
- This means that any changes made to bots in the webhook are erased after the webhook finishes.
- Added notification records.
- When enabled, notification records make it easy to send push notifications to users.
- They work based on a subscription model:
- Notifier creates a notification record.
- User subscribes to a notification with
os.subscribeToNotification(recordName, address)
. - Notifier can send notifications to all subscriptions using
os.sendNotification()
.
- Notifications are secured by markers, just like regular records.
publicRead
: ThepublicRead
marker can be used to allow anyone to read and subscribe to a notification.- The following actions are allowed for notifications:
create
read
update
delete
list
subscribe
unsubscribe
listSubscriptions
send
- After login, if a user is subscribed to a notification but their current device is not registered for notifications, then they will be prompted to register the device for notifications.
- Additionally, device registrations are stored separately from subscriptions so registering a device for an account will cause the device to receive notifications for all subscriptions the user has.
- Finally, the following functions have been added:
os.recordNotification(recordName, notification)
os.getNotification(recordName, address)
os.eraseNotification(recordName, address)
os.listNotifications(recordName, address?)
os.listNotificationsByMarker(recordName, marker, address?)
os.subscribeToNotification(recordName, address)
os.unsubscribeFromNotification(recordName, address)
os.sendNotification(recordName, address, payload)
os.listNotificationSubscriptions(recordName, address)
os.listUserNotificationSubscriptions()
- Added the ability to request consent again so that a parent can adjust the privacy features for their child.
- Added the
jsonObject
form subtype.- Supports loading meshes stored in the Three.js JSON Object Scene format.
- Works similarly to
gltf
, but it uses ObjectLoader to load meshes from the URL specified in theformAddress
tag.
- Improved the sheetPortal to only create bots in insts that are showing the sheetPortal.
π Bug Fixes
- Fixed an issue where CasualOS would run into an error when creating a bot with an object tag that includes an array copied from another tag.
- Fixed an issue where it was impossible to configure a custom AB1 for a comId.
- Resolved an issue where the Monaco editor failed to refresh when navigating between the same tag in different spaces. The editor now correctly detects the context change and updates the displayed content accordingly.
- Fixed an issue where it was possible for users who are not logged in to access public data on Privo-enabled servers.
- Fixed an issue where CasualOS would run into a server error if a user tried to login using a parent account.
v3.3.10
π Features
- Updated the abCore docs.
v3.3.9
π Features
- Improved CasualOS to understand and process Typescript class method and property accessibility modifiers correctly.
π Bug Fixes
- Fixed an issue where library scripts would always error when executing a loop (for, while, etc.).
- Fixed an issue where it was possible for tag masks to get overwritten by a bot's regular tags shortly after creation of the bot.
- Fixed an issue where AI Chat features would only be enabled if OpenAI Chat was configured.
v3.3.8
π Features
- Improved
SERVER_CONFIG
to allow customizing the OpenTelemetry resource. - Improved the server to record metrics for how long HTTP and Websocket requests take to complete and also the status they have when finishing.
- Tags in the "recent tags" list in the
systemPortal
will now always show bot system. - Added the
meshPositioningMode
tag to prevent CasualOS from repositioning meshes around the center of the bot.- There are two possible values:
center
- The mesh will be positioned so it is centered around the bot's center. (Default)absolute
- The mesh won't be repositioned. It will retain the position configured in the GLTF.
- There are two possible values:
- Added support for Anthropic AI Chat models to
ai.chat()
andai.stream.chat()
.SERVER_CONFIG
needs to be configured with an Anthropic API Key and allowedanthropic
models.
- Added support for
stable-image-ultra
,stable-image-core
,sd3-medium
,sd3-large
,sd3-large-turbo
AI image generation models. - Add support for Minio for file records.
- Can be configured by using the
minio
property inSERVER_CONFIG
.
- Can be configured by using the
- Added the ability to enable semantic error highlighting.
- Added the ability to scan files for moderation labels.
- This functionality can be configured by the
SERVER_CONFIG.moderation.jobs.files
andSERVER_CONFIG.rekognition.moderation
properties. - Once a (configured) banned label is detected, a notification can be sent based on the
SERVER_CONFIG.notifications
configuration.- If desired, the filter should be set to match
file
resources andscanned
actions.
- If desired, the filter should be set to match
- Currently, only image files are supported. The default list of supported file types is:
.png
.webp
.jpg
.jpeg
.gif
- Additionally, it is possible to manually trigger moderation for a file as a
superUser
by using thescanFileForModeration
procedure.
- This functionality can be configured by the
π Bug Fixes
- Fixed an issue where an older version of session key hashes would be used when refreshing a session, leading to slowdowns when validating session keys.
- Fixed an issue where lines wouldn't draw to the center of the target bot when the bot was smaller than the arrow head length.
- Fixed an issue where the SystemPortal didn't support creating listeners from the "Add Tag" dialog.
- Fixed an issue where the
mapPortal
would not be able to be closed after having loaded themapPortal
for a different inst.
v3.3.7
π Features
- Added OpenTelemetry tracing to the CasualOS server.
- This will greatly improve our ability to track down issues and understand what is going on with the system.
- Can be configured via the
SERVER_CONFIG
environment variable in thetelemetry
key. - See the
SERVER_CONFIG
schema in ServerBuilder.ts for more information.
- Added the ability to generate Sloyd.ai models with
ai.sloyd.generateModel(request)
.- Requires a valid subscription that has been granted access to the
ai.sloyd
feature. request
is should be an object with the following properties:prompt
- The prompt to use for generating the model.recordName
- The name of the record that the model should be generated in. If omitted, then the user's record will be used by default.outputMimeType
- The MIME Type of the model that should be output. Currently, onlymodel/gltf+json
andmodel/gltf-binary
are supported. If omitted, thenmodel/gltf+json
will be used.levelOfDetail
- A number between0.01
and1
that indicates the level of detail that should be generated for the model. Higher values will generate more detailed models. If omitted, then0.5
will be used.baseModelId
- The ID of the model that should be edited.thumbnail
- An object that specifies how the thumbnail for the model should be generated. If omitted, then no thumbnail will be created. The object should have the following properties:type
- Should always be"image/png"
width
- The desired width of the thumbnail in pixels.height
- The desired height of the thumbnail in pixels.
- Requesting users require access to the
ai.sloyd
resource kind andcreate
action for the specified record.
- Requires a valid subscription that has been granted access to the
- Tags added to bots through the
systemPortal
will now be added to the "tags" section instead of the "pinned tags" section. - Improved the CasualOS CLI to be able to generate and validate server configs.
- Improved
portalZoomableMax
andportalZoomableMin
to be supported forperspective
portal camera types. - Updated the BIOS dialog with various visual improvements.
- The default BIOS options have been updated:
enter join code
local
studio
free
sign in
sign up
sign out
- Improved Hume AI features to support Studios.
- The
ai.hume
features now determine whether a Studio can configure their own HumeapiKey
andsecretKey
. ai.hume.getAccessToken(recordName)
now accepts a record name.- This allows the user to specify which record they want to use for hume.ai access.
- Once a studio is configured, requests to one of the Studio's records will return an access token derived from the Studio's configured
apiKey
andsecretKey
. - Requesting users require access to the
ai.hume
resource kind andcreate
action for the specified record.
- The
- Added the
floatingBillboard
option forlabelPosition
.- Like
floating
, but the label background won't have an arrow and the label will always face the camera.
- Like
- Added the
labelFloatingBackgroundColor
tag to control the color of the background for floating labels.- Defaults to
white
.
- Defaults to
- Improved
@onClick
,@onAnyBotClicked
,@onGridClick
,@onPointerEnter
,@onPointerExit
,@onPointerDown
,@onPointerUp
,@onAnyBotPointerEnter
,@onAnyBotPointerExit
,@onAnyBotPointerDown
, and@onAnyBotPointerUp
to include the ID of the button that was pressed.- For each of these listeners,
that.buttonId
will be either"left"
,"right"
,"middle"
, ornull
. - This means that you can now determine which button was pressed (if any) and respond accordingly.
- For each of these listeners,
π Bug Fixes
- Fixed an issue where editing a tag may fail if multiple initialization updates for the same bot with different tag values were applied to the inst.
- Fixed an issue where different instances of the CasualOS server could try to save an inst at the same time and cause the inst to lose track of its data.
- Fixed an issue where CasualOS would always decide to load inst data from Redis instead of the database.
- Improved the CasualOS server to discard redundant updates when saving a studio inst. This will greatly help prevent hitting inst size limits in the future.
- Fixed an issue where
@onSpaceMaxSizeReached
would not be called when an inst ran out of space. - Fixed an issue where meshes for hands in XR don't follow the camera when
cameraPositionOffset
is changed. - Fixed an issue where the wrist portals for hands in Meta Quest devices were positioned incorrectly.
- Fixed an issue where it was impossible to close the map portal from inside
@onInstJoined
. - Fixed an issue where selecting an option in the BIOS would fail to actually show the selected option.
- Fixed an issue where the arrow on floating labels would clip into the bot if the bot had a scale > 1.
- Fixed an issue where portal bots would not appear in the code editor autocomplete.
v3.3.6
π Features
- Casual Simulation is now PRIVO Certified!
- The certification seal has been added in various locations to notify users that Casual Simulation, ab1.bot, and publicos.link are COPPA Safe Harbor Certified.
- Added the ability to record and display Loom videos from within CasualOS.
- NOTE: Loom requires access to the MediaRecorder API and third party cookies. In testing, if third party cookies are not allowed, the Loom SDK will silently fail to work.
loom.recordVideo(options)
- A function that can be used to start the recording process. Resolves with a promise that includes information about the recorded video.options
is an object with one of the following properties:publicAppId
- The public app ID of the loom app that the video should be associated with.recordName
- The name of the record that the video should be associated with. The studio for the record needs to have loom features enabled and also be configured with a loom public app ID and private key.
loom.watchVideo(url)
- A function that can be used to load and watch the given loom video.loom.getVideoEmbedMetadata(url)
- A function that can be used to load additional information about a video that can be used to embed the video.
- Moved pinned tags in
systemPortal
to appear above the tags list. - Pressing
Enter
while a tag is focused in the system portal now triggers the "New Tag" dialog.