[{"url":"https://api.github.com/repos/loro-dev/loro/releases/367867888","assets_url":"https://api.github.com/repos/loro-dev/loro/releases/367867888/assets","upload_url":"https://uploads.github.com/repos/loro-dev/loro/releases/367867888/assets{?name,label}","html_url":"https://github.com/loro-dev/loro/releases/tag/loro-crdt%401.14.1","id":367867888,"author":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOHpcjs84V7Tfw","tag_name":"loro-crdt@1.14.1","target_commitish":"main","name":"loro-crdt@1.14.1","draft":false,"immutable":false,"prerelease":false,"created_at":"2026-08-10T11:34:46Z","updated_at":"2026-08-10T11:39:15Z","published_at":"2026-08-10T11:39:15Z","assets":[],"tarball_url":"https://api.github.com/repos/loro-dev/loro/tarball/loro-crdt@1.14.1","zipball_url":"https://api.github.com/repos/loro-dev/loro/zipball/loro-crdt@1.14.1","body":"### Patch Changes\n\n- 76cc0f9: Make `importBatch` atomic and never leave the document detached.\n\n  `importBatch` force-detaches the document so each blob only touches the OpLog, then\n  reattaches with a single checkout at the end. Two exits skipped that reattach and\n  stranded the document in detached mode, where later imports stop being reflected in\n  the state, local edits branch off a stale version, and every later `attach()` re-runs\n  the same failing checkout:\n\n  - The closing checkout was `expect`ed to succeed. Remote ops that decode fine but are\n    rejected by state validation (for example a list insert past the end of the list)\n    only reach that validation here, because the blobs were imported while detached, so\n    a malformed blob turned into a panic — a `RuntimeError: unreachable` trap in WASM —\n    after the document had already been left detached.\n  - Any other panic while decoding or applying a blob unwound past the reattach.\n\n  The batch now runs inside an OpLog rollback scope. If the closing checkout cannot\n  apply the accumulated changes, the whole batch is rolled back and `importBatch`\n  returns the state-apply error with the document still attached and unchanged, instead\n  of trapping. A panic inside the batch reattaches before it is re-raised.\n\n  The pending-changes rollback journal now snapshots each touched slot as it was when\n  the scope began, instead of undoing individual mutations. The previous two-phase undo\n  resurrected changes that the same import both parked and unlocked — routine across a\n  batch — leaving pending entries that referenced container registrations the rollback\n  had already discarded, and pre-batch pending changes unlocked by a rolled-back batch\n  are now re-parked instead of silently dropped.\n\n  `importBatch` of out-of-order updates is also considerably faster: the import preflight\n  no longer rescans the whole pending set once per blob, which made such a batch\n  quadratic. Draining 12000 out-of-order updates in one `importBatch` goes from ~3.4s to\n  ~0.45s, with peak memory unchanged. In-order batches and single `import` calls are\n  unaffected."},{"url":"https://api.github.com/repos/loro-dev/loro/releases/367867915","assets_url":"https://api.github.com/repos/loro-dev/loro/releases/367867915/assets","upload_url":"https://uploads.github.com/repos/loro-dev/loro/releases/367867915/assets{?name,label}","html_url":"https://github.com/loro-dev/loro/releases/tag/loro-crdt-map%401.14.1","id":367867915,"author":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOHpcjs84V7TgL","tag_name":"loro-crdt-map@1.14.1","target_commitish":"main","name":"loro-crdt-map@1.14.1","draft":false,"immutable":false,"prerelease":false,"created_at":"2026-08-10T11:34:46Z","updated_at":"2026-08-10T11:39:18Z","published_at":"2026-08-10T11:39:18Z","assets":[],"tarball_url":"https://api.github.com/repos/loro-dev/loro/tarball/loro-crdt-map@1.14.1","zipball_url":"https://api.github.com/repos/loro-dev/loro/zipball/loro-crdt-map@1.14.1","body":"### Patch Changes\n\n- 76cc0f9: Make `importBatch` atomic and never leave the document detached.\n\n  `importBatch` force-detaches the document so each blob only touches the OpLog, then\n  reattaches with a single checkout at the end. Two exits skipped that reattach and\n  stranded the document in detached mode, where later imports stop being reflected in\n  the state, local edits branch off a stale version, and every later `attach()` re-runs\n  the same failing checkout:\n\n  - The closing checkout was `expect`ed to succeed. Remote ops that decode fine but are\n    rejected by state validation (for example a list insert past the end of the list)\n    only reach that validation here, because the blobs were imported while detached, so\n    a malformed blob turned into a panic — a `RuntimeError: unreachable` trap in WASM —\n    after the document had already been left detached.\n  - Any other panic while decoding or applying a blob unwound past the reattach.\n\n  The batch now runs inside an OpLog rollback scope. If the closing checkout cannot\n  apply the accumulated changes, the whole batch is rolled back and `importBatch`\n  returns the state-apply error with the document still attached and unchanged, instead\n  of trapping. A panic inside the batch reattaches before it is re-raised.\n\n  The pending-changes rollback journal now snapshots each touched slot as it was when\n  the scope began, instead of undoing individual mutations. The previous two-phase undo\n  resurrected changes that the same import both parked and unlocked — routine across a\n  batch — leaving pending entries that referenced container registrations the rollback\n  had already discarded, and pre-batch pending changes unlocked by a rolled-back batch\n  are now re-parked instead of silently dropped.\n\n  `importBatch` of out-of-order updates is also considerably faster: the import preflight\n  no longer rescans the whole pending set once per blob, which made such a batch\n  quadratic. Draining 12000 out-of-order updates in one `importBatch` goes from ~3.4s to\n  ~0.45s, with peak memory unchanged. In-order batches and single `import` calls are\n  unaffected."},{"url":"https://api.github.com/repos/loro-dev/loro/releases/367207787","assets_url":"https://api.github.com/repos/loro-dev/loro/releases/367207787/assets","upload_url":"https://uploads.github.com/repos/loro-dev/loro/releases/367207787/assets{?name,label}","html_url":"https://github.com/loro-dev/loro/releases/tag/loro-crdt%401.14.0","id":367207787,"author":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOHpcjs84V4yVr","tag_name":"loro-crdt@1.14.0","target_commitish":"main","name":"loro-crdt@1.14.0","draft":false,"immutable":false,"prerelease":false,"created_at":"2026-08-08T13:18:02Z","updated_at":"2026-08-08T13:23:37Z","published_at":"2026-08-08T13:23:37Z","assets":[],"tarball_url":"https://api.github.com/repos/loro-dev/loro/tarball/loro-crdt@1.14.0","zipball_url":"https://api.github.com/repos/loro-dev/loro/zipball/loro-crdt@1.14.0","body":"### Minor Changes\n\n- bbf21c3: fix: avoid unreadable WASM traps (`RuntimeError: unreachable executed`) on invalid arguments. `getCursor` with an invalid `side`, `getEditorOf` at an out-of-range position, and accessing an unknown container (created by a newer version of loro-crdt) now throw catchable JS errors with readable messages or return `undefined` instead of trapping the WASM instance.\n\n  feat: on a Rust panic, the full panic info (message, `file:line`, and the complete stack including the Rust call path) is now stored as a JS `Error` on `globalThis.__LORO_WASM_LAST_PANIC__` before the instance traps, so applications can recover readable diagnostics from a caught `RuntimeError`.\n\n  fix: the WASM start hook was never invoked in the `bundler`/`browser`/`base64` builds (the glue checked the JS namespace instead of the wasm exports for `__wbindgen_start`), so no panic hook was installed there at all. The start hook now runs in every build target.\n\n  feat: out-of-memory failures are now reported too. Allocation failure in WASM bypasses the panic hook and traps silently; the package now wraps the global allocator so OOM stores `loro-crdt: out of WASM memory: allocation of N bytes failed` on `globalThis.__LORO_WASM_LAST_PANIC__` and prints it to `console.error` before trapping.\n\n### Patch Changes\n\n- bbcaef6: Fix a panic on import that could permanently break a document's sync.\n\n  `import_changes_to_oplog` defers the changes whose deps are not yet in the DAG\n  and hands them to `extend_pending_changes_with_unknown_lamport` to be parked.\n  `try_apply_pending` runs in between and applies changes parked by earlier\n  imports, which advances the oplog version, so a deferred change can become\n  applicable — or already applied — by the time it is parked. Both outcomes used\n  to hit `unreachable!`, compiling to `RuntimeError: unreachable` in WASM.\n\n  The re-classification is now handled instead of asserted: a change that became\n  applicable is applied and cascaded into whatever it unblocks, an already-applied\n  one is skipped, and `ImportStatus` reports only what genuinely stayed pending.\n\n  This mattered most through `import_batch`, which force-detaches the document for\n  the duration of the batch and reattaches after the loop. The panic unwound past\n  the reattach and left the document detached, so every later import and export\n  failed and the document stopped syncing until the process restarted."},{"url":"https://api.github.com/repos/loro-dev/loro/releases/367207803","assets_url":"https://api.github.com/repos/loro-dev/loro/releases/367207803/assets","upload_url":"https://uploads.github.com/repos/loro-dev/loro/releases/367207803/assets{?name,label}","html_url":"https://github.com/loro-dev/loro/releases/tag/loro-crdt-map%401.14.0","id":367207803,"author":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOHpcjs84V4yV7","tag_name":"loro-crdt-map@1.14.0","target_commitish":"main","name":"loro-crdt-map@1.14.0","draft":false,"immutable":false,"prerelease":false,"created_at":"2026-08-08T13:18:02Z","updated_at":"2026-08-08T13:23:39Z","published_at":"2026-08-08T13:23:39Z","assets":[],"tarball_url":"https://api.github.com/repos/loro-dev/loro/tarball/loro-crdt-map@1.14.0","zipball_url":"https://api.github.com/repos/loro-dev/loro/zipball/loro-crdt-map@1.14.0","body":"### Minor Changes\n\n- bbf21c3: fix: avoid unreadable WASM traps (`RuntimeError: unreachable executed`) on invalid arguments. `getCursor` with an invalid `side`, `getEditorOf` at an out-of-range position, and accessing an unknown container (created by a newer version of loro-crdt) now throw catchable JS errors with readable messages or return `undefined` instead of trapping the WASM instance.\n\n  feat: on a Rust panic, the full panic info (message, `file:line`, and the complete stack including the Rust call path) is now stored as a JS `Error` on `globalThis.__LORO_WASM_LAST_PANIC__` before the instance traps, so applications can recover readable diagnostics from a caught `RuntimeError`.\n\n  fix: the WASM start hook was never invoked in the `bundler`/`browser`/`base64` builds (the glue checked the JS namespace instead of the wasm exports for `__wbindgen_start`), so no panic hook was installed there at all. The start hook now runs in every build target.\n\n  feat: out-of-memory failures are now reported too. Allocation failure in WASM bypasses the panic hook and traps silently; the package now wraps the global allocator so OOM stores `loro-crdt: out of WASM memory: allocation of N bytes failed` on `globalThis.__LORO_WASM_LAST_PANIC__` and prints it to `console.error` before trapping.\n\n### Patch Changes\n\n- bbcaef6: Fix a panic on import that could permanently break a document's sync.\n\n  `import_changes_to_oplog` defers the changes whose deps are not yet in the DAG\n  and hands them to `extend_pending_changes_with_unknown_lamport` to be parked.\n  `try_apply_pending` runs in between and applies changes parked by earlier\n  imports, which advances the oplog version, so a deferred change can become\n  applicable — or already applied — by the time it is parked. Both outcomes used\n  to hit `unreachable!`, compiling to `RuntimeError: unreachable` in WASM.\n\n  The re-classification is now handled instead of asserted: a change that became\n  applicable is applied and cascaded into whatever it unblocks, an already-applied\n  one is skipped, and `ImportStatus` reports only what genuinely stayed pending.\n\n  This mattered most through `import_batch`, which force-detaches the document for\n  the duration of the batch and reattaches after the loop. The panic unwound past\n  the reattach and left the document detached, so every later import and export\n  failed and the document stopped syncing until the process restarted."},{"url":"https://api.github.com/repos/loro-dev/loro/releases/363406991","assets_url":"https://api.github.com/repos/loro-dev/loro/releases/363406991/assets","upload_url":"https://uploads.github.com/repos/loro-dev/loro/releases/363406991/assets{?name,label}","html_url":"https://github.com/loro-dev/loro/releases/tag/loro-crdt%401.13.9","id":363406991,"author":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOHpcjs84VqSaP","tag_name":"loro-crdt@1.13.9","target_commitish":"main","name":"loro-crdt@1.13.9","draft":false,"immutable":false,"prerelease":false,"created_at":"2026-08-01T02:30:30Z","updated_at":"2026-08-01T02:35:16Z","published_at":"2026-08-01T02:35:16Z","assets":[],"tarball_url":"https://api.github.com/repos/loro-dev/loro/tarball/loro-crdt@1.13.9","zipball_url":"https://api.github.com/repos/loro-dev/loro/zipball/loro-crdt@1.13.9","body":"### Patch Changes\n\n- ddc47ec: Retreat the conservative replay base to the latest single-head critical\n  version of the two versions' combined history instead of the beginning of\n  history. When an import or checkout involves a genuinely concurrent branch,\n  the causal replay now starts at the most recent point that no concurrency\n  crosses (in the sense of Eg-walker's critical versions), skipping the\n  fully-synced common prefix that the old empty-version fallback replayed.\n- ddc47ec: Fix a convergence bug where a movable tree's incrementally maintained state\n  could diverge from a full replay of its own oplog. When newly imported\n  operations were concurrent with part of the receiving peer's multi-head\n  frontier, the diff mode was misclassified as concurrency-free and the tree\n  fast path applied the new moves without adjudicating them against the\n  existing concurrent branch. The classifier now verifies that every entry\n  point of the imported region causally covers the whole current frontier,\n  and otherwise retreats the replay base to the latest critical version so\n  the competing branches are replayed together.\n- ddc47ec: Correct LCA unmatched-branch detection when an explicit dependency already\n  covers the same peer's implicit predecessor. Keep those causally newer imports\n  on the current replay base, and avoid rebuilding unchanged list-like containers\n  when a genuinely concurrent update needs a conservative base containing a large\n  common history."},{"url":"https://api.github.com/repos/loro-dev/loro/releases/363406999","assets_url":"https://api.github.com/repos/loro-dev/loro/releases/363406999/assets","upload_url":"https://uploads.github.com/repos/loro-dev/loro/releases/363406999/assets{?name,label}","html_url":"https://github.com/loro-dev/loro/releases/tag/loro-crdt-map%401.13.9","id":363406999,"author":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOHpcjs84VqSaX","tag_name":"loro-crdt-map@1.13.9","target_commitish":"main","name":"loro-crdt-map@1.13.9","draft":false,"immutable":false,"prerelease":false,"created_at":"2026-08-01T02:30:30Z","updated_at":"2026-08-01T02:35:19Z","published_at":"2026-08-01T02:35:19Z","assets":[],"tarball_url":"https://api.github.com/repos/loro-dev/loro/tarball/loro-crdt-map@1.13.9","zipball_url":"https://api.github.com/repos/loro-dev/loro/zipball/loro-crdt-map@1.13.9","body":"### Patch Changes\n\n- ddc47ec: Retreat the conservative replay base to the latest single-head critical\n  version of the two versions' combined history instead of the beginning of\n  history. When an import or checkout involves a genuinely concurrent branch,\n  the causal replay now starts at the most recent point that no concurrency\n  crosses (in the sense of Eg-walker's critical versions), skipping the\n  fully-synced common prefix that the old empty-version fallback replayed.\n- ddc47ec: Fix a convergence bug where a movable tree's incrementally maintained state\n  could diverge from a full replay of its own oplog. When newly imported\n  operations were concurrent with part of the receiving peer's multi-head\n  frontier, the diff mode was misclassified as concurrency-free and the tree\n  fast path applied the new moves without adjudicating them against the\n  existing concurrent branch. The classifier now verifies that every entry\n  point of the imported region causally covers the whole current frontier,\n  and otherwise retreats the replay base to the latest critical version so\n  the competing branches are replayed together.\n- ddc47ec: Correct LCA unmatched-branch detection when an explicit dependency already\n  covers the same peer's implicit predecessor. Keep those causally newer imports\n  on the current replay base, and avoid rebuilding unchanged list-like containers\n  when a genuinely concurrent update needs a conservative base containing a large\n  common history."},{"url":"https://api.github.com/repos/loro-dev/loro/releases/357478608","assets_url":"https://api.github.com/repos/loro-dev/loro/releases/357478608/assets","upload_url":"https://uploads.github.com/repos/loro-dev/loro/releases/357478608/assets{?name,label}","html_url":"https://github.com/loro-dev/loro/releases/tag/loro.js%400.1.0","id":357478608,"author":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOHpcjs84VTrDQ","tag_name":"loro.js@0.1.0","target_commitish":"main","name":"loro.js@0.1.0","draft":false,"immutable":false,"prerelease":false,"created_at":"2026-07-21T16:14:35Z","updated_at":"2026-07-21T16:20:09Z","published_at":"2026-07-21T16:20:09Z","assets":[],"tarball_url":"https://api.github.com/repos/loro-dev/loro/tarball/loro.js@0.1.0","zipball_url":"https://api.github.com/repos/loro-dev/loro/zipball/loro.js@0.1.0","body":"### Minor Changes\n\n- 68587bc: Add a pure TypeScript implementation of the current Loro binary format and a\n  `loro-crdt`-compatible CRDT runtime.\n- 68587bc: Improve pure TypeScript runtime performance for merged changes, concurrent\n  sequence insertion, large state snapshots, and bulk list edits. Snapshot\n  SSTables now use interoperable LZ4 compression and defer non-frontier history\n  decoding until a history-dependent API needs it.\n\n### Patch Changes\n\n- 4e663a1: Keep large latest-state snapshots encoded and hydrate containers on demand.\n  Local edits and later updates now use a small history overlay, while snapshot\n  export rewrites only dirty SSTable blocks and avoids redundant output buffers.","reactions":{"url":"https://api.github.com/repos/loro-dev/loro/releases/357478608/reactions","total_count":2,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":2,"eyes":0}},{"url":"https://api.github.com/repos/loro-dev/loro/releases/357478582","assets_url":"https://api.github.com/repos/loro-dev/loro/releases/357478582/assets","upload_url":"https://uploads.github.com/repos/loro-dev/loro/releases/357478582/assets{?name,label}","html_url":"https://github.com/loro-dev/loro/releases/tag/loro-crdt%401.13.8","id":357478582,"author":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOHpcjs84VTrC2","tag_name":"loro-crdt@1.13.8","target_commitish":"main","name":"loro-crdt@1.13.8","draft":false,"immutable":false,"prerelease":false,"created_at":"2026-07-21T16:14:35Z","updated_at":"2026-07-21T16:20:06Z","published_at":"2026-07-21T16:20:06Z","assets":[],"tarball_url":"https://api.github.com/repos/loro-dev/loro/tarball/loro-crdt@1.13.8","zipball_url":"https://api.github.com/repos/loro-dev/loro/zipball/loro-crdt@1.13.8","body":"### Patch Changes\n\n- ac1feb6: Reduce peak memory across large snapshot import, `toJSON`, update import, and\n  snapshot export by preserving lazy state, bounding the decompressed SSTable\n  block cache by bytes, and preallocating the snapshot output exactly. Snapshot\n  import now validates every embedded SSTable block checksum before accepting\n  external bytes.\n\n  Full snapshot export no longer walks the alive-container graph: store entries\n  for referenced containers are created when the creating op or imported diff is\n  applied, so a cold export after a large import is a flush plus KV export\n  instead of re-reading every container from compressed blocks. As part of this,\n  full export round-trips imported state bytes faithfully (inconsistent\n  alive-container parent metadata is now rejected by shallow export, which still\n  walks, rather than by full export), and an ensured-but-empty mergeable child is\n  no longer materialized into the KV store by a full export — importers resolve\n  it from its parent map marker. First `toJSON` after import also avoids decoding\n  each lazy container twice."},{"url":"https://api.github.com/repos/loro-dev/loro/releases/357478562","assets_url":"https://api.github.com/repos/loro-dev/loro/releases/357478562/assets","upload_url":"https://uploads.github.com/repos/loro-dev/loro/releases/357478562/assets{?name,label}","html_url":"https://github.com/loro-dev/loro/releases/tag/loro-crdt-map%401.13.8","id":357478562,"author":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOHpcjs84VTrCi","tag_name":"loro-crdt-map@1.13.8","target_commitish":"main","name":"loro-crdt-map@1.13.8","draft":false,"immutable":false,"prerelease":false,"created_at":"2026-07-21T16:14:35Z","updated_at":"2026-07-21T16:20:04Z","published_at":"2026-07-21T16:20:04Z","assets":[],"tarball_url":"https://api.github.com/repos/loro-dev/loro/tarball/loro-crdt-map@1.13.8","zipball_url":"https://api.github.com/repos/loro-dev/loro/zipball/loro-crdt-map@1.13.8","body":"### Patch Changes\n\n- 033f43a: Keep the source-map package changelog aligned with the matching `loro-crdt` release."},{"url":"https://api.github.com/repos/loro-dev/loro/releases/354245542","assets_url":"https://api.github.com/repos/loro-dev/loro/releases/354245542/assets","upload_url":"https://uploads.github.com/repos/loro-dev/loro/releases/354245542/assets{?name,label}","html_url":"https://github.com/loro-dev/loro/releases/tag/loro-crdt%401.13.7","id":354245542,"author":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOHpcjs84VHVum","tag_name":"loro-crdt@1.13.7","target_commitish":"main","name":"loro-crdt@1.13.7","draft":false,"immutable":false,"prerelease":false,"created_at":"2026-07-15T06:35:52Z","updated_at":"2026-07-15T06:41:31Z","published_at":"2026-07-15T06:41:31Z","assets":[],"tarball_url":"https://api.github.com/repos/loro-dev/loro/tarball/loro-crdt@1.13.7","zipball_url":"https://api.github.com/repos/loro-dev/loro/zipball/loro-crdt@1.13.7","body":"### Patch Changes\n\n- 3986805: Speed up snapshot import. When decoding a Loro snapshot, the redundant per-block SSTable validation (eager block-metadata decode and per-block checksums) is now skipped, because the whole snapshot body is already protected by the document-level checksum verified during decoding. This removes a second hash pass over the data (roughly halving B4 snapshot import time) while preserving integrity guarantees.\n\n  This fast path is internal to Loro's snapshot decoding. The public `MemKvStore::import_all` still verifies every block's checksum; a separate `import_all_unchecked` opts into the unchecked path and is only used where an outer checksum already guarantees integrity.\n\n- 9b6330d: Speed up local text editing (~35% faster on the B4 editing trace). Three hot-path\n  changes: the lock-order debug instrumentation is now compiled out of release\n  builds (it ran on every per-op lock acquisition); the visible-op count is bumped\n  incrementally for local ops instead of recomputing it from the version vectors\n  (which also allocated) on every op; and a couple of per-op allocations on the\n  text insert/delete path were removed (lazy error-context formatting and inline\n  storage for entity ranges).\n- c37e76a: Fix a checkout hang after snapshot import. Change-store blocks decoded from a snapshot recorded a wrong end lamport (`lamport_range.1` was set to the start lamport of the block's last change instead of its end). When a change was split across multiple blocks and a lamport-based lookup engaged the binary search path in `ChangeStore::get_change_by_lamport_lte` — e.g. the movable-list diff calculator resolving historical positions during `checkout` — the degenerate range made the search loop forever. The binary search now also caps its steps and falls back to a scan if it ever fails to converge; the fallback considers both unflushed in-memory blocks and the underlying kv store, so lamport lookups (e.g. `getChangeAtLamport`) stay correct for local changes that have not been flushed yet."},{"url":"https://api.github.com/repos/loro-dev/loro/releases/354245570","assets_url":"https://api.github.com/repos/loro-dev/loro/releases/354245570/assets","upload_url":"https://uploads.github.com/repos/loro-dev/loro/releases/354245570/assets{?name,label}","html_url":"https://github.com/loro-dev/loro/releases/tag/loro-crdt-map%401.13.7","id":354245570,"author":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOHpcjs84VHVvC","tag_name":"loro-crdt-map@1.13.7","target_commitish":"main","name":"loro-crdt-map@1.13.7","draft":false,"immutable":false,"prerelease":false,"created_at":"2026-07-15T06:35:52Z","updated_at":"2026-07-15T06:41:34Z","published_at":"2026-07-15T06:41:34Z","assets":[],"tarball_url":"https://api.github.com/repos/loro-dev/loro/tarball/loro-crdt-map@1.13.7","zipball_url":"https://api.github.com/repos/loro-dev/loro/zipball/loro-crdt-map@1.13.7","body":"# loro-crdt-map\n\n## 1.13.6\n\n### Patch Changes\n\n- a4e6174: Fix undo/redo restoring mergeable map children as regular non-mergeable containers.\n- 78f6c8a: Fix a potential deadlock when lazy snapshot loading resolves mergeable container parent depths.\n\n## 1.13.5\n\n### Patch Changes\n\n- 1727258: Improve text insert and snapshot import performance by avoiding duplicate text boundary validation and skipping eager imported change block parsing.\n- 52d8168: Recover two per-operation editing slowdowns regressed since 1.11.\n\n  Both are constant-factor regressions on the per-op (auto-commit) editing path\n  introduced by the lazy-snapshot work in #985, measured against the 1.11.1\n  release.\n\n  1. Every `MapHandler`/`ListHandler`/`MovableListHandler` insert validated its\n     value with `ensure_no_regular_container_value`, which heap-allocated a `Vec`\n     on each call even for scalar values (the common case). A scalar fast-path now\n     skips the allocation and traversal entirely. `map create 10^4 key`:\n     ~19.4ms -> ~10.7ms.\n  2. The per-op text bounds check (`TextHandler::len`/`len_unicode`/`len_utf16`)\n     took two `DocState` locks — one to check whether the container state was\n     decoded, then another to query the length. These are now consolidated into a\n     single `DocState::get_text_len` that takes one lock and one container-store\n     lookup. The lazy-snapshot memory behavior is preserved: a still-lazy\n     container reads its cached length metadata without materializing the full\n     richtext state. `bench_text B4 apply` (per-op text editing): ~389ms -> ~352ms.\n\n## 1.13.4\n\n### Patch Changes\n\n- 4d577ad: Fix two O(n^2) editing slowdowns.\n\n  1. Editing with UTF-16 / UTF-8 (byte) positions (the default in the JS binding)\n     validated each position by materializing the entire `[0, pos)` prefix string,\n     making every `insert`/`delete`/`splice`/`mark` O(n) and a run of edits O(n^2)\n     (regression since 1.12.0). The boundary check now reads the rope's prefix\n     caches via the cursor (O(log n)). Unicode-indexed editing was unaffected.\n  2. When a subscriber is attached and many edits land on the same container within\n     one event batch (e.g. random-position inserts, or many distinct map-key\n     writes), building the event cloned the growing accumulated diff on every\n     compose — O(n^2) in the number of fragments. The diffs are now composed in\n     place. This affected text, map and list events.\n  3. Converting a UTF-16 / UTF-8 position within a text chunk to a unicode offset\n     scanned the chunk char-by-char, so editing/slicing a large contiguous chunk\n     (a big insert, a loaded document, or a long run of typed text that merges into\n     one chunk) was O(chunk length) per op. Chunks that contain no astral-plane\n     characters (UTF-16) or are pure ASCII (UTF-8) now convert in O(1), covering\n     essentially all real-world text (ASCII/Latin/CJK).\n\n## 1.13.0\n\n### Minor Changes\n\n- fa888d8: Add mergeable child containers: child containers created under a map key that converge across peers on concurrent first-write instead of forking. Exposed as `ensureMergeable{Counter,Map,List,MovableList,Text,Tree}` on `LoroMap`. A mergeable child lives at a deterministic `ContainerID` derived from `(parent, key, kind)`, and its visibility is driven by a binary ref the parent map stores at the key, so deletes and kind conflicts resolve through the map's regular LWW. `getOrCreateContainer` is deprecated for lazy map-child creation; migrate those call sites to `ensureMergeable*`. `setContainer` and `insertContainer` regular semantics are unchanged.\n\n## 1.12.4\n\n### Patch Changes\n\n- a6e23b6: Optimize snapshot export for shallow documents by reusing cached shallow-root state instead of checking out to the shallow root and back to latest.\n\n## 1.12.2\n\n### Patch Changes\n\n- cc587ed: Add a browser package remapping so Vite/Rolldown production builds load WASM without top-level await or circular wasm wrapper chunks.\n\n  Also make the base64 entry easier to bundle with plain esbuild, Rollup, and Next.js Webpack by avoiding static Node builtin `require()` calls and top-level await in browser bundles.\n\n- 8f57f4c: Reduce memory usage for read-only access to snapshot-imported documents by avoiding unnecessary lazy container state initialization.\n\n## 1.12.0\n\n### Minor Changes\n\n- 7dfda87: Make update imports atomic across oplog and document state application.\n\n  - `import` and `import_json_updates` now roll back imported oplog changes when state application fails, so malformed updates do not leave the document with oplog/state divergence.\n  - Pending changes that are activated during import are included in the rollback boundary when they can affect state application.\n  - Import rollback uses conditional guards to avoid adding fixed overhead to successful detached or no-op imports.\n\n### Patch Changes\n\n- 64aa97c: Harden encoding, snapshot, and import paths against malformed input\n\n  - JSON schema import (`import_json_updates`): out-of-range compressed peer indices now return `DecodeError` instead of being silently accepted as raw peer IDs; mismatched `JsonOpContent` vs container type returns `DecodeError` instead of panicking.\n  - Outdated binary encoding decoder (`decode_op`): malformed op streams (missing delete iterators, type mismatches) now return `DecodeDataCorruptionError` instead of panicking.\n  - Fast snapshot decoder (`decode_snapshot_blob_meta`): truncated or oversized section lengths now return `DecodeDataCorruptionError` instead of panicking on slice indexing.\n  - Change store KV import (`import_all`): corrupted `VersionVector`/`Frontiers` metadata now returns `DecodeDataCorruptionError` instead of panicking.\n  - Value encoding (`LoroValueKind::from_u8`, `read_str`): invalid byte values and invalid UTF-8 now return `DecodeDataCorruptionError` instead of panicking.\n  - `LoroDoc::diff()`: checkout failures during diff calculation are now propagated as `LoroError` instead of panicking; state restore uses `unwrap()` to fail-fast on internal errors.\n  - `try_get_text/list/map/tree/movable_list/counter`: now return `None` for wrong root container types instead of panicking.\n  - Detached list insert out-of-bounds: returns `LoroError::OutOfBound` instead of panicking.\n  - Tree `mov_after`/`mov_before` on deleted node: returns `TreeNodeDeletedOrNotExist` instead of panicking.\n  - `JsonChange::op_len`: empty ops array returns `0` instead of panicking.\n  - `renew_peer_id`: avoids theoretical collision with `PeerID::MAX`.\n\n- 0977ad1: Fix lock-order panics when JavaScript callbacks re-enter Loro APIs.\n\n  - `opCount()` no longer reacquires the OpLog lock while the current thread already holds a higher-order lock.\n  - `LoroText.iter()` snapshots text chunks before invoking the user callback, so callback code can safely read or mutate the document.\n\n- ef100e6: Reduce memory spikes when exporting snapshots from shallow documents.\n\n  When a shallow document is re-exported from its existing shallow root with only a small tail of updates, Loro now reuses the stored shallow-root state instead of decoding all containers just to re-encode the same state.\n\n- 933d5d6: feat: add clearRedo and clearUndo methods\n  #921\n- 17dc6c0: Fix several edge-case contract violations in document, text, and JSONPath APIs.\n\n  - JSONPath `value(...)` comparisons now handle boolean values consistently with other scalar comparisons.\n  - Rich text mark expansion now follows `ExpandType::Before` and `ExpandType::Both` at documented insertion boundaries.\n  - Text delta slicing now validates invalid ranges and UTF-8/UTF-16 boundaries before slicing, and public deltas omit removed-style tombstones after unmarking.\n  - Detached list and movable-list out-of-bounds operations now return `LoroError::OutOfBound` instead of panicking.\n\n## 1.11.1\n\n### Patch Changes\n\n- 6f5b7a9: Fix production panic regressions\n\n## 1.10.8\n\n### Patch Changes\n\n- 9f68a57: Return errors instead of panicking when diff or checkout targets frontiers before a shallow snapshot root.\n\n## 1.10.6\n\n### Patch Changes\n\n- 85921d7: fix: don't hang when remapping nested containers w same ID (#911)\n\n## 1.10.5\n\n### Patch Changes\n\n- 2d6c235: Fix counter undo after remote updates #906\n\n## 1.10.4\n\n### Patch Changes\n\n- 864b5ca: perf(loro-internal): remove quadratic slow paths in text import/checkout #895\n- a34134d: perf: rm the event calling wrapper for ops that will not trigger events\n\n## 1.10.3\n\n### Patch Changes\n\n- 2800a4c: perf: skip useless unmark op #878\n- fffaf45: feat: add JSONPath subscription #883\n\n## 1.10.2\n\n### Patch Changes\n\n- 53635dd: fix: toDelta should ignore null style entries #875\n\n## 1.10.1\n\n### Patch Changes\n\n- ca76d86: fix: Empty LoroText attach error #873\n\n## 1.10.0\n\n### Minor Changes\n\n- ce16b52: feat: add sliceDelta method to slice a span of richtext #862\n\n  Use `text.sliceDelta(start, end)` when you need a Quill-style delta for only part of a rich text field (for example, to copy a styled snippet). The method takes UTF-16 indices; use `sliceDeltaUtf8` if you want to slice by UTF-8 byte offsets instead.\n\n  ```ts\n  import { LoroDoc } from \"loro-crdt\";\n\n  const doc = new LoroDoc();\n  doc.configTextStyle({\n    bold: { expand: \"after\" },\n    comment: { expand: \"none\" },\n  });\n  const text = doc.getText(\"text\");\n\n  text.insert(0, \"Hello World!\");\n  text.mark({ start: 0, end: 5 }, \"bold\", true);\n  text.mark({ start: 6, end: 11 }, \"comment\", \"greeting\");\n\n  const snippet = text.sliceDelta(1, 8);\n  console.log(snippet);\n  // [\n  //   { insert: \"ello\", attributes: { bold: true } },\n  //   { insert: \" \" },\n  //   { insert: \"Wo\", attributes: { comment: \"greeting\" } },\n  // ]\n  ```\n\n### Patch Changes\n\n- a78d70f: fix: avoid convert panic #858\n- ee94ee4: fix: EphemeralStore apply should ignore timeout entries #865\n- 9e0a613: fix: Reject symbol-keyed map objects in wasm conversion #855\n\n## 1.9.0\n\n### Minor Changes\n\n- 10a405b: feat: JSONPath rfc9535 #848\n\n  Thanks to @zolero for the thorough implementation of JSONPath support!\n\n  LoroDoc now supports querying and mutating document data using **JSONPath**, following the [RFC 9535](https://www.rfc-editor.org/rfc/rfc9535) specification.\n\n  ### 🧩 API\n\n  ```ts\n  // Execute a JSONPath query on the document\n  doc.JSONPath(path: string): any[];\n  ```\n\n  ### 📚 Query Examples\n\n  Example data setup\n\n  ```ts\n  const doc = new LoroDoc();\n  const store = doc.getMap(\"store\");\n\n  // Simplified setup for illustration purposes\n  store.set(\"books\", [\n    {\n      title: \"1984\",\n      author: \"George Orwell\",\n      price: 10,\n      available: true,\n      isbn: \"978-0451524935\",\n    },\n    {\n      title: \"Animal Farm\",\n      author: \"George Orwell\",\n      price: 8,\n      available: true,\n    },\n    {\n      title: \"Brave New World\",\n      author: \"Aldous Huxley\",\n      price: 12,\n      available: false,\n    },\n    {\n      title: \"Fahrenheit 451\",\n      author: \"Ray Bradbury\",\n      price: 9,\n      available: true,\n    },\n    {\n      title: \"The Great Gatsby\",\n      author: \"F. Scott Fitzgerald\",\n      price: null,\n      available: true,\n    },\n    {\n      title: \"To Kill a Mockingbird\",\n      author: \"Harper Lee\",\n      price: 11,\n      available: true,\n    },\n    {\n      title: \"The Catcher in the Rye\",\n      author: \"J.D. Salinger\",\n      price: 10,\n      available: false,\n    },\n    {\n      title: \"Lord of the Flies\",\n      author: \"William Golding\",\n      price: 9,\n      available: true,\n    },\n    {\n      title: \"Pride and Prejudice\",\n      author: \"Jane Austen\",\n      price: 7,\n      available: true,\n    },\n    {\n      title: \"The Hobbit\",\n      author: \"J.R.R. Tolkien\",\n      price: 14,\n      available: true,\n    },\n  ]);\n  store.set(\"featured_authors\", [\"George Orwell\", \"Jane Austen\"]);\n  ```\n\n  ```ts\n  // 1. Get all book titles\n  doc.JSONPath(\"$.store.books[*].title\");\n  // → [\"1984\", \"Animal Farm\", \"Brave New World\", \"The Hobbit\"]\n\n  // 2. Filter: available books only\n  doc.JSONPath(\"$.store.books[?(@.available)].title\");\n  // → [\"1984\", \"Animal Farm\", \"The Hobbit\"]\n\n  // 3. Filter: books with price > 10\n  doc.JSONPath(\"$.store.books[?(@.price > 10)].title\");\n  // → [\"The Hobbit\"]\n\n  // 4. Use recursive descent to get all prices\n  doc.JSONPath(\"$..price\");\n  // → [10, 8, 12, 9, null, 11, 14]\n\n  // 5. Slice syntax: first three books\n  doc.JSONPath(\"$.store.books[0:3].title\");\n  // → [\"1984\", \"Animal Farm\", \"Brave New World\"]\n\n  // 6. Membership test: authors in featured list\n  doc.JSONPath(\"$.store.books[?(@.author in $.store.featured_authors)].title\");\n  // → [\"1984\", \"Animal Farm\", \"Pride and Prejudice\"]\n\n  // 7. String match using `contains`\n  doc.JSONPath(\"$.store.books[?(@.title contains 'The')].author\");\n  // → [\"F. Scott Fitzgerald\", \"J.R.R. Tolkien\"]\n  ```\n\n- 10a405b: refactor!: remove deprecated encoding format in v0.x #849\n\n### Patch Changes\n\n- 3af6a85: fix: WASM loading compatibility for esbuild and rsbuild #851\n\n## 1.8.9\n\n### Patch Changes\n\n- 53f5533: Extract sourcemap to another package","mentions_count":1},{"url":"https://api.github.com/repos/loro-dev/loro/releases/342551908","assets_url":"https://api.github.com/repos/loro-dev/loro/releases/342551908/assets","upload_url":"https://uploads.github.com/repos/loro-dev/loro/releases/342551908/assets{?name,label}","html_url":"https://github.com/loro-dev/loro/releases/tag/loro-crdt%401.13.6","id":342551908,"author":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOHpcjs84Uau1k","tag_name":"loro-crdt@1.13.6","target_commitish":"main","name":"loro-crdt@1.13.6","draft":false,"immutable":false,"prerelease":false,"created_at":"2026-06-21T15:33:23Z","updated_at":"2026-06-21T15:40:17Z","published_at":"2026-06-21T15:40:17Z","assets":[],"tarball_url":"https://api.github.com/repos/loro-dev/loro/tarball/loro-crdt@1.13.6","zipball_url":"https://api.github.com/repos/loro-dev/loro/zipball/loro-crdt@1.13.6","body":"### Patch Changes\n\n- a4e6174: Fix undo/redo restoring mergeable map children as regular non-mergeable containers.\n- 78f6c8a: Fix a potential deadlock when lazy snapshot loading resolves mergeable container parent depths."},{"url":"https://api.github.com/repos/loro-dev/loro/releases/342428064","assets_url":"https://api.github.com/repos/loro-dev/loro/releases/342428064/assets","upload_url":"https://uploads.github.com/repos/loro-dev/loro/releases/342428064/assets{?name,label}","html_url":"https://github.com/loro-dev/loro/releases/tag/loro-crdt%401.13.5","id":342428064,"author":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOHpcjs84UaQmg","tag_name":"loro-crdt@1.13.5","target_commitish":"main","name":"loro-crdt@1.13.5","draft":false,"immutable":false,"prerelease":false,"created_at":"2026-06-21T00:24:32Z","updated_at":"2026-06-21T00:28:57Z","published_at":"2026-06-21T00:28:57Z","assets":[],"tarball_url":"https://api.github.com/repos/loro-dev/loro/tarball/loro-crdt@1.13.5","zipball_url":"https://api.github.com/repos/loro-dev/loro/zipball/loro-crdt@1.13.5","body":"### Patch Changes\n\n- 1727258: Improve text insert and snapshot import performance by avoiding duplicate text boundary validation and skipping eager imported change block parsing.\n- 52d8168: Recover two per-operation editing slowdowns regressed since 1.11.\n\n  Both are constant-factor regressions on the per-op (auto-commit) editing path\n  introduced by the lazy-snapshot work in #985, measured against the 1.11.1\n  release.\n\n  1. Every `MapHandler`/`ListHandler`/`MovableListHandler` insert validated its\n     value with `ensure_no_regular_container_value`, which heap-allocated a `Vec`\n     on each call even for scalar values (the common case). A scalar fast-path now\n     skips the allocation and traversal entirely. `map create 10^4 key`:\n     ~19.4ms -> ~10.7ms.\n  2. The per-op text bounds check (`TextHandler::len`/`len_unicode`/`len_utf16`)\n     took two `DocState` locks — one to check whether the container state was\n     decoded, then another to query the length. These are now consolidated into a\n     single `DocState::get_text_len` that takes one lock and one container-store\n     lookup. The lazy-snapshot memory behavior is preserved: a still-lazy\n     container reads its cached length metadata without materializing the full\n     richtext state. `bench_text B4 apply` (per-op text editing): ~389ms -> ~352ms."},{"url":"https://api.github.com/repos/loro-dev/loro/releases/342551900","assets_url":"https://api.github.com/repos/loro-dev/loro/releases/342551900/assets","upload_url":"https://uploads.github.com/repos/loro-dev/loro/releases/342551900/assets{?name,label}","html_url":"https://github.com/loro-dev/loro/releases/tag/loro-crdt-map%401.13.6","id":342551900,"author":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOHpcjs84Uau1c","tag_name":"loro-crdt-map@1.13.6","target_commitish":"main","name":"loro-crdt-map@1.13.6","draft":false,"immutable":false,"prerelease":false,"created_at":"2026-06-21T15:33:23Z","updated_at":"2026-06-21T15:40:14Z","published_at":"2026-06-21T15:40:14Z","assets":[],"tarball_url":"https://api.github.com/repos/loro-dev/loro/tarball/loro-crdt-map@1.13.6","zipball_url":"https://api.github.com/repos/loro-dev/loro/zipball/loro-crdt-map@1.13.6","body":"### Patch Changes\n\n- a4e6174: Fix undo/redo restoring mergeable map children as regular non-mergeable containers.\n- 78f6c8a: Fix a potential deadlock when lazy snapshot loading resolves mergeable container parent depths."},{"url":"https://api.github.com/repos/loro-dev/loro/releases/342428055","assets_url":"https://api.github.com/repos/loro-dev/loro/releases/342428055/assets","upload_url":"https://uploads.github.com/repos/loro-dev/loro/releases/342428055/assets{?name,label}","html_url":"https://github.com/loro-dev/loro/releases/tag/loro-crdt-map%401.13.5","id":342428055,"author":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOHpcjs84UaQmX","tag_name":"loro-crdt-map@1.13.5","target_commitish":"main","name":"loro-crdt-map@1.13.5","draft":false,"immutable":false,"prerelease":false,"created_at":"2026-06-21T00:24:32Z","updated_at":"2026-06-21T00:28:55Z","published_at":"2026-06-21T00:28:55Z","assets":[],"tarball_url":"https://api.github.com/repos/loro-dev/loro/tarball/loro-crdt-map@1.13.5","zipball_url":"https://api.github.com/repos/loro-dev/loro/zipball/loro-crdt-map@1.13.5","body":"### Patch Changes\n\n- 1727258: Improve text insert and snapshot import performance by avoiding duplicate text boundary validation and skipping eager imported change block parsing.\n- 52d8168: Recover two per-operation editing slowdowns regressed since 1.11.\n\n  Both are constant-factor regressions on the per-op (auto-commit) editing path\n  introduced by the lazy-snapshot work in #985, measured against the 1.11.1\n  release.\n\n  1. Every `MapHandler`/`ListHandler`/`MovableListHandler` insert validated its\n     value with `ensure_no_regular_container_value`, which heap-allocated a `Vec`\n     on each call even for scalar values (the common case). A scalar fast-path now\n     skips the allocation and traversal entirely. `map create 10^4 key`:\n     ~19.4ms -> ~10.7ms.\n  2. The per-op text bounds check (`TextHandler::len`/`len_unicode`/`len_utf16`)\n     took two `DocState` locks — one to check whether the container state was\n     decoded, then another to query the length. These are now consolidated into a\n     single `DocState::get_text_len` that takes one lock and one container-store\n     lookup. The lazy-snapshot memory behavior is preserved: a still-lazy\n     container reads its cached length metadata without materializing the full\n     richtext state. `bench_text B4 apply` (per-op text editing): ~389ms -> ~352ms."},{"url":"https://api.github.com/repos/loro-dev/loro/releases/340252533","assets_url":"https://api.github.com/repos/loro-dev/loro/releases/340252533/assets","upload_url":"https://uploads.github.com/repos/loro-dev/loro/releases/340252533/assets{?name,label}","html_url":"https://github.com/loro-dev/loro/releases/tag/loro-crdt%401.13.4","id":340252533,"author":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOHpcjs84UR9d1","tag_name":"loro-crdt@1.13.4","target_commitish":"main","name":"loro-crdt@1.13.4","draft":false,"immutable":false,"prerelease":false,"created_at":"2026-06-16T15:39:23Z","updated_at":"2026-06-16T15:44:48Z","published_at":"2026-06-16T15:44:48Z","assets":[],"tarball_url":"https://api.github.com/repos/loro-dev/loro/tarball/loro-crdt@1.13.4","zipball_url":"https://api.github.com/repos/loro-dev/loro/zipball/loro-crdt@1.13.4","body":"### Patch Changes\n\n- 4d577ad: Fix two O(n^2) editing slowdowns.\n\n  1. Editing with UTF-16 / UTF-8 (byte) positions (the default in the JS binding)\n     validated each position by materializing the entire `[0, pos)` prefix string,\n     making every `insert`/`delete`/`splice`/`mark` O(n) and a run of edits O(n^2)\n     (regression since 1.12.0). The boundary check now reads the rope's prefix\n     caches via the cursor (O(log n)). Unicode-indexed editing was unaffected.\n  2. When a subscriber is attached and many edits land on the same container within\n     one event batch (e.g. random-position inserts, or many distinct map-key\n     writes), building the event cloned the growing accumulated diff on every\n     compose — O(n^2) in the number of fragments. The diffs are now composed in\n     place. This affected text, map and list events.\n  3. Converting a UTF-16 / UTF-8 position within a text chunk to a unicode offset\n     scanned the chunk char-by-char, so editing/slicing a large contiguous chunk\n     (a big insert, a loaded document, or a long run of typed text that merges into\n     one chunk) was O(chunk length) per op. Chunks that contain no astral-plane\n     characters (UTF-16) or are pure ASCII (UTF-8) now convert in O(1), covering\n     essentially all real-world text (ASCII/Latin/CJK)."},{"url":"https://api.github.com/repos/loro-dev/loro/releases/340252552","assets_url":"https://api.github.com/repos/loro-dev/loro/releases/340252552/assets","upload_url":"https://uploads.github.com/repos/loro-dev/loro/releases/340252552/assets{?name,label}","html_url":"https://github.com/loro-dev/loro/releases/tag/loro-crdt-map%401.13.4","id":340252552,"author":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOHpcjs84UR9eI","tag_name":"loro-crdt-map@1.13.4","target_commitish":"main","name":"loro-crdt-map@1.13.4","draft":false,"immutable":false,"prerelease":false,"created_at":"2026-06-16T15:39:23Z","updated_at":"2026-06-16T15:44:51Z","published_at":"2026-06-16T15:44:51Z","assets":[],"tarball_url":"https://api.github.com/repos/loro-dev/loro/tarball/loro-crdt-map@1.13.4","zipball_url":"https://api.github.com/repos/loro-dev/loro/zipball/loro-crdt-map@1.13.4","body":"### Patch Changes\n\n- 4d577ad: Fix two O(n^2) editing slowdowns.\n\n  1. Editing with UTF-16 / UTF-8 (byte) positions (the default in the JS binding)\n     validated each position by materializing the entire `[0, pos)` prefix string,\n     making every `insert`/`delete`/`splice`/`mark` O(n) and a run of edits O(n^2)\n     (regression since 1.12.0). The boundary check now reads the rope's prefix\n     caches via the cursor (O(log n)). Unicode-indexed editing was unaffected.\n  2. When a subscriber is attached and many edits land on the same container within\n     one event batch (e.g. random-position inserts, or many distinct map-key\n     writes), building the event cloned the growing accumulated diff on every\n     compose — O(n^2) in the number of fragments. The diffs are now composed in\n     place. This affected text, map and list events.\n  3. Converting a UTF-16 / UTF-8 position within a text chunk to a unicode offset\n     scanned the chunk char-by-char, so editing/slicing a large contiguous chunk\n     (a big insert, a loaded document, or a long run of typed text that merges into\n     one chunk) was O(chunk length) per op. Chunks that contain no astral-plane\n     characters (UTF-16) or are pure ASCII (UTF-8) now convert in O(1), covering\n     essentially all real-world text (ASCII/Latin/CJK)."},{"url":"https://api.github.com/repos/loro-dev/loro/releases/339691533","assets_url":"https://api.github.com/repos/loro-dev/loro/releases/339691533/assets","upload_url":"https://uploads.github.com/repos/loro-dev/loro/releases/339691533/assets{?name,label}","html_url":"https://github.com/loro-dev/loro/releases/tag/loro-crdt%401.13.3","id":339691533,"author":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOHpcjs84UP0gN","tag_name":"loro-crdt@1.13.3","target_commitish":"main","name":"loro-crdt@1.13.3","draft":false,"immutable":false,"prerelease":false,"created_at":"2026-06-15T17:03:44Z","updated_at":"2026-06-15T17:08:36Z","published_at":"2026-06-15T17:08:36Z","assets":[],"tarball_url":"https://api.github.com/repos/loro-dev/loro/tarball/loro-crdt@1.13.3","zipball_url":"https://api.github.com/repos/loro-dev/loro/zipball/loro-crdt@1.13.3","body":"### Patch Changes\n\n- 8d258cb: Fix `unreachable` panic when importing an out-of-order update whose op targets a mergeable child container before its creation (or its parent map) has arrived. Such ops are now buffered as pending and applied once the creating change is imported.\n- 32700ba: Fix undo recording for the first local commit after importing shallow snapshots that need import-time state materialization."},{"url":"https://api.github.com/repos/loro-dev/loro/releases/339691511","assets_url":"https://api.github.com/repos/loro-dev/loro/releases/339691511/assets","upload_url":"https://uploads.github.com/repos/loro-dev/loro/releases/339691511/assets{?name,label}","html_url":"https://github.com/loro-dev/loro/releases/tag/loro-crdt-map%401.13.3","id":339691511,"author":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOHpcjs84UP0f3","tag_name":"loro-crdt-map@1.13.3","target_commitish":"main","name":"loro-crdt-map@1.13.3","draft":false,"immutable":false,"prerelease":false,"created_at":"2026-06-15T17:03:44Z","updated_at":"2026-06-15T17:08:33Z","published_at":"2026-06-15T17:08:33Z","assets":[],"tarball_url":"https://api.github.com/repos/loro-dev/loro/tarball/loro-crdt-map@1.13.3","zipball_url":"https://api.github.com/repos/loro-dev/loro/zipball/loro-crdt-map@1.13.3","body":"# loro-crdt-map\n\n## 1.13.0\n\n### Minor Changes\n\n- fa888d8: Add mergeable child containers: child containers created under a map key that converge across peers on concurrent first-write instead of forking. Exposed as `ensureMergeable{Counter,Map,List,MovableList,Text,Tree}` on `LoroMap`. A mergeable child lives at a deterministic `ContainerID` derived from `(parent, key, kind)`, and its visibility is driven by a binary ref the parent map stores at the key, so deletes and kind conflicts resolve through the map's regular LWW.\n\n## 1.12.4\n\n### Patch Changes\n\n- a6e23b6: Optimize snapshot export for shallow documents by reusing cached shallow-root state instead of checking out to the shallow root and back to latest.\n\n## 1.12.2\n\n### Patch Changes\n\n- cc587ed: Add a browser package remapping so Vite/Rolldown production builds load WASM without top-level await or circular wasm wrapper chunks.\n\n  Also make the base64 entry easier to bundle with plain esbuild, Rollup, and Next.js Webpack by avoiding static Node builtin `require()` calls and top-level await in browser bundles.\n\n- 8f57f4c: Reduce memory usage for read-only access to snapshot-imported documents by avoiding unnecessary lazy container state initialization.\n\n## 1.12.0\n\n### Minor Changes\n\n- 7dfda87: Make update imports atomic across oplog and document state application.\n\n  - `import` and `import_json_updates` now roll back imported oplog changes when state application fails, so malformed updates do not leave the document with oplog/state divergence.\n  - Pending changes that are activated during import are included in the rollback boundary when they can affect state application.\n  - Import rollback uses conditional guards to avoid adding fixed overhead to successful detached or no-op imports.\n\n### Patch Changes\n\n- 64aa97c: Harden encoding, snapshot, and import paths against malformed input\n\n  - JSON schema import (`import_json_updates`): out-of-range compressed peer indices now return `DecodeError` instead of being silently accepted as raw peer IDs; mismatched `JsonOpContent` vs container type returns `DecodeError` instead of panicking.\n  - Outdated binary encoding decoder (`decode_op`): malformed op streams (missing delete iterators, type mismatches) now return `DecodeDataCorruptionError` instead of panicking.\n  - Fast snapshot decoder (`decode_snapshot_blob_meta`): truncated or oversized section lengths now return `DecodeDataCorruptionError` instead of panicking on slice indexing.\n  - Change store KV import (`import_all`): corrupted `VersionVector`/`Frontiers` metadata now returns `DecodeDataCorruptionError` instead of panicking.\n  - Value encoding (`LoroValueKind::from_u8`, `read_str`): invalid byte values and invalid UTF-8 now return `DecodeDataCorruptionError` instead of panicking.\n  - `LoroDoc::diff()`: checkout failures during diff calculation are now propagated as `LoroError` instead of panicking; state restore uses `unwrap()` to fail-fast on internal errors.\n  - `try_get_text/list/map/tree/movable_list/counter`: now return `None` for wrong root container types instead of panicking.\n  - Detached list insert out-of-bounds: returns `LoroError::OutOfBound` instead of panicking.\n  - Tree `mov_after`/`mov_before` on deleted node: returns `TreeNodeDeletedOrNotExist` instead of panicking.\n  - `JsonChange::op_len`: empty ops array returns `0` instead of panicking.\n  - `renew_peer_id`: avoids theoretical collision with `PeerID::MAX`.\n\n- 0977ad1: Fix lock-order panics when JavaScript callbacks re-enter Loro APIs.\n\n  - `opCount()` no longer reacquires the OpLog lock while the current thread already holds a higher-order lock.\n  - `LoroText.iter()` snapshots text chunks before invoking the user callback, so callback code can safely read or mutate the document.\n\n- ef100e6: Reduce memory spikes when exporting snapshots from shallow documents.\n\n  When a shallow document is re-exported from its existing shallow root with only a small tail of updates, Loro now reuses the stored shallow-root state instead of decoding all containers just to re-encode the same state.\n\n- 933d5d6: feat: add clearRedo and clearUndo methods\n  #921\n- 17dc6c0: Fix several edge-case contract violations in document, text, and JSONPath APIs.\n\n  - JSONPath `value(...)` comparisons now handle boolean values consistently with other scalar comparisons.\n  - Rich text mark expansion now follows `ExpandType::Before` and `ExpandType::Both` at documented insertion boundaries.\n  - Text delta slicing now validates invalid ranges and UTF-8/UTF-16 boundaries before slicing, and public deltas omit removed-style tombstones after unmarking.\n  - Detached list and movable-list out-of-bounds operations now return `LoroError::OutOfBound` instead of panicking.\n\n## 1.11.1\n\n### Patch Changes\n\n- 6f5b7a9: Fix production panic regressions\n\n## 1.10.8\n\n### Patch Changes\n\n- 9f68a57: Return errors instead of panicking when diff or checkout targets frontiers before a shallow snapshot root.\n\n## 1.10.6\n\n### Patch Changes\n\n- 85921d7: fix: don't hang when remapping nested containers w same ID (#911)\n\n## 1.10.5\n\n### Patch Changes\n\n- 2d6c235: Fix counter undo after remote updates #906\n\n## 1.10.4\n\n### Patch Changes\n\n- 864b5ca: perf(loro-internal): remove quadratic slow paths in text import/checkout #895\n- a34134d: perf: rm the event calling wrapper for ops that will not trigger events\n\n## 1.10.3\n\n### Patch Changes\n\n- 2800a4c: perf: skip useless unmark op #878\n- fffaf45: feat: add JSONPath subscription #883\n\n## 1.10.2\n\n### Patch Changes\n\n- 53635dd: fix: toDelta should ignore null style entries #875\n\n## 1.10.1\n\n### Patch Changes\n\n- ca76d86: fix: Empty LoroText attach error #873\n\n## 1.10.0\n\n### Minor Changes\n\n- ce16b52: feat: add sliceDelta method to slice a span of richtext #862\n\n  Use `text.sliceDelta(start, end)` when you need a Quill-style delta for only part of a rich text field (for example, to copy a styled snippet). The method takes UTF-16 indices; use `sliceDeltaUtf8` if you want to slice by UTF-8 byte offsets instead.\n\n  ```ts\n  import { LoroDoc } from \"loro-crdt\";\n\n  const doc = new LoroDoc();\n  doc.configTextStyle({\n    bold: { expand: \"after\" },\n    comment: { expand: \"none\" },\n  });\n  const text = doc.getText(\"text\");\n\n  text.insert(0, \"Hello World!\");\n  text.mark({ start: 0, end: 5 }, \"bold\", true);\n  text.mark({ start: 6, end: 11 }, \"comment\", \"greeting\");\n\n  const snippet = text.sliceDelta(1, 8);\n  console.log(snippet);\n  // [\n  //   { insert: \"ello\", attributes: { bold: true } },\n  //   { insert: \" \" },\n  //   { insert: \"Wo\", attributes: { comment: \"greeting\" } },\n  // ]\n  ```\n\n### Patch Changes\n\n- a78d70f: fix: avoid convert panic #858\n- ee94ee4: fix: EphemeralStore apply should ignore timeout entries #865\n- 9e0a613: fix: Reject symbol-keyed map objects in wasm conversion #855\n\n## 1.9.0\n\n### Minor Changes\n\n- 10a405b: feat: JSONPath rfc9535 #848\n\n  Thanks to @zolero for the thorough implementation of JSONPath support!\n\n  LoroDoc now supports querying and mutating document data using **JSONPath**, following the [RFC 9535](https://www.rfc-editor.org/rfc/rfc9535) specification.\n\n  ### 🧩 API\n\n  ```ts\n  // Execute a JSONPath query on the document\n  doc.JSONPath(path: string): any[];\n  ```\n\n  ### 📚 Query Examples\n\n  Example data setup\n\n  ```ts\n  const doc = new LoroDoc();\n  const store = doc.getMap(\"store\");\n\n  // Simplified setup for illustration purposes\n  store.set(\"books\", [\n    {\n      title: \"1984\",\n      author: \"George Orwell\",\n      price: 10,\n      available: true,\n      isbn: \"978-0451524935\",\n    },\n    {\n      title: \"Animal Farm\",\n      author: \"George Orwell\",\n      price: 8,\n      available: true,\n    },\n    {\n      title: \"Brave New World\",\n      author: \"Aldous Huxley\",\n      price: 12,\n      available: false,\n    },\n    {\n      title: \"Fahrenheit 451\",\n      author: \"Ray Bradbury\",\n      price: 9,\n      available: true,\n    },\n    {\n      title: \"The Great Gatsby\",\n      author: \"F. Scott Fitzgerald\",\n      price: null,\n      available: true,\n    },\n    {\n      title: \"To Kill a Mockingbird\",\n      author: \"Harper Lee\",\n      price: 11,\n      available: true,\n    },\n    {\n      title: \"The Catcher in the Rye\",\n      author: \"J.D. Salinger\",\n      price: 10,\n      available: false,\n    },\n    {\n      title: \"Lord of the Flies\",\n      author: \"William Golding\",\n      price: 9,\n      available: true,\n    },\n    {\n      title: \"Pride and Prejudice\",\n      author: \"Jane Austen\",\n      price: 7,\n      available: true,\n    },\n    {\n      title: \"The Hobbit\",\n      author: \"J.R.R. Tolkien\",\n      price: 14,\n      available: true,\n    },\n  ]);\n  store.set(\"featured_authors\", [\"George Orwell\", \"Jane Austen\"]);\n  ```\n\n  ```ts\n  // 1. Get all book titles\n  doc.JSONPath(\"$.store.books[*].title\");\n  // → [\"1984\", \"Animal Farm\", \"Brave New World\", \"The Hobbit\"]\n\n  // 2. Filter: available books only\n  doc.JSONPath(\"$.store.books[?(@.available)].title\");\n  // → [\"1984\", \"Animal Farm\", \"The Hobbit\"]\n\n  // 3. Filter: books with price > 10\n  doc.JSONPath(\"$.store.books[?(@.price > 10)].title\");\n  // → [\"The Hobbit\"]\n\n  // 4. Use recursive descent to get all prices\n  doc.JSONPath(\"$..price\");\n  // → [10, 8, 12, 9, null, 11, 14]\n\n  // 5. Slice syntax: first three books\n  doc.JSONPath(\"$.store.books[0:3].title\");\n  // → [\"1984\", \"Animal Farm\", \"Brave New World\"]\n\n  // 6. Membership test: authors in featured list\n  doc.JSONPath(\"$.store.books[?(@.author in $.store.featured_authors)].title\");\n  // → [\"1984\", \"Animal Farm\", \"Pride and Prejudice\"]\n\n  // 7. String match using `contains`\n  doc.JSONPath(\"$.store.books[?(@.title contains 'The')].author\");\n  // → [\"F. Scott Fitzgerald\", \"J.R.R. Tolkien\"]\n  ```\n\n- 10a405b: refactor!: remove deprecated encoding format in v0.x #849\n\n### Patch Changes\n\n- 3af6a85: fix: WASM loading compatibility for esbuild and rsbuild #851\n\n## 1.8.9\n\n### Patch Changes\n\n- 53f5533: Extract sourcemap to another package","mentions_count":1},{"url":"https://api.github.com/repos/loro-dev/loro/releases/338383662","assets_url":"https://api.github.com/repos/loro-dev/loro/releases/338383662/assets","upload_url":"https://uploads.github.com/repos/loro-dev/loro/releases/338383662/assets{?name,label}","html_url":"https://github.com/loro-dev/loro/releases/tag/loro-crdt%401.13.2","id":338383662,"author":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOHpcjs84UK1Mu","tag_name":"loro-crdt@1.13.2","target_commitish":"main","name":"loro-crdt@1.13.2","draft":false,"immutable":false,"prerelease":false,"created_at":"2026-06-12T04:59:53Z","updated_at":"2026-06-12T05:06:21Z","published_at":"2026-06-12T05:06:21Z","assets":[],"tarball_url":"https://api.github.com/repos/loro-dev/loro/tarball/loro-crdt@1.13.2","zipball_url":"https://api.github.com/repos/loro-dev/loro/zipball/loro-crdt@1.13.2","body":"### Patch Changes\n\n- 9d7d5c8: Fix `getContainerById` / `hasContainer` for ensured-but-empty mergeable containers.\n  After `ensureMergeableMap` (and friends), the child was visible via `map.get(key)`\n  and `toJSON()` but its id did not resolve until the first op was written into it —\n  locally and on remote peers after sync. The id now resolves as long as the parent\n  map's child ref is alive; a mergeable cid that was never ensured still resolves to\n  `undefined`."},{"url":"https://api.github.com/repos/loro-dev/loro/releases/338383683","assets_url":"https://api.github.com/repos/loro-dev/loro/releases/338383683/assets","upload_url":"https://uploads.github.com/repos/loro-dev/loro/releases/338383683/assets{?name,label}","html_url":"https://github.com/loro-dev/loro/releases/tag/loro-crdt-map%401.13.2","id":338383683,"author":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOHpcjs84UK1ND","tag_name":"loro-crdt-map@1.13.2","target_commitish":"main","name":"loro-crdt-map@1.13.2","draft":false,"immutable":false,"prerelease":false,"created_at":"2026-06-12T04:59:53Z","updated_at":"2026-06-12T05:06:24Z","published_at":"2026-06-12T05:06:24Z","assets":[],"tarball_url":"https://api.github.com/repos/loro-dev/loro/tarball/loro-crdt-map@1.13.2","zipball_url":"https://api.github.com/repos/loro-dev/loro/zipball/loro-crdt-map@1.13.2","body":"# loro-crdt-map\n\n## 1.13.0\n\n### Minor Changes\n\n- fa888d8: Add mergeable child containers: child containers created under a map key that converge across peers on concurrent first-write instead of forking. Exposed as `ensureMergeable{Counter,Map,List,MovableList,Text,Tree}` on `LoroMap`. A mergeable child lives at a deterministic `ContainerID` derived from `(parent, key, kind)`, and its visibility is driven by a binary ref the parent map stores at the key, so deletes and kind conflicts resolve through the map's regular LWW.\n\n## 1.12.4\n\n### Patch Changes\n\n- a6e23b6: Optimize snapshot export for shallow documents by reusing cached shallow-root state instead of checking out to the shallow root and back to latest.\n\n## 1.12.2\n\n### Patch Changes\n\n- cc587ed: Add a browser package remapping so Vite/Rolldown production builds load WASM without top-level await or circular wasm wrapper chunks.\n\n  Also make the base64 entry easier to bundle with plain esbuild, Rollup, and Next.js Webpack by avoiding static Node builtin `require()` calls and top-level await in browser bundles.\n\n- 8f57f4c: Reduce memory usage for read-only access to snapshot-imported documents by avoiding unnecessary lazy container state initialization.\n\n## 1.12.0\n\n### Minor Changes\n\n- 7dfda87: Make update imports atomic across oplog and document state application.\n\n  - `import` and `import_json_updates` now roll back imported oplog changes when state application fails, so malformed updates do not leave the document with oplog/state divergence.\n  - Pending changes that are activated during import are included in the rollback boundary when they can affect state application.\n  - Import rollback uses conditional guards to avoid adding fixed overhead to successful detached or no-op imports.\n\n### Patch Changes\n\n- 64aa97c: Harden encoding, snapshot, and import paths against malformed input\n\n  - JSON schema import (`import_json_updates`): out-of-range compressed peer indices now return `DecodeError` instead of being silently accepted as raw peer IDs; mismatched `JsonOpContent` vs container type returns `DecodeError` instead of panicking.\n  - Outdated binary encoding decoder (`decode_op`): malformed op streams (missing delete iterators, type mismatches) now return `DecodeDataCorruptionError` instead of panicking.\n  - Fast snapshot decoder (`decode_snapshot_blob_meta`): truncated or oversized section lengths now return `DecodeDataCorruptionError` instead of panicking on slice indexing.\n  - Change store KV import (`import_all`): corrupted `VersionVector`/`Frontiers` metadata now returns `DecodeDataCorruptionError` instead of panicking.\n  - Value encoding (`LoroValueKind::from_u8`, `read_str`): invalid byte values and invalid UTF-8 now return `DecodeDataCorruptionError` instead of panicking.\n  - `LoroDoc::diff()`: checkout failures during diff calculation are now propagated as `LoroError` instead of panicking; state restore uses `unwrap()` to fail-fast on internal errors.\n  - `try_get_text/list/map/tree/movable_list/counter`: now return `None` for wrong root container types instead of panicking.\n  - Detached list insert out-of-bounds: returns `LoroError::OutOfBound` instead of panicking.\n  - Tree `mov_after`/`mov_before` on deleted node: returns `TreeNodeDeletedOrNotExist` instead of panicking.\n  - `JsonChange::op_len`: empty ops array returns `0` instead of panicking.\n  - `renew_peer_id`: avoids theoretical collision with `PeerID::MAX`.\n\n- 0977ad1: Fix lock-order panics when JavaScript callbacks re-enter Loro APIs.\n\n  - `opCount()` no longer reacquires the OpLog lock while the current thread already holds a higher-order lock.\n  - `LoroText.iter()` snapshots text chunks before invoking the user callback, so callback code can safely read or mutate the document.\n\n- ef100e6: Reduce memory spikes when exporting snapshots from shallow documents.\n\n  When a shallow document is re-exported from its existing shallow root with only a small tail of updates, Loro now reuses the stored shallow-root state instead of decoding all containers just to re-encode the same state.\n\n- 933d5d6: feat: add clearRedo and clearUndo methods\n  #921\n- 17dc6c0: Fix several edge-case contract violations in document, text, and JSONPath APIs.\n\n  - JSONPath `value(...)` comparisons now handle boolean values consistently with other scalar comparisons.\n  - Rich text mark expansion now follows `ExpandType::Before` and `ExpandType::Both` at documented insertion boundaries.\n  - Text delta slicing now validates invalid ranges and UTF-8/UTF-16 boundaries before slicing, and public deltas omit removed-style tombstones after unmarking.\n  - Detached list and movable-list out-of-bounds operations now return `LoroError::OutOfBound` instead of panicking.\n\n## 1.11.1\n\n### Patch Changes\n\n- 6f5b7a9: Fix production panic regressions\n\n## 1.10.8\n\n### Patch Changes\n\n- 9f68a57: Return errors instead of panicking when diff or checkout targets frontiers before a shallow snapshot root.\n\n## 1.10.6\n\n### Patch Changes\n\n- 85921d7: fix: don't hang when remapping nested containers w same ID (#911)\n\n## 1.10.5\n\n### Patch Changes\n\n- 2d6c235: Fix counter undo after remote updates #906\n\n## 1.10.4\n\n### Patch Changes\n\n- 864b5ca: perf(loro-internal): remove quadratic slow paths in text import/checkout #895\n- a34134d: perf: rm the event calling wrapper for ops that will not trigger events\n\n## 1.10.3\n\n### Patch Changes\n\n- 2800a4c: perf: skip useless unmark op #878\n- fffaf45: feat: add JSONPath subscription #883\n\n## 1.10.2\n\n### Patch Changes\n\n- 53635dd: fix: toDelta should ignore null style entries #875\n\n## 1.10.1\n\n### Patch Changes\n\n- ca76d86: fix: Empty LoroText attach error #873\n\n## 1.10.0\n\n### Minor Changes\n\n- ce16b52: feat: add sliceDelta method to slice a span of richtext #862\n\n  Use `text.sliceDelta(start, end)` when you need a Quill-style delta for only part of a rich text field (for example, to copy a styled snippet). The method takes UTF-16 indices; use `sliceDeltaUtf8` if you want to slice by UTF-8 byte offsets instead.\n\n  ```ts\n  import { LoroDoc } from \"loro-crdt\";\n\n  const doc = new LoroDoc();\n  doc.configTextStyle({\n    bold: { expand: \"after\" },\n    comment: { expand: \"none\" },\n  });\n  const text = doc.getText(\"text\");\n\n  text.insert(0, \"Hello World!\");\n  text.mark({ start: 0, end: 5 }, \"bold\", true);\n  text.mark({ start: 6, end: 11 }, \"comment\", \"greeting\");\n\n  const snippet = text.sliceDelta(1, 8);\n  console.log(snippet);\n  // [\n  //   { insert: \"ello\", attributes: { bold: true } },\n  //   { insert: \" \" },\n  //   { insert: \"Wo\", attributes: { comment: \"greeting\" } },\n  // ]\n  ```\n\n### Patch Changes\n\n- a78d70f: fix: avoid convert panic #858\n- ee94ee4: fix: EphemeralStore apply should ignore timeout entries #865\n- 9e0a613: fix: Reject symbol-keyed map objects in wasm conversion #855\n\n## 1.9.0\n\n### Minor Changes\n\n- 10a405b: feat: JSONPath rfc9535 #848\n\n  Thanks to @zolero for the thorough implementation of JSONPath support!\n\n  LoroDoc now supports querying and mutating document data using **JSONPath**, following the [RFC 9535](https://www.rfc-editor.org/rfc/rfc9535) specification.\n\n  ### 🧩 API\n\n  ```ts\n  // Execute a JSONPath query on the document\n  doc.JSONPath(path: string): any[];\n  ```\n\n  ### 📚 Query Examples\n\n  Example data setup\n\n  ```ts\n  const doc = new LoroDoc();\n  const store = doc.getMap(\"store\");\n\n  // Simplified setup for illustration purposes\n  store.set(\"books\", [\n    {\n      title: \"1984\",\n      author: \"George Orwell\",\n      price: 10,\n      available: true,\n      isbn: \"978-0451524935\",\n    },\n    {\n      title: \"Animal Farm\",\n      author: \"George Orwell\",\n      price: 8,\n      available: true,\n    },\n    {\n      title: \"Brave New World\",\n      author: \"Aldous Huxley\",\n      price: 12,\n      available: false,\n    },\n    {\n      title: \"Fahrenheit 451\",\n      author: \"Ray Bradbury\",\n      price: 9,\n      available: true,\n    },\n    {\n      title: \"The Great Gatsby\",\n      author: \"F. Scott Fitzgerald\",\n      price: null,\n      available: true,\n    },\n    {\n      title: \"To Kill a Mockingbird\",\n      author: \"Harper Lee\",\n      price: 11,\n      available: true,\n    },\n    {\n      title: \"The Catcher in the Rye\",\n      author: \"J.D. Salinger\",\n      price: 10,\n      available: false,\n    },\n    {\n      title: \"Lord of the Flies\",\n      author: \"William Golding\",\n      price: 9,\n      available: true,\n    },\n    {\n      title: \"Pride and Prejudice\",\n      author: \"Jane Austen\",\n      price: 7,\n      available: true,\n    },\n    {\n      title: \"The Hobbit\",\n      author: \"J.R.R. Tolkien\",\n      price: 14,\n      available: true,\n    },\n  ]);\n  store.set(\"featured_authors\", [\"George Orwell\", \"Jane Austen\"]);\n  ```\n\n  ```ts\n  // 1. Get all book titles\n  doc.JSONPath(\"$.store.books[*].title\");\n  // → [\"1984\", \"Animal Farm\", \"Brave New World\", \"The Hobbit\"]\n\n  // 2. Filter: available books only\n  doc.JSONPath(\"$.store.books[?(@.available)].title\");\n  // → [\"1984\", \"Animal Farm\", \"The Hobbit\"]\n\n  // 3. Filter: books with price > 10\n  doc.JSONPath(\"$.store.books[?(@.price > 10)].title\");\n  // → [\"The Hobbit\"]\n\n  // 4. Use recursive descent to get all prices\n  doc.JSONPath(\"$..price\");\n  // → [10, 8, 12, 9, null, 11, 14]\n\n  // 5. Slice syntax: first three books\n  doc.JSONPath(\"$.store.books[0:3].title\");\n  // → [\"1984\", \"Animal Farm\", \"Brave New World\"]\n\n  // 6. Membership test: authors in featured list\n  doc.JSONPath(\"$.store.books[?(@.author in $.store.featured_authors)].title\");\n  // → [\"1984\", \"Animal Farm\", \"Pride and Prejudice\"]\n\n  // 7. String match using `contains`\n  doc.JSONPath(\"$.store.books[?(@.title contains 'The')].author\");\n  // → [\"F. Scott Fitzgerald\", \"J.R.R. Tolkien\"]\n  ```\n\n- 10a405b: refactor!: remove deprecated encoding format in v0.x #849\n\n### Patch Changes\n\n- 3af6a85: fix: WASM loading compatibility for esbuild and rsbuild #851\n\n## 1.8.9\n\n### Patch Changes\n\n- 53f5533: Extract sourcemap to another package","mentions_count":1},{"url":"https://api.github.com/repos/loro-dev/loro/releases/336064483","assets_url":"https://api.github.com/repos/loro-dev/loro/releases/336064483/assets","upload_url":"https://uploads.github.com/repos/loro-dev/loro/releases/336064483/assets{?name,label}","html_url":"https://github.com/loro-dev/loro/releases/tag/loro-crdt%401.13.1","id":336064483,"author":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOHpcjs84UB-_j","tag_name":"loro-crdt@1.13.1","target_commitish":"main","name":"loro-crdt@1.13.1","draft":false,"immutable":false,"prerelease":false,"created_at":"2026-06-08T16:06:59Z","updated_at":"2026-06-08T16:12:16Z","published_at":"2026-06-08T16:12:16Z","assets":[],"tarball_url":"https://api.github.com/repos/loro-dev/loro/tarball/loro-crdt@1.13.1","zipball_url":"https://api.github.com/repos/loro-dev/loro/zipball/loro-crdt@1.13.1","body":"### Patch Changes\n\n- c1e05bf: Fix Node and Vitest bare imports by resolving the package root to the Node.js\n  WASM entry under the `node` export condition."},{"url":"https://api.github.com/repos/loro-dev/loro/releases/335850385","assets_url":"https://api.github.com/repos/loro-dev/loro/releases/335850385/assets","upload_url":"https://uploads.github.com/repos/loro-dev/loro/releases/335850385/assets{?name,label}","html_url":"https://github.com/loro-dev/loro/releases/tag/loro-crdt%401.13.0","id":335850385,"author":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOHpcjs84UBKuR","tag_name":"loro-crdt@1.13.0","target_commitish":"main","name":"loro-crdt@1.13.0","draft":false,"immutable":false,"prerelease":false,"created_at":"2026-06-08T09:19:12Z","updated_at":"2026-06-08T09:23:49Z","published_at":"2026-06-08T09:23:49Z","assets":[],"tarball_url":"https://api.github.com/repos/loro-dev/loro/tarball/loro-crdt@1.13.0","zipball_url":"https://api.github.com/repos/loro-dev/loro/zipball/loro-crdt@1.13.0","body":"### Minor Changes\n\n- fa888d8: Add mergeable child containers: child containers created under a map key that converge across peers on concurrent first-write instead of forking. Exposed as `ensureMergeable{Counter,Map,List,MovableList,Text,Tree}` on `LoroMap`. A mergeable child lives at a deterministic `ContainerID` derived from `(parent, key, kind)`, and its visibility is driven by a binary ref the parent map stores at the key, so deletes and kind conflicts resolve through the map's regular LWW."},{"url":"https://api.github.com/repos/loro-dev/loro/releases/336064506","assets_url":"https://api.github.com/repos/loro-dev/loro/releases/336064506/assets","upload_url":"https://uploads.github.com/repos/loro-dev/loro/releases/336064506/assets{?name,label}","html_url":"https://github.com/loro-dev/loro/releases/tag/loro-crdt-map%401.13.1","id":336064506,"author":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOHpcjs84UB-_6","tag_name":"loro-crdt-map@1.13.1","target_commitish":"main","name":"loro-crdt-map@1.13.1","draft":false,"immutable":false,"prerelease":false,"created_at":"2026-06-08T16:06:59Z","updated_at":"2026-06-08T16:12:19Z","published_at":"2026-06-08T16:12:19Z","assets":[],"tarball_url":"https://api.github.com/repos/loro-dev/loro/tarball/loro-crdt-map@1.13.1","zipball_url":"https://api.github.com/repos/loro-dev/loro/zipball/loro-crdt-map@1.13.1","body":"# loro-crdt-map\n\n## 1.13.0\n\n### Minor Changes\n\n- fa888d8: Add mergeable child containers: child containers created under a map key that converge across peers on concurrent first-write instead of forking. Exposed as `ensureMergeable{Counter,Map,List,MovableList,Text,Tree}` on `LoroMap`. A mergeable child lives at a deterministic `ContainerID` derived from `(parent, key, kind)`, and its visibility is driven by a binary ref the parent map stores at the key, so deletes and kind conflicts resolve through the map's regular LWW.\n\n## 1.12.4\n\n### Patch Changes\n\n- a6e23b6: Optimize snapshot export for shallow documents by reusing cached shallow-root state instead of checking out to the shallow root and back to latest.\n\n## 1.12.2\n\n### Patch Changes\n\n- cc587ed: Add a browser package remapping so Vite/Rolldown production builds load WASM without top-level await or circular wasm wrapper chunks.\n\n  Also make the base64 entry easier to bundle with plain esbuild, Rollup, and Next.js Webpack by avoiding static Node builtin `require()` calls and top-level await in browser bundles.\n\n- 8f57f4c: Reduce memory usage for read-only access to snapshot-imported documents by avoiding unnecessary lazy container state initialization.\n\n## 1.12.0\n\n### Minor Changes\n\n- 7dfda87: Make update imports atomic across oplog and document state application.\n\n  - `import` and `import_json_updates` now roll back imported oplog changes when state application fails, so malformed updates do not leave the document with oplog/state divergence.\n  - Pending changes that are activated during import are included in the rollback boundary when they can affect state application.\n  - Import rollback uses conditional guards to avoid adding fixed overhead to successful detached or no-op imports.\n\n### Patch Changes\n\n- 64aa97c: Harden encoding, snapshot, and import paths against malformed input\n\n  - JSON schema import (`import_json_updates`): out-of-range compressed peer indices now return `DecodeError` instead of being silently accepted as raw peer IDs; mismatched `JsonOpContent` vs container type returns `DecodeError` instead of panicking.\n  - Outdated binary encoding decoder (`decode_op`): malformed op streams (missing delete iterators, type mismatches) now return `DecodeDataCorruptionError` instead of panicking.\n  - Fast snapshot decoder (`decode_snapshot_blob_meta`): truncated or oversized section lengths now return `DecodeDataCorruptionError` instead of panicking on slice indexing.\n  - Change store KV import (`import_all`): corrupted `VersionVector`/`Frontiers` metadata now returns `DecodeDataCorruptionError` instead of panicking.\n  - Value encoding (`LoroValueKind::from_u8`, `read_str`): invalid byte values and invalid UTF-8 now return `DecodeDataCorruptionError` instead of panicking.\n  - `LoroDoc::diff()`: checkout failures during diff calculation are now propagated as `LoroError` instead of panicking; state restore uses `unwrap()` to fail-fast on internal errors.\n  - `try_get_text/list/map/tree/movable_list/counter`: now return `None` for wrong root container types instead of panicking.\n  - Detached list insert out-of-bounds: returns `LoroError::OutOfBound` instead of panicking.\n  - Tree `mov_after`/`mov_before` on deleted node: returns `TreeNodeDeletedOrNotExist` instead of panicking.\n  - `JsonChange::op_len`: empty ops array returns `0` instead of panicking.\n  - `renew_peer_id`: avoids theoretical collision with `PeerID::MAX`.\n\n- 0977ad1: Fix lock-order panics when JavaScript callbacks re-enter Loro APIs.\n\n  - `opCount()` no longer reacquires the OpLog lock while the current thread already holds a higher-order lock.\n  - `LoroText.iter()` snapshots text chunks before invoking the user callback, so callback code can safely read or mutate the document.\n\n- ef100e6: Reduce memory spikes when exporting snapshots from shallow documents.\n\n  When a shallow document is re-exported from its existing shallow root with only a small tail of updates, Loro now reuses the stored shallow-root state instead of decoding all containers just to re-encode the same state.\n\n- 933d5d6: feat: add clearRedo and clearUndo methods\n  #921\n- 17dc6c0: Fix several edge-case contract violations in document, text, and JSONPath APIs.\n\n  - JSONPath `value(...)` comparisons now handle boolean values consistently with other scalar comparisons.\n  - Rich text mark expansion now follows `ExpandType::Before` and `ExpandType::Both` at documented insertion boundaries.\n  - Text delta slicing now validates invalid ranges and UTF-8/UTF-16 boundaries before slicing, and public deltas omit removed-style tombstones after unmarking.\n  - Detached list and movable-list out-of-bounds operations now return `LoroError::OutOfBound` instead of panicking.\n\n## 1.11.1\n\n### Patch Changes\n\n- 6f5b7a9: Fix production panic regressions\n\n## 1.10.8\n\n### Patch Changes\n\n- 9f68a57: Return errors instead of panicking when diff or checkout targets frontiers before a shallow snapshot root.\n\n## 1.10.6\n\n### Patch Changes\n\n- 85921d7: fix: don't hang when remapping nested containers w same ID (#911)\n\n## 1.10.5\n\n### Patch Changes\n\n- 2d6c235: Fix counter undo after remote updates #906\n\n## 1.10.4\n\n### Patch Changes\n\n- 864b5ca: perf(loro-internal): remove quadratic slow paths in text import/checkout #895\n- a34134d: perf: rm the event calling wrapper for ops that will not trigger events\n\n## 1.10.3\n\n### Patch Changes\n\n- 2800a4c: perf: skip useless unmark op #878\n- fffaf45: feat: add JSONPath subscription #883\n\n## 1.10.2\n\n### Patch Changes\n\n- 53635dd: fix: toDelta should ignore null style entries #875\n\n## 1.10.1\n\n### Patch Changes\n\n- ca76d86: fix: Empty LoroText attach error #873\n\n## 1.10.0\n\n### Minor Changes\n\n- ce16b52: feat: add sliceDelta method to slice a span of richtext #862\n\n  Use `text.sliceDelta(start, end)` when you need a Quill-style delta for only part of a rich text field (for example, to copy a styled snippet). The method takes UTF-16 indices; use `sliceDeltaUtf8` if you want to slice by UTF-8 byte offsets instead.\n\n  ```ts\n  import { LoroDoc } from \"loro-crdt\";\n\n  const doc = new LoroDoc();\n  doc.configTextStyle({\n    bold: { expand: \"after\" },\n    comment: { expand: \"none\" },\n  });\n  const text = doc.getText(\"text\");\n\n  text.insert(0, \"Hello World!\");\n  text.mark({ start: 0, end: 5 }, \"bold\", true);\n  text.mark({ start: 6, end: 11 }, \"comment\", \"greeting\");\n\n  const snippet = text.sliceDelta(1, 8);\n  console.log(snippet);\n  // [\n  //   { insert: \"ello\", attributes: { bold: true } },\n  //   { insert: \" \" },\n  //   { insert: \"Wo\", attributes: { comment: \"greeting\" } },\n  // ]\n  ```\n\n### Patch Changes\n\n- a78d70f: fix: avoid convert panic #858\n- ee94ee4: fix: EphemeralStore apply should ignore timeout entries #865\n- 9e0a613: fix: Reject symbol-keyed map objects in wasm conversion #855\n\n## 1.9.0\n\n### Minor Changes\n\n- 10a405b: feat: JSONPath rfc9535 #848\n\n  Thanks to @zolero for the thorough implementation of JSONPath support!\n\n  LoroDoc now supports querying and mutating document data using **JSONPath**, following the [RFC 9535](https://www.rfc-editor.org/rfc/rfc9535) specification.\n\n  ### 🧩 API\n\n  ```ts\n  // Execute a JSONPath query on the document\n  doc.JSONPath(path: string): any[];\n  ```\n\n  ### 📚 Query Examples\n\n  Example data setup\n\n  ```ts\n  const doc = new LoroDoc();\n  const store = doc.getMap(\"store\");\n\n  // Simplified setup for illustration purposes\n  store.set(\"books\", [\n    {\n      title: \"1984\",\n      author: \"George Orwell\",\n      price: 10,\n      available: true,\n      isbn: \"978-0451524935\",\n    },\n    {\n      title: \"Animal Farm\",\n      author: \"George Orwell\",\n      price: 8,\n      available: true,\n    },\n    {\n      title: \"Brave New World\",\n      author: \"Aldous Huxley\",\n      price: 12,\n      available: false,\n    },\n    {\n      title: \"Fahrenheit 451\",\n      author: \"Ray Bradbury\",\n      price: 9,\n      available: true,\n    },\n    {\n      title: \"The Great Gatsby\",\n      author: \"F. Scott Fitzgerald\",\n      price: null,\n      available: true,\n    },\n    {\n      title: \"To Kill a Mockingbird\",\n      author: \"Harper Lee\",\n      price: 11,\n      available: true,\n    },\n    {\n      title: \"The Catcher in the Rye\",\n      author: \"J.D. Salinger\",\n      price: 10,\n      available: false,\n    },\n    {\n      title: \"Lord of the Flies\",\n      author: \"William Golding\",\n      price: 9,\n      available: true,\n    },\n    {\n      title: \"Pride and Prejudice\",\n      author: \"Jane Austen\",\n      price: 7,\n      available: true,\n    },\n    {\n      title: \"The Hobbit\",\n      author: \"J.R.R. Tolkien\",\n      price: 14,\n      available: true,\n    },\n  ]);\n  store.set(\"featured_authors\", [\"George Orwell\", \"Jane Austen\"]);\n  ```\n\n  ```ts\n  // 1. Get all book titles\n  doc.JSONPath(\"$.store.books[*].title\");\n  // → [\"1984\", \"Animal Farm\", \"Brave New World\", \"The Hobbit\"]\n\n  // 2. Filter: available books only\n  doc.JSONPath(\"$.store.books[?(@.available)].title\");\n  // → [\"1984\", \"Animal Farm\", \"The Hobbit\"]\n\n  // 3. Filter: books with price > 10\n  doc.JSONPath(\"$.store.books[?(@.price > 10)].title\");\n  // → [\"The Hobbit\"]\n\n  // 4. Use recursive descent to get all prices\n  doc.JSONPath(\"$..price\");\n  // → [10, 8, 12, 9, null, 11, 14]\n\n  // 5. Slice syntax: first three books\n  doc.JSONPath(\"$.store.books[0:3].title\");\n  // → [\"1984\", \"Animal Farm\", \"Brave New World\"]\n\n  // 6. Membership test: authors in featured list\n  doc.JSONPath(\"$.store.books[?(@.author in $.store.featured_authors)].title\");\n  // → [\"1984\", \"Animal Farm\", \"Pride and Prejudice\"]\n\n  // 7. String match using `contains`\n  doc.JSONPath(\"$.store.books[?(@.title contains 'The')].author\");\n  // → [\"F. Scott Fitzgerald\", \"J.R.R. Tolkien\"]\n  ```\n\n- 10a405b: refactor!: remove deprecated encoding format in v0.x #849\n\n### Patch Changes\n\n- 3af6a85: fix: WASM loading compatibility for esbuild and rsbuild #851\n\n## 1.8.9\n\n### Patch Changes\n\n- 53f5533: Extract sourcemap to another package","mentions_count":1},{"url":"https://api.github.com/repos/loro-dev/loro/releases/335850413","assets_url":"https://api.github.com/repos/loro-dev/loro/releases/335850413/assets","upload_url":"https://uploads.github.com/repos/loro-dev/loro/releases/335850413/assets{?name,label}","html_url":"https://github.com/loro-dev/loro/releases/tag/loro-crdt-map%401.13.0","id":335850413,"author":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOHpcjs84UBKut","tag_name":"loro-crdt-map@1.13.0","target_commitish":"main","name":"loro-crdt-map@1.13.0","draft":false,"immutable":false,"prerelease":false,"created_at":"2026-06-08T09:19:12Z","updated_at":"2026-06-08T09:23:52Z","published_at":"2026-06-08T09:23:52Z","assets":[],"tarball_url":"https://api.github.com/repos/loro-dev/loro/tarball/loro-crdt-map@1.13.0","zipball_url":"https://api.github.com/repos/loro-dev/loro/zipball/loro-crdt-map@1.13.0","body":"### Minor Changes\n\n- fa888d8: Add mergeable child containers: child containers created under a map key that converge across peers on concurrent first-write instead of forking. Exposed as `ensureMergeable{Counter,Map,List,MovableList,Text,Tree}` on `LoroMap`. A mergeable child lives at a deterministic `ContainerID` derived from `(parent, key, kind)`, and its visibility is driven by a binary ref the parent map stores at the key, so deletes and kind conflicts resolve through the map's regular LWW."},{"url":"https://api.github.com/repos/loro-dev/loro/releases/335437732","assets_url":"https://api.github.com/repos/loro-dev/loro/releases/335437732/assets","upload_url":"https://uploads.github.com/repos/loro-dev/loro/releases/335437732/assets{?name,label}","html_url":"https://github.com/loro-dev/loro/releases/tag/loro-crdt%401.12.5","id":335437732,"author":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOHpcjs84T_l-k","tag_name":"loro-crdt@1.12.5","target_commitish":"main","name":"loro-crdt@1.12.5","draft":false,"immutable":false,"prerelease":false,"created_at":"2026-06-06T16:09:22Z","updated_at":"2026-06-06T16:14:35Z","published_at":"2026-06-06T16:14:35Z","assets":[],"tarball_url":"https://api.github.com/repos/loro-dev/loro/tarball/loro-crdt@1.12.5","zipball_url":"https://api.github.com/repos/loro-dev/loro/zipball/loro-crdt@1.12.5","body":"### Patch Changes\n\n- bd10411: Fix Vite dev server WASM resolution for bare `loro-crdt` imports by using conditional exports for browser development builds."},{"url":"https://api.github.com/repos/loro-dev/loro/releases/335431427","assets_url":"https://api.github.com/repos/loro-dev/loro/releases/335431427/assets","upload_url":"https://uploads.github.com/repos/loro-dev/loro/releases/335431427/assets{?name,label}","html_url":"https://github.com/loro-dev/loro/releases/tag/loro-crdt-map%401.12.5","id":335431427,"author":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOHpcjs84T_kcD","tag_name":"loro-crdt-map@1.12.5","target_commitish":"main","name":"loro-crdt-map@1.12.5","draft":false,"immutable":false,"prerelease":false,"created_at":"2026-06-06T15:36:43Z","updated_at":"2026-06-06T15:36:45Z","published_at":"2026-06-06T15:36:45Z","assets":[],"tarball_url":"https://api.github.com/repos/loro-dev/loro/tarball/loro-crdt-map@1.12.5","zipball_url":"https://api.github.com/repos/loro-dev/loro/zipball/loro-crdt-map@1.12.5","body":"# loro-crdt-map\n\n## 1.12.4\n\n### Patch Changes\n\n- a6e23b6: Optimize snapshot export for shallow documents by reusing cached shallow-root state instead of checking out to the shallow root and back to latest.\n\n## 1.12.2\n\n### Patch Changes\n\n- cc587ed: Add a browser package remapping so Vite/Rolldown production builds load WASM without top-level await or circular wasm wrapper chunks.\n\n  Also make the base64 entry easier to bundle with plain esbuild, Rollup, and Next.js Webpack by avoiding static Node builtin `require()` calls and top-level await in browser bundles.\n\n- 8f57f4c: Reduce memory usage for read-only access to snapshot-imported documents by avoiding unnecessary lazy container state initialization.\n\n## 1.12.0\n\n### Minor Changes\n\n- 7dfda87: Make update imports atomic across oplog and document state application.\n\n  - `import` and `import_json_updates` now roll back imported oplog changes when state application fails, so malformed updates do not leave the document with oplog/state divergence.\n  - Pending changes that are activated during import are included in the rollback boundary when they can affect state application.\n  - Import rollback uses conditional guards to avoid adding fixed overhead to successful detached or no-op imports.\n\n### Patch Changes\n\n- 64aa97c: Harden encoding, snapshot, and import paths against malformed input\n\n  - JSON schema import (`import_json_updates`): out-of-range compressed peer indices now return `DecodeError` instead of being silently accepted as raw peer IDs; mismatched `JsonOpContent` vs container type returns `DecodeError` instead of panicking.\n  - Outdated binary encoding decoder (`decode_op`): malformed op streams (missing delete iterators, type mismatches) now return `DecodeDataCorruptionError` instead of panicking.\n  - Fast snapshot decoder (`decode_snapshot_blob_meta`): truncated or oversized section lengths now return `DecodeDataCorruptionError` instead of panicking on slice indexing.\n  - Change store KV import (`import_all`): corrupted `VersionVector`/`Frontiers` metadata now returns `DecodeDataCorruptionError` instead of panicking.\n  - Value encoding (`LoroValueKind::from_u8`, `read_str`): invalid byte values and invalid UTF-8 now return `DecodeDataCorruptionError` instead of panicking.\n  - `LoroDoc::diff()`: checkout failures during diff calculation are now propagated as `LoroError` instead of panicking; state restore uses `unwrap()` to fail-fast on internal errors.\n  - `try_get_text/list/map/tree/movable_list/counter`: now return `None` for wrong root container types instead of panicking.\n  - Detached list insert out-of-bounds: returns `LoroError::OutOfBound` instead of panicking.\n  - Tree `mov_after`/`mov_before` on deleted node: returns `TreeNodeDeletedOrNotExist` instead of panicking.\n  - `JsonChange::op_len`: empty ops array returns `0` instead of panicking.\n  - `renew_peer_id`: avoids theoretical collision with `PeerID::MAX`.\n\n- 0977ad1: Fix lock-order panics when JavaScript callbacks re-enter Loro APIs.\n\n  - `opCount()` no longer reacquires the OpLog lock while the current thread already holds a higher-order lock.\n  - `LoroText.iter()` snapshots text chunks before invoking the user callback, so callback code can safely read or mutate the document.\n\n- ef100e6: Reduce memory spikes when exporting snapshots from shallow documents.\n\n  When a shallow document is re-exported from its existing shallow root with only a small tail of updates, Loro now reuses the stored shallow-root state instead of decoding all containers just to re-encode the same state.\n\n- 933d5d6: feat: add clearRedo and clearUndo methods\n  #921\n- 17dc6c0: Fix several edge-case contract violations in document, text, and JSONPath APIs.\n\n  - JSONPath `value(...)` comparisons now handle boolean values consistently with other scalar comparisons.\n  - Rich text mark expansion now follows `ExpandType::Before` and `ExpandType::Both` at documented insertion boundaries.\n  - Text delta slicing now validates invalid ranges and UTF-8/UTF-16 boundaries before slicing, and public deltas omit removed-style tombstones after unmarking.\n  - Detached list and movable-list out-of-bounds operations now return `LoroError::OutOfBound` instead of panicking.\n\n## 1.11.1\n\n### Patch Changes\n\n- 6f5b7a9: Fix production panic regressions\n\n## 1.10.8\n\n### Patch Changes\n\n- 9f68a57: Return errors instead of panicking when diff or checkout targets frontiers before a shallow snapshot root.\n\n## 1.10.6\n\n### Patch Changes\n\n- 85921d7: fix: don't hang when remapping nested containers w same ID (#911)\n\n## 1.10.5\n\n### Patch Changes\n\n- 2d6c235: Fix counter undo after remote updates #906\n\n## 1.10.4\n\n### Patch Changes\n\n- 864b5ca: perf(loro-internal): remove quadratic slow paths in text import/checkout #895\n- a34134d: perf: rm the event calling wrapper for ops that will not trigger events\n\n## 1.10.3\n\n### Patch Changes\n\n- 2800a4c: perf: skip useless unmark op #878\n- fffaf45: feat: add JSONPath subscription #883\n\n## 1.10.2\n\n### Patch Changes\n\n- 53635dd: fix: toDelta should ignore null style entries #875\n\n## 1.10.1\n\n### Patch Changes\n\n- ca76d86: fix: Empty LoroText attach error #873\n\n## 1.10.0\n\n### Minor Changes\n\n- ce16b52: feat: add sliceDelta method to slice a span of richtext #862\n\n  Use `text.sliceDelta(start, end)` when you need a Quill-style delta for only part of a rich text field (for example, to copy a styled snippet). The method takes UTF-16 indices; use `sliceDeltaUtf8` if you want to slice by UTF-8 byte offsets instead.\n\n  ```ts\n  import { LoroDoc } from \"loro-crdt\";\n\n  const doc = new LoroDoc();\n  doc.configTextStyle({\n    bold: { expand: \"after\" },\n    comment: { expand: \"none\" },\n  });\n  const text = doc.getText(\"text\");\n\n  text.insert(0, \"Hello World!\");\n  text.mark({ start: 0, end: 5 }, \"bold\", true);\n  text.mark({ start: 6, end: 11 }, \"comment\", \"greeting\");\n\n  const snippet = text.sliceDelta(1, 8);\n  console.log(snippet);\n  // [\n  //   { insert: \"ello\", attributes: { bold: true } },\n  //   { insert: \" \" },\n  //   { insert: \"Wo\", attributes: { comment: \"greeting\" } },\n  // ]\n  ```\n\n### Patch Changes\n\n- a78d70f: fix: avoid convert panic #858\n- ee94ee4: fix: EphemeralStore apply should ignore timeout entries #865\n- 9e0a613: fix: Reject symbol-keyed map objects in wasm conversion #855\n\n## 1.9.0\n\n### Minor Changes\n\n- 10a405b: feat: JSONPath rfc9535 #848\n\n  Thanks to @zolero for the thorough implementation of JSONPath support!\n\n  LoroDoc now supports querying and mutating document data using **JSONPath**, following the [RFC 9535](https://www.rfc-editor.org/rfc/rfc9535) specification.\n\n  ### 🧩 API\n\n  ```ts\n  // Execute a JSONPath query on the document\n  doc.JSONPath(path: string): any[];\n  ```\n\n  ### 📚 Query Examples\n\n  Example data setup\n\n  ```ts\n  const doc = new LoroDoc();\n  const store = doc.getMap(\"store\");\n\n  // Simplified setup for illustration purposes\n  store.set(\"books\", [\n    {\n      title: \"1984\",\n      author: \"George Orwell\",\n      price: 10,\n      available: true,\n      isbn: \"978-0451524935\",\n    },\n    {\n      title: \"Animal Farm\",\n      author: \"George Orwell\",\n      price: 8,\n      available: true,\n    },\n    {\n      title: \"Brave New World\",\n      author: \"Aldous Huxley\",\n      price: 12,\n      available: false,\n    },\n    {\n      title: \"Fahrenheit 451\",\n      author: \"Ray Bradbury\",\n      price: 9,\n      available: true,\n    },\n    {\n      title: \"The Great Gatsby\",\n      author: \"F. Scott Fitzgerald\",\n      price: null,\n      available: true,\n    },\n    {\n      title: \"To Kill a Mockingbird\",\n      author: \"Harper Lee\",\n      price: 11,\n      available: true,\n    },\n    {\n      title: \"The Catcher in the Rye\",\n      author: \"J.D. Salinger\",\n      price: 10,\n      available: false,\n    },\n    {\n      title: \"Lord of the Flies\",\n      author: \"William Golding\",\n      price: 9,\n      available: true,\n    },\n    {\n      title: \"Pride and Prejudice\",\n      author: \"Jane Austen\",\n      price: 7,\n      available: true,\n    },\n    {\n      title: \"The Hobbit\",\n      author: \"J.R.R. Tolkien\",\n      price: 14,\n      available: true,\n    },\n  ]);\n  store.set(\"featured_authors\", [\"George Orwell\", \"Jane Austen\"]);\n  ```\n\n  ```ts\n  // 1. Get all book titles\n  doc.JSONPath(\"$.store.books[*].title\");\n  // → [\"1984\", \"Animal Farm\", \"Brave New World\", \"The Hobbit\"]\n\n  // 2. Filter: available books only\n  doc.JSONPath(\"$.store.books[?(@.available)].title\");\n  // → [\"1984\", \"Animal Farm\", \"The Hobbit\"]\n\n  // 3. Filter: books with price > 10\n  doc.JSONPath(\"$.store.books[?(@.price > 10)].title\");\n  // → [\"The Hobbit\"]\n\n  // 4. Use recursive descent to get all prices\n  doc.JSONPath(\"$..price\");\n  // → [10, 8, 12, 9, null, 11, 14]\n\n  // 5. Slice syntax: first three books\n  doc.JSONPath(\"$.store.books[0:3].title\");\n  // → [\"1984\", \"Animal Farm\", \"Brave New World\"]\n\n  // 6. Membership test: authors in featured list\n  doc.JSONPath(\"$.store.books[?(@.author in $.store.featured_authors)].title\");\n  // → [\"1984\", \"Animal Farm\", \"Pride and Prejudice\"]\n\n  // 7. String match using `contains`\n  doc.JSONPath(\"$.store.books[?(@.title contains 'The')].author\");\n  // → [\"F. Scott Fitzgerald\", \"J.R.R. Tolkien\"]\n  ```\n\n- 10a405b: refactor!: remove deprecated encoding format in v0.x #849\n\n### Patch Changes\n\n- 3af6a85: fix: WASM loading compatibility for esbuild and rsbuild #851\n\n## 1.8.9\n\n### Patch Changes\n\n- 53f5533: Extract sourcemap to another package","mentions_count":1},{"url":"https://api.github.com/repos/loro-dev/loro/releases/334682914","assets_url":"https://api.github.com/repos/loro-dev/loro/releases/334682914/assets","upload_url":"https://uploads.github.com/repos/loro-dev/loro/releases/334682914/assets{?name,label}","html_url":"https://github.com/loro-dev/loro/releases/tag/loro-crdt%401.12.4","id":334682914,"author":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOHpcjs84T8tsi","tag_name":"loro-crdt@1.12.4","target_commitish":"main","name":"loro-crdt@1.12.4","draft":false,"immutable":false,"prerelease":false,"created_at":"2026-06-05T01:08:50Z","updated_at":"2026-06-05T01:08:55Z","published_at":"2026-06-05T01:08:55Z","assets":[],"tarball_url":"https://api.github.com/repos/loro-dev/loro/tarball/loro-crdt@1.12.4","zipball_url":"https://api.github.com/repos/loro-dev/loro/zipball/loro-crdt@1.12.4","body":"### Patch Changes\n\n- a6e23b6: Optimize snapshot export for shallow documents by reusing cached shallow-root state instead of checking out to the shallow root and back to latest."},{"url":"https://api.github.com/repos/loro-dev/loro/releases/334682908","assets_url":"https://api.github.com/repos/loro-dev/loro/releases/334682908/assets","upload_url":"https://uploads.github.com/repos/loro-dev/loro/releases/334682908/assets{?name,label}","html_url":"https://github.com/loro-dev/loro/releases/tag/loro-crdt-map%401.12.4","id":334682908,"author":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOHpcjs84T8tsc","tag_name":"loro-crdt-map@1.12.4","target_commitish":"main","name":"loro-crdt-map@1.12.4","draft":false,"immutable":false,"prerelease":false,"created_at":"2026-06-05T01:08:50Z","updated_at":"2026-06-05T01:08:52Z","published_at":"2026-06-05T01:08:52Z","assets":[],"tarball_url":"https://api.github.com/repos/loro-dev/loro/tarball/loro-crdt-map@1.12.4","zipball_url":"https://api.github.com/repos/loro-dev/loro/zipball/loro-crdt-map@1.12.4","body":"### Patch Changes\n\n- a6e23b6: Optimize snapshot export for shallow documents by reusing cached shallow-root state instead of checking out to the shallow root and back to latest."},{"url":"https://api.github.com/repos/loro-dev/loro/releases/315426224","assets_url":"https://api.github.com/repos/loro-dev/loro/releases/315426224/assets","upload_url":"https://uploads.github.com/repos/loro-dev/loro/releases/315426224/assets{?name,label}","html_url":"https://github.com/loro-dev/loro/releases/tag/loro-crdt%401.12.1","id":315426224,"author":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOHpcjs84SzQWw","tag_name":"loro-crdt@1.12.1","target_commitish":"main","name":"loro-crdt@1.12.1","draft":false,"immutable":false,"prerelease":false,"created_at":"2026-04-29T20:11:51Z","updated_at":"2026-04-29T20:11:54Z","published_at":"2026-04-29T20:11:54Z","assets":[],"tarball_url":"https://api.github.com/repos/loro-dev/loro/tarball/loro-crdt@1.12.1","zipball_url":"https://api.github.com/repos/loro-dev/loro/zipball/loro-crdt@1.12.1","body":"### Patch Changes\n\n-   2159110: Fix Emscripten builds by using the native system timestamp path instead of the wasm-bindgen Date.now binding.\n-   658fdc6: Reject malformed import blob metadata instead of panicking when decoding unchecked import blobs.\n-   4d35808: Prefer non-empty root containers when reading documents that contain same-name roots with different container types.\n"}]