Skip to content

Releases: casual-simulation/casualos

v3.3.15

19 Dec 18:15
Compare
Choose a tag to compare

πŸš€ 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. The joinRoom method now includes a preliminary step to check and request these permissions, ensuring a smoother user experience.

v3.3.14

03 Dec 22:23
Compare
Choose a tag to compare

πŸš€ 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

08 Nov 17:58
Compare
Choose a tag to compare

πŸš€ 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

25 Oct 20:03
Compare
Choose a tag to compare

πŸš€ 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 and connectionKey in the URL might not actually log the user in.

v3.3.11

21 Oct 19:15
Compare
Choose a tag to compare

πŸš€ 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: The publicRead marker can be used to allow anyone to execute the webhook.
      • private: The private 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()).
      • 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:
      1. Notifier creates a notification record.
      2. User subscribes to a notification with os.subscribeToNotification(recordName, address).
      3. Notifier can send notifications to all subscriptions using os.sendNotification().
    • Notifications are secured by markers, just like regular records.
      • publicRead: The publicRead 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.
  • 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

03 Sep 16:02
Compare
Choose a tag to compare

πŸš€ Features

  • Updated the abCore docs.

v3.3.9

20 Aug 14:31
Compare
Choose a tag to compare

πŸš€ 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

05 Aug 15:31
Compare
Choose a tag to compare

πŸš€ 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.
  • Added support for Anthropic AI Chat models to ai.chat() and ai.stream.chat().
    • SERVER_CONFIG needs to be configured with an Anthropic API Key and allowed anthropic 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 in SERVER_CONFIG.
  • 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 and SERVER_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 and scanned actions.
    • 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 the scanFileForModeration procedure.

πŸ› 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 the mapPortal for a different inst.

v3.3.7

18 Jul 17:41
Compare
Choose a tag to compare

πŸš€ 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 the telemetry 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, only model/gltf+json and model/gltf-binary are supported. If omitted, then model/gltf+json will be used.
      • levelOfDetail - A number between 0.01 and 1 that indicates the level of detail that should be generated for the model. Higher values will generate more detailed models. If omitted, then 0.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 and create action for the specified record.
  • 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 and portalZoomableMin to be supported for perspective 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 Hume apiKey and secretKey.
    • 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 and secretKey.
      • Requesting users require access to the ai.hume resource kind and create action for the specified record.
  • Added the floatingBillboard option for labelPosition.
    • Like floating, but the label background won't have an arrow and the label will always face the camera.
  • Added the labelFloatingBackgroundColor tag to control the color of the background for floating labels.
    • Defaults to white.
  • 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", or null.
    • This means that you can now determine which button was pressed (if any) and respond accordingly.

πŸ› 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

14 Jun 21:51
Compare
Choose a tag to compare

πŸš€ 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.