diff --git a/README.md b/README.md index 11ed35d..f223b22 100644 --- a/README.md +++ b/README.md @@ -11,8 +11,8 @@ archives are vendored under `vendor/zennotes/` with their source identity and checksums (`manifest.json`), and `package-lock.json` pins the complete install. A clean checkout installs them with `npm ci`, without a source clone or sibling repository. The vendored set is the core release -[core-2.67.0-core.hb828dd60259bc376](https://github.com/ZenNotes/zennotes/releases/tag/core-2.67.0-core.hb828dd60259bc376) -(desktop commit `58ba24ac`, clean tree). +[core-2.68.0-core.h6e3db1e19bc2b662](https://github.com/ZenNotes/zennotes/releases/tag/core-2.68.0-core.h6e3db1e19bc2b662) +(desktop commit `881baa6a`, clean tree). `npm run boundaries:check` verifies the pins, installed versions, singleton React/CodeMirror peers, and public export usage. `npm run core:adopt -- ` diff --git a/ios/App/App.xcodeproj/project.pbxproj b/ios/App/App.xcodeproj/project.pbxproj index fd20846..bafe839 100644 --- a/ios/App/App.xcodeproj/project.pbxproj +++ b/ios/App/App.xcodeproj/project.pbxproj @@ -604,12 +604,12 @@ CLANG_ENABLE_OBJC_WEAK = NO; CODE_SIGN_ENTITLEMENTS = ZenWidgets/ZenWidgets.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 39; + CURRENT_PROJECT_VERSION = 40; DEVELOPMENT_TEAM = WYY7PK57DM; GENERATE_INFOPLIST_FILE = NO; INFOPLIST_FILE = ZenWidgets/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 15.0; - MARKETING_VERSION = 1.23.0; + MARKETING_VERSION = 1.24.0; PRODUCT_BUNDLE_IDENTIFIER = md.zennotes.ZenWidgets; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; @@ -733,12 +733,12 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = App/App.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 39; + CURRENT_PROJECT_VERSION = 40; DEVELOPMENT_TEAM = WYY7PK57DM; INFOPLIST_FILE = App/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - MARKETING_VERSION = 1.23.0; + MARKETING_VERSION = 1.24.0; OTHER_SWIFT_FLAGS = "$(inherited) \"-D\" \"COCOAPODS\" \"-DDEBUG\""; PRODUCT_BUNDLE_IDENTIFIER = md.zennotes; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -755,12 +755,12 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = App/App.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 39; + CURRENT_PROJECT_VERSION = 40; DEVELOPMENT_TEAM = WYY7PK57DM; INFOPLIST_FILE = App/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - MARKETING_VERSION = 1.23.0; + MARKETING_VERSION = 1.24.0; PRODUCT_BUNDLE_IDENTIFIER = md.zennotes; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_ACTIVE_COMPILATION_CONDITIONS = ""; @@ -775,12 +775,12 @@ CLANG_ENABLE_OBJC_WEAK = NO; CODE_SIGN_ENTITLEMENTS = ShareExtension/ShareExtension.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 39; + CURRENT_PROJECT_VERSION = 40; DEVELOPMENT_TEAM = WYY7PK57DM; GENERATE_INFOPLIST_FILE = NO; INFOPLIST_FILE = ShareExtension/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 15.0; - MARKETING_VERSION = 1.23.0; + MARKETING_VERSION = 1.24.0; PRODUCT_BUNDLE_IDENTIFIER = md.zennotes.ShareExtension; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; @@ -797,12 +797,12 @@ CLANG_ENABLE_OBJC_WEAK = NO; CODE_SIGN_ENTITLEMENTS = ZenWidgets/ZenWidgets.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 39; + CURRENT_PROJECT_VERSION = 40; DEVELOPMENT_TEAM = WYY7PK57DM; GENERATE_INFOPLIST_FILE = NO; INFOPLIST_FILE = ZenWidgets/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 15.0; - MARKETING_VERSION = 1.23.0; + MARKETING_VERSION = 1.24.0; PRODUCT_BUNDLE_IDENTIFIER = md.zennotes.ZenWidgets; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; @@ -835,12 +835,12 @@ CLANG_ENABLE_OBJC_WEAK = NO; CODE_SIGN_ENTITLEMENTS = ShareExtension/ShareExtension.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 39; + CURRENT_PROJECT_VERSION = 40; DEVELOPMENT_TEAM = WYY7PK57DM; GENERATE_INFOPLIST_FILE = NO; INFOPLIST_FILE = ShareExtension/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 15.0; - MARKETING_VERSION = 1.23.0; + MARKETING_VERSION = 1.24.0; PRODUCT_BUNDLE_IDENTIFIER = md.zennotes.ShareExtension; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; diff --git a/package-lock.json b/package-lock.json index 9fec75c..8e0f065 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,9 +32,9 @@ "@lezer/highlight": "^1.2.5", "@replit/codemirror-vim": "^6.4.0", "@xyflow/react": "^12.12.0", - "@zennotes/app-core": "file:vendor/zennotes/zennotes-app-core-2.67.0-core.hb828dd60259bc376.tgz", - "@zennotes/bridge-contract": "file:vendor/zennotes/zennotes-bridge-contract-2.67.0-boundaries.h53f4d533587f4290.tgz", - "@zennotes/shared-domain": "file:vendor/zennotes/zennotes-shared-domain-2.67.0-boundaries.h53f4d533587f4290.tgz", + "@zennotes/app-core": "file:vendor/zennotes/zennotes-app-core-2.68.0-core.h6e3db1e19bc2b662.tgz", + "@zennotes/bridge-contract": "file:vendor/zennotes/zennotes-bridge-contract-2.68.0-boundaries.hd2ce4427b284c18e.tgz", + "@zennotes/shared-domain": "file:vendor/zennotes/zennotes-shared-domain-2.68.0-boundaries.hd2ce4427b284c18e.tgz", "codemirror": "^6.0.1", "dompurify": "^3.4.16", "function-plot": "^1.25.3", @@ -657,6 +657,19 @@ "crelt": "^1.0.5" } }, + "node_modules/@codemirror/merge": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/@codemirror/merge/-/merge-6.12.2.tgz", + "integrity": "sha512-V8JvyAPjHbPupqP7BeMcsdsYCbyPij74jxIbaIJDORI+VZzW44zFmon8bF+oxGWvOKhcRmkiUMXd8MxHr3YA2w==", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.17.0", + "@lezer/highlight": "^1.0.0", + "style-mod": "^4.1.0" + } + }, "node_modules/@codemirror/search": { "version": "6.7.2", "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-6.7.2.tgz", @@ -3640,9 +3653,9 @@ } }, "node_modules/@zennotes/app-core": { - "version": "2.67.0-core.hb828dd60259bc376", - "resolved": "file:vendor/zennotes/zennotes-app-core-2.67.0-core.hb828dd60259bc376.tgz", - "integrity": "sha512-k94Z88Sebd6NHAe8/1ba5K0K46NuJ7gwhMmxzAG97Y5VKu+6r+TKsXD/R8Axkh6UIJ4AtoBVBi0lca6nOO2JUQ==", + "version": "2.68.0-core.h6e3db1e19bc2b662", + "resolved": "file:vendor/zennotes/zennotes-app-core-2.68.0-core.h6e3db1e19bc2b662.tgz", + "integrity": "sha512-Qrt0Z2CmP0b9mtdGqJjj1xWxaEsWc9a1LbwE3WJWky0ThjS0FBTTYRHGjfLJD5RWu03XxuKr4GJJFbhHRATz4Q==", "license": "MIT", "dependencies": { "@codemirror/autocomplete": "^6.18.3", @@ -3663,6 +3676,7 @@ "@codemirror/lang-yaml": "^6.1.3", "@codemirror/language-data": "^6.5.1", "@codemirror/lint": "^6.9.7", + "@codemirror/merge": "^6.12.2", "@codemirror/search": "^6.5.8", "@excalidraw/excalidraw": "^0.18.1", "@myriaddreamin/typst-ts-renderer": "^0.7.0", @@ -3670,8 +3684,8 @@ "@myriaddreamin/typst.ts": "^0.7.0", "@replit/codemirror-vim": "^6.3.0", "@xyflow/react": "^12.11.2", - "@zennotes/bridge-contract": "2.67.0-boundaries.h53f4d533587f4290", - "@zennotes/shared-domain": "2.67.0-boundaries.h53f4d533587f4290", + "@zennotes/bridge-contract": "2.68.0-boundaries.hd2ce4427b284c18e", + "@zennotes/shared-domain": "2.68.0-boundaries.hd2ce4427b284c18e", "dompurify": "^3.3.4", "function-plot": "^1.25.3", "gray-matter": "^4.0.3", @@ -3715,19 +3729,19 @@ } }, "node_modules/@zennotes/bridge-contract": { - "version": "2.67.0-boundaries.h53f4d533587f4290", - "resolved": "file:vendor/zennotes/zennotes-bridge-contract-2.67.0-boundaries.h53f4d533587f4290.tgz", - "integrity": "sha512-3qnOkEVjq4pKqAOO/jw9oRy+NzK+h9G6yKGywzcfPQSFVS/ugN+6JKBKkRvObdDz64vPkIhR5m0cu8H3t7uFyw==", + "version": "2.68.0-boundaries.hd2ce4427b284c18e", + "resolved": "file:vendor/zennotes/zennotes-bridge-contract-2.68.0-boundaries.hd2ce4427b284c18e.tgz", + "integrity": "sha512-b+njMYCybpZzix7WYDrs73LjF8ff8abDeoQ/ocKJWRn9ZOGNLGiG62eLOlsEvqIO5tpuzjQeUQNjLCIqOrBn8w==", "license": "MIT" }, "node_modules/@zennotes/shared-domain": { - "version": "2.67.0-boundaries.h53f4d533587f4290", - "resolved": "file:vendor/zennotes/zennotes-shared-domain-2.67.0-boundaries.h53f4d533587f4290.tgz", - "integrity": "sha512-5oooEqUyGJJ32/ZKA7KzReaCNmXOF0AQHHumfGsUESxTAE1Tf6u2sY9ubbNgFZCErZuDDmF0aF2ZiPxtMyJBnQ==", + "version": "2.68.0-boundaries.hd2ce4427b284c18e", + "resolved": "file:vendor/zennotes/zennotes-shared-domain-2.68.0-boundaries.hd2ce4427b284c18e.tgz", + "integrity": "sha512-oxluGn1xX+7YLHTt0v04vs4T/cFUOwIrB4aF16OpsoQ8Tm+cfFeRxAE6xYjybTWITT/qDSIbQyBNfiFK0puqQg==", "license": "MIT", "dependencies": { "@scure/bip39": "2.4.0", - "@zennotes/bridge-contract": "2.67.0-boundaries.h53f4d533587f4290", + "@zennotes/bridge-contract": "2.68.0-boundaries.hd2ce4427b284c18e", "hash-wasm": "4.12.0", "lz-string": "^1.5.0" } diff --git a/package.json b/package.json index cfe384d..a797416 100644 --- a/package.json +++ b/package.json @@ -69,9 +69,9 @@ "vscode-oniguruma": "^2.0.1", "vscode-textmate": "^9.3.2", "zustand": "^5.0.15", - "@zennotes/app-core": "file:vendor/zennotes/zennotes-app-core-2.67.0-core.hb828dd60259bc376.tgz", - "@zennotes/shared-domain": "file:vendor/zennotes/zennotes-shared-domain-2.67.0-boundaries.h53f4d533587f4290.tgz", - "@zennotes/bridge-contract": "file:vendor/zennotes/zennotes-bridge-contract-2.67.0-boundaries.h53f4d533587f4290.tgz", + "@zennotes/app-core": "file:vendor/zennotes/zennotes-app-core-2.68.0-core.h6e3db1e19bc2b662.tgz", + "@zennotes/shared-domain": "file:vendor/zennotes/zennotes-shared-domain-2.68.0-boundaries.hd2ce4427b284c18e.tgz", + "@zennotes/bridge-contract": "file:vendor/zennotes/zennotes-bridge-contract-2.68.0-boundaries.hd2ce4427b284c18e.tgz", "@lezer/common": "^1.5.3" }, "devDependencies": { diff --git a/src/bridge/demo-tour.test.ts b/src/bridge/demo-tour.test.ts new file mode 100644 index 0000000..48d0406 --- /dev/null +++ b/src/bridge/demo-tour.test.ts @@ -0,0 +1,112 @@ +import assert from 'node:assert/strict' +import { test } from 'node:test' +import { loadMobileModule } from '../../tooling/load-mobile-module.ts' + +// Before core 2.68.0 the demo tour named its notes "NN Title"; it now +// writes "NN Title". Desktop's vault.ts removes and replaces the notes under +// either name, and a tour seeded by an older build (on this phone, or synced +// from a desktop) must not survive Remove or come back doubled by Regenerate. +// Both delete what they match, so the match is exact: only the old separator, +// and only a name that becomes one of the tour's own notes. +Object.defineProperty(globalThis, 'localStorage', { configurable: true, value: { getItem: () => null } }) +const { MobileVault, DEMO_TOUR_NOTES, DEMO_TOUR_ASSETS } = await loadMobileModule([ + './src/bridge/vault-fs', '@zennotes/shared-domain/demo-tour-data' +]) + +/** The NativeFs surface the tour uses. Like the providers, a delete of a + * missing file fails. */ +class MemoryFs { + files = new Map() + directories = new Set() + async mkdir(path: string): Promise { this.directories.add(path) } + async writeText(path: string, body: string): Promise { this.files.set(path, body) } + async deleteFile(path: string): Promise { + if (!this.files.delete(path)) throw new Error(`File does not exist: ${path}`) + } + async rmdir(path: string): Promise { + for (const key of [...this.files.keys()]) if (key === path || key.startsWith(`${path}/`)) this.files.delete(key) + for (const key of [...this.directories]) if (key === path || key.startsWith(`${path}/`)) this.directories.delete(key) + } + async readdir(path: string): Promise<{ name: string; type: 'file' | 'directory' }[]> { + const names = new Map() + for (const key of this.files.keys()) { + if (!key.startsWith(`${path}/`)) continue + const rest = key.slice(path.length + 1) + const slash = rest.indexOf('/') + names.set(slash < 0 ? rest : rest.slice(0, slash), slash < 0 ? 'file' : 'directory') + } + return [...names].map(([name, type]) => ({ name, type })) + } +} + +const currentPaths: string[] = DEMO_TOUR_NOTES.map((note: { path: string }) => note.path) +const olderName = (path: string): string => path.replace(/^(inbox\/demo\/\d{2}b?) /, '$1 \u2014 ') + +/** The user's own notes beside the tour. Each looks related, and none is the + * tour's: a tour title behind a middle dot or an en dash instead of the old + * separator, the old separator in front of a title the tour never had, and a + * plain note. Remove and Regenerate must leave every one byte for byte. */ +const USER_NOTES = new Map([ + ['inbox/demo/00 \u00b7 Start Here.md', '# Middle dot\n'], + ['inbox/demo/01 \u2013 Markdown Basics.md', '# En dash\n'], + ['inbox/demo/99 \u2014 Not from the tour.md', '# Old separator, own title\n'], + ['inbox/demo/My own note.md', '# Mine\n'] +]) + +function vaultWith(paths: (path: string) => string) { + const fs = new MemoryFs() + for (const note of DEMO_TOUR_NOTES) fs.files.set(paths(note.path), note.body) + for (const asset of DEMO_TOUR_ASSETS) fs.files.set(asset.path, asset.body) + for (const [path, body] of USER_NOTES) fs.files.set(path, body) + const vault = new MobileVault('Fixture') + Object.assign(vault, { fs, ensureVaultLayout: async () => {} }) + return { fs, vault } +} + +const tourNotesOnDisk = (fs: MemoryFs): string[] => + [...fs.files.keys()].filter((key) => key.startsWith('inbox/demo/') && !USER_NOTES.has(key)).sort() + +function assertUserNotesKept(fs: MemoryFs): void { + for (const [path, body] of USER_NOTES) assert.equal(fs.files.get(path), body, `${path} was touched`) +} + +test('the older names are the tour notes behind the old separator', () => { + assert.equal(currentPaths.length, 17) + for (const path of currentPaths) assert.notEqual(olderName(path), path) +}) + +test('removing the tour deletes the notes it wrote under their older names', async () => { + const { fs, vault } = vaultWith(olderName) + + const result = await vault.removeDemoTour() + + assert.deepEqual(tourNotesOnDisk(fs), []) + for (const asset of DEMO_TOUR_ASSETS) assert.equal(fs.files.has(asset.path), false) + assertUserNotesKept(fs) + // The core unlinks every reported path, so the older names must be in it. + assert.deepEqual( + [...result.notePaths].sort(), + [...currentPaths, ...currentPaths.map(olderName)].sort() + ) +}) + +test('regenerating replaces a tour seeded under the older names instead of adding a second copy', async () => { + const { fs, vault } = vaultWith(olderName) + + const result = await vault.generateDemoTour() + + assert.deepEqual(tourNotesOnDisk(fs), [...currentPaths].sort()) + for (const note of DEMO_TOUR_NOTES) assert.equal(fs.files.get(note.path), note.body) + assertUserNotesKept(fs) + assert.deepEqual(result.notePaths, currentPaths) +}) + +test('a tour under the current names is removed as before', async () => { + const { fs, vault } = vaultWith((path) => path) + + const result = await vault.removeDemoTour() + + assert.deepEqual(tourNotesOnDisk(fs), []) + assertUserNotesKept(fs) + assert.deepEqual(result.notePaths, currentPaths) +}) diff --git a/src/bridge/vault-fs.ts b/src/bridge/vault-fs.ts index 8806506..eb3c053 100644 --- a/src/bridge/vault-fs.ts +++ b/src/bridge/vault-fs.ts @@ -37,6 +37,7 @@ import { bytesToBase64 } from './base64' import { isFormDirName, isDatabaseInternalPath } from '@zennotes/shared-domain/databases' import { emptyExcalidrawDocument } from '@zennotes/shared-domain/excalidraw' import { DEMO_TOUR_ASSETS, DEMO_TOUR_NOTES } from '@zennotes/shared-domain/demo-tour-data' +import { currentDemoTourPath, DEMO_TOUR_DIR } from '@zennotes/shared-domain/demo-tour' import { WELCOME_NOTE_PATH, WELCOME_NOTE_BODY } from './welcome-note' import { rewriteWikilinksForRename, @@ -1253,8 +1254,23 @@ export class MobileVault { emitVaultChange({ kind: 'add', path: WELCOME_NOTE_PATH, folder: 'inbox', scope: 'content' }) } + /** Tour notes still on disk under their older names (see + * currentDemoTourPath), found the way desktop's vault.ts finds them. */ + private async olderDemoTourNotePaths(): Promise { + const current = new Set(DEMO_TOUR_NOTES.map((note) => note.path)) + return (await this.fs.readdir(DEMO_TOUR_DIR)) + .map((entry) => `${DEMO_TOUR_DIR}/${entry.name}`) + .filter((rel) => rel !== currentDemoTourPath(rel) && current.has(currentDemoTourPath(rel))) + } + async generateDemoTour(): Promise { await this.ensureVaultLayout() + // Regenerating replaces a tour seeded under the older names rather than + // writing a second copy beside it. + for (const rel of await this.olderDemoTourNotePaths()) { + await this.fs.deleteFile(rel).catch(() => {}) + this.invalidateMeta(rel) + } for (const note of DEMO_TOUR_NOTES) { const dir = dirName(note.path) if (dir) await this.fs.mkdir(dir) @@ -1274,9 +1290,13 @@ export class MobileVault { } async removeDemoTour(): Promise { - for (const note of DEMO_TOUR_NOTES) { - await this.fs.deleteFile(note.path).catch(() => {}) - this.invalidateMeta(note.path) + const notePaths = [ + ...DEMO_TOUR_NOTES.map((note) => note.path), + ...(await this.olderDemoTourNotePaths()) + ] + for (const rel of notePaths) { + await this.fs.deleteFile(rel).catch(() => {}) + this.invalidateMeta(rel) } for (const asset of DEMO_TOUR_ASSETS) { await this.fs.deleteFile(asset.path).catch(() => {}) @@ -1285,7 +1305,7 @@ export class MobileVault { if (remaining.length === 0) await this.fs.rmdir('inbox/demo').catch(() => {}) emitVaultChange({ kind: 'unlink', path: 'inbox/demo', folder: 'inbox', scope: 'content' }) return { - notePaths: DEMO_TOUR_NOTES.map((n) => n.path), + notePaths, assetPaths: DEMO_TOUR_ASSETS.map((a) => a.path) } } diff --git a/vendor/zennotes/manifest.json b/vendor/zennotes/manifest.json index 151b847..3944e3e 100644 --- a/vendor/zennotes/manifest.json +++ b/vendor/zennotes/manifest.json @@ -1,12 +1,12 @@ { "name": "@zennotes/app-core", - "version": "2.67.0-core.hb828dd60259bc376", - "file": "zennotes-app-core-2.67.0-core.hb828dd60259bc376.tgz", - "sha256": "02a2982b92c6d48ddc3c0b0730ff9462a5227f1ce7d599e5c856aebd35e07bc7", - "integrity": "sha512-k94Z88Sebd6NHAe8/1ba5K0K46NuJ7gwhMmxzAG97Y5VKu+6r+TKsXD/R8Axkh6UIJ4AtoBVBi0lca6nOO2JUQ==", - "sourceCommit": "58ba24acaf78422b1622418cdbf80dfc2647abfa", + "version": "2.68.0-core.h6e3db1e19bc2b662", + "file": "zennotes-app-core-2.68.0-core.h6e3db1e19bc2b662.tgz", + "sha256": "35e5ac383b3720a74eb3bd005223b607d87830c8cb102eb7243bf65b7eaa0abb", + "integrity": "sha512-Qrt0Z2CmP0b9mtdGqJjj1xWxaEsWc9a1LbwE3WJWky0ThjS0FBTTYRHGjfLJD5RWu03XxuKr4GJJFbhHRATz4Q==", + "sourceCommit": "881baa6a94a441dbf03e59ce6d8d1277624803cf", "workingTreeDirty": false, - "sourceLockSha256": "784aee794c2047a319d16b3e248c22ca2445fcf18cad03e2ce6a92f5c6456f92", + "sourceLockSha256": "d0887eb65d0bf060c112437c105abf43a4c3a927d682f844ae25976d19d7d992", "toolchain": { "node": "v22.23.3", "typescript": "5.9.3", @@ -15,20 +15,20 @@ "dependencies": [ { "name": "@zennotes/bridge-contract", - "version": "2.67.0-boundaries.h53f4d533587f4290", - "file": "zennotes-bridge-contract-2.67.0-boundaries.h53f4d533587f4290.tgz", - "sha256": "d489790a5659ec148746e1ea0baeba8d0795dab1729517b93861c0d65717fcaa", - "integrity": "sha512-3qnOkEVjq4pKqAOO/jw9oRy+NzK+h9G6yKGywzcfPQSFVS/ugN+6JKBKkRvObdDz64vPkIhR5m0cu8H3t7uFyw==", - "sourceCommit": "58ba24acaf78422b1622418cdbf80dfc2647abfa", + "version": "2.68.0-boundaries.hd2ce4427b284c18e", + "file": "zennotes-bridge-contract-2.68.0-boundaries.hd2ce4427b284c18e.tgz", + "sha256": "9678d63a50f5c0d036f25eb5e5c5cd72af4a4fa182472892f1930eac75d3be54", + "integrity": "sha512-b+njMYCybpZzix7WYDrs73LjF8ff8abDeoQ/ocKJWRn9ZOGNLGiG62eLOlsEvqIO5tpuzjQeUQNjLCIqOrBn8w==", + "sourceCommit": "881baa6a94a441dbf03e59ce6d8d1277624803cf", "workingTreeDirty": false }, { "name": "@zennotes/shared-domain", - "version": "2.67.0-boundaries.h53f4d533587f4290", - "file": "zennotes-shared-domain-2.67.0-boundaries.h53f4d533587f4290.tgz", - "sha256": "c6df54b576bb34202697c034f5f90a5a69aaa6d64b194301d38b4eaae52e2158", - "integrity": "sha512-5oooEqUyGJJ32/ZKA7KzReaCNmXOF0AQHHumfGsUESxTAE1Tf6u2sY9ubbNgFZCErZuDDmF0aF2ZiPxtMyJBnQ==", - "sourceCommit": "58ba24acaf78422b1622418cdbf80dfc2647abfa", + "version": "2.68.0-boundaries.hd2ce4427b284c18e", + "file": "zennotes-shared-domain-2.68.0-boundaries.hd2ce4427b284c18e.tgz", + "sha256": "1cb6fd1228a48354cdb59aa24e03d572f15fc9aab7b92aab985bb9c4ff9a29f6", + "integrity": "sha512-oxluGn1xX+7YLHTt0v04vs4T/cFUOwIrB4aF16OpsoQ8Tm+cfFeRxAE6xYjybTWITT/qDSIbQyBNfiFK0puqQg==", + "sourceCommit": "881baa6a94a441dbf03e59ce6d8d1277624803cf", "workingTreeDirty": false } ] diff --git a/vendor/zennotes/zennotes-app-core-2.67.0-core.hb828dd60259bc376.tgz b/vendor/zennotes/zennotes-app-core-2.67.0-core.hb828dd60259bc376.tgz deleted file mode 100644 index 1ed8ce6..0000000 Binary files a/vendor/zennotes/zennotes-app-core-2.67.0-core.hb828dd60259bc376.tgz and /dev/null differ diff --git a/vendor/zennotes/zennotes-app-core-2.68.0-core.h6e3db1e19bc2b662.tgz b/vendor/zennotes/zennotes-app-core-2.68.0-core.h6e3db1e19bc2b662.tgz new file mode 100644 index 0000000..af7937f Binary files /dev/null and b/vendor/zennotes/zennotes-app-core-2.68.0-core.h6e3db1e19bc2b662.tgz differ diff --git a/vendor/zennotes/zennotes-bridge-contract-2.67.0-boundaries.h53f4d533587f4290.tgz b/vendor/zennotes/zennotes-bridge-contract-2.67.0-boundaries.h53f4d533587f4290.tgz deleted file mode 100644 index 84f91a0..0000000 Binary files a/vendor/zennotes/zennotes-bridge-contract-2.67.0-boundaries.h53f4d533587f4290.tgz and /dev/null differ diff --git a/vendor/zennotes/zennotes-bridge-contract-2.68.0-boundaries.hd2ce4427b284c18e.tgz b/vendor/zennotes/zennotes-bridge-contract-2.68.0-boundaries.hd2ce4427b284c18e.tgz new file mode 100644 index 0000000..dc41c3e Binary files /dev/null and b/vendor/zennotes/zennotes-bridge-contract-2.68.0-boundaries.hd2ce4427b284c18e.tgz differ diff --git a/vendor/zennotes/zennotes-shared-domain-2.67.0-boundaries.h53f4d533587f4290.tgz b/vendor/zennotes/zennotes-shared-domain-2.67.0-boundaries.h53f4d533587f4290.tgz deleted file mode 100644 index 45ea3c8..0000000 Binary files a/vendor/zennotes/zennotes-shared-domain-2.67.0-boundaries.h53f4d533587f4290.tgz and /dev/null differ diff --git a/vendor/zennotes/zennotes-shared-domain-2.68.0-boundaries.hd2ce4427b284c18e.tgz b/vendor/zennotes/zennotes-shared-domain-2.68.0-boundaries.hd2ce4427b284c18e.tgz new file mode 100644 index 0000000..c01cf00 Binary files /dev/null and b/vendor/zennotes/zennotes-shared-domain-2.68.0-boundaries.hd2ce4427b284c18e.tgz differ