@abraca/cli 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abracadabra-cli.esm.js","names":["u64.split","u64.rotrSH","u64.shrSH","u64.rotrSL","u64.shrSL","u64.rotrBH","u64.rotrBL","u64.add4L","u64.add4H","u64.add5L","u64.add5H","u64.add","u64.add3L","u64.add3H","toPlain","toPlain","nodePath"],"sources":["../src/parser.ts","../node_modules/@noble/hashes/esm/utils.js","../node_modules/@noble/hashes/esm/_md.js","../node_modules/@noble/hashes/esm/_u64.js","../node_modules/@noble/hashes/esm/sha2.js","../src/crypto.ts","../src/connection.ts","../src/command.ts","../src/output.ts","../src/commands/help.ts","../src/resolve.ts","../src/commands/spaces.ts","../src/commands/tree.ts","../../mcp/src/converters/yjsToMarkdown.ts","../../mcp/src/converters/markdownToYjs.ts","../src/commands/documents.ts","../src/commands/content.ts","../src/commands/meta.ts","../src/commands/awareness.ts","../src/commands/files.ts","../src/commands/permissions.ts","../src/index.ts"],"sourcesContent":["/**\n * Minimal argument parser for Abracadabra CLI.\n *\n * Syntax:\n * abracadabra [--flag] <command>[:<subcommand>] [key=value ...] [--flag2]\n * abracadabra [--flag] <command>[:<subcommand>] [key=\"value with spaces\"] [--format=json]\n */\n\nexport interface ParsedArgs {\n /** The command name, e.g. \"tree\", \"spaces:switch\", \"read\" */\n command: string\n /** Key-value parameters, e.g. { name: \"My Doc\", type: \"doc\" } */\n params: Record<string, string>\n /** Boolean flags, e.g. { total: true, verbose: true } */\n flags: Set<string>\n /** Positional arguments (non-flag, non-key=value, after the command) */\n positional: string[]\n}\n\n/**\n * Parse CLI arguments into a structured object.\n * @param argv Raw process.argv (includes node path and script path)\n */\nexport function parseArgs(argv: string[]): ParsedArgs {\n const args = argv.slice(2) // skip node + script\n\n const result: ParsedArgs = {\n command: 'help',\n params: {},\n flags: new Set(),\n positional: [],\n }\n\n let commandFound = false\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i]\n\n // --flag or --key=value\n if (arg.startsWith('--')) {\n const stripped = arg.slice(2)\n const eqIdx = stripped.indexOf('=')\n if (eqIdx !== -1) {\n // --format=json style\n const key = stripped.slice(0, eqIdx)\n const value = stripped.slice(eqIdx + 1)\n result.params[key] = value\n } else {\n result.flags.add(stripped)\n }\n continue\n }\n\n // key=value pair\n const eqIdx = arg.indexOf('=')\n if (eqIdx !== -1 && eqIdx > 0) {\n const key = arg.slice(0, eqIdx)\n let value = arg.slice(eqIdx + 1)\n // Strip surrounding quotes if present\n if ((value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))) {\n value = value.slice(1, -1)\n }\n result.params[key] = value\n continue\n }\n\n // First bare word is the command\n if (!commandFound) {\n result.command = arg\n commandFound = true\n continue\n }\n\n // Subsequent bare words are positional\n result.positional.push(arg)\n }\n\n return result\n}\n","/**\n * Utilities for hex, bytes, CSPRNG.\n * @module\n */\n/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n// We use WebCrypto aka globalThis.crypto, which exists in browsers and node.js 16+.\n// node.js versions earlier than v19 don't declare it in global scope.\n// For node.js, package.json#exports field mapping rewrites import\n// from `crypto` to `cryptoNode`, which imports native module.\n// Makes the utils un-importable in browsers without a bundler.\n// Once node.js 18 is deprecated (2025-04-30), we can just drop the import.\nimport { crypto } from '@noble/hashes/crypto';\n/** Checks if something is Uint8Array. Be careful: nodejs Buffer will return true. */\nexport function isBytes(a) {\n return a instanceof Uint8Array || (ArrayBuffer.isView(a) && a.constructor.name === 'Uint8Array');\n}\n/** Asserts something is positive integer. */\nexport function anumber(n) {\n if (!Number.isSafeInteger(n) || n < 0)\n throw new Error('positive integer expected, got ' + n);\n}\n/** Asserts something is Uint8Array. */\nexport function abytes(b, ...lengths) {\n if (!isBytes(b))\n throw new Error('Uint8Array expected');\n if (lengths.length > 0 && !lengths.includes(b.length))\n throw new Error('Uint8Array expected of length ' + lengths + ', got length=' + b.length);\n}\n/** Asserts something is hash */\nexport function ahash(h) {\n if (typeof h !== 'function' || typeof h.create !== 'function')\n throw new Error('Hash should be wrapped by utils.createHasher');\n anumber(h.outputLen);\n anumber(h.blockLen);\n}\n/** Asserts a hash instance has not been destroyed / finished */\nexport function aexists(instance, checkFinished = true) {\n if (instance.destroyed)\n throw new Error('Hash instance has been destroyed');\n if (checkFinished && instance.finished)\n throw new Error('Hash#digest() has already been called');\n}\n/** Asserts output is properly-sized byte array */\nexport function aoutput(out, instance) {\n abytes(out);\n const min = instance.outputLen;\n if (out.length < min) {\n throw new Error('digestInto() expects output buffer of length at least ' + min);\n }\n}\n/** Cast u8 / u16 / u32 to u8. */\nexport function u8(arr) {\n return new Uint8Array(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n/** Cast u8 / u16 / u32 to u32. */\nexport function u32(arr) {\n return new Uint32Array(arr.buffer, arr.byteOffset, Math.floor(arr.byteLength / 4));\n}\n/** Zeroize a byte array. Warning: JS provides no guarantees. */\nexport function clean(...arrays) {\n for (let i = 0; i < arrays.length; i++) {\n arrays[i].fill(0);\n }\n}\n/** Create DataView of an array for easy byte-level manipulation. */\nexport function createView(arr) {\n return new DataView(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n/** The rotate right (circular right shift) operation for uint32 */\nexport function rotr(word, shift) {\n return (word << (32 - shift)) | (word >>> shift);\n}\n/** The rotate left (circular left shift) operation for uint32 */\nexport function rotl(word, shift) {\n return (word << shift) | ((word >>> (32 - shift)) >>> 0);\n}\n/** Is current platform little-endian? Most are. Big-Endian platform: IBM */\nexport const isLE = /* @__PURE__ */ (() => new Uint8Array(new Uint32Array([0x11223344]).buffer)[0] === 0x44)();\n/** The byte swap operation for uint32 */\nexport function byteSwap(word) {\n return (((word << 24) & 0xff000000) |\n ((word << 8) & 0xff0000) |\n ((word >>> 8) & 0xff00) |\n ((word >>> 24) & 0xff));\n}\n/** Conditionally byte swap if on a big-endian platform */\nexport const swap8IfBE = isLE\n ? (n) => n\n : (n) => byteSwap(n);\n/** @deprecated */\nexport const byteSwapIfBE = swap8IfBE;\n/** In place byte swap for Uint32Array */\nexport function byteSwap32(arr) {\n for (let i = 0; i < arr.length; i++) {\n arr[i] = byteSwap(arr[i]);\n }\n return arr;\n}\nexport const swap32IfBE = isLE\n ? (u) => u\n : byteSwap32;\n// Built-in hex conversion https://caniuse.com/mdn-javascript_builtins_uint8array_fromhex\nconst hasHexBuiltin = /* @__PURE__ */ (() => \n// @ts-ignore\ntypeof Uint8Array.from([]).toHex === 'function' && typeof Uint8Array.fromHex === 'function')();\n// Array where index 0xf0 (240) is mapped to string 'f0'\nconst hexes = /* @__PURE__ */ Array.from({ length: 256 }, (_, i) => i.toString(16).padStart(2, '0'));\n/**\n * Convert byte array to hex string. Uses built-in function, when available.\n * @example bytesToHex(Uint8Array.from([0xca, 0xfe, 0x01, 0x23])) // 'cafe0123'\n */\nexport function bytesToHex(bytes) {\n abytes(bytes);\n // @ts-ignore\n if (hasHexBuiltin)\n return bytes.toHex();\n // pre-caching improves the speed 6x\n let hex = '';\n for (let i = 0; i < bytes.length; i++) {\n hex += hexes[bytes[i]];\n }\n return hex;\n}\n// We use optimized technique to convert hex string to byte array\nconst asciis = { _0: 48, _9: 57, A: 65, F: 70, a: 97, f: 102 };\nfunction asciiToBase16(ch) {\n if (ch >= asciis._0 && ch <= asciis._9)\n return ch - asciis._0; // '2' => 50-48\n if (ch >= asciis.A && ch <= asciis.F)\n return ch - (asciis.A - 10); // 'B' => 66-(65-10)\n if (ch >= asciis.a && ch <= asciis.f)\n return ch - (asciis.a - 10); // 'b' => 98-(97-10)\n return;\n}\n/**\n * Convert hex string to byte array. Uses built-in function, when available.\n * @example hexToBytes('cafe0123') // Uint8Array.from([0xca, 0xfe, 0x01, 0x23])\n */\nexport function hexToBytes(hex) {\n if (typeof hex !== 'string')\n throw new Error('hex string expected, got ' + typeof hex);\n // @ts-ignore\n if (hasHexBuiltin)\n return Uint8Array.fromHex(hex);\n const hl = hex.length;\n const al = hl / 2;\n if (hl % 2)\n throw new Error('hex string expected, got unpadded hex of length ' + hl);\n const array = new Uint8Array(al);\n for (let ai = 0, hi = 0; ai < al; ai++, hi += 2) {\n const n1 = asciiToBase16(hex.charCodeAt(hi));\n const n2 = asciiToBase16(hex.charCodeAt(hi + 1));\n if (n1 === undefined || n2 === undefined) {\n const char = hex[hi] + hex[hi + 1];\n throw new Error('hex string expected, got non-hex character \"' + char + '\" at index ' + hi);\n }\n array[ai] = n1 * 16 + n2; // multiply first octet, e.g. 'a3' => 10*16+3 => 160 + 3 => 163\n }\n return array;\n}\n/**\n * There is no setImmediate in browser and setTimeout is slow.\n * Call of async fn will return Promise, which will be fullfiled only on\n * next scheduler queue processing step and this is exactly what we need.\n */\nexport const nextTick = async () => { };\n/** Returns control to thread each 'tick' ms to avoid blocking. */\nexport async function asyncLoop(iters, tick, cb) {\n let ts = Date.now();\n for (let i = 0; i < iters; i++) {\n cb(i);\n // Date.now() is not monotonic, so in case if clock goes backwards we return return control too\n const diff = Date.now() - ts;\n if (diff >= 0 && diff < tick)\n continue;\n await nextTick();\n ts += diff;\n }\n}\n/**\n * Converts string to bytes using UTF8 encoding.\n * @example utf8ToBytes('abc') // Uint8Array.from([97, 98, 99])\n */\nexport function utf8ToBytes(str) {\n if (typeof str !== 'string')\n throw new Error('string expected');\n return new Uint8Array(new TextEncoder().encode(str)); // https://bugzil.la/1681809\n}\n/**\n * Converts bytes to string using UTF8 encoding.\n * @example bytesToUtf8(Uint8Array.from([97, 98, 99])) // 'abc'\n */\nexport function bytesToUtf8(bytes) {\n return new TextDecoder().decode(bytes);\n}\n/**\n * Normalizes (non-hex) string or Uint8Array to Uint8Array.\n * Warning: when Uint8Array is passed, it would NOT get copied.\n * Keep in mind for future mutable operations.\n */\nexport function toBytes(data) {\n if (typeof data === 'string')\n data = utf8ToBytes(data);\n abytes(data);\n return data;\n}\n/**\n * Helper for KDFs: consumes uint8array or string.\n * When string is passed, does utf8 decoding, using TextDecoder.\n */\nexport function kdfInputToBytes(data) {\n if (typeof data === 'string')\n data = utf8ToBytes(data);\n abytes(data);\n return data;\n}\n/** Copies several Uint8Arrays into one. */\nexport function concatBytes(...arrays) {\n let sum = 0;\n for (let i = 0; i < arrays.length; i++) {\n const a = arrays[i];\n abytes(a);\n sum += a.length;\n }\n const res = new Uint8Array(sum);\n for (let i = 0, pad = 0; i < arrays.length; i++) {\n const a = arrays[i];\n res.set(a, pad);\n pad += a.length;\n }\n return res;\n}\nexport function checkOpts(defaults, opts) {\n if (opts !== undefined && {}.toString.call(opts) !== '[object Object]')\n throw new Error('options should be object or undefined');\n const merged = Object.assign(defaults, opts);\n return merged;\n}\n/** For runtime check if class implements interface */\nexport class Hash {\n}\n/** Wraps hash function, creating an interface on top of it */\nexport function createHasher(hashCons) {\n const hashC = (msg) => hashCons().update(toBytes(msg)).digest();\n const tmp = hashCons();\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = () => hashCons();\n return hashC;\n}\nexport function createOptHasher(hashCons) {\n const hashC = (msg, opts) => hashCons(opts).update(toBytes(msg)).digest();\n const tmp = hashCons({});\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = (opts) => hashCons(opts);\n return hashC;\n}\nexport function createXOFer(hashCons) {\n const hashC = (msg, opts) => hashCons(opts).update(toBytes(msg)).digest();\n const tmp = hashCons({});\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = (opts) => hashCons(opts);\n return hashC;\n}\nexport const wrapConstructor = createHasher;\nexport const wrapConstructorWithOpts = createOptHasher;\nexport const wrapXOFConstructorWithOpts = createXOFer;\n/** Cryptographically secure PRNG. Uses internal OS-level `crypto.getRandomValues`. */\nexport function randomBytes(bytesLength = 32) {\n if (crypto && typeof crypto.getRandomValues === 'function') {\n return crypto.getRandomValues(new Uint8Array(bytesLength));\n }\n // Legacy Node.js compatibility\n if (crypto && typeof crypto.randomBytes === 'function') {\n return Uint8Array.from(crypto.randomBytes(bytesLength));\n }\n throw new Error('crypto.getRandomValues must be defined');\n}\n//# sourceMappingURL=utils.js.map","/**\n * Internal Merkle-Damgard hash utils.\n * @module\n */\nimport { Hash, abytes, aexists, aoutput, clean, createView, toBytes } from \"./utils.js\";\n/** Polyfill for Safari 14. https://caniuse.com/mdn-javascript_builtins_dataview_setbiguint64 */\nexport function setBigUint64(view, byteOffset, value, isLE) {\n if (typeof view.setBigUint64 === 'function')\n return view.setBigUint64(byteOffset, value, isLE);\n const _32n = BigInt(32);\n const _u32_max = BigInt(0xffffffff);\n const wh = Number((value >> _32n) & _u32_max);\n const wl = Number(value & _u32_max);\n const h = isLE ? 4 : 0;\n const l = isLE ? 0 : 4;\n view.setUint32(byteOffset + h, wh, isLE);\n view.setUint32(byteOffset + l, wl, isLE);\n}\n/** Choice: a ? b : c */\nexport function Chi(a, b, c) {\n return (a & b) ^ (~a & c);\n}\n/** Majority function, true if any two inputs is true. */\nexport function Maj(a, b, c) {\n return (a & b) ^ (a & c) ^ (b & c);\n}\n/**\n * Merkle-Damgard hash construction base class.\n * Could be used to create MD5, RIPEMD, SHA1, SHA2.\n */\nexport class HashMD extends Hash {\n constructor(blockLen, outputLen, padOffset, isLE) {\n super();\n this.finished = false;\n this.length = 0;\n this.pos = 0;\n this.destroyed = false;\n this.blockLen = blockLen;\n this.outputLen = outputLen;\n this.padOffset = padOffset;\n this.isLE = isLE;\n this.buffer = new Uint8Array(blockLen);\n this.view = createView(this.buffer);\n }\n update(data) {\n aexists(this);\n data = toBytes(data);\n abytes(data);\n const { view, buffer, blockLen } = this;\n const len = data.length;\n for (let pos = 0; pos < len;) {\n const take = Math.min(blockLen - this.pos, len - pos);\n // Fast path: we have at least one block in input, cast it to view and process\n if (take === blockLen) {\n const dataView = createView(data);\n for (; blockLen <= len - pos; pos += blockLen)\n this.process(dataView, pos);\n continue;\n }\n buffer.set(data.subarray(pos, pos + take), this.pos);\n this.pos += take;\n pos += take;\n if (this.pos === blockLen) {\n this.process(view, 0);\n this.pos = 0;\n }\n }\n this.length += data.length;\n this.roundClean();\n return this;\n }\n digestInto(out) {\n aexists(this);\n aoutput(out, this);\n this.finished = true;\n // Padding\n // We can avoid allocation of buffer for padding completely if it\n // was previously not allocated here. But it won't change performance.\n const { buffer, view, blockLen, isLE } = this;\n let { pos } = this;\n // append the bit '1' to the message\n buffer[pos++] = 0b10000000;\n clean(this.buffer.subarray(pos));\n // we have less than padOffset left in buffer, so we cannot put length in\n // current block, need process it and pad again\n if (this.padOffset > blockLen - pos) {\n this.process(view, 0);\n pos = 0;\n }\n // Pad until full block byte with zeros\n for (let i = pos; i < blockLen; i++)\n buffer[i] = 0;\n // Note: sha512 requires length to be 128bit integer, but length in JS will overflow before that\n // You need to write around 2 exabytes (u64_max / 8 / (1024**6)) for this to happen.\n // So we just write lowest 64 bits of that value.\n setBigUint64(view, blockLen - 8, BigInt(this.length * 8), isLE);\n this.process(view, 0);\n const oview = createView(out);\n const len = this.outputLen;\n // NOTE: we do division by 4 later, which should be fused in single op with modulo by JIT\n if (len % 4)\n throw new Error('_sha2: outputLen should be aligned to 32bit');\n const outLen = len / 4;\n const state = this.get();\n if (outLen > state.length)\n throw new Error('_sha2: outputLen bigger than state');\n for (let i = 0; i < outLen; i++)\n oview.setUint32(4 * i, state[i], isLE);\n }\n digest() {\n const { buffer, outputLen } = this;\n this.digestInto(buffer);\n const res = buffer.slice(0, outputLen);\n this.destroy();\n return res;\n }\n _cloneInto(to) {\n to || (to = new this.constructor());\n to.set(...this.get());\n const { blockLen, buffer, length, finished, destroyed, pos } = this;\n to.destroyed = destroyed;\n to.finished = finished;\n to.length = length;\n to.pos = pos;\n if (length % blockLen)\n to.buffer.set(buffer);\n return to;\n }\n clone() {\n return this._cloneInto();\n }\n}\n/**\n * Initial SHA-2 state: fractional parts of square roots of first 16 primes 2..53.\n * Check out `test/misc/sha2-gen-iv.js` for recomputation guide.\n */\n/** Initial SHA256 state. Bits 0..32 of frac part of sqrt of primes 2..19 */\nexport const SHA256_IV = /* @__PURE__ */ Uint32Array.from([\n 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19,\n]);\n/** Initial SHA224 state. Bits 32..64 of frac part of sqrt of primes 23..53 */\nexport const SHA224_IV = /* @__PURE__ */ Uint32Array.from([\n 0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4,\n]);\n/** Initial SHA384 state. Bits 0..64 of frac part of sqrt of primes 23..53 */\nexport const SHA384_IV = /* @__PURE__ */ Uint32Array.from([\n 0xcbbb9d5d, 0xc1059ed8, 0x629a292a, 0x367cd507, 0x9159015a, 0x3070dd17, 0x152fecd8, 0xf70e5939,\n 0x67332667, 0xffc00b31, 0x8eb44a87, 0x68581511, 0xdb0c2e0d, 0x64f98fa7, 0x47b5481d, 0xbefa4fa4,\n]);\n/** Initial SHA512 state. Bits 0..64 of frac part of sqrt of primes 2..19 */\nexport const SHA512_IV = /* @__PURE__ */ Uint32Array.from([\n 0x6a09e667, 0xf3bcc908, 0xbb67ae85, 0x84caa73b, 0x3c6ef372, 0xfe94f82b, 0xa54ff53a, 0x5f1d36f1,\n 0x510e527f, 0xade682d1, 0x9b05688c, 0x2b3e6c1f, 0x1f83d9ab, 0xfb41bd6b, 0x5be0cd19, 0x137e2179,\n]);\n//# sourceMappingURL=_md.js.map","/**\n * Internal helpers for u64. BigUint64Array is too slow as per 2025, so we implement it using Uint32Array.\n * @todo re-check https://issues.chromium.org/issues/42212588\n * @module\n */\nconst U32_MASK64 = /* @__PURE__ */ BigInt(2 ** 32 - 1);\nconst _32n = /* @__PURE__ */ BigInt(32);\nfunction fromBig(n, le = false) {\n if (le)\n return { h: Number(n & U32_MASK64), l: Number((n >> _32n) & U32_MASK64) };\n return { h: Number((n >> _32n) & U32_MASK64) | 0, l: Number(n & U32_MASK64) | 0 };\n}\nfunction split(lst, le = false) {\n const len = lst.length;\n let Ah = new Uint32Array(len);\n let Al = new Uint32Array(len);\n for (let i = 0; i < len; i++) {\n const { h, l } = fromBig(lst[i], le);\n [Ah[i], Al[i]] = [h, l];\n }\n return [Ah, Al];\n}\nconst toBig = (h, l) => (BigInt(h >>> 0) << _32n) | BigInt(l >>> 0);\n// for Shift in [0, 32)\nconst shrSH = (h, _l, s) => h >>> s;\nconst shrSL = (h, l, s) => (h << (32 - s)) | (l >>> s);\n// Right rotate for Shift in [1, 32)\nconst rotrSH = (h, l, s) => (h >>> s) | (l << (32 - s));\nconst rotrSL = (h, l, s) => (h << (32 - s)) | (l >>> s);\n// Right rotate for Shift in (32, 64), NOTE: 32 is special case.\nconst rotrBH = (h, l, s) => (h << (64 - s)) | (l >>> (s - 32));\nconst rotrBL = (h, l, s) => (h >>> (s - 32)) | (l << (64 - s));\n// Right rotate for shift===32 (just swaps l&h)\nconst rotr32H = (_h, l) => l;\nconst rotr32L = (h, _l) => h;\n// Left rotate for Shift in [1, 32)\nconst rotlSH = (h, l, s) => (h << s) | (l >>> (32 - s));\nconst rotlSL = (h, l, s) => (l << s) | (h >>> (32 - s));\n// Left rotate for Shift in (32, 64), NOTE: 32 is special case.\nconst rotlBH = (h, l, s) => (l << (s - 32)) | (h >>> (64 - s));\nconst rotlBL = (h, l, s) => (h << (s - 32)) | (l >>> (64 - s));\n// JS uses 32-bit signed integers for bitwise operations which means we cannot\n// simple take carry out of low bit sum by shift, we need to use division.\nfunction add(Ah, Al, Bh, Bl) {\n const l = (Al >>> 0) + (Bl >>> 0);\n return { h: (Ah + Bh + ((l / 2 ** 32) | 0)) | 0, l: l | 0 };\n}\n// Addition with more than 2 elements\nconst add3L = (Al, Bl, Cl) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0);\nconst add3H = (low, Ah, Bh, Ch) => (Ah + Bh + Ch + ((low / 2 ** 32) | 0)) | 0;\nconst add4L = (Al, Bl, Cl, Dl) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0);\nconst add4H = (low, Ah, Bh, Ch, Dh) => (Ah + Bh + Ch + Dh + ((low / 2 ** 32) | 0)) | 0;\nconst add5L = (Al, Bl, Cl, Dl, El) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0) + (El >>> 0);\nconst add5H = (low, Ah, Bh, Ch, Dh, Eh) => (Ah + Bh + Ch + Dh + Eh + ((low / 2 ** 32) | 0)) | 0;\n// prettier-ignore\nexport { add, add3H, add3L, add4H, add4L, add5H, add5L, fromBig, rotlBH, rotlBL, rotlSH, rotlSL, rotr32H, rotr32L, rotrBH, rotrBL, rotrSH, rotrSL, shrSH, shrSL, split, toBig };\n// prettier-ignore\nconst u64 = {\n fromBig, split, toBig,\n shrSH, shrSL,\n rotrSH, rotrSL, rotrBH, rotrBL,\n rotr32H, rotr32L,\n rotlSH, rotlSL, rotlBH, rotlBL,\n add, add3L, add3H, add4L, add4H, add5H, add5L,\n};\nexport default u64;\n//# sourceMappingURL=_u64.js.map","/**\n * SHA2 hash function. A.k.a. sha256, sha384, sha512, sha512_224, sha512_256.\n * SHA256 is the fastest hash implementable in JS, even faster than Blake3.\n * Check out [RFC 4634](https://datatracker.ietf.org/doc/html/rfc4634) and\n * [FIPS 180-4](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf).\n * @module\n */\nimport { Chi, HashMD, Maj, SHA224_IV, SHA256_IV, SHA384_IV, SHA512_IV } from \"./_md.js\";\nimport * as u64 from \"./_u64.js\";\nimport { clean, createHasher, rotr } from \"./utils.js\";\n/**\n * Round constants:\n * First 32 bits of fractional parts of the cube roots of the first 64 primes 2..311)\n */\n// prettier-ignore\nconst SHA256_K = /* @__PURE__ */ Uint32Array.from([\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2\n]);\n/** Reusable temporary buffer. \"W\" comes straight from spec. */\nconst SHA256_W = /* @__PURE__ */ new Uint32Array(64);\nexport class SHA256 extends HashMD {\n constructor(outputLen = 32) {\n super(64, outputLen, 8, false);\n // We cannot use array here since array allows indexing by variable\n // which means optimizer/compiler cannot use registers.\n this.A = SHA256_IV[0] | 0;\n this.B = SHA256_IV[1] | 0;\n this.C = SHA256_IV[2] | 0;\n this.D = SHA256_IV[3] | 0;\n this.E = SHA256_IV[4] | 0;\n this.F = SHA256_IV[5] | 0;\n this.G = SHA256_IV[6] | 0;\n this.H = SHA256_IV[7] | 0;\n }\n get() {\n const { A, B, C, D, E, F, G, H } = this;\n return [A, B, C, D, E, F, G, H];\n }\n // prettier-ignore\n set(A, B, C, D, E, F, G, H) {\n this.A = A | 0;\n this.B = B | 0;\n this.C = C | 0;\n this.D = D | 0;\n this.E = E | 0;\n this.F = F | 0;\n this.G = G | 0;\n this.H = H | 0;\n }\n process(view, offset) {\n // Extend the first 16 words into the remaining 48 words w[16..63] of the message schedule array\n for (let i = 0; i < 16; i++, offset += 4)\n SHA256_W[i] = view.getUint32(offset, false);\n for (let i = 16; i < 64; i++) {\n const W15 = SHA256_W[i - 15];\n const W2 = SHA256_W[i - 2];\n const s0 = rotr(W15, 7) ^ rotr(W15, 18) ^ (W15 >>> 3);\n const s1 = rotr(W2, 17) ^ rotr(W2, 19) ^ (W2 >>> 10);\n SHA256_W[i] = (s1 + SHA256_W[i - 7] + s0 + SHA256_W[i - 16]) | 0;\n }\n // Compression function main loop, 64 rounds\n let { A, B, C, D, E, F, G, H } = this;\n for (let i = 0; i < 64; i++) {\n const sigma1 = rotr(E, 6) ^ rotr(E, 11) ^ rotr(E, 25);\n const T1 = (H + sigma1 + Chi(E, F, G) + SHA256_K[i] + SHA256_W[i]) | 0;\n const sigma0 = rotr(A, 2) ^ rotr(A, 13) ^ rotr(A, 22);\n const T2 = (sigma0 + Maj(A, B, C)) | 0;\n H = G;\n G = F;\n F = E;\n E = (D + T1) | 0;\n D = C;\n C = B;\n B = A;\n A = (T1 + T2) | 0;\n }\n // Add the compressed chunk to the current hash value\n A = (A + this.A) | 0;\n B = (B + this.B) | 0;\n C = (C + this.C) | 0;\n D = (D + this.D) | 0;\n E = (E + this.E) | 0;\n F = (F + this.F) | 0;\n G = (G + this.G) | 0;\n H = (H + this.H) | 0;\n this.set(A, B, C, D, E, F, G, H);\n }\n roundClean() {\n clean(SHA256_W);\n }\n destroy() {\n this.set(0, 0, 0, 0, 0, 0, 0, 0);\n clean(this.buffer);\n }\n}\nexport class SHA224 extends SHA256 {\n constructor() {\n super(28);\n this.A = SHA224_IV[0] | 0;\n this.B = SHA224_IV[1] | 0;\n this.C = SHA224_IV[2] | 0;\n this.D = SHA224_IV[3] | 0;\n this.E = SHA224_IV[4] | 0;\n this.F = SHA224_IV[5] | 0;\n this.G = SHA224_IV[6] | 0;\n this.H = SHA224_IV[7] | 0;\n }\n}\n// SHA2-512 is slower than sha256 in js because u64 operations are slow.\n// Round contants\n// First 32 bits of the fractional parts of the cube roots of the first 80 primes 2..409\n// prettier-ignore\nconst K512 = /* @__PURE__ */ (() => u64.split([\n '0x428a2f98d728ae22', '0x7137449123ef65cd', '0xb5c0fbcfec4d3b2f', '0xe9b5dba58189dbbc',\n '0x3956c25bf348b538', '0x59f111f1b605d019', '0x923f82a4af194f9b', '0xab1c5ed5da6d8118',\n '0xd807aa98a3030242', '0x12835b0145706fbe', '0x243185be4ee4b28c', '0x550c7dc3d5ffb4e2',\n '0x72be5d74f27b896f', '0x80deb1fe3b1696b1', '0x9bdc06a725c71235', '0xc19bf174cf692694',\n '0xe49b69c19ef14ad2', '0xefbe4786384f25e3', '0x0fc19dc68b8cd5b5', '0x240ca1cc77ac9c65',\n '0x2de92c6f592b0275', '0x4a7484aa6ea6e483', '0x5cb0a9dcbd41fbd4', '0x76f988da831153b5',\n '0x983e5152ee66dfab', '0xa831c66d2db43210', '0xb00327c898fb213f', '0xbf597fc7beef0ee4',\n '0xc6e00bf33da88fc2', '0xd5a79147930aa725', '0x06ca6351e003826f', '0x142929670a0e6e70',\n '0x27b70a8546d22ffc', '0x2e1b21385c26c926', '0x4d2c6dfc5ac42aed', '0x53380d139d95b3df',\n '0x650a73548baf63de', '0x766a0abb3c77b2a8', '0x81c2c92e47edaee6', '0x92722c851482353b',\n '0xa2bfe8a14cf10364', '0xa81a664bbc423001', '0xc24b8b70d0f89791', '0xc76c51a30654be30',\n '0xd192e819d6ef5218', '0xd69906245565a910', '0xf40e35855771202a', '0x106aa07032bbd1b8',\n '0x19a4c116b8d2d0c8', '0x1e376c085141ab53', '0x2748774cdf8eeb99', '0x34b0bcb5e19b48a8',\n '0x391c0cb3c5c95a63', '0x4ed8aa4ae3418acb', '0x5b9cca4f7763e373', '0x682e6ff3d6b2b8a3',\n '0x748f82ee5defb2fc', '0x78a5636f43172f60', '0x84c87814a1f0ab72', '0x8cc702081a6439ec',\n '0x90befffa23631e28', '0xa4506cebde82bde9', '0xbef9a3f7b2c67915', '0xc67178f2e372532b',\n '0xca273eceea26619c', '0xd186b8c721c0c207', '0xeada7dd6cde0eb1e', '0xf57d4f7fee6ed178',\n '0x06f067aa72176fba', '0x0a637dc5a2c898a6', '0x113f9804bef90dae', '0x1b710b35131c471b',\n '0x28db77f523047d84', '0x32caab7b40c72493', '0x3c9ebe0a15c9bebc', '0x431d67c49c100d4c',\n '0x4cc5d4becb3e42b6', '0x597f299cfc657e2a', '0x5fcb6fab3ad6faec', '0x6c44198c4a475817'\n].map(n => BigInt(n))))();\nconst SHA512_Kh = /* @__PURE__ */ (() => K512[0])();\nconst SHA512_Kl = /* @__PURE__ */ (() => K512[1])();\n// Reusable temporary buffers\nconst SHA512_W_H = /* @__PURE__ */ new Uint32Array(80);\nconst SHA512_W_L = /* @__PURE__ */ new Uint32Array(80);\nexport class SHA512 extends HashMD {\n constructor(outputLen = 64) {\n super(128, outputLen, 16, false);\n // We cannot use array here since array allows indexing by variable\n // which means optimizer/compiler cannot use registers.\n // h -- high 32 bits, l -- low 32 bits\n this.Ah = SHA512_IV[0] | 0;\n this.Al = SHA512_IV[1] | 0;\n this.Bh = SHA512_IV[2] | 0;\n this.Bl = SHA512_IV[3] | 0;\n this.Ch = SHA512_IV[4] | 0;\n this.Cl = SHA512_IV[5] | 0;\n this.Dh = SHA512_IV[6] | 0;\n this.Dl = SHA512_IV[7] | 0;\n this.Eh = SHA512_IV[8] | 0;\n this.El = SHA512_IV[9] | 0;\n this.Fh = SHA512_IV[10] | 0;\n this.Fl = SHA512_IV[11] | 0;\n this.Gh = SHA512_IV[12] | 0;\n this.Gl = SHA512_IV[13] | 0;\n this.Hh = SHA512_IV[14] | 0;\n this.Hl = SHA512_IV[15] | 0;\n }\n // prettier-ignore\n get() {\n const { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this;\n return [Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl];\n }\n // prettier-ignore\n set(Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl) {\n this.Ah = Ah | 0;\n this.Al = Al | 0;\n this.Bh = Bh | 0;\n this.Bl = Bl | 0;\n this.Ch = Ch | 0;\n this.Cl = Cl | 0;\n this.Dh = Dh | 0;\n this.Dl = Dl | 0;\n this.Eh = Eh | 0;\n this.El = El | 0;\n this.Fh = Fh | 0;\n this.Fl = Fl | 0;\n this.Gh = Gh | 0;\n this.Gl = Gl | 0;\n this.Hh = Hh | 0;\n this.Hl = Hl | 0;\n }\n process(view, offset) {\n // Extend the first 16 words into the remaining 64 words w[16..79] of the message schedule array\n for (let i = 0; i < 16; i++, offset += 4) {\n SHA512_W_H[i] = view.getUint32(offset);\n SHA512_W_L[i] = view.getUint32((offset += 4));\n }\n for (let i = 16; i < 80; i++) {\n // s0 := (w[i-15] rightrotate 1) xor (w[i-15] rightrotate 8) xor (w[i-15] rightshift 7)\n const W15h = SHA512_W_H[i - 15] | 0;\n const W15l = SHA512_W_L[i - 15] | 0;\n const s0h = u64.rotrSH(W15h, W15l, 1) ^ u64.rotrSH(W15h, W15l, 8) ^ u64.shrSH(W15h, W15l, 7);\n const s0l = u64.rotrSL(W15h, W15l, 1) ^ u64.rotrSL(W15h, W15l, 8) ^ u64.shrSL(W15h, W15l, 7);\n // s1 := (w[i-2] rightrotate 19) xor (w[i-2] rightrotate 61) xor (w[i-2] rightshift 6)\n const W2h = SHA512_W_H[i - 2] | 0;\n const W2l = SHA512_W_L[i - 2] | 0;\n const s1h = u64.rotrSH(W2h, W2l, 19) ^ u64.rotrBH(W2h, W2l, 61) ^ u64.shrSH(W2h, W2l, 6);\n const s1l = u64.rotrSL(W2h, W2l, 19) ^ u64.rotrBL(W2h, W2l, 61) ^ u64.shrSL(W2h, W2l, 6);\n // SHA256_W[i] = s0 + s1 + SHA256_W[i - 7] + SHA256_W[i - 16];\n const SUMl = u64.add4L(s0l, s1l, SHA512_W_L[i - 7], SHA512_W_L[i - 16]);\n const SUMh = u64.add4H(SUMl, s0h, s1h, SHA512_W_H[i - 7], SHA512_W_H[i - 16]);\n SHA512_W_H[i] = SUMh | 0;\n SHA512_W_L[i] = SUMl | 0;\n }\n let { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this;\n // Compression function main loop, 80 rounds\n for (let i = 0; i < 80; i++) {\n // S1 := (e rightrotate 14) xor (e rightrotate 18) xor (e rightrotate 41)\n const sigma1h = u64.rotrSH(Eh, El, 14) ^ u64.rotrSH(Eh, El, 18) ^ u64.rotrBH(Eh, El, 41);\n const sigma1l = u64.rotrSL(Eh, El, 14) ^ u64.rotrSL(Eh, El, 18) ^ u64.rotrBL(Eh, El, 41);\n //const T1 = (H + sigma1 + Chi(E, F, G) + SHA256_K[i] + SHA256_W[i]) | 0;\n const CHIh = (Eh & Fh) ^ (~Eh & Gh);\n const CHIl = (El & Fl) ^ (~El & Gl);\n // T1 = H + sigma1 + Chi(E, F, G) + SHA512_K[i] + SHA512_W[i]\n // prettier-ignore\n const T1ll = u64.add5L(Hl, sigma1l, CHIl, SHA512_Kl[i], SHA512_W_L[i]);\n const T1h = u64.add5H(T1ll, Hh, sigma1h, CHIh, SHA512_Kh[i], SHA512_W_H[i]);\n const T1l = T1ll | 0;\n // S0 := (a rightrotate 28) xor (a rightrotate 34) xor (a rightrotate 39)\n const sigma0h = u64.rotrSH(Ah, Al, 28) ^ u64.rotrBH(Ah, Al, 34) ^ u64.rotrBH(Ah, Al, 39);\n const sigma0l = u64.rotrSL(Ah, Al, 28) ^ u64.rotrBL(Ah, Al, 34) ^ u64.rotrBL(Ah, Al, 39);\n const MAJh = (Ah & Bh) ^ (Ah & Ch) ^ (Bh & Ch);\n const MAJl = (Al & Bl) ^ (Al & Cl) ^ (Bl & Cl);\n Hh = Gh | 0;\n Hl = Gl | 0;\n Gh = Fh | 0;\n Gl = Fl | 0;\n Fh = Eh | 0;\n Fl = El | 0;\n ({ h: Eh, l: El } = u64.add(Dh | 0, Dl | 0, T1h | 0, T1l | 0));\n Dh = Ch | 0;\n Dl = Cl | 0;\n Ch = Bh | 0;\n Cl = Bl | 0;\n Bh = Ah | 0;\n Bl = Al | 0;\n const All = u64.add3L(T1l, sigma0l, MAJl);\n Ah = u64.add3H(All, T1h, sigma0h, MAJh);\n Al = All | 0;\n }\n // Add the compressed chunk to the current hash value\n ({ h: Ah, l: Al } = u64.add(this.Ah | 0, this.Al | 0, Ah | 0, Al | 0));\n ({ h: Bh, l: Bl } = u64.add(this.Bh | 0, this.Bl | 0, Bh | 0, Bl | 0));\n ({ h: Ch, l: Cl } = u64.add(this.Ch | 0, this.Cl | 0, Ch | 0, Cl | 0));\n ({ h: Dh, l: Dl } = u64.add(this.Dh | 0, this.Dl | 0, Dh | 0, Dl | 0));\n ({ h: Eh, l: El } = u64.add(this.Eh | 0, this.El | 0, Eh | 0, El | 0));\n ({ h: Fh, l: Fl } = u64.add(this.Fh | 0, this.Fl | 0, Fh | 0, Fl | 0));\n ({ h: Gh, l: Gl } = u64.add(this.Gh | 0, this.Gl | 0, Gh | 0, Gl | 0));\n ({ h: Hh, l: Hl } = u64.add(this.Hh | 0, this.Hl | 0, Hh | 0, Hl | 0));\n this.set(Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl);\n }\n roundClean() {\n clean(SHA512_W_H, SHA512_W_L);\n }\n destroy() {\n clean(this.buffer);\n this.set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);\n }\n}\nexport class SHA384 extends SHA512 {\n constructor() {\n super(48);\n this.Ah = SHA384_IV[0] | 0;\n this.Al = SHA384_IV[1] | 0;\n this.Bh = SHA384_IV[2] | 0;\n this.Bl = SHA384_IV[3] | 0;\n this.Ch = SHA384_IV[4] | 0;\n this.Cl = SHA384_IV[5] | 0;\n this.Dh = SHA384_IV[6] | 0;\n this.Dl = SHA384_IV[7] | 0;\n this.Eh = SHA384_IV[8] | 0;\n this.El = SHA384_IV[9] | 0;\n this.Fh = SHA384_IV[10] | 0;\n this.Fl = SHA384_IV[11] | 0;\n this.Gh = SHA384_IV[12] | 0;\n this.Gl = SHA384_IV[13] | 0;\n this.Hh = SHA384_IV[14] | 0;\n this.Hl = SHA384_IV[15] | 0;\n }\n}\n/**\n * Truncated SHA512/256 and SHA512/224.\n * SHA512_IV is XORed with 0xa5a5a5a5a5a5a5a5, then used as \"intermediary\" IV of SHA512/t.\n * Then t hashes string to produce result IV.\n * See `test/misc/sha2-gen-iv.js`.\n */\n/** SHA512/224 IV */\nconst T224_IV = /* @__PURE__ */ Uint32Array.from([\n 0x8c3d37c8, 0x19544da2, 0x73e19966, 0x89dcd4d6, 0x1dfab7ae, 0x32ff9c82, 0x679dd514, 0x582f9fcf,\n 0x0f6d2b69, 0x7bd44da8, 0x77e36f73, 0x04c48942, 0x3f9d85a8, 0x6a1d36c8, 0x1112e6ad, 0x91d692a1,\n]);\n/** SHA512/256 IV */\nconst T256_IV = /* @__PURE__ */ Uint32Array.from([\n 0x22312194, 0xfc2bf72c, 0x9f555fa3, 0xc84c64c2, 0x2393b86b, 0x6f53b151, 0x96387719, 0x5940eabd,\n 0x96283ee2, 0xa88effe3, 0xbe5e1e25, 0x53863992, 0x2b0199fc, 0x2c85b8aa, 0x0eb72ddc, 0x81c52ca2,\n]);\nexport class SHA512_224 extends SHA512 {\n constructor() {\n super(28);\n this.Ah = T224_IV[0] | 0;\n this.Al = T224_IV[1] | 0;\n this.Bh = T224_IV[2] | 0;\n this.Bl = T224_IV[3] | 0;\n this.Ch = T224_IV[4] | 0;\n this.Cl = T224_IV[5] | 0;\n this.Dh = T224_IV[6] | 0;\n this.Dl = T224_IV[7] | 0;\n this.Eh = T224_IV[8] | 0;\n this.El = T224_IV[9] | 0;\n this.Fh = T224_IV[10] | 0;\n this.Fl = T224_IV[11] | 0;\n this.Gh = T224_IV[12] | 0;\n this.Gl = T224_IV[13] | 0;\n this.Hh = T224_IV[14] | 0;\n this.Hl = T224_IV[15] | 0;\n }\n}\nexport class SHA512_256 extends SHA512 {\n constructor() {\n super(32);\n this.Ah = T256_IV[0] | 0;\n this.Al = T256_IV[1] | 0;\n this.Bh = T256_IV[2] | 0;\n this.Bl = T256_IV[3] | 0;\n this.Ch = T256_IV[4] | 0;\n this.Cl = T256_IV[5] | 0;\n this.Dh = T256_IV[6] | 0;\n this.Dl = T256_IV[7] | 0;\n this.Eh = T256_IV[8] | 0;\n this.El = T256_IV[9] | 0;\n this.Fh = T256_IV[10] | 0;\n this.Fl = T256_IV[11] | 0;\n this.Gh = T256_IV[12] | 0;\n this.Gl = T256_IV[13] | 0;\n this.Hh = T256_IV[14] | 0;\n this.Hl = T256_IV[15] | 0;\n }\n}\n/**\n * SHA2-256 hash function from RFC 4634.\n *\n * It is the fastest JS hash, even faster than Blake3.\n * To break sha256 using birthday attack, attackers need to try 2^128 hashes.\n * BTC network is doing 2^70 hashes/sec (2^95 hashes/year) as per 2025.\n */\nexport const sha256 = /* @__PURE__ */ createHasher(() => new SHA256());\n/** SHA2-224 hash function from RFC 4634 */\nexport const sha224 = /* @__PURE__ */ createHasher(() => new SHA224());\n/** SHA2-512 hash function from RFC 4634. */\nexport const sha512 = /* @__PURE__ */ createHasher(() => new SHA512());\n/** SHA2-384 hash function from RFC 4634. */\nexport const sha384 = /* @__PURE__ */ createHasher(() => new SHA384());\n/**\n * SHA2-512/256 \"truncated\" hash function, with improved resistance to length extension attacks.\n * See the paper on [truncated SHA512](https://eprint.iacr.org/2010/548.pdf).\n */\nexport const sha512_256 = /* @__PURE__ */ createHasher(() => new SHA512_256());\n/**\n * SHA2-512/224 \"truncated\" hash function, with improved resistance to length extension attacks.\n * See the paper on [truncated SHA512](https://eprint.iacr.org/2010/548.pdf).\n */\nexport const sha512_224 = /* @__PURE__ */ createHasher(() => new SHA512_224());\n//# sourceMappingURL=sha2.js.map","/**\n * Ed25519 key generation, persistence, and challenge signing for CLI auth.\n * Mirrors @abraca/mcp/src/crypto.ts — standalone to avoid MCP SDK dependency.\n */\nimport * as ed from '@noble/ed25519'\nimport { sha512 } from '@noble/hashes/sha2'\nimport { readFile, writeFile, mkdir } from 'node:fs/promises'\n\n// @noble/ed25519 v2+ requires explicit hash configuration\ned.etc.sha512Sync = (...msgs: Uint8Array[]) => sha512(ed.etc.concatBytes(...msgs))\nimport { existsSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { join, dirname } from 'node:path'\n\nconst DEFAULT_KEY_PATH = join(homedir(), '.abracadabra', 'cli.key')\n\nfunction toBase64url(bytes: Uint8Array): string {\n return Buffer.from(bytes).toString('base64url')\n}\n\nfunction fromBase64url(b64: string): Uint8Array {\n return new Uint8Array(Buffer.from(b64, 'base64url'))\n}\n\nexport interface CLIKeypair {\n privateKey: Uint8Array\n publicKeyB64: string\n}\n\n/**\n * Load an existing Ed25519 keypair from disk, or generate and persist a new one.\n * The file stores the raw 32-byte private key seed.\n */\nexport async function loadOrCreateKeypair(keyPath?: string): Promise<CLIKeypair> {\n const path = keyPath || DEFAULT_KEY_PATH\n\n if (existsSync(path)) {\n const seed = await readFile(path)\n if (seed.length !== 32) {\n throw new Error(`Invalid key file at ${path}: expected 32 bytes, got ${seed.length}`)\n }\n const privateKey = new Uint8Array(seed)\n const publicKey = ed.getPublicKey(privateKey)\n return { privateKey, publicKeyB64: toBase64url(publicKey) }\n }\n\n // Generate new keypair\n const privateKey = ed.utils.randomPrivateKey()\n const publicKey = ed.getPublicKey(privateKey)\n\n // Ensure directory exists and write seed with restricted permissions\n const dir = dirname(path)\n if (!existsSync(dir)) {\n await mkdir(dir, { recursive: true, mode: 0o700 })\n }\n await writeFile(path, Buffer.from(privateKey), { mode: 0o600 })\n\n console.error(`[abracadabra] Generated new keypair at ${path}`)\n console.error(`[abracadabra] Public key: ${toBase64url(publicKey)}`)\n\n return { privateKey, publicKeyB64: toBase64url(publicKey) }\n}\n\n/** Sign a base64url challenge with the private key; returns base64url signature. */\nexport function signChallenge(challengeB64: string, privateKey: Uint8Array): string {\n const challenge = fromBase64url(challengeB64)\n const sig = ed.sign(challenge, privateKey)\n return toBase64url(sig)\n}\n","/**\n * CLIConnection — manages the CRDT connection lifecycle for the CLI.\n *\n * Handles: Ed25519 auth → space discovery → Y.Doc sync → awareness.\n * Reuses the same patterns as AbracadabraMCPServer but without MCP SDK dependency.\n */\nimport * as Y from 'yjs'\nimport { AbracadabraProvider, AbracadabraClient } from '@abraca/dabra'\nimport type { ServerInfo, DocumentMeta, SpaceMeta } from '@abraca/dabra'\nimport { loadOrCreateKeypair, signChallenge } from './crypto.ts'\n\nexport interface CLIConnectionConfig {\n url: string\n name?: string\n color?: string\n inviteCode?: string\n keyFile?: string\n /** If true, suppress all stderr logging */\n quiet?: boolean\n}\n\ninterface CachedProvider {\n provider: AbracadabraProvider\n lastAccessed: number\n}\n\nfunction waitForSync(\n provider: { on(event: string, cb: () => void): void; off(event: string, cb: () => void): void },\n timeoutMs = 15000\n): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n const timer = setTimeout(() => {\n provider.off('synced', handler)\n reject(new Error(`Sync timed out after ${timeoutMs}ms`))\n }, timeoutMs)\n\n function handler() {\n clearTimeout(timer)\n resolve()\n }\n\n provider.on('synced', handler)\n })\n}\n\n/** Map a DocumentMeta to SpaceMeta shape for display compatibility. */\nfunction docToSpaceMeta(doc: DocumentMeta): SpaceMeta {\n const publicAccess = doc.public_access\n let visibility: SpaceMeta['visibility'] = 'private'\n if (publicAccess && publicAccess !== 'none') visibility = 'public'\n\n return {\n id: doc.id,\n doc_id: doc.id,\n name: doc.label ?? doc.id,\n description: doc.description ?? null,\n visibility,\n is_hub: doc.is_hub ?? false,\n owner_id: doc.owner_id ?? null,\n created_at: 0,\n updated_at: doc.updated_at ?? 0,\n public_access: publicAccess ?? null,\n }\n}\n\nexport class CLIConnection {\n readonly config: CLIConnectionConfig\n readonly client: AbracadabraClient\n\n private _serverInfo: ServerInfo | null = null\n private _rootDocId: string | null = null\n private _spaces: SpaceMeta[] = []\n private _rootDoc: Y.Doc | null = null\n private _rootProvider: AbracadabraProvider | null = null\n private _userId: string | null = null\n private _signFn: ((challenge: string) => Promise<string>) | null = null\n private childCache = new Map<string, CachedProvider>()\n\n constructor(config: CLIConnectionConfig) {\n this.config = config\n this.client = new AbracadabraClient({\n url: config.url,\n persistAuth: false,\n })\n }\n\n get displayName(): string {\n return this.config.name || 'CLI User'\n }\n\n get displayColor(): string {\n return this.config.color || 'hsl(45, 90%, 55%)'\n }\n\n get serverInfo(): ServerInfo | null {\n return this._serverInfo\n }\n\n get rootDocId(): string | null {\n return this._rootDocId\n }\n\n get spaces(): SpaceMeta[] {\n return this._spaces\n }\n\n get rootDoc(): Y.Doc | null {\n return this._rootDoc\n }\n\n get rootProvider(): AbracadabraProvider | null {\n return this._rootProvider\n }\n\n get userId(): string | null {\n return this._userId\n }\n\n private log(msg: string): void {\n if (!this.config.quiet) {\n console.error(`[abracadabra] ${msg}`)\n }\n }\n\n /** Connect to the server: authenticate, discover spaces, sync root doc. */\n async connect(): Promise<void> {\n // Step 1: Load or generate Ed25519 keypair\n const keypair = await loadOrCreateKeypair(this.config.keyFile)\n this._userId = keypair.publicKeyB64\n const signFn = (challenge: string) => Promise.resolve(signChallenge(challenge, keypair.privateKey))\n this._signFn = signFn\n\n // Step 2: Authenticate via challenge-response (register on first run)\n try {\n await this.client.loginWithKey(keypair.publicKeyB64, signFn)\n } catch (err: any) {\n const status = err?.status ?? err?.response?.status\n if (status === 404 || status === 422) {\n this.log('Key not registered, creating new account...')\n await this.client.registerWithKey({\n publicKey: keypair.publicKeyB64,\n username: this.displayName.replace(/\\s+/g, '-').toLowerCase(),\n displayName: this.displayName,\n deviceName: 'CLI',\n inviteCode: this.config.inviteCode,\n })\n await this.client.loginWithKey(keypair.publicKeyB64, signFn)\n } else {\n throw err\n }\n }\n this.log(`Authenticated as ${this.displayName} (${keypair.publicKeyB64.slice(0, 12)}...)`)\n\n // Step 3: Discover server info\n this._serverInfo = await this.client.serverInfo()\n\n // Step 4: Discover root documents\n let initialDocId: string | null = this._serverInfo.index_doc_id ?? null\n try {\n const roots = await this.client.listRootDocuments()\n this._spaces = roots.map(docToSpaceMeta)\n const hub = roots.find((d: any) => d.is_hub)\n if (hub) {\n initialDocId = hub.id\n this.log(`Hub document: ${hub.label ?? hub.id} (${hub.id})`)\n } else if (roots.length > 0) {\n initialDocId = roots[0].id\n this.log(`No hub, using first root doc: ${roots[0].label ?? roots[0].id}`)\n }\n } catch {\n try {\n this._spaces = await this.client.listSpaces()\n const hub = this._spaces.find(s => s.is_hub)\n if (hub) {\n initialDocId = hub.doc_id\n } else if (this._spaces.length > 0) {\n initialDocId = this._spaces[0].doc_id\n }\n } catch {\n this.log('Neither /docs?root=true nor /spaces available, using index_doc_id')\n }\n }\n\n if (!initialDocId) {\n throw new Error('No entry point found: server has neither spaces nor index_doc_id configured.')\n }\n\n this._rootDocId = initialDocId\n\n // Step 5: Connect provider and sync\n const doc = new Y.Doc({ guid: initialDocId })\n const provider = new AbracadabraProvider({\n name: initialDocId,\n document: doc,\n client: this.client,\n disableOfflineStore: true,\n subdocLoading: 'lazy',\n })\n\n await waitForSync(provider)\n\n provider.awareness.setLocalStateField('user', {\n name: this.displayName,\n color: this.displayColor,\n publicKey: this._userId,\n isAgent: false,\n })\n provider.awareness.setLocalStateField('status', null)\n\n this._rootDoc = doc\n this._rootProvider = provider\n this.log('Connected and synced')\n }\n\n /** Switch active space to a different root document. */\n async switchSpace(docId: string): Promise<void> {\n // Destroy existing child providers\n for (const [, cached] of this.childCache) {\n cached.provider.destroy()\n }\n this.childCache.clear()\n\n // Destroy current root provider\n if (this._rootProvider) {\n this._rootProvider.destroy()\n this._rootProvider = null\n }\n this._rootDoc = null\n\n // Re-authenticate if JWT has expired\n if (!this.client.isTokenValid() && this._signFn && this._userId) {\n await this.client.loginWithKey(this._userId, this._signFn)\n }\n\n // Connect to new space\n const doc = new Y.Doc({ guid: docId })\n const provider = new AbracadabraProvider({\n name: docId,\n document: doc,\n client: this.client,\n disableOfflineStore: true,\n subdocLoading: 'lazy',\n })\n\n await waitForSync(provider)\n\n provider.awareness.setLocalStateField('user', {\n name: this.displayName,\n color: this.displayColor,\n publicKey: this._userId,\n isAgent: false,\n })\n\n this._rootDoc = doc\n this._rootProvider = provider\n this._rootDocId = docId\n this.log(`Switched to space ${docId}`)\n }\n\n /** Get the root doc-tree Y.Map. */\n getTreeMap(): Y.Map<any> | null {\n return this._rootDoc?.getMap('doc-tree') ?? null\n }\n\n /** Get the root doc-trash Y.Map. */\n getTrashMap(): Y.Map<any> | null {\n return this._rootDoc?.getMap('doc-trash') ?? null\n }\n\n /** Get or create a child provider for a document. */\n async getChildProvider(docId: string): Promise<AbracadabraProvider> {\n const cached = this.childCache.get(docId)\n if (cached) {\n cached.lastAccessed = Date.now()\n return cached.provider\n }\n\n if (!this._rootProvider) {\n throw new Error('Not connected. Call connect() first.')\n }\n\n // Re-authenticate if JWT has expired\n if (!this.client.isTokenValid() && this._signFn && this._userId) {\n await this.client.loginWithKey(this._userId, this._signFn)\n }\n\n const childProvider = await this._rootProvider.loadChild(docId)\n await waitForSync(childProvider)\n\n childProvider.awareness.setLocalStateField('user', {\n name: this.displayName,\n color: this.displayColor,\n publicKey: this._userId,\n isAgent: false,\n })\n\n this.childCache.set(docId, {\n provider: childProvider,\n lastAccessed: Date.now(),\n })\n\n return childProvider\n }\n\n /** Graceful shutdown. */\n async destroy(): Promise<void> {\n for (const [, cached] of this.childCache) {\n cached.provider.destroy()\n }\n this.childCache.clear()\n\n if (this._rootProvider) {\n this._rootProvider.awareness.setLocalStateField('status', null)\n this._rootProvider.destroy()\n this._rootProvider = null\n }\n this._rootDoc = null\n\n this.log('Disconnected')\n }\n}\n","/**\n * Command interface and registry.\n */\nimport type { CLIConnection } from './connection.ts'\nimport type { ParsedArgs } from './parser.ts'\n\nexport interface Command {\n name: string\n aliases?: string[]\n description: string\n usage?: string\n run(conn: CLIConnection | null, args: ParsedArgs): Promise<string>\n}\n\nconst commands: Command[] = []\n\nexport function registerCommand(cmd: Command): void {\n commands.push(cmd)\n}\n\nexport function getCommand(name: string): Command | null {\n return commands.find(c =>\n c.name === name || c.aliases?.includes(name)\n ) ?? null\n}\n\nexport function getAllCommands(): Command[] {\n return [...commands]\n}\n","/**\n * Output formatting utilities for Abracadabra CLI.\n *\n * Supports JSON, TSV, tree, and compact text output.\n */\n\nimport type { ParsedArgs } from './parser.ts'\n\nexport type OutputFormat = 'json' | 'tsv' | 'tree' | 'text' | 'md'\n\nexport function getFormat(args: ParsedArgs, defaultFormat: OutputFormat = 'text'): OutputFormat {\n const f = args.params['format']\n if (f && ['json', 'tsv', 'tree', 'text', 'md'].includes(f)) {\n return f as OutputFormat\n }\n return defaultFormat\n}\n\n/** Print a JSON-serializable value. */\nexport function printJson(data: unknown): string {\n return JSON.stringify(data, null, 2)\n}\n\n/** Print a list of objects as TSV. */\nexport function printTsv(rows: Record<string, unknown>[], columns?: string[]): string {\n if (rows.length === 0) return ''\n const cols = columns ?? Object.keys(rows[0])\n const header = cols.map(c => c.toUpperCase()).join('\\t')\n const body = rows.map(row =>\n cols.map(c => {\n const val = row[c]\n if (val == null) return '—'\n if (typeof val === 'object') return JSON.stringify(val)\n return String(val)\n }).join('\\t')\n ).join('\\n')\n return header + '\\n' + body\n}\n\n/** Format a tree of nested items with box-drawing characters. */\nexport function printTree(\n items: TreeNode[],\n opts: { indent?: string, isLast?: boolean[] } = {}\n): string {\n const lines: string[] = []\n for (let i = 0; i < items.length; i++) {\n const item = items[i]\n const isLast = i === items.length - 1\n const prefix = (opts.isLast ?? [])\n .map(last => last ? ' ' : '│ ')\n .join('')\n const connector = isLast ? '└── ' : '├── '\n const typeSuffix = item.type ? ` (${item.type})` : ''\n lines.push(`${prefix}${connector}${item.label}${typeSuffix}`)\n if (item.children && item.children.length > 0) {\n lines.push(printTree(item.children, {\n isLast: [...(opts.isLast ?? []), isLast],\n }))\n }\n }\n return lines.join('\\n')\n}\n\nexport interface TreeNode {\n label: string\n type?: string\n children?: TreeNode[]\n}\n\n/** Format relative time (e.g. \"2m ago\", \"1h ago\"). */\nexport function relativeTime(timestamp: number | undefined | null): string {\n if (!timestamp) return '—'\n const diff = Date.now() - timestamp\n if (diff < 0) return 'just now'\n if (diff < 60_000) return `${Math.floor(diff / 1000)}s ago`\n if (diff < 3_600_000) return `${Math.floor(diff / 60_000)}m ago`\n if (diff < 86_400_000) return `${Math.floor(diff / 3_600_000)}h ago`\n return `${Math.floor(diff / 86_400_000)}d ago`\n}\n\n/** Truncate a string to a max length, appending '…' if truncated. */\nexport function truncate(str: string, max: number): string {\n if (str.length <= max) return str\n return str.slice(0, max - 1) + '…'\n}\n\n/** Pad a string to a fixed width. */\nexport function pad(str: string, width: number): string {\n if (str.length >= width) return str.slice(0, width)\n return str + ' '.repeat(width - str.length)\n}\n\n/** Format a table with auto-column widths. */\nexport function printTable(rows: string[][], headers?: string[]): string {\n const allRows = headers ? [headers, ...rows] : rows\n if (allRows.length === 0) return ''\n\n const colCount = Math.max(...allRows.map(r => r.length))\n const widths: number[] = []\n for (let c = 0; c < colCount; c++) {\n widths[c] = Math.max(...allRows.map(r => (r[c] ?? '').length))\n }\n\n const formatted = allRows.map(row =>\n row.map((cell, i) => pad(cell, widths[i])).join(' ')\n )\n\n return formatted.join('\\n')\n}\n","/**\n * help + version commands.\n */\nimport { registerCommand, getAllCommands } from '../command.ts'\nimport type { CLIConnection } from '../connection.ts'\nimport type { ParsedArgs } from '../parser.ts'\nimport { pad } from '../output.ts'\n\nregisterCommand({\n name: 'help',\n aliases: ['h', '?'],\n description: 'Show list of all available commands.',\n usage: 'help [<command>]',\n async run(_conn: CLIConnection | null, args: ParsedArgs): Promise<string> {\n const target = args.positional[0]\n\n if (target) {\n const cmd = getAllCommands().find(c =>\n c.name === target || c.aliases?.includes(target)\n )\n if (!cmd) {\n return `Unknown command: ${target}\\n\\nRun 'abracadabra help' to see all commands.`\n }\n const aliasStr = cmd.aliases?.length ? ` (aliases: ${cmd.aliases.join(', ')})` : ''\n let text = `${cmd.name}${aliasStr}\\n ${cmd.description}`\n if (cmd.usage) text += `\\n\\n Usage: abracadabra ${cmd.usage}`\n return text\n }\n\n const cmds = getAllCommands()\n const maxLen = Math.max(...cmds.map(c => c.name.length))\n\n const lines = [\n 'Abracadabra CLI — interact with CRDT document workspaces from the terminal.',\n '',\n 'Usage: abracadabra <command> [key=value ...] [--flags]',\n '',\n 'Commands:',\n ...cmds.map(c => {\n const aliasStr = c.aliases?.length ? ` (${c.aliases.join(', ')})` : ''\n return ` ${pad(c.name, maxLen + 2)}${c.description}${aliasStr}`\n }),\n '',\n 'Environment:',\n ' ABRA_URL Server URL (required)',\n ' ABRA_KEY_FILE Path to Ed25519 key file',\n ' ABRA_INVITE_CODE Invite code for first-run registration',\n ' ABRA_NAME Display name',\n ' ABRA_COLOR Presence color',\n '',\n 'Run \"abracadabra help <command>\" for command-specific help.',\n ]\n return lines.join('\\n')\n },\n})\n\nregisterCommand({\n name: 'version',\n aliases: ['v'],\n description: 'Show CLI and server version.',\n async run(conn: CLIConnection | null): Promise<string> {\n const cliVersion = '1.0.0'\n const lines = [`Abracadabra CLI v${cliVersion}`]\n if (conn?.serverInfo) {\n const si = conn.serverInfo\n if (si.version) lines.push(`Server v${si.version}`)\n if (si.name) lines.push(`Server name ${si.name}`)\n if (si.protocol_version) lines.push(`Protocol ${si.protocol_version}`)\n }\n return lines.join('\\n')\n },\n})\n","/**\n * Document resolution utilities for the CLI.\n *\n * Resolves documents by id, name (label), or path (label chain from root).\n * Similar to Obsidian's file= / path= resolution.\n */\nimport * as Y from 'yjs'\nimport type { CLIConnection } from './connection.ts'\n\nexport interface TreeEntry {\n id: string\n label: string\n parentId: string | null\n order: number\n type?: string\n meta?: Record<string, unknown>\n createdAt?: number\n updatedAt?: number\n}\n\n/** Safely read a tree map value, converting Y.Map to plain object if needed. */\nfunction toPlain(val: any): any {\n return val instanceof Y.Map ? val.toJSON() : val\n}\n\n/** Read all tree entries from the Y.Map. */\nexport function readEntries(treeMap: Y.Map<any>): TreeEntry[] {\n const entries: TreeEntry[] = []\n treeMap.forEach((raw: any, id: string) => {\n const value = toPlain(raw)\n if (typeof value !== 'object' || value === null) return\n entries.push({\n id,\n label: value.label || 'Untitled',\n parentId: value.parentId ?? null,\n order: value.order ?? 0,\n type: value.type,\n meta: value.meta,\n createdAt: value.createdAt,\n updatedAt: value.updatedAt,\n })\n })\n return entries\n}\n\n/** Get direct children of a parent, sorted by order. */\nexport function childrenOf(entries: TreeEntry[], parentId: string | null): TreeEntry[] {\n return entries\n .filter(e => e.parentId === parentId)\n .sort((a, b) => (a.order ?? 0) - (b.order ?? 0))\n}\n\n/** Get all descendants of an entry. */\nexport function descendantsOf(entries: TreeEntry[], id: string | null): TreeEntry[] {\n const result: TreeEntry[] = []\n const visited = new Set<string>()\n function collect(pid: string) {\n if (visited.has(pid)) return\n visited.add(pid)\n for (const child of childrenOf(entries, pid)) {\n result.push(child)\n collect(child.id)\n }\n }\n collect(id!)\n return result\n}\n\n/** Build a nested tree structure for display. */\nexport function buildTree(entries: TreeEntry[], rootId: string | null, maxDepth: number, currentDepth = 0, visited = new Set<string>()): TreeDisplayNode[] {\n if (maxDepth >= 0 && currentDepth >= maxDepth) return []\n const children = childrenOf(entries, rootId)\n return children.filter(e => !visited.has(e.id)).map(entry => {\n const next = new Set(visited)\n next.add(entry.id)\n return {\n id: entry.id,\n label: entry.label,\n type: entry.type,\n meta: entry.meta,\n children: buildTree(entries, entry.id, maxDepth, currentDepth + 1, next),\n }\n })\n}\n\nexport interface TreeDisplayNode {\n id: string\n label: string\n type?: string\n meta?: Record<string, unknown>\n children: TreeDisplayNode[]\n}\n\n/**\n * Normalize a document ID so the hub/root doc ID is treated as the tree root (null).\n */\nexport function normalizeRootId(id: string | null | undefined, conn: CLIConnection): string | null {\n if (id == null) return null\n return id === conn.rootDocId ? null : id\n}\n\n/**\n * Resolve a document from parsed args.\n *\n * Resolution order:\n * 1. id=<uuid> — Direct document ID\n * 2. name=<label> — Case-insensitive label match (first match wins)\n * 3. path=<a/b/c> — Resolve by label path from root\n * 4. First positional argument — tries name resolution\n *\n * Returns the document ID or null if not found.\n */\nexport function resolveDocument(\n conn: CLIConnection,\n params: Record<string, string>,\n positional: string[],\n): string | null {\n const treeMap = conn.getTreeMap()\n if (!treeMap) return null\n\n const entries = readEntries(treeMap)\n\n // 1. Direct ID\n if (params['id']) {\n const entry = entries.find(e => e.id === params['id'])\n return entry ? entry.id : null\n }\n\n // 2. Name resolution (case-insensitive label match)\n const name = params['name'] || params['file'] || positional[0]\n if (name) {\n const lower = name.toLowerCase()\n const match = entries.find(e => e.label.toLowerCase() === lower)\n if (match) return match.id\n\n // Substring match as fallback\n const substring = entries.find(e => e.label.toLowerCase().includes(lower))\n if (substring) return substring.id\n }\n\n // 3. Path resolution (slash-separated label chain)\n if (params['path']) {\n const segments = params['path'].split('/').map(s => s.trim()).filter(Boolean)\n let currentParent: string | null = normalizeRootId(conn.rootDocId, conn)\n\n for (const segment of segments) {\n const lower = segment.toLowerCase()\n const children = childrenOf(entries, currentParent)\n const match = children.find(c => c.label.toLowerCase() === lower)\n if (!match) return null\n currentParent = match.id\n }\n\n return currentParent\n }\n\n return null\n}\n\n/** Get the ancestor path labels for a document. */\nexport function getAncestorPath(entries: TreeEntry[], docId: string): string[] {\n const byId = new Map(entries.map(e => [e.id, e]))\n const path: string[] = []\n let current = byId.get(docId)?.parentId\n const visited = new Set<string>()\n while (current && !visited.has(current)) {\n visited.add(current)\n const parent = byId.get(current)\n if (!parent) break\n path.unshift(parent.label)\n current = parent.parentId\n }\n return path\n}\n","/**\n * spaces, spaces:switch, info commands.\n */\nimport { registerCommand } from '../command.ts'\nimport type { CLIConnection } from '../connection.ts'\nimport type { ParsedArgs } from '../parser.ts'\nimport { printJson, printTable, getFormat, pad } from '../output.ts'\nimport { readEntries, childrenOf } from '../resolve.ts'\n\nregisterCommand({\n name: 'info',\n description: 'Show server and space info.',\n async run(conn: CLIConnection | null): Promise<string> {\n if (!conn) return 'Not connected'\n const si = conn.serverInfo\n if (!si) return 'No server info available'\n\n const treeMap = conn.getTreeMap()\n const docCount = treeMap ? readEntries(treeMap).length : 0\n\n const rootProvider = conn.rootProvider\n const onlineUsers = rootProvider\n ? Array.from(rootProvider.awareness.getStates().values()).filter((s: any) => s.user).length\n : 0\n\n const lines = [\n `Server: ${si.name ?? '—'}`,\n `URL: ${conn.config.url}`,\n `Version: ${si.version ?? '—'}`,\n `Protocol: ${si.protocol_version ?? '—'}`,\n `Hub Doc: ${conn.rootDocId ?? '—'}`,\n `Auth: ${si.auth_methods?.join(', ') ?? '—'}`,\n `Registration:${si.registration_allowed ? ' open' : ' closed'}${si.invite_only ? ' (invite only)' : ''}`,\n `Documents: ${docCount}`,\n `Users: ${onlineUsers} online`,\n ]\n return lines.join('\\n')\n },\n})\n\nregisterCommand({\n name: 'spaces',\n description: 'List available spaces/root documents.',\n usage: 'spaces [--format=json|tsv]',\n async run(conn: CLIConnection | null, args: ParsedArgs): Promise<string> {\n if (!conn) return 'Not connected'\n const spaces = conn.spaces\n if (!spaces.length) return 'No spaces available.'\n\n const format = getFormat(args, 'text')\n const active = conn.rootDocId\n\n if (format === 'json') {\n return printJson(spaces.map(s => ({ ...s, active: s.doc_id === active })))\n }\n\n const rows = spaces.map(s => [\n s.doc_id === active ? '▸' : ' ',\n s.doc_id.slice(0, 8) + '…',\n s.name,\n s.is_hub ? 'hub' : '',\n s.visibility,\n ])\n\n return printTable(rows, ['', 'ID', 'NAME', 'HUB', 'VISIBILITY'])\n },\n})\n\nregisterCommand({\n name: 'spaces:switch',\n aliases: ['switch'],\n description: 'Switch the active space.',\n usage: 'spaces:switch name=<name> | id=<docId>',\n async run(conn: CLIConnection | null, args: ParsedArgs): Promise<string> {\n if (!conn) return 'Not connected'\n\n const targetName = args.params['name'] || args.positional[0]\n const targetId = args.params['id']\n\n let docId: string | null = null\n\n if (targetId) {\n docId = targetId\n } else if (targetName) {\n const lower = targetName.toLowerCase()\n const space = conn.spaces.find(s =>\n s.name.toLowerCase() === lower || s.doc_id === targetName\n )\n if (space) docId = space.doc_id\n }\n\n if (!docId) {\n return 'Space not found. Use \"abracadabra spaces\" to list available spaces.'\n }\n\n await conn.switchSpace(docId)\n const space = conn.spaces.find(s => s.doc_id === docId)\n return `Switched to space \"${space?.name ?? docId}\"`\n },\n})\n","/**\n * tree, ls, search commands — navigate and explore the document tree.\n */\nimport { registerCommand } from '../command.ts'\nimport type { CLIConnection } from '../connection.ts'\nimport type { ParsedArgs } from '../parser.ts'\nimport {\n readEntries,\n childrenOf,\n buildTree,\n normalizeRootId,\n resolveDocument,\n getAncestorPath,\n type TreeDisplayNode,\n} from '../resolve.ts'\nimport { printJson, printTable, printTree, getFormat, relativeTime, type TreeNode } from '../output.ts'\n\nfunction toTreeNodes(nodes: TreeDisplayNode[]): TreeNode[] {\n return nodes.map(n => ({\n label: n.label,\n type: n.type,\n children: n.children.length > 0 ? toTreeNodes(n.children) : undefined,\n }))\n}\n\nregisterCommand({\n name: 'tree',\n aliases: ['t'],\n description: 'Show the full document tree hierarchy.',\n usage: 'tree [id=<docId>] [depth=<n>] [--format=json|tree]',\n async run(conn: CLIConnection | null, args: ParsedArgs): Promise<string> {\n if (!conn) return 'Not connected'\n const treeMap = conn.getTreeMap()\n if (!treeMap) return 'Not connected'\n\n const rootId = normalizeRootId(\n args.params['id'] || args.positional[0] || conn.rootDocId,\n conn\n )\n const maxDepth = args.params['depth'] ? parseInt(args.params['depth'], 10) : -1\n const format = getFormat(args, 'tree')\n\n const entries = readEntries(treeMap)\n const tree = buildTree(entries, rootId, maxDepth)\n\n if (format === 'json') {\n return printJson(tree)\n }\n\n if (tree.length === 0) {\n return '(empty tree)'\n }\n\n // Find root label for header\n const hubSpace = conn.spaces.find(s => s.doc_id === conn.rootDocId)\n const rootLabel = hubSpace?.name ?? conn.rootDocId ?? 'Workspace'\n\n return rootLabel + '\\n' + printTree(toTreeNodes(tree))\n },\n})\n\nregisterCommand({\n name: 'ls',\n aliases: ['list', 'l'],\n description: 'List direct children of a document (defaults to root).',\n usage: 'ls [id=<parentId>] [name=<parentName>] [--format=json|tsv] [--total]',\n async run(conn: CLIConnection | null, args: ParsedArgs): Promise<string> {\n if (!conn) return 'Not connected'\n const treeMap = conn.getTreeMap()\n if (!treeMap) return 'Not connected'\n\n let parentId: string | null = null\n if (args.params['id'] || args.params['name'] || args.params['path'] || args.positional[0]) {\n parentId = resolveDocument(conn, args.params, args.positional)\n if (!parentId && (args.params['id'] || args.params['name'] || args.params['path'])) {\n return 'Document not found.'\n }\n }\n\n const targetId = normalizeRootId(parentId || conn.rootDocId, conn)\n const entries = readEntries(treeMap)\n const children = childrenOf(entries, targetId)\n\n if (args.flags.has('total')) {\n return String(children.length)\n }\n\n const format = getFormat(args, 'text')\n\n if (format === 'json') {\n return printJson(children)\n }\n\n if (children.length === 0) {\n return '(no children)'\n }\n\n const rows = children.map(c => [\n c.id.slice(0, 8) + '…',\n c.label,\n c.type ?? '—',\n relativeTime(c.updatedAt),\n ])\n\n return printTable(rows, ['ID', 'LABEL', 'TYPE', 'UPDATED'])\n },\n})\n\nregisterCommand({\n name: 'search',\n aliases: ['find', 's'],\n description: 'Search documents by label across the tree.',\n usage: 'search query=<text> [id=<rootId>] [--format=json|tsv] [--total]',\n async run(conn: CLIConnection | null, args: ParsedArgs): Promise<string> {\n if (!conn) return 'Not connected'\n const treeMap = conn.getTreeMap()\n if (!treeMap) return 'Not connected'\n\n const query = args.params['query'] || args.positional[0]\n if (!query) return 'Missing required parameter: query=<text>'\n\n const entries = readEntries(treeMap)\n const lowerQuery = query.toLowerCase()\n\n const matches = entries.filter(e =>\n e.label.toLowerCase().includes(lowerQuery)\n )\n\n if (args.flags.has('total')) {\n return String(matches.length)\n }\n\n const format = getFormat(args, 'text')\n\n if (matches.length === 0) {\n return `No documents found matching \"${query}\".`\n }\n\n const results = matches.map(entry => ({\n id: entry.id,\n label: entry.label,\n type: entry.type,\n path: getAncestorPath(entries, entry.id),\n }))\n\n if (format === 'json') {\n return printJson(results)\n }\n\n const rows = results.map(r => [\n r.path.length > 0 ? r.path.join(' / ') + ' / ' + r.label : r.label,\n r.label,\n r.type ?? '—',\n ])\n\n return printTable(rows, ['PATH', 'LABEL', 'TYPE'])\n },\n})\n","/**\n * Y.XmlFragment → Markdown serializer.\n * Walks the TipTap document structure and produces markdown text.\n */\nimport * as Y from 'yjs'\n\n// ── Inline text serialization ────────────────────────────────────────────────\n\nfunction deltaToMarkdown(delta: { insert: string; attributes?: Record<string, any> }[]): string {\n return delta.map(op => {\n let text = op.insert as string\n if (!op.attributes) return text\n\n const a = op.attributes\n\n if (a.code) text = `\\`${text}\\``\n if (a.bold) text = `**${text}**`\n if (a.italic) text = `*${text}*`\n if (a.strike) text = `~~${text}~~`\n if (a.link?.href) text = `[${text}](${a.link.href})`\n if (a.badge) text = `:badge[${a.badge.label || text}]`\n if (a.kbd) text = `:kbd{value=\"${a.kbd.value || text}\"}`\n if (a.proseIcon) text = `:icon{name=\"${a.proseIcon.name}\"}`\n\n return text\n }).join('')\n}\n\nfunction xmlTextToMarkdown(xmlText: Y.XmlText): string {\n const delta = xmlText.toDelta()\n return deltaToMarkdown(delta)\n}\n\nfunction elementTextContent(el: Y.XmlElement | Y.XmlFragment): string {\n const parts: string[] = []\n for (let i = 0; i < el.length; i++) {\n const child = el.get(i)\n if (child instanceof Y.XmlText) {\n parts.push(xmlTextToMarkdown(child))\n } else if (child instanceof Y.XmlElement) {\n parts.push(elementTextContent(child))\n }\n }\n return parts.join('')\n}\n\n// ── Block serialization ──────────────────────────────────────────────────────\n\nfunction serializeElement(el: Y.XmlElement, indent = ''): string {\n const name = el.nodeName\n\n switch (name) {\n case 'documentHeader':\n case 'documentMeta':\n return ''\n\n case 'heading': {\n const level = Number(el.getAttribute('level')) || 1\n const prefix = '#'.repeat(level)\n return `${prefix} ${elementTextContent(el)}`\n }\n\n case 'paragraph':\n return elementTextContent(el)\n\n case 'bulletList':\n return serializeList(el, 'bullet', indent)\n\n case 'orderedList':\n return serializeList(el, 'ordered', indent)\n\n case 'taskList':\n return serializeTaskList(el, indent)\n\n case 'codeBlock': {\n const lang = el.getAttribute('language') || ''\n const code = elementTextContent(el)\n return `\\`\\`\\`${lang}\\n${code}\\n\\`\\`\\``\n }\n\n case 'blockquote': {\n const lines: string[] = []\n for (let i = 0; i < el.length; i++) {\n const child = el.get(i)\n if (child instanceof Y.XmlElement) {\n lines.push(serializeElement(child, indent))\n }\n }\n return lines.map(l => `> ${l}`).join('\\n')\n }\n\n case 'horizontalRule':\n return '---'\n\n case 'table':\n return serializeTable(el)\n\n case 'docEmbed': {\n const docId = el.getAttribute('docId')\n return docId ? `![[${docId}]]` : ''\n }\n\n case 'svgEmbed': {\n const svg = el.getAttribute('svg') || ''\n const svgTitle = el.getAttribute('title') || ''\n if (!svg) return ''\n return `\\`\\`\\`svg${svgTitle ? ` ${svgTitle}` : ''}\\n${svg}\\n\\`\\`\\``\n }\n\n case 'image': {\n const src = el.getAttribute('src') || ''\n const alt = el.getAttribute('alt') || ''\n const w = el.getAttribute('width')\n const h = el.getAttribute('height')\n let attrs = ''\n if (w || h) {\n const parts: string[] = []\n if (w) parts.push(`width=\"${w}\"`)\n if (h) parts.push(`height=\"${h}\"`)\n attrs = `{${parts.join(' ')}}`\n }\n return `![${alt}](${src})${attrs}`\n }\n\n case 'callout': {\n const type = el.getAttribute('type') || 'note'\n const inner = serializeChildren(el, indent)\n return `::${type}\\n${inner}\\n::`\n }\n\n case 'collapsible': {\n const label = el.getAttribute('label') || 'Details'\n const open = el.getAttribute('open')\n const props: string[] = [`label=\"${label}\"`]\n if (open === true || open === 'true') props.push('open=\"true\"')\n const inner = serializeChildren(el, indent)\n return `::collapsible{${props.join(' ')}}\\n${inner}\\n::`\n }\n\n case 'steps': {\n const inner = serializeChildren(el, indent)\n return `::steps\\n${inner}\\n::`\n }\n\n case 'card': {\n const title = el.getAttribute('title') || ''\n const icon = el.getAttribute('icon') || ''\n const to = el.getAttribute('to') || ''\n const props: string[] = []\n if (title) props.push(`title=\"${title}\"`)\n if (icon) props.push(`icon=\"${icon}\"`)\n if (to) props.push(`to=\"${to}\"`)\n const inner = serializeChildren(el, indent)\n return `::card{${props.join(' ')}}\\n${inner}\\n::`\n }\n\n case 'cardGroup': {\n const inner = serializeChildren(el, indent)\n return `::card-group\\n${inner}\\n::`\n }\n\n case 'codeCollapse': {\n const inner = serializeChildren(el, indent)\n return `::code-collapse\\n${inner}\\n::`\n }\n\n case 'codeGroup': {\n const inner = serializeChildren(el, indent)\n return `::code-group\\n${inner}\\n::`\n }\n\n case 'codePreview': {\n const inner = serializeChildren(el, indent)\n return `::code-preview\\n${inner}\\n::`\n }\n\n case 'codeTree': {\n const files = el.getAttribute('files') || '[]'\n return `::code-tree{files=\"${files}\"}\\n::`\n }\n\n case 'accordion':\n return serializeSlottedComponent(el, 'accordion', 'accordionItem', 'item')\n\n case 'tabs':\n return serializeSlottedComponent(el, 'tabs', 'tabsItem', 'tab')\n\n case 'field': {\n const fieldName = el.getAttribute('name') || ''\n const fieldType = el.getAttribute('type') || 'string'\n const required = el.getAttribute('required')\n const props: string[] = []\n if (fieldName) props.push(`name=\"${fieldName}\"`)\n props.push(`type=\"${fieldType}\"`)\n if (required === true || required === 'true') props.push('required=\"true\"')\n const inner = serializeChildren(el, indent)\n return `::field{${props.join(' ')}}\\n${inner}\\n::`\n }\n\n case 'fieldGroup': {\n const inner = serializeChildren(el, indent)\n return `::field-group\\n${inner}\\n::`\n }\n\n default: {\n // Unknown node — try to serialize children\n return serializeChildren(el, indent)\n }\n }\n}\n\nfunction serializeList(el: Y.XmlElement, type: 'bullet' | 'ordered', indent: string): string {\n const lines: string[] = []\n for (let i = 0; i < el.length; i++) {\n const item = el.get(i)\n if (item instanceof Y.XmlElement && item.nodeName === 'listItem') {\n const prefix = type === 'bullet' ? '- ' : `${i + 1}. `\n const content = elementTextContent(item)\n lines.push(`${indent}${prefix}${content}`)\n }\n }\n return lines.join('\\n')\n}\n\nfunction serializeTaskList(el: Y.XmlElement, indent: string): string {\n const lines: string[] = []\n for (let i = 0; i < el.length; i++) {\n const item = el.get(i)\n if (item instanceof Y.XmlElement && item.nodeName === 'taskItem') {\n const checked = item.getAttribute('checked')\n const marker = (checked === true || checked === 'true') ? '[x]' : '[ ]'\n const content = elementTextContent(item)\n lines.push(`${indent}- ${marker} ${content}`)\n }\n }\n return lines.join('\\n')\n}\n\nfunction serializeTable(el: Y.XmlElement): string {\n const rows: string[][] = []\n let isHeader = true\n\n for (let i = 0; i < el.length; i++) {\n const row = el.get(i)\n if (!(row instanceof Y.XmlElement) || row.nodeName !== 'tableRow') continue\n\n const cells: string[] = []\n for (let j = 0; j < row.length; j++) {\n const cell = row.get(j)\n if (cell instanceof Y.XmlElement) {\n cells.push(elementTextContent(cell))\n }\n }\n rows.push(cells)\n }\n\n if (!rows.length) return ''\n\n const headerRow = rows[0]!\n const lines = [`| ${headerRow.join(' | ')} |`]\n\n // Separator\n lines.push(`| ${headerRow.map(() => '---').join(' | ')} |`)\n\n // Data rows\n for (let i = 1; i < rows.length; i++) {\n lines.push(`| ${rows[i]!.join(' | ')} |`)\n }\n\n return lines.join('\\n')\n}\n\nfunction serializeSlottedComponent(\n el: Y.XmlElement,\n componentName: string,\n childNodeName: string,\n slotName: string\n): string {\n const parts: string[] = [`::${componentName}`]\n\n for (let i = 0; i < el.length; i++) {\n const child = el.get(i)\n if (!(child instanceof Y.XmlElement) || child.nodeName !== childNodeName) continue\n\n const label = child.getAttribute('label') || `Item ${i + 1}`\n const icon = child.getAttribute('icon') || ''\n const props: string[] = [`label=\"${label}\"`]\n if (icon) props.push(`icon=\"${icon}\"`)\n parts.push(`#${slotName}{${props.join(' ')}}`)\n\n const inner = serializeChildren(child, '')\n if (inner) parts.push(inner)\n }\n\n parts.push('::')\n return parts.join('\\n')\n}\n\nfunction serializeChildren(el: Y.XmlElement | Y.XmlFragment, indent: string): string {\n const parts: string[] = []\n for (let i = 0; i < el.length; i++) {\n const child = el.get(i)\n if (child instanceof Y.XmlElement) {\n const serialized = serializeElement(child, indent)\n if (serialized) parts.push(serialized)\n } else if (child instanceof Y.XmlText) {\n const text = xmlTextToMarkdown(child)\n if (text) parts.push(text)\n }\n }\n return parts.join('\\n\\n')\n}\n\n// ── Public API ───────────────────────────────────────────────────────────────\n\n/**\n * Converts a Y.XmlFragment (TipTap document) to markdown.\n * Extracts the title from the documentHeader element.\n *\n * @returns `{ title, markdown }` where title is the H1/header text\n */\nexport function yjsToMarkdown(fragment: Y.XmlFragment): { title: string; markdown: string } {\n let title = 'Untitled'\n const bodyParts: string[] = []\n\n for (let i = 0; i < fragment.length; i++) {\n const child = fragment.get(i)\n if (!(child instanceof Y.XmlElement)) continue\n\n if (child.nodeName === 'documentHeader') {\n title = elementTextContent(child) || 'Untitled'\n continue\n }\n\n if (child.nodeName === 'documentMeta') {\n continue\n }\n\n const serialized = serializeElement(child)\n if (serialized !== '') {\n bodyParts.push(serialized)\n }\n }\n\n return { title, markdown: bodyParts.join('\\n\\n') }\n}\n","/**\n * Markdown → Y.js converter.\n * Ported from cou-sh/app/utils/markdownToYjs.ts with Vue dependency removed.\n */\nimport * as Y from 'yjs'\nimport type { PageMeta } from './types.ts'\n\n// ── Filename → readable label ────────────────────────────────────────────────\n\nexport function filenameToLabel(raw: string): string {\n const base = raw.replace(/\\.[^.]+$/, '')\n const spaced = base.replace(/([a-z])([A-Z])/g, '$1 $2')\n const clean = spaced.replace(/[-_.]+/g, ' ').replace(/\\s+/g, ' ').trim()\n return clean.charAt(0).toUpperCase() + clean.slice(1)\n}\n\n// ── YAML frontmatter parser ──────────────────────────────────────────────────\n\nexport interface FrontmatterResult {\n title?: string\n meta: Partial<PageMeta>\n body: string\n}\n\nfunction coerceScalar(raw: string): string | number | boolean {\n const trimmed = raw.trim()\n if (trimmed === 'true') return true\n if (trimmed === 'false') return false\n const num = Number(trimmed)\n if (!Number.isNaN(num) && trimmed !== '') return num\n if ((trimmed.startsWith('\"') && trimmed.endsWith('\"'))\n || (trimmed.startsWith(\"'\") && trimmed.endsWith(\"'\"))) {\n return trimmed.slice(1, -1)\n }\n return trimmed\n}\n\nfunction parseInlineArray(raw: string): string[] {\n return raw.slice(1, -1).split(',').map(s => s.trim()).filter(Boolean)\n}\n\nexport function parseFrontmatter(markdown: string): FrontmatterResult {\n const noResult: FrontmatterResult = { meta: {}, body: markdown }\n\n const match = markdown.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---\\r?\\n?/)\n if (!match) return noResult\n\n const yamlBlock = match[1]!\n const body = markdown.slice(match[0].length)\n\n const raw: Record<string, string | string[]> = {}\n const lines = yamlBlock.split('\\n')\n let i = 0\n while (i < lines.length) {\n const line = lines[i]!\n const blockSeqKey = line.match(/^(\\w[\\w-]*):\\s*$/)\n if (blockSeqKey && i + 1 < lines.length && /^\\s+-\\s/.test(lines[i + 1]!)) {\n const key = blockSeqKey[1]!\n const items: string[] = []\n i++\n while (i < lines.length && /^\\s+-\\s/.test(lines[i]!)) {\n items.push(lines[i]!.replace(/^\\s+-\\s/, '').trim())\n i++\n }\n raw[key] = items\n continue\n }\n const kvMatch = line.match(/^(\\w[\\w-]*):\\s*(.*)$/)\n if (kvMatch) {\n const key = kvMatch[1]!\n const val = kvMatch[2]!.trim()\n if (val.startsWith('[') && val.endsWith(']')) {\n raw[key] = parseInlineArray(val)\n } else {\n raw[key] = val\n }\n }\n i++\n }\n\n const meta: Partial<PageMeta> = {}\n\n const getStr = (keys: string[]): string | undefined => {\n for (const k of keys) {\n const v = raw[k]\n if (typeof v === 'string' && v) return v\n }\n }\n\n if (raw['tags']) meta.tags = Array.isArray(raw['tags']) ? raw['tags'] : [raw['tags'] as string]\n const color = getStr(['color'])\n if (color) meta.color = color\n const icon = getStr(['icon'])\n if (icon) meta.icon = icon\n const status = getStr(['status'])\n if (status) meta.status = status\n\n const priorityRaw = getStr(['priority'])\n if (priorityRaw !== undefined) {\n const map: Record<string, number> = { low: 1, medium: 2, high: 3, urgent: 4 }\n meta.priority = map[priorityRaw.toLowerCase()] ?? (Number(priorityRaw) || 0)\n }\n\n const checkedRaw = raw['checked'] ?? raw['done']\n if (checkedRaw !== undefined) meta.checked = checkedRaw === 'true' || checkedRaw === true\n\n const dateStart = getStr(['date', 'created'])\n if (dateStart) meta.dateStart = dateStart\n const dateEnd = getStr(['due'])\n if (dateEnd) meta.dateEnd = dateEnd\n\n const subtitle = getStr(['description', 'subtitle'])\n if (subtitle) meta.subtitle = subtitle\n const url = getStr(['url'])\n if (url) meta.url = url\n const email = getStr(['email'])\n if (email) meta.email = email\n const phone = getStr(['phone'])\n if (phone) meta.phone = phone\n\n const ratingRaw = getStr(['rating'])\n if (ratingRaw !== undefined) {\n const n = Number(ratingRaw)\n if (!Number.isNaN(n)) meta.rating = Math.min(5, Math.max(0, n))\n }\n\n // Datetime fields\n const datetimeStart = getStr(['datetimeStart'])\n if (datetimeStart) meta.datetimeStart = datetimeStart\n const datetimeEnd = getStr(['datetimeEnd'])\n if (datetimeEnd) meta.datetimeEnd = datetimeEnd\n const allDayRaw = raw['allDay']\n if (allDayRaw !== undefined) meta.allDay = allDayRaw === 'true' || allDayRaw === true\n\n // Geo fields\n const geoLatRaw = getStr(['geoLat'])\n if (geoLatRaw !== undefined) { const n = Number(geoLatRaw); if (!Number.isNaN(n)) meta.geoLat = n }\n const geoLngRaw = getStr(['geoLng'])\n if (geoLngRaw !== undefined) { const n = Number(geoLngRaw); if (!Number.isNaN(n)) meta.geoLng = n }\n const geoType = getStr(['geoType'])\n if (geoType && (geoType === 'marker' || geoType === 'line' || geoType === 'measure')) {\n meta.geoType = geoType\n }\n const geoDescription = getStr(['geoDescription'])\n if (geoDescription) meta.geoDescription = geoDescription\n\n // Numeric fields\n const numberRaw = getStr(['number'])\n if (numberRaw !== undefined) { const n = Number(numberRaw); if (!Number.isNaN(n)) meta.number = n }\n const unit = getStr(['unit'])\n if (unit) meta.unit = unit\n\n // Note\n const note = getStr(['note'])\n if (note) meta.note = note\n\n const title = typeof raw['title'] === 'string' ? raw['title'] : undefined\n\n return { title, meta, body }\n}\n\n// ── Inline token parsing ─────────────────────────────────────────────────────\n\ninterface InlineToken {\n text: string\n attrs?: Record<string, unknown>\n}\n\nfunction parseInline(text: string): InlineToken[] {\n const stripped = text.replace(/\\{lang=\"[^\"]*\"\\}/g, '')\n .replace(/:(?!badge|icon|kbd)(\\w[\\w-]*)\\[([^\\]]*)\\](\\{[^}]*\\})?/g, '$2')\n .replace(/:(?!badge|icon|kbd)(\\w[\\w-]*)(\\{[^}]*\\})/g, '')\n\n const tokens: InlineToken[] = []\n const re = /:badge\\[([^\\]]*)\\](\\{[^}]*\\})?|:icon\\{([^}]*)\\}|:kbd\\{([^}]*)\\}|!?\\[\\[([^\\]|]+?)(?:\\|([^\\]]+?))?\\]\\]|~~(.+?)~~|\\*\\*(.+?)\\*\\*|\\*(.+?)\\*|_(.+?)_|`(.+?)`|\\[(.+?)\\]\\((.+?)\\)/g\n let lastIndex = 0\n let match: RegExpExecArray | null\n\n while ((match = re.exec(stripped)) !== null) {\n if (match.index > lastIndex) {\n tokens.push({ text: stripped.slice(lastIndex, match.index) })\n }\n if (match[1] !== undefined) {\n const badgeProps = parseMdcProps(match[2])\n tokens.push({ text: match[1] || 'Badge', attrs: { badge: { label: match[1] || 'Badge', color: badgeProps['color'] || 'neutral', variant: badgeProps['variant'] || 'subtle' } } })\n } else if (match[3] !== undefined) {\n const iconProps = parseMdcProps(`{${match[3]}}`)\n tokens.push({ text: '\\u200B', attrs: { proseIcon: { name: iconProps['name'] || 'i-lucide-star' } } })\n } else if (match[4] !== undefined) {\n const kbdProps = parseMdcProps(`{${match[4]}}`)\n tokens.push({ text: kbdProps['value'] || '', attrs: { kbd: { value: kbdProps['value'] || '' } } })\n } else if (match[5] !== undefined) {\n // Inline wikilink [[docId]] or [[docId|label]] → link to /doc/docId\n const docId = match[5]\n const displayText = match[6] ?? docId\n tokens.push({ text: displayText!, attrs: { link: { href: `/doc/${docId}` } } })\n } else if (match[7] !== undefined) {\n tokens.push({ text: match[7], attrs: { strike: true } })\n } else if (match[8] !== undefined) {\n tokens.push({ text: match[8], attrs: { bold: true } })\n } else if (match[9] !== undefined) {\n tokens.push({ text: match[9], attrs: { italic: true } })\n } else if (match[10] !== undefined) {\n tokens.push({ text: match[10], attrs: { italic: true } })\n } else if (match[11] !== undefined) {\n tokens.push({ text: match[11], attrs: { code: true } })\n } else if (match[12] !== undefined && match[13] !== undefined) {\n tokens.push({ text: match[12], attrs: { link: { href: match[13] } } })\n }\n lastIndex = match.index + match[0].length\n }\n\n if (lastIndex < stripped.length) {\n tokens.push({ text: stripped.slice(lastIndex) })\n }\n return tokens.filter(t => t.text.length > 0)\n}\n\n// ── Block-level parser ───────────────────────────────────────────────────────\n\ninterface TaskItem {\n text: string\n checked: boolean\n}\n\ntype Block =\n | { type: 'heading'; level: number; text: string }\n | { type: 'paragraph'; text: string }\n | { type: 'bulletList'; items: string[] }\n | { type: 'orderedList'; items: string[] }\n | { type: 'taskList'; items: TaskItem[] }\n | { type: 'codeBlock'; lang: string; code: string }\n | { type: 'blockquote'; lines: string[] }\n | { type: 'table'; headerRow: string[]; dataRows: string[][] }\n | { type: 'hr' }\n | { type: 'callout'; calloutType: string; innerBlocks: Block[] }\n | { type: 'collapsible'; label: string; open: boolean; innerBlocks: Block[] }\n | { type: 'steps'; innerBlocks: Block[] }\n | { type: 'card'; title: string; icon: string; to: string; innerBlocks: Block[] }\n | { type: 'cardGroup'; cards: Block[] }\n | { type: 'codeCollapse'; codeBlocks: Block[] }\n | { type: 'codeGroup'; codeBlocks: Block[] }\n | { type: 'codePreview'; innerBlocks: Block[]; codeBlocks: Block[] }\n | { type: 'codeTree'; files: string }\n | { type: 'accordion'; items: { label: string; icon: string; innerBlocks: Block[] }[] }\n | { type: 'tabs'; items: { label: string; icon: string; innerBlocks: Block[] }[] }\n | { type: 'field'; name: string; fieldType: string; required: boolean; innerBlocks: Block[] }\n | { type: 'fieldGroup'; fields: Block[] }\n | { type: 'image'; src: string; alt: string; width?: string; height?: string }\n | { type: 'docEmbed'; docId: string }\n | { type: 'svgEmbed'; svg: string; title: string }\n\nfunction parseTableRow(line: string): string[] {\n const parts = line.split('|')\n return parts.slice(1, parts.length - 1).map(c => c.trim())\n}\n\nfunction isTableSeparator(line: string): boolean {\n return /^\\|[\\s|:-]+\\|$/.test(line.trim())\n}\n\nfunction extractFencedCode(lines: string[]): Block[] {\n const result: Block[] = []\n let i = 0\n while (i < lines.length) {\n const line = lines[i]!\n const fenceMatch = line.match(/^(`{3,})(\\w*)/)\n if (fenceMatch) {\n const fence = fenceMatch[1]!\n const lang = fenceMatch[2] ?? ''\n const codeLines: string[] = []\n i++\n while (i < lines.length && !lines[i]!.startsWith(fence)) {\n codeLines.push(lines[i]!)\n i++\n }\n i++\n result.push({ type: 'codeBlock', lang, code: codeLines.join('\\n') })\n continue\n }\n i++\n }\n return result\n}\n\nfunction parseMdcProps(propsStr: string | undefined): Record<string, string> {\n if (!propsStr) return {}\n const result: Record<string, string> = {}\n const re = /(\\w[\\w-]*)=\"([^\"]*)\"/g\n let m: RegExpExecArray | null\n while ((m = re.exec(propsStr)) !== null) {\n result[m[1]!] = m[2]!\n }\n return result\n}\n\nfunction parseMdcChildren(innerLines: string[], slotPrefix: string): { label: string; icon: string; innerBlocks: Block[] }[] {\n const items: { label: string; icon: string; lines: string[] }[] = []\n let current: { label: string; icon: string; lines: string[] } | null = null\n const slotRe = new RegExp(`^#${slotPrefix}(\\\\{[^}]*\\\\})?\\\\s*$`)\n\n for (const line of innerLines) {\n const slotMatch = line.match(slotRe)\n if (slotMatch) {\n if (current) items.push(current)\n const props = parseMdcProps(slotMatch[1])\n current = { label: props['label'] || props['title'] || `Item ${items.length + 1}`, icon: props['icon'] || '', lines: [] }\n continue\n }\n if (current) {\n current.lines.push(line)\n } else {\n if (!items.length && !current) {\n current = { label: `Item 1`, icon: '', lines: [line] }\n }\n }\n }\n if (current) items.push(current)\n\n return items.map(item => ({\n label: item.label,\n icon: item.icon,\n innerBlocks: parseBlocks(item.lines.join('\\n')),\n }))\n}\n\nconst TASK_RE = /^[-*+]\\s+\\[([ xX])\\]\\s+(.*)/\n\nfunction parseBlocks(markdown: string): Block[] {\n const rawLines = markdown.split('\\n')\n let firstContentLine = 0\n while (firstContentLine < rawLines.length) {\n const l = rawLines[firstContentLine]!\n if (l.trim() === '' || /^import\\s/.test(l) || /^export\\s/.test(l)) {\n firstContentLine++\n } else {\n break\n }\n }\n const stripped = rawLines.slice(firstContentLine).join('\\n')\n\n const blocks: Block[] = []\n const lines = stripped.split('\\n')\n let i = 0\n\n while (i < lines.length) {\n const line = lines[i]!\n\n const fenceBlockMatch = line.match(/^(`{3,})(.*)$/)\n if (fenceBlockMatch) {\n const fence = fenceBlockMatch[1]!\n const lang = fenceBlockMatch[2]!.trim()\n .replace(/\\{[^}]*\\}$/, '')\n .replace(/\\s*\\[.*\\]$/, '')\n .trim()\n const codeLines: string[] = []\n i++\n while (i < lines.length && !lines[i]!.startsWith(fence)) {\n codeLines.push(lines[i]!)\n i++\n }\n i++\n if (lang === 'svg' || lang.startsWith('svg ')) {\n const svgTitle = lang === 'svg' ? '' : lang.slice(4).trim()\n blocks.push({ type: 'svgEmbed', svg: codeLines.join('\\n'), title: svgTitle })\n } else {\n blocks.push({ type: 'codeBlock', lang, code: codeLines.join('\\n') })\n }\n continue\n }\n\n const headingMatch = line.match(/^(#{1,6})\\s+(.*)/)\n if (headingMatch) {\n blocks.push({ type: 'heading', level: headingMatch[1]!.length, text: headingMatch[2]!.trim() })\n i++\n continue\n }\n\n if (/^[-*_]{3,}\\s*$/.test(line)) {\n blocks.push({ type: 'hr' })\n i++\n continue\n }\n\n const docEmbedMatch = line.match(/^!\\[\\[([^\\]|]+?)(?:\\|[^\\]]*?)?\\]\\]\\s*$/)\n if (docEmbedMatch) {\n blocks.push({ type: 'docEmbed', docId: docEmbedMatch[1]! })\n i++\n continue\n }\n\n const imgMatch = line.match(/^!\\[([^\\]]*)\\]\\(([^)]+)\\)(\\{[^}]*\\})?\\s*$/)\n if (imgMatch) {\n const alt = imgMatch[1] ?? ''\n const src = imgMatch[2] ?? ''\n const attrs = parseMdcProps(imgMatch[3])\n blocks.push({ type: 'image', src, alt, width: attrs['width'], height: attrs['height'] })\n i++\n continue\n }\n\n if (line.startsWith('> ') || line === '>') {\n const bqLines: string[] = []\n while (i < lines.length && (lines[i]!.startsWith('> ') || lines[i] === '>')) {\n bqLines.push(lines[i]!.replace(/^>\\s?/, ''))\n i++\n }\n blocks.push({ type: 'blockquote', lines: bqLines })\n continue\n }\n\n if (/^\\s*\\|/.test(line)) {\n const tableLines: string[] = []\n while (i < lines.length && /^\\s*\\|/.test(lines[i]!)) {\n tableLines.push(lines[i]!)\n i++\n }\n if (tableLines.length >= 2 && isTableSeparator(tableLines[1]!)) {\n const headerRow = parseTableRow(tableLines[0]!)\n const dataRows = tableLines.slice(2)\n .filter(l => !isTableSeparator(l))\n .map(parseTableRow)\n blocks.push({ type: 'table', headerRow, dataRows })\n } else {\n for (const l of tableLines) blocks.push({ type: 'paragraph', text: l })\n }\n continue\n }\n\n const MDC_OPEN = /^\\s*(:{2,})(\\w[\\w-]*)(\\{[^}]*\\})?\\s*$/\n if (MDC_OPEN.test(line)) {\n const colons = line.match(/^\\s*(:+)/)?.[1]?.length ?? 2\n const componentName = line.match(/^\\s*:{2,}(\\w[\\w-]*)/)?.[1] ?? ''\n const innerLines: string[] = []\n i++\n while (i < lines.length) {\n const l = lines[i]!\n if (new RegExp(`^\\\\s*:{${colons}}\\\\s*$`).test(l)) { i++; break }\n const innerFence = l.match(/^(\\s*`{3,})/)\n if (innerFence) {\n const fenceStr = innerFence[1]!.trimStart()\n innerLines.push(l)\n i++\n while (i < lines.length && !lines[i]!.trimStart().startsWith(fenceStr)) {\n innerLines.push(lines[i]!)\n i++\n }\n if (i < lines.length) { innerLines.push(lines[i]!); i++ }\n continue\n }\n innerLines.push(l)\n i++\n }\n\n const nonBlank = innerLines.filter(l => l.trim().length > 0)\n if (nonBlank.length) {\n const minIndent = Math.min(...nonBlank.map(l => l.match(/^(\\s*)/)?.[1]?.length ?? 0))\n if (minIndent > 0) {\n for (let j = 0; j < innerLines.length; j++) {\n innerLines[j] = innerLines[j]!.slice(Math.min(minIndent, innerLines[j]!.length))\n }\n }\n }\n\n let contentStart = 0\n if (innerLines[0]?.trim() === '---') {\n const fmEnd = innerLines.findIndex((l, idx) => idx > 0 && l.trim() === '---')\n if (fmEnd !== -1) contentStart = fmEnd + 1\n }\n const contentLines = innerLines.slice(contentStart)\n\n const defaultSlotLines: string[] = []\n const codeSlotLines: string[] = []\n let currentSlot: 'default' | 'code' | 'other' = 'default'\n for (const l of contentLines) {\n if (/^#code\\s*$/.test(l)) { currentSlot = 'code'; continue }\n if (/^#\\w+/.test(l) && !/^#{2,}\\s/.test(l)) { currentSlot = 'other'; continue }\n if (currentSlot === 'default') defaultSlotLines.push(l)\n else if (currentSlot === 'code') codeSlotLines.push(l)\n }\n const innerBlocks = parseBlocks(defaultSlotLines.join('\\n'))\n\n const codeBlocks = extractFencedCode(codeSlotLines)\n\n const CALLOUT_NAMES = new Set(['tip', 'note', 'info', 'warning', 'caution', 'danger', 'callout', 'alert'])\n if (CALLOUT_NAMES.has(componentName.toLowerCase())) {\n blocks.push({ type: 'callout', calloutType: componentName.toLowerCase(), innerBlocks })\n } else {\n const mdcProps = parseMdcProps(line.match(MDC_OPEN)?.[3])\n const lc = componentName.toLowerCase()\n\n if (lc === 'collapsible') {\n blocks.push({ type: 'collapsible', label: mdcProps['label'] || 'Details', open: mdcProps['open'] === 'true', innerBlocks })\n } else if (lc === 'steps') {\n blocks.push({ type: 'steps', innerBlocks })\n } else if (lc === 'card') {\n blocks.push({ type: 'card', title: mdcProps['title'] || '', icon: mdcProps['icon'] || '', to: mdcProps['to'] || '', innerBlocks })\n } else if (lc === 'card-group') {\n const cards = innerBlocks.filter(b => b.type === 'card')\n if (cards.length) {\n blocks.push({ type: 'cardGroup', cards })\n } else {\n blocks.push(...innerBlocks)\n }\n } else if (lc === 'code-collapse') {\n blocks.push({ type: 'codeCollapse', codeBlocks: codeBlocks.length ? codeBlocks : innerBlocks.filter(b => b.type === 'codeBlock') })\n } else if (lc === 'code-group') {\n const allCode = [...innerBlocks.filter(b => b.type === 'codeBlock'), ...codeBlocks]\n blocks.push({ type: 'codeGroup', codeBlocks: allCode })\n } else if (lc === 'code-preview') {\n blocks.push({ type: 'codePreview', innerBlocks, codeBlocks })\n } else if (lc === 'code-tree') {\n blocks.push({ type: 'codeTree', files: mdcProps['files'] || '[]' })\n } else if (lc === 'accordion') {\n const items = parseMdcChildren(contentLines, 'item')\n if (items.length) {\n blocks.push({ type: 'accordion', items })\n } else {\n blocks.push({ type: 'accordion', items: [{ label: 'Item 1', icon: '', innerBlocks }] })\n }\n } else if (lc === 'tabs') {\n const items = parseMdcChildren(contentLines, 'tab')\n if (items.length) {\n blocks.push({ type: 'tabs', items })\n } else {\n blocks.push({ type: 'tabs', items: [{ label: 'Tab 1', icon: '', innerBlocks }] })\n }\n } else if (lc === 'field') {\n blocks.push({ type: 'field', name: mdcProps['name'] || '', fieldType: mdcProps['type'] || 'string', required: mdcProps['required'] === 'true', innerBlocks })\n } else if (lc === 'field-group') {\n const fields = innerBlocks.filter(b => b.type === 'field')\n if (fields.length) {\n blocks.push({ type: 'fieldGroup', fields })\n } else {\n blocks.push(...innerBlocks)\n }\n } else {\n blocks.push(...innerBlocks)\n blocks.push(...codeBlocks)\n }\n }\n continue\n }\n\n if (TASK_RE.test(line)) {\n const items: TaskItem[] = []\n while (i < lines.length && TASK_RE.test(lines[i]!)) {\n const m = lines[i]!.match(TASK_RE)!\n items.push({ checked: m[1]!.toLowerCase() === 'x', text: m[2]! })\n i++\n }\n blocks.push({ type: 'taskList', items })\n continue\n }\n\n if (/^[-*+]\\s+/.test(line)) {\n const items: string[] = []\n while (i < lines.length && /^[-*+]\\s+/.test(lines[i]!) && !TASK_RE.test(lines[i]!)) {\n items.push(lines[i]!.replace(/^[-*+]\\s+/, ''))\n i++\n }\n if (items.length) {\n blocks.push({ type: 'bulletList', items })\n continue\n }\n }\n\n if (/^\\d+\\.\\s+/.test(line)) {\n const items: string[] = []\n while (i < lines.length && /^\\d+\\.\\s+/.test(lines[i]!)) {\n items.push(lines[i]!.replace(/^\\d+\\.\\s+/, ''))\n i++\n }\n blocks.push({ type: 'orderedList', items })\n continue\n }\n\n if (line.trim() === '') {\n i++\n continue\n }\n\n const paraLines: string[] = []\n while (\n i < lines.length\n && lines[i]!.trim() !== ''\n && !/^(#{1,6}\\s|[-*+]\\s|\\d+\\.\\s|>|`{3,}|\\s*\\||[-*_]{3,}\\s*$|\\s*:{2,}\\w)/.test(lines[i]!)\n ) {\n paraLines.push(lines[i]!)\n i++\n }\n if (paraLines.length) {\n blocks.push({ type: 'paragraph', text: paraLines.join(' ') })\n }\n }\n\n return blocks\n}\n\n// ── Y.js content population ──────────────────────────────────────────────────\n\nfunction fillTextInto(el: Y.XmlElement, tokens: InlineToken[]): void {\n const filtered = tokens.filter(t => t.text.length > 0)\n if (!filtered.length) return\n\n const xtNodes = filtered.map(() => new Y.XmlText())\n el.insert(0, xtNodes)\n\n filtered.forEach((tok, i) => {\n if (tok.attrs) {\n xtNodes[i]!.insert(0, tok.text, tok.attrs as Record<string, boolean | object>)\n } else {\n xtNodes[i]!.insert(0, tok.text)\n }\n })\n}\n\nfunction blockElName(b: Block): string {\n switch (b.type) {\n case 'heading': return 'heading'\n case 'paragraph': return 'paragraph'\n case 'bulletList': return 'bulletList'\n case 'orderedList': return 'orderedList'\n case 'taskList': return 'taskList'\n case 'codeBlock': return 'codeBlock'\n case 'blockquote': return 'blockquote'\n case 'table': return 'table'\n case 'hr': return 'horizontalRule'\n case 'callout': return 'callout'\n case 'collapsible': return 'collapsible'\n case 'steps': return 'steps'\n case 'card': return 'card'\n case 'cardGroup': return 'cardGroup'\n case 'codeCollapse': return 'codeCollapse'\n case 'codeGroup': return 'codeGroup'\n case 'codePreview': return 'codePreview'\n case 'codeTree': return 'codeTree'\n case 'accordion': return 'accordion'\n case 'tabs': return 'tabs'\n case 'field': return 'field'\n case 'fieldGroup': return 'fieldGroup'\n case 'image': return 'image'\n case 'docEmbed': return 'docEmbed'\n case 'svgEmbed': return 'svgEmbed'\n }\n}\n\nfunction fillBlock(el: Y.XmlElement, block: Block): void {\n switch (block.type) {\n case 'heading': {\n el.setAttribute('level', block.level as any)\n fillTextInto(el, parseInline(block.text))\n break\n }\n case 'paragraph': {\n fillTextInto(el, parseInline(block.text))\n break\n }\n case 'bulletList':\n case 'orderedList': {\n const listItemEls = block.items.map(() => new Y.XmlElement('listItem'))\n el.insert(0, listItemEls)\n block.items.forEach((text, i) => {\n const paraEl = new Y.XmlElement('paragraph')\n listItemEls[i]!.insert(0, [paraEl])\n fillTextInto(paraEl, parseInline(text))\n })\n break\n }\n case 'taskList': {\n const taskItemEls = block.items.map(() => new Y.XmlElement('taskItem'))\n el.insert(0, taskItemEls)\n block.items.forEach((item, i) => {\n taskItemEls[i]!.setAttribute('checked', item.checked as any)\n const paraEl = new Y.XmlElement('paragraph')\n taskItemEls[i]!.insert(0, [paraEl])\n fillTextInto(paraEl, parseInline(item.text))\n })\n break\n }\n case 'codeBlock': {\n if (block.lang) el.setAttribute('language', block.lang)\n const xt = new Y.XmlText()\n el.insert(0, [xt])\n xt.insert(0, block.code)\n break\n }\n case 'blockquote': {\n const paraEls = block.lines.map(() => new Y.XmlElement('paragraph'))\n el.insert(0, paraEls)\n block.lines.forEach((line, i) => fillTextInto(paraEls[i]!, parseInline(line)))\n break\n }\n case 'table': {\n const headerRowEl = new Y.XmlElement('tableRow')\n const dataRowEls = block.dataRows.map(() => new Y.XmlElement('tableRow'))\n el.insert(0, [headerRowEl, ...dataRowEls])\n\n const headerCellEls = block.headerRow.map(() => new Y.XmlElement('tableHeader'))\n headerRowEl.insert(0, headerCellEls)\n block.headerRow.forEach((cellText, i) => {\n const paraEl = new Y.XmlElement('paragraph')\n headerCellEls[i]!.insert(0, [paraEl])\n fillTextInto(paraEl, parseInline(cellText))\n })\n\n block.dataRows.forEach((row, ri) => {\n const cellEls = row.map(() => new Y.XmlElement('tableCell'))\n dataRowEls[ri]!.insert(0, cellEls)\n row.forEach((cellText, ci) => {\n const paraEl = new Y.XmlElement('paragraph')\n cellEls[ci]!.insert(0, [paraEl])\n fillTextInto(paraEl, parseInline(cellText))\n })\n })\n break\n }\n case 'hr': break\n case 'callout': {\n el.setAttribute('type', block.calloutType)\n if (!block.innerBlocks.length) {\n const paraEl = new Y.XmlElement('paragraph')\n el.insert(0, [paraEl])\n break\n }\n const innerEls = block.innerBlocks.map(b => new Y.XmlElement(blockElName(b)))\n el.insert(0, innerEls)\n block.innerBlocks.forEach((b, i) => fillBlock(innerEls[i]!, b))\n break\n }\n case 'collapsible': {\n el.setAttribute('label', block.label)\n el.setAttribute('open', block.open as any)\n const inner = block.innerBlocks.length ? block.innerBlocks : [{ type: 'paragraph' as const, text: '' }]\n const innerEls = inner.map(b => new Y.XmlElement(blockElName(b)))\n el.insert(0, innerEls)\n inner.forEach((b, i) => fillBlock(innerEls[i]!, b))\n break\n }\n case 'steps': {\n const inner = block.innerBlocks.length ? block.innerBlocks : [{ type: 'paragraph' as const, text: '' }]\n const innerEls = inner.map(b => new Y.XmlElement(blockElName(b)))\n el.insert(0, innerEls)\n inner.forEach((b, i) => fillBlock(innerEls[i]!, b))\n break\n }\n case 'card': {\n if (block.title) el.setAttribute('title', block.title)\n if (block.icon) el.setAttribute('icon', block.icon)\n if (block.to) el.setAttribute('to', block.to)\n const inner = block.innerBlocks.length ? block.innerBlocks : [{ type: 'paragraph' as const, text: '' }]\n const innerEls = inner.map(b => new Y.XmlElement(blockElName(b)))\n el.insert(0, innerEls)\n inner.forEach((b, i) => fillBlock(innerEls[i]!, b))\n break\n }\n case 'cardGroup': {\n const cardEls = block.cards.map(b => new Y.XmlElement(blockElName(b)))\n el.insert(0, cardEls)\n block.cards.forEach((b, i) => fillBlock(cardEls[i]!, b))\n break\n }\n case 'codeCollapse': {\n const codes = block.codeBlocks.length ? block.codeBlocks : [{ type: 'codeBlock' as const, lang: '', code: '' }]\n const codeEl = new Y.XmlElement('codeBlock')\n el.insert(0, [codeEl])\n fillBlock(codeEl, codes[0]!)\n break\n }\n case 'codeGroup': {\n const codes = block.codeBlocks.length ? block.codeBlocks : [{ type: 'codeBlock' as const, lang: '', code: '' }]\n const codeEls = codes.map(() => new Y.XmlElement('codeBlock'))\n el.insert(0, codeEls)\n codes.forEach((b, i) => fillBlock(codeEls[i]!, b))\n break\n }\n case 'codePreview': {\n const all = [...block.innerBlocks, ...block.codeBlocks]\n const inner = all.length ? all : [{ type: 'paragraph' as const, text: '' }]\n const innerEls = inner.map(b => new Y.XmlElement(blockElName(b)))\n el.insert(0, innerEls)\n inner.forEach((b, i) => fillBlock(innerEls[i]!, b))\n break\n }\n case 'codeTree': {\n el.setAttribute('files', block.files)\n break\n }\n case 'accordion': {\n const itemEls = block.items.map(() => new Y.XmlElement('accordionItem'))\n el.insert(0, itemEls)\n block.items.forEach((item, i) => {\n itemEls[i]!.setAttribute('label', item.label)\n if (item.icon) itemEls[i]!.setAttribute('icon', item.icon)\n const inner = item.innerBlocks.length ? item.innerBlocks : [{ type: 'paragraph' as const, text: '' }]\n const childEls = inner.map(b => new Y.XmlElement(blockElName(b)))\n itemEls[i]!.insert(0, childEls)\n inner.forEach((b, ci) => fillBlock(childEls[ci]!, b))\n })\n break\n }\n case 'tabs': {\n const itemEls = block.items.map(() => new Y.XmlElement('tabsItem'))\n el.insert(0, itemEls)\n block.items.forEach((item, i) => {\n itemEls[i]!.setAttribute('label', item.label)\n if (item.icon) itemEls[i]!.setAttribute('icon', item.icon)\n const inner = item.innerBlocks.length ? item.innerBlocks : [{ type: 'paragraph' as const, text: '' }]\n const childEls = inner.map(b => new Y.XmlElement(blockElName(b)))\n itemEls[i]!.insert(0, childEls)\n inner.forEach((b, ci) => fillBlock(childEls[ci]!, b))\n })\n break\n }\n case 'field': {\n if (block.name) el.setAttribute('name', block.name)\n el.setAttribute('type', block.fieldType)\n el.setAttribute('required', block.required as any)\n const inner = block.innerBlocks.length ? block.innerBlocks : [{ type: 'paragraph' as const, text: '' }]\n const innerEls = inner.map(b => new Y.XmlElement(blockElName(b)))\n el.insert(0, innerEls)\n inner.forEach((b, i) => fillBlock(innerEls[i]!, b))\n break\n }\n case 'fieldGroup': {\n const fieldEls = block.fields.map(b => new Y.XmlElement(blockElName(b)))\n el.insert(0, fieldEls)\n block.fields.forEach((b, i) => fillBlock(fieldEls[i]!, b))\n break\n }\n case 'image': {\n el.setAttribute('src', block.src)\n if (block.alt) el.setAttribute('alt', block.alt)\n if (block.width) el.setAttribute('width', block.width)\n if (block.height) el.setAttribute('height', block.height)\n break\n }\n case 'docEmbed': {\n el.setAttribute('docId', block.docId)\n break\n }\n case 'svgEmbed': {\n el.setAttribute('svg', block.svg)\n if (block.title) el.setAttribute('title', block.title)\n break\n }\n }\n}\n\n// ── Public API ───────────────────────────────────────────────────────────────\n\nexport function populateYDocFromMarkdown(\n fragment: Y.XmlFragment,\n markdown: string,\n fallbackTitle = 'Untitled'\n): void {\n const ydoc = fragment.doc\n if (!ydoc) {\n console.warn('[markdownToYjs] fragment has no doc — skipping population')\n return\n }\n\n const blocks = parseBlocks(markdown)\n\n let title = fallbackTitle\n let contentBlocks = blocks\n const h1 = blocks.findIndex(b => b.type === 'heading' && b.level === 1)\n if (h1 !== -1) {\n title = (blocks[h1] as { type: 'heading'; level: number; text: string }).text\n contentBlocks = blocks.filter((_, i) => i !== h1)\n }\n if (!contentBlocks.length) contentBlocks = [{ type: 'paragraph', text: '' }]\n\n ydoc.transact(() => {\n const headerEl = new Y.XmlElement('documentHeader')\n const metaEl = new Y.XmlElement('documentMeta')\n const bodyEls: Y.XmlElement[] = contentBlocks.map((b) => {\n switch (b.type) {\n case 'heading': return new Y.XmlElement('heading')\n case 'paragraph': return new Y.XmlElement('paragraph')\n case 'bulletList': return new Y.XmlElement('bulletList')\n case 'orderedList': return new Y.XmlElement('orderedList')\n case 'taskList': return new Y.XmlElement('taskList')\n case 'codeBlock': return new Y.XmlElement('codeBlock')\n case 'blockquote': return new Y.XmlElement('blockquote')\n case 'table': return new Y.XmlElement('table')\n case 'hr': return new Y.XmlElement('horizontalRule')\n case 'callout': return new Y.XmlElement('callout')\n case 'collapsible': return new Y.XmlElement('collapsible')\n case 'steps': return new Y.XmlElement('steps')\n case 'card': return new Y.XmlElement('card')\n case 'cardGroup': return new Y.XmlElement('cardGroup')\n case 'codeCollapse': return new Y.XmlElement('codeCollapse')\n case 'codeGroup': return new Y.XmlElement('codeGroup')\n case 'codePreview': return new Y.XmlElement('codePreview')\n case 'codeTree': return new Y.XmlElement('codeTree')\n case 'accordion': return new Y.XmlElement('accordion')\n case 'tabs': return new Y.XmlElement('tabs')\n case 'field': return new Y.XmlElement('field')\n case 'fieldGroup': return new Y.XmlElement('fieldGroup')\n case 'image': return new Y.XmlElement('image')\n case 'docEmbed': return new Y.XmlElement('docEmbed')\n case 'svgEmbed': return new Y.XmlElement('svgEmbed')\n }\n })\n\n fragment.insert(0, [headerEl, metaEl, ...bodyEls])\n\n const headerXt = new Y.XmlText()\n headerEl.insert(0, [headerXt])\n headerXt.insert(0, title)\n\n contentBlocks.forEach((block, i) => fillBlock(bodyEls[i]!, block))\n })\n}\n","/**\n * Document CRUD commands: read, create, rename, move, delete, type, doc.\n */\nimport * as Y from 'yjs'\nimport { registerCommand } from '../command.ts'\nimport type { CLIConnection } from '../connection.ts'\nimport type { ParsedArgs } from '../parser.ts'\nimport { readEntries, childrenOf, normalizeRootId, resolveDocument, descendantsOf } from '../resolve.ts'\nimport { printJson, relativeTime } from '../output.ts'\nimport { yjsToMarkdown } from '../converters/yjsToMarkdown.ts'\nimport { populateYDocFromMarkdown, parseFrontmatter } from '../converters/markdownToYjs.ts'\n\n/** Safely read a tree map value, converting Y.Map to plain object if needed. */\nfunction toPlain(val: any): any {\n return val instanceof Y.Map ? val.toJSON() : val\n}\n\nregisterCommand({\n name: 'doc',\n aliases: ['info:doc'],\n description: 'Show document metadata (label, type, meta, dates).',\n usage: 'doc id=<docId> | name=<label> | path=<a/b/c>',\n async run(conn: CLIConnection | null, args: ParsedArgs): Promise<string> {\n if (!conn) return 'Not connected'\n\n const docId = resolveDocument(conn, args.params, args.positional)\n if (!docId) return 'Document not found. Specify id=, name=, or path= to identify the document.'\n\n const treeMap = conn.getTreeMap()\n if (!treeMap) return 'Not connected'\n\n const raw = treeMap.get(docId)\n if (!raw) return `Document ${docId} not found in tree.`\n\n const entry = toPlain(raw)\n\n const lines = [\n `id: ${docId}`,\n `label: ${entry.label || 'Untitled'}`,\n `type: ${entry.type ?? '—'}`,\n `parent: ${entry.parentId ?? '(root)'}`,\n `order: ${entry.order ?? 0}`,\n `created: ${entry.createdAt ? new Date(entry.createdAt).toISOString() : '—'}`,\n `updated: ${entry.updatedAt ? new Date(entry.updatedAt).toISOString() : '—'} (${relativeTime(entry.updatedAt)})`,\n ]\n\n if (entry.meta && Object.keys(entry.meta).length > 0) {\n lines.push(`meta:`)\n for (const [k, v] of Object.entries(entry.meta)) {\n lines.push(` ${k}: ${typeof v === 'object' ? JSON.stringify(v) : v}`)\n }\n }\n\n // Count children\n const entries = readEntries(treeMap)\n const children = childrenOf(entries, docId)\n lines.push(`children: ${children.length}`)\n\n return lines.join('\\n')\n },\n})\n\nregisterCommand({\n name: 'read',\n aliases: ['cat', 'r'],\n description: 'Read document content as markdown.',\n usage: 'read id=<docId> | name=<label> | path=<a/b/c> [--format=json|md]',\n async run(conn: CLIConnection | null, args: ParsedArgs): Promise<string> {\n if (!conn) return 'Not connected'\n\n const docId = resolveDocument(conn, args.params, args.positional)\n if (!docId) return 'Document not found. Specify id=, name=, or path= to identify the document.'\n\n try {\n const provider = await conn.getChildProvider(docId)\n const fragment = provider.document.getXmlFragment('default')\n const { title, markdown } = yjsToMarkdown(fragment)\n\n if (args.flags.has('json') || args.params['format'] === 'json') {\n // Include tree metadata + children\n const treeMap = conn.getTreeMap()\n let label = title\n let type: string | undefined\n let meta: Record<string, unknown> | undefined\n let children: Array<{ id: string; label: string; type?: string }> = []\n if (treeMap) {\n const entry = treeMap.get(docId)\n if (entry) {\n label = entry.label || title\n type = entry.type\n meta = entry.meta\n }\n treeMap.forEach((value: any, id: string) => {\n const v = toPlain(value)\n if (v.parentId === docId) {\n children.push({ id, label: v.label || 'Untitled', type: v.type })\n }\n })\n children.sort((a: any, b: any) => {\n const va = treeMap.get(a.id)\n const vb = treeMap.get(b.id)\n return ((va?.order ?? 0) - (vb?.order ?? 0))\n })\n }\n return printJson({ label, type, meta, markdown, children })\n }\n\n return markdown || '(empty document)'\n } catch (error: any) {\n return `Error reading document: ${error.message}`\n }\n },\n})\n\nregisterCommand({\n name: 'create',\n aliases: ['new'],\n description: 'Create a new document in the tree.',\n usage: 'create label=<name> [parent=<docId>] [type=<pageType>] [content=<markdown>] [--format=json]',\n async run(conn: CLIConnection | null, args: ParsedArgs): Promise<string> {\n if (!conn) return 'Not connected'\n\n const label = args.params['label'] || args.params['name'] || args.positional[0]\n if (!label) return 'Missing required parameter: label=<name>'\n\n const treeMap = conn.getTreeMap()\n const rootDoc = conn.rootDoc\n if (!treeMap || !rootDoc) return 'Not connected'\n\n // Resolve parent\n let parentId: string | null = null\n if (args.params['parent']) {\n parentId = resolveDocument(conn, { id: args.params['parent'], name: args.params['parent'] }, [])\n if (!parentId) parentId = args.params['parent'] // Use raw value as ID\n }\n\n const normalizedParent = normalizeRootId(parentId || conn.rootDocId, conn)\n const type = args.params['type']\n\n const id = crypto.randomUUID()\n const now = Date.now()\n\n // Parse optional meta from params\n const meta: Record<string, unknown> = {}\n if (args.params['icon']) meta['icon'] = args.params['icon']\n if (args.params['color']) meta['color'] = args.params['color']\n\n rootDoc.transact(() => {\n treeMap.set(id, {\n label,\n parentId: normalizedParent,\n order: now,\n type,\n meta: Object.keys(meta).length > 0 ? meta : undefined,\n createdAt: now,\n updatedAt: now,\n })\n })\n\n // Write content if provided\n const content = args.params['content']\n if (content) {\n try {\n const provider = await conn.getChildProvider(id)\n const fragment = provider.document.getXmlFragment('default')\n const contentToWrite = content.replace(/\\\\n/g, '\\n').replace(/\\\\t/g, '\\t')\n populateYDocFromMarkdown(fragment, contentToWrite, label)\n } catch (error: any) {\n return `Created ${id} \"${label}\" but failed to write content: ${error.message}`\n }\n }\n\n if (args.params['format'] === 'json') {\n return printJson({ id, label, parentId: normalizedParent, type })\n }\n\n return `Created: ${id.slice(0, 8)}… \"${label}\"${type ? ` (${type})` : ''}`\n },\n})\n\nregisterCommand({\n name: 'rename',\n description: 'Rename a document.',\n usage: 'rename id=<docId> | name=<oldLabel> label=<newLabel>',\n async run(conn: CLIConnection | null, args: ParsedArgs): Promise<string> {\n if (!conn) return 'Not connected'\n\n const docId = resolveDocument(conn, args.params, args.positional)\n if (!docId) return 'Document not found.'\n\n const newLabel = args.params['label'] || args.params['to']\n if (!newLabel) return 'Missing required parameter: label=<newLabel>'\n\n const treeMap = conn.getTreeMap()\n if (!treeMap) return 'Not connected'\n\n const raw = treeMap.get(docId)\n if (!raw) return `Document ${docId} not found.`\n\n const entry = toPlain(raw)\n treeMap.set(docId, { ...entry, label: newLabel, updatedAt: Date.now() })\n\n return `Renamed to \"${newLabel}\"`\n },\n})\n\nregisterCommand({\n name: 'move',\n aliases: ['mv'],\n description: 'Move a document to a new parent.',\n usage: 'move id=<docId> | name=<label> to=<parentId> [order=<n>]',\n async run(conn: CLIConnection | null, args: ParsedArgs): Promise<string> {\n if (!conn) return 'Not connected'\n\n const docId = resolveDocument(conn, args.params, args.positional)\n if (!docId) return 'Document not found.'\n\n const newParentId = args.params['to'] || args.params['parent']\n if (!newParentId) return 'Missing required parameter: to=<parentId>'\n\n const treeMap = conn.getTreeMap()\n if (!treeMap) return 'Not connected'\n\n const raw = treeMap.get(docId)\n if (!raw) return `Document ${docId} not found.`\n\n const entry = toPlain(raw)\n const order = args.params['order'] ? parseInt(args.params['order'], 10) : Date.now()\n treeMap.set(docId, {\n ...entry,\n parentId: normalizeRootId(newParentId, conn),\n order,\n updatedAt: Date.now(),\n })\n\n return `Moved ${docId.slice(0, 8)}… to parent ${newParentId.slice(0, 8)}…`\n },\n})\n\nregisterCommand({\n name: 'delete',\n aliases: ['rm', 'del'],\n description: 'Soft-delete a document (moves to trash).',\n usage: 'delete id=<docId> | name=<label>',\n async run(conn: CLIConnection | null, args: ParsedArgs): Promise<string> {\n if (!conn) return 'Not connected'\n\n const docId = resolveDocument(conn, args.params, args.positional)\n if (!docId) return 'Document not found.'\n\n const treeMap = conn.getTreeMap()\n const trashMap = conn.getTrashMap()\n const rootDoc = conn.rootDoc\n if (!treeMap || !trashMap || !rootDoc) return 'Not connected'\n\n const entries = readEntries(treeMap)\n const toDelete = [docId, ...descendantsOf(entries, docId).map(e => e.id)]\n\n const now = Date.now()\n rootDoc.transact(() => {\n for (const nid of toDelete) {\n const raw = treeMap.get(nid)\n if (!raw) continue\n const entry = toPlain(raw)\n trashMap.set(nid, {\n label: entry.label || 'Untitled',\n parentId: entry.parentId ?? null,\n order: entry.order ?? 0,\n type: entry.type,\n meta: entry.meta,\n deletedAt: now,\n })\n treeMap.delete(nid)\n }\n })\n\n return `Deleted ${toDelete.length} document(s)`\n },\n})\n\nregisterCommand({\n name: 'type',\n description: 'Change the page type view of a document.',\n usage: 'type id=<docId> | name=<label> type=<pageType>',\n async run(conn: CLIConnection | null, args: ParsedArgs): Promise<string> {\n if (!conn) return 'Not connected'\n\n const docId = resolveDocument(conn, args.params, args.positional)\n if (!docId) return 'Document not found.'\n\n const newType = args.params['type'] || args.positional[1]\n if (!newType) return 'Missing required parameter: type=<pageType>'\n\n const treeMap = conn.getTreeMap()\n if (!treeMap) return 'Not connected'\n\n const raw = treeMap.get(docId)\n if (!raw) return `Document ${docId} not found.`\n\n const entry = toPlain(raw)\n treeMap.set(docId, { ...entry, type: newType, updatedAt: Date.now() })\n\n return `Changed type to \"${newType}\"`\n },\n})\n\nregisterCommand({\n name: 'write',\n description: 'Write markdown content to a document (replace or append).',\n usage: 'write id=<docId> | name=<label> content=<markdown> [mode=replace|append]',\n async run(conn: CLIConnection | null, args: ParsedArgs): Promise<string> {\n if (!conn) return 'Not connected'\n\n const docId = resolveDocument(conn, args.params, args.positional)\n if (!docId) return 'Document not found.'\n\n // Content from param, or read from stdin if piped\n let content = args.params['content']\n\n if (!content) {\n // Check if stdin is piped (not a TTY)\n if (!process.stdin.isTTY) {\n content = await readStdin()\n }\n }\n\n if (!content) return 'Missing required parameter: content=<markdown> (or pipe via stdin)'\n\n // Unescape \\n and \\t\n content = content.replace(/\\\\n/g, '\\n').replace(/\\\\t/g, '\\t')\n\n try {\n const writeMode = args.params['mode'] ?? 'replace'\n const provider = await conn.getChildProvider(docId)\n const doc = provider.document\n const fragment = doc.getXmlFragment('default')\n\n // Parse optional frontmatter\n const { title, meta, body } = parseFrontmatter(content)\n\n // Update tree metadata if frontmatter provided\n if (title || Object.keys(meta).length > 0) {\n const treeMap = conn.getTreeMap()\n const rootDoc = conn.rootDoc\n if (treeMap && rootDoc) {\n const entry = treeMap.get(docId)\n if (entry) {\n const e = toPlain(entry)\n rootDoc.transact(() => {\n const updates: Record<string, unknown> = { ...e, updatedAt: Date.now() }\n if (title) updates.label = title\n if (Object.keys(meta).length > 0) {\n updates.meta = { ...(e.meta ?? {}), ...meta }\n }\n treeMap.set(docId, updates)\n })\n }\n }\n }\n\n if (writeMode === 'replace') {\n doc.transact(() => {\n while (fragment.length > 0) {\n fragment.delete(0)\n }\n })\n }\n\n const contentToWrite = body || content\n populateYDocFromMarkdown(fragment, contentToWrite, title || 'Untitled')\n\n return `Document ${docId.slice(0, 8)}… updated (${writeMode} mode)`\n } catch (error: any) {\n return `Error writing document: ${error.message}`\n }\n },\n})\n\nregisterCommand({\n name: 'duplicate',\n aliases: ['dup'],\n description: 'Shallow-clone a document.',\n usage: 'duplicate id=<docId> | name=<label>',\n async run(conn: CLIConnection | null, args: ParsedArgs): Promise<string> {\n if (!conn) return 'Not connected'\n\n const docId = resolveDocument(conn, args.params, args.positional)\n if (!docId) return 'Document not found.'\n\n const treeMap = conn.getTreeMap()\n if (!treeMap) return 'Not connected'\n\n const raw = treeMap.get(docId)\n if (!raw) return `Document ${docId} not found.`\n\n const entry = toPlain(raw)\n const newId = crypto.randomUUID()\n treeMap.set(newId, {\n ...entry,\n label: (entry.label || 'Untitled') + ' (copy)',\n order: Date.now(),\n })\n\n return `Duplicated: ${newId.slice(0, 8)}… \"${entry.label} (copy)\"`\n },\n})\n\n/** Helper to read all of stdin as a string. */\nfunction readStdin(): Promise<string> {\n return new Promise((resolve, reject) => {\n let data = ''\n process.stdin.setEncoding('utf-8')\n process.stdin.on('data', (chunk: string) => { data += chunk })\n process.stdin.on('end', () => resolve(data))\n process.stdin.on('error', reject)\n // Safety timeout — don't hang forever\n setTimeout(() => resolve(data), 5000)\n })\n}\n","/**\n * Content commands: append, prepend, wc, export.\n */\nimport * as fs from 'node:fs'\nimport * as path from 'node:path'\nimport { registerCommand } from '../command.ts'\nimport type { CLIConnection } from '../connection.ts'\nimport type { ParsedArgs } from '../parser.ts'\nimport { resolveDocument } from '../resolve.ts'\nimport { yjsToMarkdown } from '../converters/yjsToMarkdown.ts'\nimport { populateYDocFromMarkdown } from '../converters/markdownToYjs.ts'\n\nregisterCommand({\n name: 'append',\n description: 'Append content to a document.',\n usage: 'append id=<docId> | name=<label> content=<text> [--inline]',\n async run(conn: CLIConnection | null, args: ParsedArgs): Promise<string> {\n if (!conn) return 'Not connected'\n\n const docId = resolveDocument(conn, args.params, args.positional)\n if (!docId) return 'Document not found.'\n\n const content = args.params['content']\n if (!content) return 'Missing required parameter: content=<text>'\n\n try {\n const provider = await conn.getChildProvider(docId)\n const fragment = provider.document.getXmlFragment('default')\n const text = args.flags.has('inline')\n ? content.replace(/\\\\n/g, '\\n').replace(/\\\\t/g, '\\t')\n : '\\n' + content.replace(/\\\\n/g, '\\n').replace(/\\\\t/g, '\\t')\n populateYDocFromMarkdown(fragment, text, '')\n\n return `Appended to ${docId.slice(0, 8)}…`\n } catch (error: any) {\n return `Error: ${error.message}`\n }\n },\n})\n\nregisterCommand({\n name: 'prepend',\n description: 'Prepend content to a document (after frontmatter).',\n usage: 'prepend id=<docId> | name=<label> content=<text> [--inline]',\n async run(conn: CLIConnection | null, args: ParsedArgs): Promise<string> {\n if (!conn) return 'Not connected'\n\n const docId = resolveDocument(conn, args.params, args.positional)\n if (!docId) return 'Document not found.'\n\n const content = args.params['content']\n if (!content) return 'Missing required parameter: content=<text>'\n\n try {\n const provider = await conn.getChildProvider(docId)\n const doc = provider.document\n const fragment = doc.getXmlFragment('default')\n\n // Read existing, prepend, rewrite\n const { markdown: existing } = yjsToMarkdown(fragment)\n const text = content.replace(/\\\\n/g, '\\n').replace(/\\\\t/g, '\\t')\n const combined = args.flags.has('inline')\n ? text + existing\n : text + '\\n' + existing\n\n doc.transact(() => {\n while (fragment.length > 0) {\n fragment.delete(0)\n }\n })\n populateYDocFromMarkdown(fragment, combined, '')\n\n return `Prepended to ${docId.slice(0, 8)}…`\n } catch (error: any) {\n return `Error: ${error.message}`\n }\n },\n})\n\nregisterCommand({\n name: 'wc',\n aliases: ['wordcount'],\n description: 'Count words and characters in a document.',\n usage: 'wc id=<docId> | name=<label> [--words] [--characters]',\n async run(conn: CLIConnection | null, args: ParsedArgs): Promise<string> {\n if (!conn) return 'Not connected'\n\n const docId = resolveDocument(conn, args.params, args.positional)\n if (!docId) return 'Document not found.'\n\n try {\n const provider = await conn.getChildProvider(docId)\n const fragment = provider.document.getXmlFragment('default')\n const { markdown } = yjsToMarkdown(fragment)\n\n const words = markdown.split(/\\s+/).filter(Boolean).length\n const chars = markdown.length\n\n if (args.flags.has('words')) return String(words)\n if (args.flags.has('characters')) return String(chars)\n\n return `Words: ${words}\\nCharacters: ${chars}`\n } catch (error: any) {\n return `Error: ${error.message}`\n }\n },\n})\n\nregisterCommand({\n name: 'export',\n description: 'Export a document as markdown to a local file.',\n usage: 'export id=<docId> | name=<label> output=<filepath>',\n async run(conn: CLIConnection | null, args: ParsedArgs): Promise<string> {\n if (!conn) return 'Not connected'\n\n const docId = resolveDocument(conn, args.params, args.positional)\n if (!docId) return 'Document not found.'\n\n const outputPath = args.params['output'] || args.params['to'] || args.params['path']\n if (!outputPath) return 'Missing required parameter: output=<filepath>'\n\n try {\n const provider = await conn.getChildProvider(docId)\n const fragment = provider.document.getXmlFragment('default')\n const { title, markdown } = yjsToMarkdown(fragment)\n\n const resolvedPath = path.resolve(outputPath)\n fs.writeFileSync(resolvedPath, markdown, 'utf-8')\n\n return `Exported \"${title || 'document'}\" to ${resolvedPath} (${Buffer.byteLength(markdown)} bytes)`\n } catch (error: any) {\n return `Error: ${error.message}`\n }\n },\n})\n","/**\n * Metadata commands: meta, tags.\n */\nimport * as Y from 'yjs'\nimport { registerCommand } from '../command.ts'\nimport type { CLIConnection } from '../connection.ts'\nimport type { ParsedArgs } from '../parser.ts'\nimport { readEntries, resolveDocument } from '../resolve.ts'\nimport { printJson, printTable, getFormat } from '../output.ts'\n\n/** Safely read a tree map value. */\nfunction toPlain(val: any): any {\n return val instanceof Y.Map ? val.toJSON() : val\n}\n\nregisterCommand({\n name: 'meta',\n aliases: ['metadata'],\n description: 'Get or set document metadata.',\n usage: 'meta id=<docId> | name=<label> [key=value ...] [--format=json]',\n async run(conn: CLIConnection | null, args: ParsedArgs): Promise<string> {\n if (!conn) return 'Not connected'\n\n const docId = resolveDocument(conn, args.params, args.positional)\n if (!docId) return 'Document not found.'\n\n const treeMap = conn.getTreeMap()\n if (!treeMap) return 'Not connected'\n\n const raw = treeMap.get(docId)\n if (!raw) return `Document ${docId} not found.`\n\n const entry = toPlain(raw)\n\n // Collect meta updates from remaining params\n const metaKeys = new Set(['icon', 'color', 'priority', 'status', 'checked', 'rating',\n 'tags', 'dateStart', 'dateEnd', 'datetimeStart', 'datetimeEnd', 'allDay',\n 'url', 'email', 'phone', 'number', 'unit', 'subtitle', 'note',\n 'taskProgress', 'coverUploadId', 'geoType', 'geoLat', 'geoLng',\n 'deskX', 'deskY', 'deskMode', 'spShape', 'spColor', 'chartType',\n 'kanbanColumnWidth', 'galleryColumns', 'calendarView', 'tableMode',\n ])\n\n const updates: Record<string, unknown> = {}\n let hasUpdates = false\n\n for (const [key, value] of Object.entries(args.params)) {\n if (metaKeys.has(key)) {\n // Parse special types\n if (value === 'null') {\n updates[key] = null\n } else if (value === 'true') {\n updates[key] = true\n } else if (value === 'false') {\n updates[key] = false\n } else if (['priority', 'rating', 'number', 'taskProgress', 'geoLat', 'geoLng',\n 'deskX', 'deskY', 'galleryColumns'].includes(key)) {\n updates[key] = parseFloat(value)\n } else if (key === 'tags') {\n updates[key] = value.split(',').map(s => s.trim())\n } else {\n updates[key] = value\n }\n hasUpdates = true\n }\n }\n\n if (hasUpdates) {\n // Write mode: merge updates into existing meta\n treeMap.set(docId, {\n ...entry,\n meta: { ...(entry.meta ?? {}), ...updates },\n updatedAt: Date.now(),\n })\n return `Metadata updated for ${docId.slice(0, 8)}…`\n }\n\n // Read mode: display current metadata\n const meta = entry.meta ?? {}\n if (args.params['format'] === 'json') {\n return printJson({ id: docId, label: entry.label, type: entry.type, meta })\n }\n\n if (Object.keys(meta).length === 0) {\n return `Document \"${entry.label}\" has no metadata.`\n }\n\n const lines = Object.entries(meta).map(([k, v]) =>\n `${k}: ${typeof v === 'object' ? JSON.stringify(v) : v}`\n )\n return lines.join('\\n')\n },\n})\n\nregisterCommand({\n name: 'tags',\n description: 'List tags aggregated from document metadata.',\n usage: 'tags [id=<docId>] [--counts] [--total] [--format=json|tsv]',\n async run(conn: CLIConnection | null, args: ParsedArgs): Promise<string> {\n if (!conn) return 'Not connected'\n const treeMap = conn.getTreeMap()\n if (!treeMap) return 'Not connected'\n\n // If a document is specified, show its tags\n const docId = resolveDocument(conn, args.params, args.positional)\n if (docId) {\n const raw = treeMap.get(docId)\n if (!raw) return `Document ${docId} not found.`\n const entry = toPlain(raw)\n const tags: string[] = entry.meta?.tags ?? []\n if (tags.length === 0) return 'No tags.'\n return tags.join('\\n')\n }\n\n // Aggregate tags from all documents\n const entries = readEntries(treeMap)\n const tagCounts = new Map<string, number>()\n\n for (const entry of entries) {\n const tags: string[] = (entry.meta as any)?.tags ?? []\n for (const tag of tags) {\n tagCounts.set(tag, (tagCounts.get(tag) ?? 0) + 1)\n }\n }\n\n if (tagCounts.size === 0) return 'No tags found.'\n\n if (args.flags.has('total')) {\n return String(tagCounts.size)\n }\n\n const sorted = [...tagCounts.entries()].sort((a, b) => {\n if (args.params['sort'] === 'count') return b[1] - a[1]\n return a[0].localeCompare(b[0])\n })\n\n const format = getFormat(args, 'text')\n\n if (format === 'json') {\n return printJson(sorted.map(([tag, count]) => ({ tag, count })))\n }\n\n if (args.flags.has('counts')) {\n return sorted.map(([tag, count]) => `${tag}\\t${count}`).join('\\n')\n }\n\n return sorted.map(([tag]) => tag).join('\\n')\n },\n})\n","/**\n * Awareness commands: who, status, chat.\n */\nimport { registerCommand } from '../command.ts'\nimport type { CLIConnection } from '../connection.ts'\nimport type { ParsedArgs } from '../parser.ts'\nimport { printJson, printTable, getFormat } from '../output.ts'\n\nregisterCommand({\n name: 'who',\n aliases: ['users', 'online'],\n description: 'List connected users and their awareness state.',\n usage: 'who [id=<docId>] [--format=json|tsv]',\n async run(conn: CLIConnection | null, args: ParsedArgs): Promise<string> {\n if (!conn) return 'Not connected'\n\n let awareness\n if (args.params['id']) {\n try {\n const provider = await conn.getChildProvider(args.params['id'])\n awareness = provider.awareness\n } catch (error: any) {\n return `Error: ${error.message}`\n }\n } else {\n const rootProvider = conn.rootProvider\n if (!rootProvider) return 'Not connected'\n awareness = rootProvider.awareness\n }\n\n const states = awareness.getStates()\n const selfId = awareness.clientID\n const users: Array<{\n name: string\n status: string\n docId: string\n isYou: boolean\n isAgent: boolean\n }> = []\n\n for (const [clientId, state] of states) {\n const user = (state as Record<string, any>)['user']\n if (!user) continue\n users.push({\n name: user.name ?? 'Unknown',\n status: (state as Record<string, any>)['status'] ?? '—',\n docId: (state as Record<string, any>)['docId'] ?? '—',\n isYou: clientId === selfId,\n isAgent: user.isAgent ?? false,\n })\n }\n\n const format = getFormat(args, 'text')\n\n if (format === 'json') {\n return printJson(users)\n }\n\n if (users.length === 0) {\n return 'No users connected.'\n }\n\n const rows = users.map(u => [\n u.name + (u.isYou ? ' (you)' : '') + (u.isAgent ? ' 🤖' : ''),\n u.status,\n u.docId === '—' ? '—' : u.docId.slice(0, 8) + '…',\n ])\n\n return printTable(rows, ['NAME', 'STATUS', 'DOCUMENT'])\n },\n})\n\nregisterCommand({\n name: 'status',\n description: 'Set your presence status.',\n usage: 'status <text> | status --clear',\n async run(conn: CLIConnection | null, args: ParsedArgs): Promise<string> {\n if (!conn) return 'Not connected'\n\n const rootProvider = conn.rootProvider\n if (!rootProvider) return 'Not connected'\n\n if (args.flags.has('clear')) {\n rootProvider.awareness.setLocalStateField('status', null)\n return 'Status cleared.'\n }\n\n const status = args.params['text'] || args.positional[0]\n if (!status) return 'Missing status text. Use: status <text> or status --clear'\n\n rootProvider.awareness.setLocalStateField('status', status)\n return `Status set to \"${status}\"`\n },\n})\n\nregisterCommand({\n name: 'chat',\n aliases: ['send'],\n description: 'Send a chat message to a channel.',\n usage: 'chat channel=<group:docId> text=<message>',\n async run(conn: CLIConnection | null, args: ParsedArgs): Promise<string> {\n if (!conn) return 'Not connected'\n\n const rootProvider = conn.rootProvider\n if (!rootProvider) return 'Not connected'\n\n const channel = args.params['channel']\n if (!channel) return 'Missing required parameter: channel=<group:docId>'\n\n const text = args.params['text'] || args.params['content'] || args.positional[0]\n if (!text) return 'Missing required parameter: text=<message>'\n\n rootProvider.sendStateless(JSON.stringify({\n type: 'chat:send',\n channel,\n content: text,\n sender_name: conn.displayName,\n }))\n\n return `Sent to ${channel}`\n },\n})\n","/**\n * File attachment commands: upload, uploads.\n */\nimport * as fs from 'node:fs'\nimport * as nodePath from 'node:path'\nimport { registerCommand } from '../command.ts'\nimport type { CLIConnection } from '../connection.ts'\nimport type { ParsedArgs } from '../parser.ts'\nimport { resolveDocument } from '../resolve.ts'\nimport { printJson, printTable, getFormat } from '../output.ts'\n\nregisterCommand({\n name: 'uploads',\n aliases: ['attachments'],\n description: 'List file attachments for a document.',\n usage: 'uploads id=<docId> | name=<label> [--format=json|tsv] [--total]',\n async run(conn: CLIConnection | null, args: ParsedArgs): Promise<string> {\n if (!conn) return 'Not connected'\n\n const docId = resolveDocument(conn, args.params, args.positional)\n if (!docId) return 'Document not found.'\n\n try {\n const uploads = await conn.client.listUploads(docId)\n\n if (args.flags.has('total')) {\n return String(uploads.length)\n }\n\n const format = getFormat(args, 'text')\n\n if (format === 'json') {\n return printJson(uploads)\n }\n\n if (uploads.length === 0) {\n return 'No attachments.'\n }\n\n const rows = uploads.map(u => [\n u.id.slice(0, 8) + '…',\n u.filename,\n u.mime_type ?? '—',\n u.size ? formatBytes(u.size) : '—',\n ])\n\n return printTable(rows, ['ID', 'FILENAME', 'TYPE', 'SIZE'])\n } catch (error: any) {\n return `Error: ${error.message}`\n }\n },\n})\n\nregisterCommand({\n name: 'upload',\n description: 'Upload a local file to a document.',\n usage: 'upload id=<docId> | name=<label> file=<localPath> [filename=<override>]',\n async run(conn: CLIConnection | null, args: ParsedArgs): Promise<string> {\n if (!conn) return 'Not connected'\n\n const docId = resolveDocument(conn, args.params, args.positional)\n if (!docId) return 'Document not found.'\n\n const filePath = args.params['file'] || args.params['path']\n if (!filePath) return 'Missing required parameter: file=<localPath>'\n\n try {\n const resolvedPath = nodePath.resolve(filePath)\n if (!fs.existsSync(resolvedPath)) {\n return `File not found: ${resolvedPath}`\n }\n const data = fs.readFileSync(resolvedPath)\n const filename = args.params['filename'] ?? nodePath.basename(resolvedPath)\n const blob = new Blob([data])\n const result = await conn.client.upload(docId, blob, filename)\n\n return `Uploaded: ${filename} (${formatBytes(data.length)}) → ${result.id}`\n } catch (error: any) {\n return `Error: ${error.message}`\n }\n },\n})\n\nregisterCommand({\n name: 'download',\n description: 'Download a file attachment from a document.',\n usage: 'download id=<docId> | name=<label> upload=<uploadId> output=<localPath>',\n async run(conn: CLIConnection | null, args: ParsedArgs): Promise<string> {\n if (!conn) return 'Not connected'\n\n const docId = resolveDocument(conn, args.params, args.positional)\n if (!docId) return 'Document not found.'\n\n const uploadId = args.params['upload'] || args.params['uploadId']\n if (!uploadId) return 'Missing required parameter: upload=<uploadId>'\n\n const outputPath = args.params['output'] || args.params['to']\n if (!outputPath) return 'Missing required parameter: output=<localPath>'\n\n try {\n const blob = await conn.client.getUpload(docId, uploadId)\n const buffer = Buffer.from(await blob.arrayBuffer())\n const resolvedPath = nodePath.resolve(outputPath)\n fs.writeFileSync(resolvedPath, buffer)\n\n return `Downloaded to ${resolvedPath} (${formatBytes(buffer.length)})`\n } catch (error: any) {\n return `Error: ${error.message}`\n }\n },\n})\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`\n}\n","/**\n * Permission commands: permissions.\n */\nimport { registerCommand } from '../command.ts'\nimport type { CLIConnection } from '../connection.ts'\nimport type { ParsedArgs } from '../parser.ts'\nimport { resolveDocument } from '../resolve.ts'\nimport { printJson, printTable, getFormat } from '../output.ts'\n\nregisterCommand({\n name: 'permissions',\n aliases: ['perms'],\n description: 'List or set document permissions.',\n usage: 'permissions id=<docId> [user=<userId> role=<role>] [--effective] [--format=json|tsv]',\n async run(conn: CLIConnection | null, args: ParsedArgs): Promise<string> {\n if (!conn) return 'Not connected'\n\n const docId = resolveDocument(conn, args.params, args.positional)\n if (!docId) return 'Document not found.'\n\n // Set permission mode\n const targetUser = args.params['user'] || args.params['user_id']\n const targetRole = args.params['role']\n\n if (targetUser && targetRole) {\n try {\n await conn.client.setPermission(docId, {\n user_id: targetUser,\n role: targetRole as 'owner' | 'editor' | 'viewer' | 'observer',\n })\n return `Set ${targetUser.slice(0, 12)}… → ${targetRole} on ${docId.slice(0, 8)}…`\n } catch (error: any) {\n return `Error: ${error.message}`\n }\n }\n\n // Remove permission mode\n if (targetUser && args.flags.has('remove')) {\n try {\n await conn.client.removePermission(docId, { user_id: targetUser })\n return `Removed permissions for ${targetUser.slice(0, 12)}… on ${docId.slice(0, 8)}…`\n } catch (error: any) {\n return `Error: ${error.message}`\n }\n }\n\n // List permissions mode\n try {\n const format = getFormat(args, 'text')\n\n if (args.flags.has('effective')) {\n const result = await conn.client.listEffectivePermissions(docId)\n\n if (format === 'json') {\n return printJson(result)\n }\n\n if (result.permissions.length === 0) {\n return `Default role: ${result.default_role}\\nNo explicit permissions.`\n }\n\n const rows = result.permissions.map(p => [\n p.display_name || p.username,\n p.role,\n p.source,\n p.inherited_from_doc_id ? p.inherited_from_doc_id.slice(0, 8) + '…' : '—',\n ])\n\n return `Default role: ${result.default_role}\\n\\n` +\n printTable(rows, ['USER', 'ROLE', 'SOURCE', 'INHERITED FROM'])\n }\n\n const perms = await conn.client.listPermissions(docId)\n\n if (format === 'json') {\n return printJson(perms)\n }\n\n if (perms.length === 0) {\n return 'No explicit permissions set.'\n }\n\n const rows = perms.map(p => [\n p.display_name || p.username,\n p.role,\n p.user_id.slice(0, 12) + '…',\n ])\n\n return printTable(rows, ['USER', 'ROLE', 'USER ID'])\n } catch (error: any) {\n return `Error: ${error.message}`\n }\n },\n})\n","#!/usr/bin/env node\n/**\n * Abracadabra CLI — interact with CRDT document workspaces from the terminal.\n *\n * Usage:\n * abracadabra <command> [key=value ...] [--flags]\n *\n * Environment:\n * ABRA_URL Server URL (required)\n * ABRA_KEY_FILE Path to Ed25519 key file (~/.abracadabra/cli.key)\n * ABRA_INVITE_CODE Invite code for first-run registration\n * ABRA_NAME Display name (default: CLI User)\n * ABRA_COLOR Presence color (default: hsl(45, 90%, 55%))\n */\nimport { parseArgs } from './parser.ts'\nimport { CLIConnection } from './connection.ts'\nimport { getCommand } from './command.ts'\n\n// ── Register all commands ────────────────────────────────────────────────────\n// Side-effect imports: each module calls registerCommand() at module scope.\nimport './commands/help.ts'\nimport './commands/spaces.ts'\nimport './commands/tree.ts'\nimport './commands/documents.ts'\nimport './commands/content.ts'\nimport './commands/meta.ts'\nimport './commands/awareness.ts'\nimport './commands/files.ts'\nimport './commands/permissions.ts'\n\n// ── Commands that don't require a connection ─────────────────────────────────\nconst NO_CONNECT_COMMANDS = new Set(['help', 'h', '?', 'version', 'v'])\n\nasync function main() {\n const args = parseArgs(process.argv)\n\n // Resolve command\n const cmd = getCommand(args.command)\n if (!cmd) {\n console.error(`Unknown command: \"${args.command}\"`)\n console.error('Run \"abracadabra help\" to see all commands.')\n process.exit(1)\n }\n\n // Commands that don't need a server connection\n if (NO_CONNECT_COMMANDS.has(args.command)) {\n // Try to connect for extra info (version), but don't fail\n let conn: CLIConnection | null = null\n const url = process.env['ABRA_URL']\n if (url && args.command === 'version') {\n try {\n conn = new CLIConnection({\n url,\n name: process.env['ABRA_NAME'],\n color: process.env['ABRA_COLOR'],\n inviteCode: process.env['ABRA_INVITE_CODE'],\n keyFile: process.env['ABRA_KEY_FILE'],\n quiet: true,\n })\n await conn.connect()\n } catch {\n // Silently fall back to local-only version info\n }\n }\n\n try {\n const output = await cmd.run(conn, args)\n if (output) console.log(output)\n } finally {\n if (conn) await conn.destroy().catch(() => {})\n }\n return\n }\n\n // All other commands require ABRA_URL\n const url = process.env['ABRA_URL']\n if (!url) {\n console.error('Error: ABRA_URL environment variable is required.')\n console.error('')\n console.error('Set it to your Abracadabra server URL:')\n console.error(' export ABRA_URL=https://your-server.example.com')\n console.error('')\n console.error('Run \"abracadabra help\" for more info.')\n process.exit(1)\n }\n\n const conn = new CLIConnection({\n url,\n name: process.env['ABRA_NAME'],\n color: process.env['ABRA_COLOR'],\n inviteCode: process.env['ABRA_INVITE_CODE'],\n keyFile: process.env['ABRA_KEY_FILE'],\n quiet: args.flags.has('quiet') || args.flags.has('q'),\n })\n\n try {\n await conn.connect()\n const output = await cmd.run(conn, args)\n if (output) console.log(output)\n } catch (error: any) {\n console.error(`Error: ${error.message}`)\n if (args.flags.has('verbose')) {\n console.error(error.stack)\n }\n process.exit(1)\n } finally {\n await conn.destroy().catch(() => {})\n }\n}\n\nmain().catch((err) => {\n console.error(`Fatal: ${err.message ?? err}`)\n process.exit(1)\n})\n"],"x_google_ignoreList":[1,2,3,4],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export { };