diff --git "a/pkg/holospaces_web.js" "b/pkg/holospaces_web.js" new file mode 100644--- /dev/null +++ "b/pkg/holospaces_web.js" @@ -0,0 +1,3285 @@ +/* @ts-self-types="./holospaces_web.d.ts" */ + +/** + * The **messenger peer** in the browser tab: it mints the channel's content + * (channels, signed messages forming a causal DAG, feed heads) at the + * substrate's real blake3 κ, holds it in a content-addressed store, ingests + * what other peers publish (verifying on receipt, Law L5), and linearises the + * DAG into one deterministic transcript. The transport (announce / discover / + * fetch over the κ pub/sub relay) is JavaScript's `WsKappaSync`; this peer is + * the content + identity half. No homeserver (ADR-001). + */ +export class ChatPeer { + __destroy_into_raw() { + const ptr = this.__wbg_ptr; + this.__wbg_ptr = 0; + ChatPeerFinalization.unregister(this); + return ptr; + } + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_chatpeer_free(ptr, 0); + } + /** + * This peer's 32-byte X25519 **encryption** public key — published so an + * admin can seal a channel's group key to it ([`ChatPeer::seal_key_to`]). + * @returns {Uint8Array} + */ + encryption_key() { + const ret = wasm.chatpeer_encryption_key(this.__wbg_ptr); + var v1 = getArrayU8FromWasm0(ret[0], ret[1]).slice(); + wasm.__wbindgen_free(ret[0], ret[1] * 1, 1); + return v1; + } + /** + * Publish this peer's signed feed head for `channel` — the mutable pointer + * other peers resolve to discover its latest. Returns the feed κ. + * @param {string} channel + * @param {number} timestamp_ms + * @returns {string} + */ + feed(channel, timestamp_ms) { + let deferred3_0; + let deferred3_1; + try { + const ptr0 = passStringToWasm0(channel, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.chatpeer_feed(this.__wbg_ptr, ptr0, len0, timestamp_ms); + var ptr2 = ret[0]; + var len2 = ret[1]; + if (ret[3]) { + ptr2 = 0; len2 = 0; + throw takeFromExternrefTable0(ret[2]); + } + deferred3_0 = ptr2; + deferred3_1 = len2; + return getStringFromWasm0(ptr2, len2); + } finally { + wasm.__wbindgen_free(deferred3_0, deferred3_1, 1); + } + } + /** + * The head message κ a feed points at — JS walks parents back from here. + * @param {Uint8Array} bytes + * @returns {string} + */ + feed_head(bytes) { + let deferred3_0; + let deferred3_1; + try { + const ptr0 = passArray8ToWasm0(bytes, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.chatpeer_feed_head(this.__wbg_ptr, ptr0, len0); + var ptr2 = ret[0]; + var len2 = ret[1]; + if (ret[3]) { + ptr2 = 0; len2 = 0; + throw takeFromExternrefTable0(ret[2]); + } + deferred3_0 = ptr2; + deferred3_1 = len2; + return getStringFromWasm0(ptr2, len2); + } finally { + wasm.__wbindgen_free(deferred3_0, deferred3_1, 1); + } + } + /** + * The operator's content-addressed identity κ (the κ of the ed25519 public + * key). + * @returns {string} + */ + identity() { + let deferred1_0; + let deferred1_1; + try { + const ret = wasm.chatpeer_identity(this.__wbg_ptr); + deferred1_0 = ret[0]; + deferred1_1 = ret[1]; + return getStringFromWasm0(ret[0], ret[1]); + } finally { + wasm.__wbindgen_free(deferred1_0, deferred1_1, 1); + } + } + /** + * The operator identity as a **W3C `did:key`** — the standard, registry-free + * representation of this ed25519 public key (`did:key:z6Mk…`): multibase + * base58btc of the multicodec `ed25519-pub` (0xed01) prefix + the 32-byte + * key. Lets the messenger's self-sovereign identity interoperate with the + * open decentralized-identity ecosystem (DIDs / Verifiable Credentials) + * without changing our content-addressed `Operator` κ. + * @returns {string} + */ + identity_did() { + let deferred1_0; + let deferred1_1; + try { + const ret = wasm.chatpeer_identity_did(this.__wbg_ptr); + deferred1_0 = ret[0]; + deferred1_1 = ret[1]; + return getStringFromWasm0(ret[0], ret[1]); + } finally { + wasm.__wbindgen_free(deferred1_0, deferred1_1, 1); + } + } + /** + * Ingest bytes a peer fetched over the relay, verifying on receipt (the κ is + * re-derived from the bytes, Law L5 — forged content cannot enter). If the + * bytes are a message, its head advances this peer's view of the channel. + * Returns the κ. + * @param {Uint8Array} bytes + * @returns {string} + */ + ingest(bytes) { + let deferred3_0; + let deferred3_1; + try { + const ptr0 = passArray8ToWasm0(bytes, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.chatpeer_ingest(this.__wbg_ptr, ptr0, len0); + var ptr2 = ret[0]; + var len2 = ret[1]; + if (ret[3]) { + ptr2 = 0; len2 = 0; + throw takeFromExternrefTable0(ret[2]); + } + deferred3_0 = ptr2; + deferred3_1 = len2; + return getStringFromWasm0(ptr2, len2); + } finally { + wasm.__wbindgen_free(deferred3_0, deferred3_1, 1); + } + } + /** + * **Install an epoch key from a published envelope** (member): verify the + * [`KeyEnvelope`] under the trusted channel `admin_pubkey` (rejecting a + * relay-injected or non-admin envelope), find this peer's HPKE wrap, open it, + * and adopt the key as the channel's current epoch. Returns the epoch + * installed, or `undefined` if the envelope is unauthentic or this peer is + * not one of its recipients (e.g. a removed member). + * @param {Uint8Array} bytes + * @param {Uint8Array} admin_pubkey + * @returns {number | undefined} + */ + ingest_key_envelope(bytes, admin_pubkey) { + const ptr0 = passArray8ToWasm0(bytes, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + const ptr1 = passArray8ToWasm0(admin_pubkey, wasm.__wbindgen_malloc); + const len1 = WASM_VECTOR_LEN; + const ret = wasm.chatpeer_ingest_key_envelope(this.__wbg_ptr, ptr0, len0, ptr1, len1); + if (ret[3]) { + throw takeFromExternrefTable0(ret[2]); + } + return ret[0] === 0 ? undefined : ret[1]; + } + /** + * A message's causal parent κs — the edges JS follows to pull history. + * @param {Uint8Array} bytes + * @returns {any[]} + */ + message_parents(bytes) { + const ptr0 = passArray8ToWasm0(bytes, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.chatpeer_message_parents(this.__wbg_ptr, ptr0, len0); + if (ret[3]) { + throw takeFromExternrefTable0(ret[2]); + } + var v2 = getArrayJsValueFromWasm0(ret[0], ret[1]).slice(); + wasm.__wbindgen_free(ret[0], ret[1] * 4, 4); + return v2; + } + /** + * Open a messenger peer signing as the operator whose self-sovereign public + * key is `public_key` (its κ is the author identity, Law L1). + * @param {Uint8Array} secret + */ + constructor(secret) { + const ptr0 = passArray8ToWasm0(secret, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.chatpeer_new(ptr0, len0); + this.__wbg_ptr = ret; + ChatPeerFinalization.register(this, this.__wbg_ptr, this); + return this; + } + /** + * The canonical bytes of a stored object, to hand to `WsKappaSync.announce`. + * @param {string} kappa + * @returns {Uint8Array | undefined} + */ + object(kappa) { + const ptr0 = passStringToWasm0(kappa, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.chatpeer_object(this.__wbg_ptr, ptr0, len0); + let v2; + if (ret[0] !== 0) { + v2 = getArrayU8FromWasm0(ret[0], ret[1]).slice(); + wasm.__wbindgen_free(ret[0], ret[1] * 1, 1); + } + return v2; + } + /** + * Open a channel; its κ is the genesis every message refers back to. The + * genesis bytes are stored so the peer can publish them. Returns the κ. + * @param {string} name + * @param {number} created_ms + * @returns {string} + */ + open_channel(name, created_ms) { + let deferred3_0; + let deferred3_1; + try { + const ptr0 = passStringToWasm0(name, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.chatpeer_open_channel(this.__wbg_ptr, ptr0, len0, created_ms); + var ptr2 = ret[0]; + var len2 = ret[1]; + if (ret[3]) { + ptr2 = 0; len2 = 0; + throw takeFromExternrefTable0(ret[2]); + } + deferred3_0 = ptr2; + deferred3_1 = len2; + return getStringFromWasm0(ptr2, len2); + } finally { + wasm.__wbindgen_free(deferred3_0, deferred3_1, 1); + } + } + /** + * Open a group key HPKE-sealed to this peer with + * [`seal_key_to`](ChatPeer::seal_key_to). + * @param {Uint8Array} wrapped + * @returns {Uint8Array} + */ + open_sealed_key(wrapped) { + const ptr0 = passArray8ToWasm0(wrapped, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.chatpeer_open_sealed_key(this.__wbg_ptr, ptr0, len0); + if (ret[3]) { + throw takeFromExternrefTable0(ret[2]); + } + var v2 = getArrayU8FromWasm0(ret[0], ret[1]).slice(); + wasm.__wbindgen_free(ret[0], ret[1] * 1, 1); + return v2; + } + /** + * Post a signed message into `channel`, parented on this peer's current head + * for that channel (its causal view). Stores it and advances the head. + * Returns the message κ. + * @param {string} channel + * @param {number} timestamp_ms + * @param {string} body + * @returns {string} + */ + post(channel, timestamp_ms, body) { + let deferred4_0; + let deferred4_1; + try { + const ptr0 = passStringToWasm0(channel, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ptr1 = passStringToWasm0(body, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + const ret = wasm.chatpeer_post(this.__wbg_ptr, ptr0, len0, timestamp_ms, ptr1, len1); + var ptr3 = ret[0]; + var len3 = ret[1]; + if (ret[3]) { + ptr3 = 0; len3 = 0; + throw takeFromExternrefTable0(ret[2]); + } + deferred4_0 = ptr3; + deferred4_1 = len3; + return getStringFromWasm0(ptr3, len3); + } finally { + wasm.__wbindgen_free(deferred4_0, deferred4_1, 1); + } + } + /** + * Post a **sealed** message: the `plaintext` is AEAD-encrypted under the + * 32-byte channel `key` before it becomes the (opaque) message body, so the + * relay and non-members see only ciphertext. The message is still signed + * (authenticity) and the ciphertext is bound into its κ (Law L5). Returns + * the message κ. + * @param {string} channel + * @param {number} timestamp_ms + * @param {string} plaintext + * @param {Uint8Array} key + * @returns {string} + */ + post_sealed(channel, timestamp_ms, plaintext, key) { + let deferred5_0; + let deferred5_1; + try { + const ptr0 = passStringToWasm0(channel, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ptr1 = passStringToWasm0(plaintext, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + const ptr2 = passArray8ToWasm0(key, wasm.__wbindgen_malloc); + const len2 = WASM_VECTOR_LEN; + const ret = wasm.chatpeer_post_sealed(this.__wbg_ptr, ptr0, len0, timestamp_ms, ptr1, len1, ptr2, len2); + var ptr4 = ret[0]; + var len4 = ret[1]; + if (ret[3]) { + ptr4 = 0; len4 = 0; + throw takeFromExternrefTable0(ret[2]); + } + deferred5_0 = ptr4; + deferred5_1 = len4; + return getStringFromWasm0(ptr4, len4); + } finally { + wasm.__wbindgen_free(deferred5_0, deferred5_1, 1); + } + } + /** + * Post to a closed channel under its **current epoch key** (E2E sealed). The + * body is `epoch(4) ‖ ChaCha20-Poly1305(group_key, plaintext)`, so a reader + * selects the right epoch key and a removed member cannot read new epochs. + * @param {string} channel + * @param {number} timestamp_ms + * @param {string} plaintext + * @returns {string} + */ + post_to(channel, timestamp_ms, plaintext) { + let deferred4_0; + let deferred4_1; + try { + const ptr0 = passStringToWasm0(channel, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ptr1 = passStringToWasm0(plaintext, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + const ret = wasm.chatpeer_post_to(this.__wbg_ptr, ptr0, len0, timestamp_ms, ptr1, len1); + var ptr3 = ret[0]; + var len3 = ret[1]; + if (ret[3]) { + ptr3 = 0; len3 = 0; + throw takeFromExternrefTable0(ret[2]); + } + deferred4_0 = ptr3; + deferred4_1 = len3; + return getStringFromWasm0(ptr3, len3); + } finally { + wasm.__wbindgen_free(deferred4_0, deferred4_1, 1); + } + } + /** + * This peer's 32-byte ed25519 public key — published so other peers can + * authenticate its messages with [`ChatPeer::verify_message`]. + * @returns {Uint8Array} + */ + public_key() { + const ret = wasm.chatpeer_public_key(this.__wbg_ptr); + var v1 = getArrayU8FromWasm0(ret[0], ret[1]).slice(); + wasm.__wbindgen_free(ret[0], ret[1] * 1, 1); + return v1; + } + /** + * **Rekey a closed channel** (admin): mint a fresh random group key for the + * next epoch, HPKE-seal it to each member's encryption key, and return a + * **signed [`KeyEnvelope`]** as canonical bytes — content the admin publishes + * over the relay (its κ is `kappa(bytes)`). Installs the key locally as the + * channel's current epoch. Removing a member is rekeying to the smaller set: + * no envelope entry for them, so they cannot derive the new epoch's key. + * @param {string} channel + * @param {Uint8Array[]} member_pubkeys + * @returns {Uint8Array} + */ + rekey(channel, member_pubkeys) { + const ptr0 = passStringToWasm0(channel, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ptr1 = passArrayJsValueToWasm0(member_pubkeys, wasm.__wbindgen_malloc); + const len1 = WASM_VECTOR_LEN; + const ret = wasm.chatpeer_rekey(this.__wbg_ptr, ptr0, len0, ptr1, len1); + if (ret[3]) { + throw takeFromExternrefTable0(ret[2]); + } + var v3 = getArrayU8FromWasm0(ret[0], ret[1]).slice(); + wasm.__wbindgen_free(ret[0], ret[1] * 1, 1); + return v3; + } + /** + * **Seal a group key to a member with HPKE** (RFC 9180, base mode): the + * standard hybrid encryption to the recipient's + * [`encryption_key`](ChatPeer::encryption_key), so only that member can + * open it. Output is `encapsulated_key(32) ‖ ciphertext`. + * @param {Uint8Array} group_key + * @param {Uint8Array} recipient_pub + * @returns {Uint8Array} + */ + seal_key_to(group_key, recipient_pub) { + const ptr0 = passArray8ToWasm0(group_key, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + const ptr1 = passArray8ToWasm0(recipient_pub, wasm.__wbindgen_malloc); + const len1 = WASM_VECTOR_LEN; + const ret = wasm.chatpeer_seal_key_to(this.__wbg_ptr, ptr0, len0, ptr1, len1); + if (ret[3]) { + throw takeFromExternrefTable0(ret[2]); + } + var v3 = getArrayU8FromWasm0(ret[0], ret[1]).slice(); + wasm.__wbindgen_free(ret[0], ret[1] * 1, 1); + return v3; + } + /** + * The channel's transcript: every stored message for `channel`, linearised + * by [`order`](holospaces::chat::order) into the single sequence every peer + * computes identically. JSON `[{ author, body, ts, kappa }, …]`. + * @param {string} channel + * @returns {string} + */ + transcript(channel) { + let deferred3_0; + let deferred3_1; + try { + const ptr0 = passStringToWasm0(channel, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.chatpeer_transcript(this.__wbg_ptr, ptr0, len0); + var ptr2 = ret[0]; + var len2 = ret[1]; + if (ret[3]) { + ptr2 = 0; len2 = 0; + throw takeFromExternrefTable0(ret[2]); + } + deferred3_0 = ptr2; + deferred3_1 = len2; + return getStringFromWasm0(ptr2, len2); + } finally { + wasm.__wbindgen_free(deferred3_0, deferred3_1, 1); + } + } + /** + * The closed channel's transcript, each message decrypted under the epoch + * key it was sealed with. A message whose epoch key this peer lacks (e.g. an + * epoch it was removed before) is reported `decryptable: false`. JSON + * `[{ author, body, ts, kappa, epoch, decryptable }, …]`. + * @param {string} channel + * @returns {string} + */ + transcript_of(channel) { + let deferred3_0; + let deferred3_1; + try { + const ptr0 = passStringToWasm0(channel, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.chatpeer_transcript_of(this.__wbg_ptr, ptr0, len0); + var ptr2 = ret[0]; + var len2 = ret[1]; + if (ret[3]) { + ptr2 = 0; len2 = 0; + throw takeFromExternrefTable0(ret[2]); + } + deferred3_0 = ptr2; + deferred3_1 = len2; + return getStringFromWasm0(ptr2, len2); + } finally { + wasm.__wbindgen_free(deferred3_0, deferred3_1, 1); + } + } + /** + * The channel transcript with bodies **decrypted** under `key` + * (the [`transcript`](ChatPeer::transcript) counterpart for sealed channels). + * A body that fails to decrypt (wrong key / tampered) is reported as + * `decryptable: false` rather than crashing. JSON `[{ author, body, ts, + * kappa, decryptable }, …]`. + * @param {string} channel + * @param {Uint8Array} key + * @returns {string} + */ + transcript_sealed(channel, key) { + let deferred4_0; + let deferred4_1; + try { + const ptr0 = passStringToWasm0(channel, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ptr1 = passArray8ToWasm0(key, wasm.__wbindgen_malloc); + const len1 = WASM_VECTOR_LEN; + const ret = wasm.chatpeer_transcript_sealed(this.__wbg_ptr, ptr0, len0, ptr1, len1); + var ptr3 = ret[0]; + var len3 = ret[1]; + if (ret[3]) { + ptr3 = 0; len3 = 0; + throw takeFromExternrefTable0(ret[2]); + } + deferred4_0 = ptr3; + deferred4_1 = len3; + return getStringFromWasm0(ptr3, len3); + } finally { + wasm.__wbindgen_free(deferred4_0, deferred4_1, 1); + } + } + /** + * Authenticate message bytes against an author's `public_key`: real ed25519 + * verification of the carried signature over the canonical signing bytes, + * *and* that the key's κ matches the message's author (Law L1). A tampered + * body, a forged signature, or the wrong key all return `false`. + * @param {Uint8Array} bytes + * @param {Uint8Array} public_key + * @returns {boolean} + */ + verify_message(bytes, public_key) { + const ptr0 = passArray8ToWasm0(bytes, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + const ptr1 = passArray8ToWasm0(public_key, wasm.__wbindgen_malloc); + const len1 = WASM_VECTOR_LEN; + const ret = wasm.chatpeer_verify_message(this.__wbg_ptr, ptr0, len0, ptr1, len1); + if (ret[2]) { + throw takeFromExternrefTable0(ret[1]); + } + return ret[0] !== 0; + } +} +if (Symbol.dispose) ChatPeer.prototype[Symbol.dispose] = ChatPeer.prototype.free; + +/** + * The Platform Manager console, running as a browser peer that composes the + * substrate runtime over the interpreter `ContainerEngine`. + */ +export class Console { + __destroy_into_raw() { + const ptr = this.__wbg_ptr; + this.__wbg_ptr = 0; + ConsoleFinalization.unregister(this); + return ptr; + } + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_console_free(ptr, 0); + } + /** + * Boot a userland holospace **in the browser**: provision it, then spawn it + * through the substrate runtime over the interpreter `ContainerEngine`, + * capture a κ snapshot of its state (suspend), resume, and terminate — the + * execution surface running on the browser peer (ADR-008; RT2; `CC-6`). + * Returns the κ-label of the suspend snapshot (state is content, Law L3). + * @param {Uint8Array} module + * @param {number} memory_bytes + * @returns {string} + */ + boot_userland(module, memory_bytes) { + let deferred3_0; + let deferred3_1; + try { + const ptr0 = passArray8ToWasm0(module, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.console_boot_userland(this.__wbg_ptr, ptr0, len0, memory_bytes); + var ptr2 = ret[0]; + var len2 = ret[1]; + if (ret[3]) { + ptr2 = 0; len2 = 0; + throw takeFromExternrefTable0(ret[2]); + } + deferred3_0 = ptr2; + deferred3_1 = len2; + return getStringFromWasm0(ptr2, len2); + } finally { + wasm.__wbindgen_free(deferred3_0, deferred3_1, 1); + } + } + /** + * *Control panel: configure.* Reconfigure a running instance from the panel + * (ADR-018; `CC-28`). `directives_json` is a JSON array of operations across + * the four classes, e.g. `[{"lifecycle":"suspend"}, {"forwardPort":8080}, + * {"unforwardPort":8080}, {"network":{"fetch":true,"announce":false}}, + * {"quota":1073741824}, {"grant":"blake3:…"}]`. The panel builds a + * content-addressed [`Configuration`] issued by the signed-in operator, + * stores it (Law L2), and returns its κ — the content the running instance + * resolves and applies over the substrate (no server, no RPC). + * @param {string} instance + * @param {string} directives_json + * @returns {string} + */ + configure(instance, directives_json) { + let deferred4_0; + let deferred4_1; + try { + const ptr0 = passStringToWasm0(instance, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ptr1 = passStringToWasm0(directives_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + const ret = wasm.console_configure(this.__wbg_ptr, ptr0, len0, ptr1, len1); + var ptr3 = ret[0]; + var len3 = ret[1]; + if (ret[3]) { + ptr3 = 0; len3 = 0; + throw takeFromExternrefTable0(ret[2]); + } + deferred4_0 = ptr3; + deferred4_1 = len3; + return getStringFromWasm0(ptr3, len3); + } finally { + wasm.__wbindgen_free(deferred4_0, deferred4_1, 1); + } + } + /** + * Open a fresh console — a browser peer with a local content-addressed + * store and the interpreter container engine. + */ + constructor() { + const ret = wasm.console_new(); + this.__wbg_ptr = ret; + ConsoleFinalization.register(this, this.__wbg_ptr, this); + return this; + } + /** + * Provision a holospace from a `.holo` compute artifact (the *holo-file* + * compute form) with a memory budget, κ-addressing its parts into the + * peer's store (Law L2). Returns the holospace identity κ. + * @param {Uint8Array} code + * @param {number} memory_bytes + * @returns {string} + */ + provision(code, memory_bytes) { + let deferred3_0; + let deferred3_1; + try { + const ptr0 = passArray8ToWasm0(code, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.console_provision(this.__wbg_ptr, ptr0, len0, memory_bytes); + var ptr2 = ret[0]; + var len2 = ret[1]; + if (ret[3]) { + ptr2 = 0; len2 = 0; + throw takeFromExternrefTable0(ret[2]); + } + deferred3_0 = ptr2; + deferred3_1 = len2; + return getStringFromWasm0(ptr2, len2); + } finally { + wasm.__wbindgen_free(deferred3_0, deferred3_1, 1); + } + } + /** + * Provision a holospace from a **devcontainer** for the management console + * (CC-12): the `devcontainer.json` is validated against the Dev Container + * spec (`CC-4`) and κ-addressed into the store; the holospace's identity is + * the content address of its devcontainer definition (reproducible — same + * source ⇒ same κ, Law L1). This *provisions* (records) the holospace; the + * operator *enters* it to boot its OS in the workspace IDE (`CC-13`). + * Returns the holospace identity κ. + * @param {Uint8Array} config_json + * @param {number} memory_bytes + * @returns {string} + */ + provision_devcontainer(config_json, memory_bytes) { + let deferred3_0; + let deferred3_1; + try { + const ptr0 = passArray8ToWasm0(config_json, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.console_provision_devcontainer(this.__wbg_ptr, ptr0, len0, memory_bytes); + var ptr2 = ret[0]; + var len2 = ret[1]; + if (ret[3]) { + ptr2 = 0; len2 = 0; + throw takeFromExternrefTable0(ret[2]); + } + deferred3_0 = ptr2; + deferred3_1 = len2; + return getStringFromWasm0(ptr2, len2); + } finally { + wasm.__wbindgen_free(deferred3_0, deferred3_1, 1); + } + } + /** + * Provision a holospace from a *Wasm-recompiled userland* (the execution + * surface, the second compute form — ADR-008). The module is validated + * against the surface contract ([`validate_userland`]) before it is + * κ-addressed into the store, so only a substrate-valid userland can become + * a holospace's code. Returns the holospace identity κ. + * @param {Uint8Array} module + * @param {number} memory_bytes + * @returns {string} + */ + provision_userland(module, memory_bytes) { + let deferred3_0; + let deferred3_1; + try { + const ptr0 = passArray8ToWasm0(module, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.console_provision_userland(this.__wbg_ptr, ptr0, len0, memory_bytes); + var ptr2 = ret[0]; + var len2 = ret[1]; + if (ret[3]) { + ptr2 = 0; len2 = 0; + throw takeFromExternrefTable0(ret[2]); + } + deferred3_0 = ptr2; + deferred3_1 = len2; + return getStringFromWasm0(ptr2, len2); + } finally { + wasm.__wbindgen_free(deferred3_0, deferred3_1, 1); + } + } + /** + * Resolve a holospace (or any κ) from the local store, verifying it by + * re-derivation (Law L5). Returns the bytes, or `undefined` if absent. + * @param {string} kappa + * @returns {Uint8Array | undefined} + */ + resolve(kappa) { + const ptr0 = passStringToWasm0(kappa, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.console_resolve(this.__wbg_ptr, ptr0, len0); + if (ret[3]) { + throw takeFromExternrefTable0(ret[2]); + } + let v2; + if (ret[0] !== 0) { + v2 = getArrayU8FromWasm0(ret[0], ret[1]).slice(); + wasm.__wbindgen_free(ret[0], ret[1] * 1, 1); + } + return v2; + } + /** + * The operator's roster κ — the content address that links their instances + * (R5). Its bytes are in the store, so another instance can resolve it. + * @returns {string | undefined} + */ + roster_kappa() { + const ret = wasm.console_roster_kappa(this.__wbg_ptr); + let v1; + if (ret[0] !== 0) { + v1 = getStringFromWasm0(ret[0], ret[1]).slice(); + wasm.__wbindgen_free(ret[0], ret[1] * 1, 1); + } + return v1; + } + /** + * Import and run a **devcontainer in the browser** — the Codespaces/Gitpod + * scenario without a Docker daemon or a cloud VM (arc42 chapter 1, the + * motivating scenario; chapter 6). The `devcontainer.json` is validated + * against the Dev Container spec (`CC-4`); the κ-addressed Wasm `userland` + * its config selects is validated against the host-ABI surface (`CC-6`) and + * booted through the substrate runtime over the interpreter engine — same + * lifecycle as a native or remote peer (Q6). Returns the suspend snapshot κ. + * @param {string} repo + * @param {string} reference + * @param {string} config_path + * @param {Uint8Array} config_json + * @param {Uint8Array} userland_module + * @param {number} memory_bytes + * @returns {string} + */ + run_devcontainer(repo, reference, config_path, config_json, userland_module, memory_bytes) { + let deferred7_0; + let deferred7_1; + try { + const ptr0 = passStringToWasm0(repo, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ptr1 = passStringToWasm0(reference, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + const ptr2 = passStringToWasm0(config_path, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len2 = WASM_VECTOR_LEN; + const ptr3 = passArray8ToWasm0(config_json, wasm.__wbindgen_malloc); + const len3 = WASM_VECTOR_LEN; + const ptr4 = passArray8ToWasm0(userland_module, wasm.__wbindgen_malloc); + const len4 = WASM_VECTOR_LEN; + const ret = wasm.console_run_devcontainer(this.__wbg_ptr, ptr0, len0, ptr1, len1, ptr2, len2, ptr3, len3, ptr4, len4, memory_bytes); + var ptr6 = ret[0]; + var len6 = ret[1]; + if (ret[3]) { + ptr6 = 0; len6 = 0; + throw takeFromExternrefTable0(ret[2]); + } + deferred7_0 = ptr6; + deferred7_1 = len6; + return getStringFromWasm0(ptr6, len6); + } finally { + wasm.__wbindgen_free(deferred7_0, deferred7_1, 1); + } + } + /** + * Sign in by unlocking a self-sovereign key (not a server account, + * ADR-001). Returns the operator's content-addressed identity κ. + * @param {Uint8Array} key + * @returns {string} + */ + sign_in(key) { + let deferred2_0; + let deferred2_1; + try { + const ptr0 = passArray8ToWasm0(key, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.console_sign_in(this.__wbg_ptr, ptr0, len0); + deferred2_0 = ret[0]; + deferred2_1 = ret[1]; + return getStringFromWasm0(ret[0], ret[1]); + } finally { + wasm.__wbindgen_free(deferred2_0, deferred2_1, 1); + } + } + /** + * The console's View — a JSON projection of the operator and their + * holospaces (what the UI renders). + * @returns {string} + */ + view() { + let deferred1_0; + let deferred1_1; + try { + const ret = wasm.console_view(this.__wbg_ptr); + deferred1_0 = ret[0]; + deferred1_1 = ret[1]; + return getStringFromWasm0(ret[0], ret[1]); + } finally { + wasm.__wbindgen_free(deferred1_0, deferred1_1, 1); + } + } +} +if (Symbol.dispose) Console.prototype[Symbol.dispose] = Console.prototype.free; + +/** + * A devcontainer's OCI image, assembled into a bootable root filesystem *in the + * browser* — the Layer Assembler (`CC-7` / the in-crate ext4 writer) running as + * the wasm peer. The operator's page fetches the devcontainer's image layers + * from the cold-start gateway (verified by re-derivation before they are added), + * then assembles them here; the result boots over the emulator's `virtio-blk` + * ([`Workspace::boot_devcontainer`], `CC-14`). The browser peer *is* the + * machine — no server assembles or boots the OS (Law L1/L4). + */ +export class DevcontainerImage { + __destroy_into_raw() { + const ptr = this.__wbg_ptr; + this.__wbg_ptr = 0; + DevcontainerImageFinalization.unregister(this); + return ptr; + } + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_devcontainerimage_free(ptr, 0); + } + /** + * Add an OCI image layer (its media type + the verified blob bytes), in + * order from the base layer up. + * @param {string} media_type + * @param {Uint8Array} blob + */ + add_layer(media_type, blob) { + const ptr0 = passStringToWasm0(media_type, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ptr1 = passArray8ToWasm0(blob, wasm.__wbindgen_malloc); + const len1 = WASM_VECTOR_LEN; + wasm.devcontainerimage_add_layer(this.__wbg_ptr, ptr0, len0, ptr1, len1); + } + /** + * Assemble the layers into a bootable `ext4` root filesystem (gunzip + + * untar + OCI whiteout overlay + the in-crate ext4 writer; Law L4). The + * bytes back a [`Workspace::boot_devcontainer`] machine's `virtio-blk` disk. + * @returns {Uint8Array} + */ + assemble() { + const ret = wasm.devcontainerimage_assemble(this.__wbg_ptr); + if (ret[3]) { + throw takeFromExternrefTable0(ret[2]); + } + var v1 = getArrayU8FromWasm0(ret[0], ret[1]).slice(); + wasm.__wbindgen_free(ret[0], ret[1] * 1, 1); + return v1; + } + /** + * Assemble the layers into a **bootable, interactive, writable** root + * filesystem on a `disk_bytes`-sized disk: the same overlay as + * [`Self::assemble`], plus the persistent devcontainer + * [`/init`](holospaces::machine::DEVCONTAINER_INIT) injected — it mounts the + * pseudo filesystems and the shared `virtio-9p` workspace and execs a shell, + * so the booted OS stays running as a dev environment instead of powering off + * after boot — and sized to `disk_bytes` so the OS has room to work (the + * devcontainer's disk; the caller's to choose, not a hidden cap). The base + * image must provide a static `/bin/busybox`. + * @param {number} disk_bytes + * @returns {Uint8Array} + */ + assemble_bootable(disk_bytes) { + const ret = wasm.devcontainerimage_assemble_bootable(this.__wbg_ptr, disk_bytes); + if (ret[3]) { + throw takeFromExternrefTable0(ret[2]); + } + var v1 = getArrayU8FromWasm0(ret[0], ret[1]).slice(); + wasm.__wbindgen_free(ret[0], ret[1] * 1, 1); + return v1; + } + /** + * A new, empty image (add its layers lowest-first with [`Self::add_layer`]). + */ + constructor() { + const ret = wasm.devcontainerimage_new(); + this.__wbg_ptr = ret; + DevcontainerImageFinalization.register(this, this.__wbg_ptr, this); + return this; + } +} +if (Symbol.dispose) DevcontainerImage.prototype[Symbol.dispose] = DevcontainerImage.prototype.free; + +/** + * **The `Linux` app** — a real RISC-V (RV64GC) Linux machine running in the + * browser tab. It wraps the holospaces [emulator](holospaces::emulator) booted + * by the [Boot Orchestrator](holospaces::machine): a real, unmodified RISC-V + * kernel `Image` over the SBI firmware, rooting on a bootable `ext4` disk + * (busybox + the interactive [`/init`](holospaces::machine::DEVCONTAINER_INIT)) + * over `virtio-blk`, with the SBI/HVC console wired through to a terminal. + * + * The familiar Linux boot UX is the kernel's own console log streaming into + * xterm.js as it boots, ending at an interactive `holospace:/workspace#` shell. + * The JS side drives it: pump [`run`](Self::run) (in a worker, so the tab stays + * responsive), [`take_console`](Self::take_console) the new output into the + * terminal each tick, and deliver keystrokes with [`feed`](Self::feed) — exactly + * the [`boot_linux`](https://github.com/Hologram-Technologies/holospaces) example + * loop, in the browser. + */ +export class LinuxVm { + static __wrap(ptr) { + const obj = Object.create(LinuxVm.prototype); + obj.__wbg_ptr = ptr; + LinuxVmFinalization.register(obj, obj.__wbg_ptr, obj); + return obj; + } + __destroy_into_raw() { + const ptr = this.__wbg_ptr; + this.__wbg_ptr = 0; + LinuxVmFinalization.unregister(this); + return ptr; + } + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_linuxvm_free(ptr, 0); + } + /** + * Capture the current machine state into the store and return its κ — the + * parent state of the next step (taken at a quiesced prompt), or the result + * state to memoize. Page-deduplicated, so an unchanged page costs nothing. + * @returns {string} + */ + capture() { + let deferred2_0; + let deferred2_1; + try { + const ret = wasm.linuxvm_capture(this.__wbg_ptr); + var ptr1 = ret[0]; + var len1 = ret[1]; + if (ret[3]) { + ptr1 = 0; len1 = 0; + throw takeFromExternrefTable0(ret[2]); + } + deferred2_0 = ptr1; + deferred2_1 = len1; + return getStringFromWasm0(ptr1, len1); + } finally { + wasm.__wbindgen_free(deferred2_0, deferred2_1, 1); + } + } + /** + * The guest's exit code once halted (`undefined` while still running; `-1` + * for a processor trap). + * @returns {number | undefined} + */ + exit_code() { + const ret = wasm.linuxvm_exit_code(this.__wbg_ptr); + return ret[0] === 0 ? undefined : ret[1]; + } + /** + * Deliver terminal input (keystrokes / paste) to the guest's console — the + * stdin side of the interactive shell. + * @param {Uint8Array} bytes + */ + feed(bytes) { + const ptr0 = passArray8ToWasm0(bytes, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + wasm.linuxvm_feed(this.__wbg_ptr, ptr0, len0); + } + /** + * A human-readable halt reason once halted (`undefined` while running). + * @returns {string | undefined} + */ + halt_reason() { + const ret = wasm.linuxvm_halt_reason(this.__wbg_ptr); + let v1; + if (ret[0] !== 0) { + v1 = getStringFromWasm0(ret[0], ret[1]).slice(); + wasm.__wbindgen_free(ret[0], ret[1] * 1, 1); + } + return v1; + } + /** + * Whether the machine has halted (powered off or faulted). + * @returns {boolean} + */ + halted() { + const ret = wasm.linuxvm_halted(this.__wbg_ptr); + return ret !== 0; + } + /** + * Instructions processed so far — drives a live **MIPS** readout in the UI + * (`instret` / wall-time). `f64` carries the count losslessly well past any + * realistic boot. + * @returns {number} + */ + instret() { + const ret = wasm.linuxvm_instret(this.__wbg_ptr); + return ret; + } + /** + * Boot a real Linux machine. `kernel` is the **decompressed** RISC-V `Image` + * (gunzip the shipped `linux-kernel.bin.gz`); `rootfs` is the bootable `ext4` + * disk (the decompressed `linux-rootfs.ext4`). Returns a machine loaded and + * ready to [`run`](Self::run) — the default 512 MiB devcontainer machine + * ([`MachineSpec::devcontainer`]), rooting `/dev/vda` over the SBI console. + * @param {Uint8Array} kernel + * @param {Uint8Array} rootfs + */ + constructor(kernel, rootfs) { + const ptr0 = passArray8ToWasm0(kernel, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + const ptr1 = passArray8ToWasm0(rootfs, wasm.__wbindgen_malloc); + const len1 = WASM_VECTOR_LEN; + const ret = wasm.linuxvm_new(ptr0, len0, ptr1, len1); + if (ret[2]) { + throw takeFromExternrefTable0(ret[1]); + } + this.__wbg_ptr = ret[0]; + LinuxVmFinalization.register(this, this.__wbg_ptr, this); + return this; + } + /** + * **Warm-start** the machine from a snapshot `pack` — the booted shell in + * O(1), skipping the assemble-and-boot entirely (the difference between a + * multi-minute boot and an instant prompt). `pack` is the *decompressed* + * snapshot the build-time generator produced (`linux-snapshot.bin.gz`): the + * content-addressed, page-deduplicated state of the booted machine (RAM + + * rootfs). [`unpack`](holospaces::snapshot::unpack) re-derives every page's κ + * on load (Law L5), and the boot is deterministic, so this reconstructs the + * exact machine a cold boot would have produced (Law L1). Seed the terminal + * with the captured boot log via [`seed_console`](Self::seed_console). + * @param {Uint8Array} pack + * @returns {LinuxVm} + */ + static restore(pack) { + const ptr0 = passArray8ToWasm0(pack, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.linuxvm_restore(ptr0, len0); + if (ret[2]) { + throw takeFromExternrefTable0(ret[1]); + } + return LinuxVm.__wrap(ret[0]); + } + /** + * **Serve a memoized result in O(1):** restore the machine to `kappa` — + * demand-paged, so it returns immediately and faults its working set in + * lazily from the store (sub-frame), rather than materializing all RAM. The + * console resets (a side-channel, not snapshotted); the worker replays the + * command's memoized output to the terminal. + * @param {string} kappa + */ + restore_kappa(kappa) { + const ptr0 = passStringToWasm0(kappa, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.linuxvm_restore_kappa(this.__wbg_ptr, ptr0, len0); + if (ret[1]) { + throw takeFromExternrefTable0(ret[0]); + } + } + /** + * Step the machine up to `max_steps` instructions. Returns `true` while the + * machine is still live (the step budget was exhausted — call again next + * tick), `false` once the guest has halted (a clean poweroff or a fault); + * after that, [`exit_code`](Self::exit_code)/[`halt_reason`](Self::halt_reason) + * describe the end state and further calls are no-ops. + * @param {number} max_steps + * @returns {boolean} + */ + run(max_steps) { + const ret = wasm.linuxvm_run(this.__wbg_ptr, max_steps); + return ret !== 0; + } + /** + * Replay a captured console (the boot log) into the terminal after a warm + * [`restore`](Self::restore), so the booted shell renders immediately rather + * than as a blank screen. The console is a side-channel, not part of the + * state κ, so seeding it does not change the machine. + * @param {Uint8Array} bytes + */ + seed_console(bytes) { + const ptr0 = passArray8ToWasm0(bytes, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + wasm.linuxvm_seed_console(this.__wbg_ptr, ptr0, len0); + } + /** + * The memo key for a step: the content address of `(parent state κ, input + * bytes)`. Identical state + identical input ⇒ identical key (Law L1). + * @param {string} parent + * @param {Uint8Array} input + * @returns {string} + */ + step_key(parent, input) { + let deferred4_0; + let deferred4_1; + try { + const ptr0 = passStringToWasm0(parent, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ptr1 = passArray8ToWasm0(input, wasm.__wbindgen_malloc); + const len1 = WASM_VECTOR_LEN; + const ret = wasm.linuxvm_step_key(this.__wbg_ptr, ptr0, len0, ptr1, len1); + var ptr3 = ret[0]; + var len3 = ret[1]; + if (ret[3]) { + ptr3 = 0; len3 = 0; + throw takeFromExternrefTable0(ret[2]); + } + deferred4_0 = ptr3; + deferred4_1 = len3; + return getStringFromWasm0(ptr3, len3); + } finally { + wasm.__wbindgen_free(deferred4_0, deferred4_1, 1); + } + } + /** + * The console bytes produced since the previous call — the incremental boot + * log / shell output to write into the terminal (UTF-8 / ANSI as the guest + * emits it). + * @returns {Uint8Array} + */ + take_console() { + const ret = wasm.linuxvm_take_console(this.__wbg_ptr); + var v1 = getArrayU8FromWasm0(ret[0], ret[1]).slice(); + wasm.__wbindgen_free(ret[0], ret[1] * 1, 1); + return v1; + } +} +if (Symbol.dispose) LinuxVm.prototype[Symbol.dispose] = LinuxVm.prototype.free; + +/** + * The Welcome + Commit a membership change produces, to publish over the relay. + */ +export class MlsChange { + static __wrap(ptr) { + const obj = Object.create(MlsChange.prototype); + obj.__wbg_ptr = ptr; + MlsChangeFinalization.register(obj, obj.__wbg_ptr, obj); + return obj; + } + __destroy_into_raw() { + const ptr = this.__wbg_ptr; + this.__wbg_ptr = 0; + MlsChangeFinalization.unregister(this); + return ptr; + } + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_mlschange_free(ptr, 0); + } + /** + * The Commit message — delivered to every existing member to advance the epoch. + * @returns {Uint8Array} + */ + get commit() { + const ret = wasm.mlschange_commit(this.__wbg_ptr); + var v1 = getArrayU8FromWasm0(ret[0], ret[1]).slice(); + wasm.__wbindgen_free(ret[0], ret[1] * 1, 1); + return v1; + } + /** + * The Welcome message (empty for a removal) — delivered to the new member. + * @returns {Uint8Array} + */ + get welcome() { + const ret = wasm.mlschange_welcome(this.__wbg_ptr); + var v1 = getArrayU8FromWasm0(ret[0], ret[1]).slice(); + wasm.__wbindgen_free(ret[0], ret[1] * 1, 1); + return v1; + } +} +if (Symbol.dispose) MlsChange.prototype[Symbol.dispose] = MlsChange.prototype.free; + +/** + * One member's view of one MLS channel: its identity (signature key + basic + * credential), its crypto provider (key store), and — once created or joined — + * its [`MlsGroup`]. + */ +export class MlsChannel { + static __wrap(ptr) { + const obj = Object.create(MlsChannel.prototype); + obj.__wbg_ptr = ptr; + MlsChannelFinalization.register(obj, obj.__wbg_ptr, obj); + return obj; + } + __destroy_into_raw() { + const ptr = this.__wbg_ptr; + this.__wbg_ptr = 0; + MlsChannelFinalization.unregister(this); + return ptr; + } + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_mlschannel_free(ptr, 0); + } + /** + * **Add a member** by their KeyPackage bytes (admin). Returns the Welcome + * (for the new member) and the Commit (for existing members). The Commit is + * merged locally, advancing the epoch. + * @param {Uint8Array} key_package_bytes + * @returns {MlsChange} + */ + add_member(key_package_bytes) { + const ptr0 = passArray8ToWasm0(key_package_bytes, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.mlschannel_add_member(this.__wbg_ptr, ptr0, len0); + if (ret[2]) { + throw takeFromExternrefTable0(ret[1]); + } + return MlsChange.__wrap(ret[0]); + } + /** + * Found a new group (this peer becomes its admin / first member). + */ + create_group() { + const ret = wasm.mlschannel_create_group(this.__wbg_ptr); + if (ret[1]) { + throw takeFromExternrefTable0(ret[0]); + } + } + /** + * The current epoch (advances on every Commit). + * @returns {number} + */ + epoch() { + const ret = wasm.mlschannel_epoch(this.__wbg_ptr); + if (ret[2]) { + throw takeFromExternrefTable0(ret[1]); + } + return ret[0]; + } + /** + * Snapshot this channel's durable state (the MLS key store + group id + + * identity) to bytes — what a peer persists to OPFS / the κ-store so the + * group survives a reload. The bytes hold secret key material, so store them + * encrypted at rest. Pair with [`restore`](MlsChannel::restore). + * @returns {Uint8Array} + */ + export_state() { + const ret = wasm.mlschannel_export_state(this.__wbg_ptr); + if (ret[3]) { + throw takeFromExternrefTable0(ret[2]); + } + var v1 = getArrayU8FromWasm0(ret[0], ret[1]).slice(); + wasm.__wbindgen_free(ret[0], ret[1] * 1, 1); + return v1; + } + /** + * **Join** a group from a Welcome message (the bytes the admin published). + * @param {Uint8Array} welcome_bytes + */ + join(welcome_bytes) { + const ptr0 = passArray8ToWasm0(welcome_bytes, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.mlschannel_join(this.__wbg_ptr, ptr0, len0); + if (ret[1]) { + throw takeFromExternrefTable0(ret[0]); + } + } + /** + * This member's **KeyPackage** bytes — published so an admin can add them. + * @returns {Uint8Array} + */ + key_package() { + const ret = wasm.mlschannel_key_package(this.__wbg_ptr); + if (ret[3]) { + throw takeFromExternrefTable0(ret[2]); + } + var v1 = getArrayU8FromWasm0(ret[0], ret[1]).slice(); + wasm.__wbindgen_free(ret[0], ret[1] * 1, 1); + return v1; + } + /** + * The current member count. + * @returns {number} + */ + members() { + const ret = wasm.mlschannel_members(this.__wbg_ptr); + if (ret[2]) { + throw takeFromExternrefTable0(ret[1]); + } + return ret[0] >>> 0; + } + /** + * A member identity named `identity`, keyed deterministically from `seed` + * (the same seed reproduces the same MLS identity on every device). No group + * yet — call [`create_group`](MlsChannel::create_group) or + * [`join`](MlsChannel::join). Persist/restore the group with + * [`export_state`](MlsChannel::export_state) / [`restore`](MlsChannel::restore). + * @param {Uint8Array} seed + * @param {Uint8Array} identity + */ + constructor(seed, identity) { + const ptr0 = passArray8ToWasm0(seed, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + const ptr1 = passArray8ToWasm0(identity, wasm.__wbindgen_malloc); + const len1 = WASM_VECTOR_LEN; + const ret = wasm.mlschannel_new(ptr0, len0, ptr1, len1); + if (ret[2]) { + throw takeFromExternrefTable0(ret[1]); + } + this.__wbg_ptr = ret[0]; + MlsChannelFinalization.register(this, this.__wbg_ptr, this); + return this; + } + /** + * Process an inbound MLS message (an application message or a Commit). For an + * application message, returns JSON `{ "kind": "app", "text": "…" }`; for a + * Commit (membership change), merges it and returns `{ "kind": "commit", + * "epoch": n, "active": bool }` (`active:false` means this peer was removed). + * @param {Uint8Array} message_bytes + * @returns {string} + */ + receive(message_bytes) { + let deferred3_0; + let deferred3_1; + try { + const ptr0 = passArray8ToWasm0(message_bytes, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.mlschannel_receive(this.__wbg_ptr, ptr0, len0); + var ptr2 = ret[0]; + var len2 = ret[1]; + if (ret[3]) { + ptr2 = 0; len2 = 0; + throw takeFromExternrefTable0(ret[2]); + } + deferred3_0 = ptr2; + deferred3_1 = len2; + return getStringFromWasm0(ptr2, len2); + } finally { + wasm.__wbindgen_free(deferred3_0, deferred3_1, 1); + } + } + /** + * **Remove a member** by their identity bytes (admin). Returns the Commit to + * publish; existing members [`receive`](MlsChannel::receive) it and the + * removed member can no longer decrypt subsequent messages (PCS). + * @param {Uint8Array} identity + * @returns {MlsChange} + */ + remove_member(identity) { + const ptr0 = passArray8ToWasm0(identity, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.mlschannel_remove_member(this.__wbg_ptr, ptr0, len0); + if (ret[2]) { + throw takeFromExternrefTable0(ret[1]); + } + return MlsChange.__wrap(ret[0]); + } + /** + * Restore a channel from a `seed` and the bytes from + * [`export_state`](MlsChannel::export_state): rebuilds the key store, the + * deterministic signer, and loads the MLS group — picking the conversation + * back up at its current epoch (forward secrecy preserved). + * @param {Uint8Array} seed + * @param {Uint8Array} state + * @returns {MlsChannel} + */ + static restore(seed, state) { + const ptr0 = passArray8ToWasm0(seed, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + const ptr1 = passArray8ToWasm0(state, wasm.__wbindgen_malloc); + const len1 = WASM_VECTOR_LEN; + const ret = wasm.mlschannel_restore(ptr0, len0, ptr1, len1); + if (ret[2]) { + throw takeFromExternrefTable0(ret[1]); + } + return MlsChannel.__wrap(ret[0]); + } + /** + * Encrypt and frame `plaintext` as an MLS application message (forward + * secret) — the bytes to publish as the message body. + * @param {string} plaintext + * @returns {Uint8Array} + */ + send(plaintext) { + const ptr0 = passStringToWasm0(plaintext, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.mlschannel_send(this.__wbg_ptr, ptr0, len0); + if (ret[3]) { + throw takeFromExternrefTable0(ret[2]); + } + var v2 = getArrayU8FromWasm0(ret[0], ret[1]).slice(); + wasm.__wbindgen_free(ret[0], ret[1] * 1, 1); + return v2; + } +} +if (Symbol.dispose) MlsChannel.prototype[Symbol.dispose] = MlsChannel.prototype.free; + +/** + * A **workspace** over a running holospace, in the browser tab — the + * Codespaces/Gitpod experience (ADR-009; `CC-9` + `CC-11`). The operator + * launches a holospace whose code is the system emulator; it **boots a real + * operating system** (the [system emulator](holospaces::emulator) running in + * the browser's own wasm engine), and the [workspace + * projection](holospaces::projection) drives it: a live **terminal** + * (keystrokes published as canonical events that advance the holospace's κ + * snapshot) and an **editor** that reads and edits environment content *by κ*. + * + * The boot runs in instruction *chunks* ([`run`](Workspace::run)) so the UI + * stays responsive and can stream the console as the kernel boots — there is no + * server doing the work; the browser peer *is* the machine (Law L1). + * A **content-addressed object store** the browser holds in RAM (the substrate's + * memory, Law L3) — the L1 tier above a persistent OPFS L2 that JavaScript mirrors + * to by κ. JS fills it (hydrating objects from OPFS, or [`unpack`](Self::unpack)ing + * a fetched pack), then hands it to [`Workspace::restore_in`]. Object-level, so a + * peer fetches only the objects it lacks: `manifest_objects(κ) \ keys()` — the + * content-addressed delta, never the whole state again. Every `put` re-derives the + * κ from the bytes, so a forged object cannot enter under a κ it does not hash to + * (Law L5). + */ +export class ObjectStore { + __destroy_into_raw() { + const ptr = this.__wbg_ptr; + this.__wbg_ptr = 0; + ObjectStoreFinalization.unregister(this); + return ptr; + } + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_objectstore_free(ptr, 0); + } + /** + * Fetch an object's bytes by κ. + * @param {string} kappa + * @returns {Uint8Array | undefined} + */ + get(kappa) { + const ptr0 = passStringToWasm0(kappa, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.objectstore_get(this.__wbg_ptr, ptr0, len0); + let v2; + if (ret[0] !== 0) { + v2 = getArrayU8FromWasm0(ret[0], ret[1]).slice(); + wasm.__wbindgen_free(ret[0], ret[1] * 1, 1); + } + return v2; + } + /** + * Whether the object is present (the "have" check for delta sync). + * @param {string} kappa + * @returns {boolean} + */ + has(kappa) { + const ptr0 = passStringToWasm0(kappa, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.objectstore_has(this.__wbg_ptr, ptr0, len0); + return ret !== 0; + } + /** + * Every stored κ — what JS persists to OPFS / advertises as its "have" set. + * @returns {any[]} + */ + keys() { + const ret = wasm.objectstore_keys(this.__wbg_ptr); + var v1 = getArrayJsValueFromWasm0(ret[0], ret[1]).slice(); + wasm.__wbindgen_free(ret[0], ret[1] * 4, 4); + return v1; + } + /** + * The object κs a manifest references (console + pages). JS subtracts its + * `keys()` to get the delta to fetch. The manifest object must be present first. + * @param {string} manifest_kappa + * @returns {any[]} + */ + manifest_objects(manifest_kappa) { + const ptr0 = passStringToWasm0(manifest_kappa, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.objectstore_manifest_objects(this.__wbg_ptr, ptr0, len0); + if (ret[3]) { + throw takeFromExternrefTable0(ret[2]); + } + var v2 = getArrayJsValueFromWasm0(ret[0], ret[1]).slice(); + wasm.__wbindgen_free(ret[0], ret[1] * 4, 4); + return v2; + } + constructor() { + const ret = wasm.objectstore_new(); + this.__wbg_ptr = ret; + ObjectStoreFinalization.register(this, this.__wbg_ptr, this); + return this; + } + /** + * Store an object; return its κ (re-derived from the bytes — verify-on-receipt). + * @param {Uint8Array} bytes + * @returns {string} + */ + put(bytes) { + let deferred3_0; + let deferred3_1; + try { + const ptr0 = passArray8ToWasm0(bytes, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.objectstore_put(this.__wbg_ptr, ptr0, len0); + var ptr2 = ret[0]; + var len2 = ret[1]; + if (ret[3]) { + ptr2 = 0; len2 = 0; + throw takeFromExternrefTable0(ret[2]); + } + deferred3_0 = ptr2; + deferred3_1 = len2; + return getStringFromWasm0(ptr2, len2); + } finally { + wasm.__wbindgen_free(deferred3_0, deferred3_1, 1); + } + } + /** + * Load a full bootstrap [`pack`](holospaces::snapshot::pack) (the cold-start + * fast path: one request) into the store; return the manifest κ. + * @param {Uint8Array} pack + * @returns {string} + */ + unpack(pack) { + let deferred3_0; + let deferred3_1; + try { + const ptr0 = passArray8ToWasm0(pack, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.objectstore_unpack(this.__wbg_ptr, ptr0, len0); + var ptr2 = ret[0]; + var len2 = ret[1]; + if (ret[3]) { + ptr2 = 0; len2 = 0; + throw takeFromExternrefTable0(ret[2]); + } + deferred3_0 = ptr2; + deferred3_1 = len2; + return getStringFromWasm0(ptr2, len2); + } finally { + wasm.__wbindgen_free(deferred3_0, deferred3_1, 1); + } + } +} +if (Symbol.dispose) ObjectStore.prototype[Symbol.dispose] = ObjectStore.prototype.free; + +/** + * **Streaming VM** — a holospace booted by *demand-paged snapshot streaming*: the + * machine starts with **no RAM resident** and faults pages in on first touch, + * each fetched by κ over the page's own transport (HTTP static hosting, a peer) + * and verified by re-derivation (Law L5). This is the mobile boot path — a + * 512 MiB-nominal machine runs in the touched working set, and only that working + * set ever crosses the wire. + * + * JavaScript drives the fault loop (no Worker or `Atomics` needed, so it runs on + * iOS Safari): ingest the eager set (manifest + metadata + disk) → [`boot`](Self::boot) + * → then `while (!vm.halted()) { const need = vm.run_slice(n); if (need) + * vm.install(await fetch('/snap/'+need.replace(':','/'))); }`. + */ +export class StreamingVm { + __destroy_into_raw() { + const ptr = this.__wbg_ptr; + this.__wbg_ptr = 0; + StreamingVmFinalization.unregister(this); + return ptr; + } + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_streamingvm_free(ptr, 0); + } + /** + * Build the demand-paged machine named by `manifest_kappa` (a `blake3:…` + * label). The eager objects must already be [`ingest`](Self::ingest)ed; RAM + * pages stream in afterwards. Resident RAM is zero immediately after this. + * @param {string} manifest_kappa + */ + boot(manifest_kappa) { + const ptr0 = passStringToWasm0(manifest_kappa, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.streamingvm_boot(this.__wbg_ptr, ptr0, len0); + if (ret[1]) { + throw takeFromExternrefTable0(ret[0]); + } + } + /** + * The guest's exit code once halted (`undefined` while running; `-1` for a trap). + * @returns {number | undefined} + */ + exit_code() { + const ret = wasm.streamingvm_exit_code(this.__wbg_ptr); + return ret[0] === 0 ? undefined : ret[1]; + } + /** + * Deliver terminal input to the guest's console. + * @param {Uint8Array} bytes + */ + feed(bytes) { + const ptr0 = passArray8ToWasm0(bytes, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + wasm.streamingvm_feed(this.__wbg_ptr, ptr0, len0); + } + /** + * Total bytes fetched on demand so far — the bandwidth readout (only the + * touched working set ever crosses the wire). + * @returns {number} + */ + fetched_bytes() { + const ret = wasm.streamingvm_fetched_bytes(this.__wbg_ptr); + return ret; + } + /** + * A human-readable halt reason once halted. + * @returns {string | undefined} + */ + halt_reason() { + const ret = wasm.streamingvm_halt_reason(this.__wbg_ptr); + let v1; + if (ret[0] !== 0) { + v1 = getStringFromWasm0(ret[0], ret[1]).slice(); + wasm.__wbindgen_free(ret[0], ret[1] * 1, 1); + } + return v1; + } + /** + * Whether the machine has halted (powered off or faulted). + * @returns {boolean} + */ + halted() { + const ret = wasm.streamingvm_halted(this.__wbg_ptr); + return ret !== 0; + } + /** + * Ingest one content object into the local store before [`boot`](Self::boot) + * — the eager set (manifest + metadata + disk + console). Returns its κ label. + * `put` re-derives the κ from the bytes (Law L5), so an object is trusted only + * because it hashes to the κ that named it. + * @param {Uint8Array} bytes + * @returns {string} + */ + ingest(bytes) { + let deferred2_0; + let deferred2_1; + try { + const ptr0 = passArray8ToWasm0(bytes, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.streamingvm_ingest(this.__wbg_ptr, ptr0, len0); + deferred2_0 = ret[0]; + deferred2_1 = ret[1]; + return getStringFromWasm0(ret[0], ret[1]); + } finally { + wasm.__wbindgen_free(deferred2_0, deferred2_1, 1); + } + } + /** + * Install a fetched demand page: store it (re-deriving its κ — verify on + * receipt) and make every RAM page with that content resident. Returns how + * many pages were filled (`0` ⇒ the bytes matched no pending κ — a wrong or + * corrupt fetch, refused). + * @param {Uint8Array} bytes + * @returns {number} + */ + install(bytes) { + const ptr0 = passArray8ToWasm0(bytes, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.streamingvm_install(this.__wbg_ptr, ptr0, len0); + return ret; + } + /** + * A fresh peer with an empty local store and no machine yet. + */ + constructor() { + const ret = wasm.streamingvm_new(); + this.__wbg_ptr = ret; + StreamingVmFinalization.register(this, this.__wbg_ptr, this); + return this; + } + /** + * Live RAM footprint in 4 KiB pages — the touched working set (the mobile- + * memory readout). Stays far below the nominal RAM size. + * @returns {number} + */ + resident_pages() { + const ret = wasm.streamingvm_resident_pages(this.__wbg_ptr); + return ret; + } + /** + * Run up to `max_steps` instructions. Returns the κ label of a page the guest + * touched that is **not yet resident** — fetch it, [`install`](Self::install) + * it, and call again. Returns `undefined` when there was no fault: either the + * slice ran out (still live — call again) or the machine [`halted`](Self::halted). + * @param {number} max_steps + * @returns {string | undefined} + */ + run_slice(max_steps) { + const ret = wasm.streamingvm_run_slice(this.__wbg_ptr, max_steps); + let v1; + if (ret[0] !== 0) { + v1 = getStringFromWasm0(ret[0], ret[1]).slice(); + wasm.__wbindgen_free(ret[0], ret[1] * 1, 1); + } + return v1; + } + /** + * The console bytes produced since the previous call (the incremental boot + * log / shell output). + * @returns {Uint8Array} + */ + take_console() { + const ret = wasm.streamingvm_take_console(this.__wbg_ptr); + var v1 = getArrayU8FromWasm0(ret[0], ret[1]).slice(); + wasm.__wbindgen_free(ret[0], ret[1] * 1, 1); + return v1; + } +} +if (Symbol.dispose) StreamingVm.prototype[Symbol.dispose] = StreamingVm.prototype.free; + +export class Workspace { + static __wrap(ptr) { + const obj = Object.create(Workspace.prototype); + obj.__wbg_ptr = ptr; + WorkspaceFinalization.register(obj, obj.__wbg_ptr, obj); + return obj; + } + __destroy_into_raw() { + const ptr = this.__wbg_ptr; + this.__wbg_ptr = 0; + WorkspaceFinalization.unregister(this); + return ptr; + } + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_workspace_free(ptr, 0); + } + /** + * Launch a workspace: place the OS `kernel` image and `dtb` in a machine + * with `ram_bytes` of RAM at `base`, the device tree at `dtb_addr`, and hand + * off as the SBI firmware. The machine is now booting (drive it with + * [`run`](Workspace::run)). + * @param {Uint8Array} kernel + * @param {Uint8Array} dtb + * @param {number} ram_bytes + * @param {number} base + * @param {number} dtb_addr + * @returns {Workspace} + */ + static boot(kernel, dtb, ram_bytes, base, dtb_addr) { + const ptr0 = passArray8ToWasm0(kernel, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + const ptr1 = passArray8ToWasm0(dtb, wasm.__wbindgen_malloc); + const len1 = WASM_VECTOR_LEN; + const ret = wasm.workspace_boot(ptr0, len0, ptr1, len1, ram_bytes, base, dtb_addr); + if (ret[2]) { + throw takeFromExternrefTable0(ret[1]); + } + return Workspace.__wrap(ret[0]); + } + /** + * Boot a **devcontainer** workspace: the Boot Orchestrator + * ([`MachineSpec`](holospaces::machine::MachineSpec)) generates the device + * tree and boots `kernel` on a machine whose `virtio-blk` disk is the + * assembled `rootfs` (from [`DevcontainerImage::assemble`]). The guest + * kernel mounts the rootfs over `/dev/vda` and runs the devcontainer's real + * OS — entirely in the browser peer (`CC-14`). Drive it with + * [`run`](Workspace::run), exactly like [`boot`](Workspace::boot). + * @param {Uint8Array} kernel + * @param {Uint8Array} rootfs + * @returns {Workspace} + */ + static boot_devcontainer(kernel, rootfs) { + const ptr0 = passArray8ToWasm0(kernel, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + const ptr1 = passArray8ToWasm0(rootfs, wasm.__wbindgen_malloc); + const len1 = WASM_VECTOR_LEN; + const ret = wasm.workspace_boot_devcontainer(ptr0, len0, ptr1, len1); + if (ret[2]) { + throw takeFromExternrefTable0(ret[1]); + } + return Workspace.__wrap(ret[0]); + } + /** + * Boot a **networked** devcontainer workspace (`CC-16`): like + * [`boot_devcontainer`](Workspace::boot_devcontainer), but the machine also + * has a `virtio-net` device whose userspace TCP/IP NAT tunnels the guest's + * TCP streams out over a WebSocket to the relay at `relay_url` (there is no + * raw NIC behind a tab; ADR-014). The guest brings its interface up with + * DHCP and can then reach the internet — `git clone`, `apt`, `npm` — from the + * browser peer. Drive it with [`run`](Workspace::run), yielding to the event + * loop between chunks so the WebSocket delivers host-side bytes. + * @param {Uint8Array} kernel + * @param {Uint8Array} rootfs + * @param {string} relay_url + * @returns {Workspace} + */ + static boot_devcontainer_net(kernel, rootfs, relay_url) { + const ptr0 = passArray8ToWasm0(kernel, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + const ptr1 = passArray8ToWasm0(rootfs, wasm.__wbindgen_malloc); + const len1 = WASM_VECTOR_LEN; + const ptr2 = passStringToWasm0(relay_url, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len2 = WASM_VECTOR_LEN; + const ret = wasm.workspace_boot_devcontainer_net(ptr0, len0, ptr1, len1, ptr2, len2); + if (ret[2]) { + throw takeFromExternrefTable0(ret[1]); + } + return Workspace.__wrap(ret[0]); + } + /** + * Capture the running machine as a content-addressed snapshot descending from + * `parent` (empty = a root), writing its objects into the workspace store. + * Unchanged pages dedup against what is already resident, so this stores only + * the delta — and JS then persists/transmits only the new objects. Returns the + * manifest κ. + * @param {string} parent + * @returns {string} + */ + capture(parent) { + let deferred3_0; + let deferred3_1; + try { + const ptr0 = passStringToWasm0(parent, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.workspace_capture(this.__wbg_ptr, ptr0, len0); + var ptr2 = ret[0]; + var len2 = ret[1]; + if (ret[3]) { + ptr2 = 0; len2 = 0; + throw takeFromExternrefTable0(ret[2]); + } + deferred3_0 = ptr2; + deferred3_1 = len2; + return getStringFromWasm0(ptr2, len2); + } finally { + wasm.__wbindgen_free(deferred3_0, deferred3_1, 1); + } + } + /** + * The κ of every operator event published on the terminal channel so far. + * @returns {any[]} + */ + channel() { + const ret = wasm.workspace_channel(this.__wbg_ptr); + var v1 = getArrayJsValueFromWasm0(ret[0], ret[1]).slice(); + wasm.__wbindgen_free(ret[0], ret[1] * 4, 4); + return v1; + } + /** + * **Checkpoint** the current state into the editable history with a `label` and + * `timestamp_ms` (the caller's wall clock — the machine has none). Captures the + * state (deduped against the prior one) and records a [commit](holospaces::history) + * descending from the current history head. Returns the commit κ. This is one row + * in the History panel — "go back here later" with [`restore_commit`]. + * @param {string} label + * @param {number} timestamp_ms + * @returns {string} + */ + checkpoint(label, timestamp_ms) { + let deferred3_0; + let deferred3_1; + try { + const ptr0 = passStringToWasm0(label, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.workspace_checkpoint(this.__wbg_ptr, ptr0, len0, timestamp_ms); + var ptr2 = ret[0]; + var len2 = ret[1]; + if (ret[3]) { + ptr2 = 0; len2 = 0; + throw takeFromExternrefTable0(ret[2]); + } + deferred3_0 = ptr2; + deferred3_1 = len2; + return getStringFromWasm0(ptr2, len2); + } finally { + wasm.__wbindgen_free(deferred3_0, deferred3_1, 1); + } + } + /** + * The **file tree**: the workspace's files as a JSON array of + * `{ path, kappa }` — each file's current content κ (its identity, Law L1). + * What the editor's explorer renders. + * @returns {string} + */ + files() { + let deferred1_0; + let deferred1_1; + try { + const ret = wasm.workspace_files(this.__wbg_ptr); + deferred1_0 = ret[0]; + deferred1_1 = ret[1]; + return getStringFromWasm0(ret[0], ret[1]); + } finally { + wasm.__wbindgen_free(deferred1_0, deferred1_1, 1); + } + } + /** + * Whether the machine has powered off. + * @returns {boolean} + */ + get halted() { + const ret = wasm.workspace_halted(this.__wbg_ptr); + return ret !== 0; + } + /** + * The κ of the current machine state (the memo head), if established. + * @returns {string | undefined} + */ + head() { + const ret = wasm.workspace_head(this.__wbg_ptr); + let v1; + if (ret[0] !== 0) { + v1 = getStringFromWasm0(ret[0], ret[1]).slice(); + wasm.__wbindgen_free(ret[0], ret[1] * 1, 1); + } + return v1; + } + /** + * The history log as JSON, newest first: + * `[{ "commit": κ, "state": κ, "label": string, "timestamp": ms }, …]`. The data + * the History panel renders. + * @returns {string} + */ + history_json() { + let deferred1_0; + let deferred1_1; + try { + const ret = wasm.workspace_history_json(this.__wbg_ptr); + deferred1_0 = ret[0]; + deferred1_1 = ret[1]; + return getStringFromWasm0(ret[0], ret[1]); + } finally { + wasm.__wbindgen_free(deferred1_0, deferred1_1, 1); + } + } + /** + * The editor's read: fetch a file's content *by κ*, verifying it by + * re-derivation (Law L5). `undefined` if it is not in the workspace store. + * @param {string} kappa + * @returns {Uint8Array | undefined} + */ + open_file(kappa) { + const ptr0 = passStringToWasm0(kappa, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.workspace_open_file(this.__wbg_ptr, ptr0, len0); + if (ret[3]) { + throw takeFromExternrefTable0(ret[2]); + } + let v2; + if (ret[0] !== 0) { + v2 = getArrayU8FromWasm0(ret[0], ret[1]).slice(); + wasm.__wbindgen_free(ret[0], ret[1] * 1, 1); + } + return v2; + } + /** + * Open a file *by path*: the content at the file's current κ (the editor + * reads the environment content by κ). `undefined` if the path is unknown. + * @param {string} path + * @returns {Uint8Array | undefined} + */ + read_path(path) { + const ptr0 = passStringToWasm0(path, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.workspace_read_path(this.__wbg_ptr, ptr0, len0); + if (ret[3]) { + throw takeFromExternrefTable0(ret[2]); + } + let v2; + if (ret[0] !== 0) { + v2 = getArrayU8FromWasm0(ret[0], ret[1]).slice(); + wasm.__wbindgen_free(ret[0], ret[1] * 1, 1); + } + return v2; + } + /** + * **Apply a configuration** the control plane published (ADR-018; `CC-28`): + * decode the κ-addressed [`Configuration`] bytes (resolved + verified over + * the substrate by the caller, Law L5) and enact its live directives on the + * *running* machine — each `forwardPort` begins forwarding on the running + * instance, without a reboot. Returns a JSON summary of what was applied + * (`{ "forwarded": [{ "guest": 8080, "host": 8080 }], "lifecycle": "…", + * "unsupported": [...] }`). The instance state changes from the panel's + * configuration, carried as content over the substrate — no RPC. + * @param {Uint8Array} config_bytes + * @returns {string} + */ + reconfigure(config_bytes) { + let deferred3_0; + let deferred3_1; + try { + const ptr0 = passArray8ToWasm0(config_bytes, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.workspace_reconfigure(this.__wbg_ptr, ptr0, len0); + var ptr2 = ret[0]; + var len2 = ret[1]; + if (ret[3]) { + ptr2 = 0; len2 = 0; + throw takeFromExternrefTable0(ret[2]); + } + deferred3_0 = ptr2; + deferred3_1 = len2; + return getStringFromWasm0(ptr2, len2); + } finally { + wasm.__wbindgen_free(deferred3_0, deferred3_1, 1); + } + } + /** + * Reset the devcontainer to a prior state by its κ (restored from the store) — an + * instant jump to any captured/memoized checkpoint, 9P workspace intact. + * Revisiting a state is what lets a later [`run_memoized`] *serve* a step that was + * run from there before. + * @param {string} state_kappa + */ + reset_to(state_kappa) { + const ptr0 = passStringToWasm0(state_kappa, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.workspace_reset_to(this.__wbg_ptr, ptr0, len0); + if (ret[1]) { + throw takeFromExternrefTable0(ret[0]); + } + } + /** + * **Go back in time** to a commit by its κ: restore that checkpoint's machine + * state (instant, 9P workspace intact) and set it as the history head — so a + * later [`checkpoint`] forks a new branch from here, leaving the commits you + * jumped back from immutable and still restorable. + * @param {string} commit_kappa + */ + restore_commit(commit_kappa) { + const ptr0 = passStringToWasm0(commit_kappa, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.workspace_restore_commit(this.__wbg_ptr, ptr0, len0); + if (ret[1]) { + throw takeFromExternrefTable0(ret[0]); + } + } + /** + * **Warm-start** a devcontainer workspace from a precomputed snapshot `pack` — + * the booted machine in O(1) instead of replaying the assemble-and-boot. `pack` + * is the *decoded* (gunzipped) [`pack`](holospaces::snapshot::pack) the build-time + * generator produced (`devcontainer-snapshot.bin.gz`): a Merkle manifest plus + * every page of the booted machine — RAM, the virtio-blk rootfs, **and the + * mounted virtio-9p workspace** (`CC-15`). [`unpack`](holospaces::snapshot::unpack) + * loads the objects into the store (re-deriving each κ on receipt, Law L5) and + * the whole machine is reconstructed, 9p mount intact — so the workbench's + * FileSystemProvider and terminal work immediately, but the visitor never paid + * the boot. The boot is deterministic, so its result is a content-addressed + * constant (Law L1). + * @param {Uint8Array} pack + * @returns {Workspace} + */ + static restore_devcontainer(pack) { + const ptr0 = passArray8ToWasm0(pack, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.workspace_restore_devcontainer(ptr0, len0); + if (ret[2]) { + throw takeFromExternrefTable0(ret[1]); + } + return Workspace.__wrap(ret[0]); + } + /** + * **Warm-start a *networked* devcontainer** (`CC-16`): like + * [`restore_devcontainer`](Self::restore_devcontainer), but re-dials the egress + * the snapshot could not carry. A snapshot serializes the `virtio-net` device's + * negotiated features + virtqueue registers, but its egress transport is a live + * WebSocket handle no snapshot can hold — so after reconstructing the machine + * this connects a fresh tunnel to the relay at `relay_url` and reattaches it to + * the restored NIC (the guest never re-probes; its DHCP lease for the + * deterministic `10.0.2.15` is in restored RAM). The result: a warm-started + * devcontainer that reaches the internet in O(working set) — `git clone`, `pip`, + * or a live Hyperliquid request — without ever replaying the boot. Requires a + * snapshot captured from a [`boot_devcontainer_net`](Self::boot_devcontainer_net) + * machine (one whose guest enumerated the NIC); a non-net snapshot has no device + * to reattach to and this errors. + * @param {Uint8Array} pack + * @param {string} relay_url + * @returns {Workspace} + */ + static restore_devcontainer_net(pack, relay_url) { + const ptr0 = passArray8ToWasm0(pack, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + const ptr1 = passStringToWasm0(relay_url, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + const ret = wasm.workspace_restore_devcontainer_net(ptr0, len0, ptr1, len1); + if (ret[2]) { + throw takeFromExternrefTable0(ret[1]); + } + return Workspace.__wrap(ret[0]); + } + /** + * **Warm-start from an [`ObjectStore`]** JS has populated by content-addressed + * sync — hydrated from OPFS and topped up with only the objects it lacked + * (`manifest_objects(κ) \ have`), each fetched by κ and verified. Consumes the + * store, which becomes the workspace's own — so its objects persist for the next + * snapshot/variant to dedup against. The whole devcontainer (RAM + virtio-blk + * rootfs + mounted virtio-9p workspace) is reconstructed, 9P intact. This is the + * content-addressed network path: a return visit or a sibling variant transfers + * only the delta, never the whole state again. + * @param {ObjectStore} store + * @param {string} manifest_kappa + * @returns {Workspace} + */ + static restore_in(store, manifest_kappa) { + _assertClass(store, ObjectStore); + var ptr0 = store.__destroy_into_raw(); + const ptr1 = passStringToWasm0(manifest_kappa, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + const ret = wasm.workspace_restore_in(ptr0, ptr1, len1); + if (ret[2]) { + throw takeFromExternrefTable0(ret[1]); + } + return Workspace.__wrap(ret[0]); + } + /** + * Advance the running holospace by `budget` instructions (one chunk of the + * boot or of servicing input). Returns `true` once the machine has halted + * (powered off). Call repeatedly from a UI loop, rendering + * [`terminal`](Workspace::terminal) between chunks. + * @param {number} budget + * @returns {boolean} + */ + run(budget) { + const ret = wasm.workspace_run(this.__wbg_ptr, budget); + return ret !== 0; + } + /** + * Run a line through the **κ-memo** — Hologram's O(1) edge over devcontainer + * shell steps. The step is keyed by `(current state κ, line)`: if that exact step + * has run before, its result machine state is *served* by [`restore`] — no + * re-execution, the full devcontainer (RAM + rootfs + 9P workspace) reconstructed + * in one shot; otherwise the line runs once and its result is captured and + * memoized so the next time is served. Cold cost scales with the command; a + * served hit is flat — re-provisioning, undo/redo, and branching become instant. + * + * Returns JSON `{ "hit": bool, "state": "<κ>", "event": "<κ>" }`. `hit=true` means + * the result came from the memo with zero recomputation. + * @param {string} line + * @returns {string} + */ + run_memoized(line) { + let deferred3_0; + let deferred3_1; + try { + const ptr0 = passStringToWasm0(line, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.workspace_run_memoized(this.__wbg_ptr, ptr0, len0); + var ptr2 = ret[0]; + var len2 = ret[1]; + if (ret[3]) { + ptr2 = 0; len2 = 0; + throw takeFromExternrefTable0(ret[2]); + } + deferred3_0 = ptr2; + deferred3_1 = len2; + return getStringFromWasm0(ptr2, len2); + } finally { + wasm.__wbindgen_free(deferred3_0, deferred3_1, 1); + } + } + /** + * The **editor** surface: save a file's content (the operator's edit). The + * content is κ-addressed into the substrate (Law L2), so the returned κ is + * the file's new identity — an edit advances it (Law L1). The canonical edit + * event for `path` is published on the channel. + * @param {string} path + * @param {Uint8Array} content + * @returns {string} + */ + save_file(path, content) { + let deferred4_0; + let deferred4_1; + try { + const ptr0 = passStringToWasm0(path, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ptr1 = passArray8ToWasm0(content, wasm.__wbindgen_malloc); + const len1 = WASM_VECTOR_LEN; + const ret = wasm.workspace_save_file(this.__wbg_ptr, ptr0, len0, ptr1, len1); + var ptr3 = ret[0]; + var len3 = ret[1]; + if (ret[3]) { + ptr3 = 0; len3 = 0; + throw takeFromExternrefTable0(ret[2]); + } + deferred4_0 = ptr3; + deferred4_1 = len3; + return getStringFromWasm0(ptr3, len3); + } finally { + wasm.__wbindgen_free(deferred4_0, deferred4_1, 1); + } + } + /** + * Whether the terminal has rendered `marker` yet (e.g. the ready banner). + * @param {string} marker + * @returns {boolean} + */ + shows(marker) { + const ptr0 = passStringToWasm0(marker, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.workspace_shows(this.__wbg_ptr, ptr0, len0); + return ret !== 0; + } + /** + * The running holospace's κ snapshot — its canonical state (Law L1/L3/L5). + * @returns {string} + */ + state_kappa() { + let deferred1_0; + let deferred1_1; + try { + const ret = wasm.workspace_state_kappa(this.__wbg_ptr); + deferred1_0 = ret[0]; + deferred1_1 = ret[1]; + return getStringFromWasm0(ret[0], ret[1]); + } finally { + wasm.__wbindgen_free(deferred1_0, deferred1_1, 1); + } + } + /** + * Every κ in the workspace store — JS persists new ones to OPFS / advertises its + * "have" set after a [`capture`](Self::capture). + * @returns {any[]} + */ + store_keys() { + const ret = wasm.workspace_store_keys(this.__wbg_ptr); + var v1 = getArrayJsValueFromWasm0(ret[0], ret[1]).slice(); + wasm.__wbindgen_free(ret[0], ret[1] * 4, 4); + return v1; + } + /** + * Fetch a stored object's bytes by κ (to write to OPFS or send to a peer). + * @param {string} kappa + * @returns {Uint8Array | undefined} + */ + store_object(kappa) { + const ptr0 = passStringToWasm0(kappa, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.workspace_store_object(this.__wbg_ptr, ptr0, len0); + let v2; + if (ret[0] !== 0) { + v2 = getArrayU8FromWasm0(ret[0], ret[1]).slice(); + wasm.__wbindgen_free(ret[0], ret[1] * 1, 1); + } + return v2; + } + /** + * The rendered terminal — the console the running holospace has produced. + * @returns {string} + */ + terminal() { + let deferred1_0; + let deferred1_1; + try { + const ret = wasm.workspace_terminal(this.__wbg_ptr); + deferred1_0 = ret[0]; + deferred1_1 = ret[1]; + return getStringFromWasm0(ret[0], ret[1]); + } finally { + wasm.__wbindgen_free(deferred1_0, deferred1_1, 1); + } + } + /** + * Type a line into the terminal: publish it as a canonical event on the + * holospace's channel (Law L1/L2), feed the keystrokes to the running + * machine, and run until the response settles. The holospace's κ snapshot + * advances. Returns the event's κ. + * @param {string} line + * @returns {string} + */ + type_line(line) { + let deferred2_0; + let deferred2_1; + try { + const ptr0 = passStringToWasm0(line, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.workspace_type_line(this.__wbg_ptr, ptr0, len0); + deferred2_0 = ret[0]; + deferred2_1 = ret[1]; + return getStringFromWasm0(ret[0], ret[1]); + } finally { + wasm.__wbindgen_free(deferred2_0, deferred2_1, 1); + } + } + /** + * Delete a file or folder from the shared workspace (the workbench + * `FileSystemProvider.delete`) — the editor removing content the OS sees + * over `virtio-9p`. `true` if it existed. + * @param {string} name + * @returns {boolean} + */ + ws_delete(name) { + const ptr0 = passStringToWasm0(name, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.workspace_ws_delete(this.__wbg_ptr, ptr0, len0); + return ret !== 0; + } + /** + * The shared workspace's directory listing — a JSON array of + * `{ name, dir, size }` over the running holospace's `virtio-9p` workspace + * (the workbench `FileSystemProvider.readDirectory`). + * @returns {string} + */ + ws_list() { + let deferred1_0; + let deferred1_1; + try { + const ret = wasm.workspace_ws_list(this.__wbg_ptr); + deferred1_0 = ret[0]; + deferred1_1 = ret[1]; + return getStringFromWasm0(ret[0], ret[1]); + } finally { + wasm.__wbindgen_free(deferred1_0, deferred1_1, 1); + } + } + /** + * Create a folder in the shared workspace (the workbench + * `FileSystemProvider.createDirectory`). + * @param {string} name + */ + ws_mkdir(name) { + const ptr0 = passStringToWasm0(name, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + wasm.workspace_ws_mkdir(this.__wbg_ptr, ptr0, len0); + } + /** + * Read a file from the shared workspace (the workbench + * `FileSystemProvider.readFile`) — the same content the OS reads over + * `virtio-9p`. `undefined` if absent. + * @param {string} name + * @returns {Uint8Array | undefined} + */ + ws_read(name) { + const ptr0 = passStringToWasm0(name, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.workspace_ws_read(this.__wbg_ptr, ptr0, len0); + let v2; + if (ret[0] !== 0) { + v2 = getArrayU8FromWasm0(ret[0], ret[1]).slice(); + wasm.__wbindgen_free(ret[0], ret[1] * 1, 1); + } + return v2; + } + /** + * Rename a file or folder in the shared workspace (the workbench + * `FileSystemProvider.rename`). `true` if the source existed. + * @param {string} from + * @param {string} to + * @returns {boolean} + */ + ws_rename(from, to) { + const ptr0 = passStringToWasm0(from, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ptr1 = passStringToWasm0(to, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + const ret = wasm.workspace_ws_rename(this.__wbg_ptr, ptr0, len0, ptr1, len1); + return ret !== 0; + } + /** + * Write a file into the shared workspace (the workbench + * `FileSystemProvider.writeFile`) — the editor saving the *same content* the + * OS reads over `virtio-9p` (one content, Law L1). Returns the content's κ + * (its identity, Law L1/L2). + * @param {string} name + * @param {Uint8Array} content + * @returns {string} + */ + ws_write(name, content) { + let deferred3_0; + let deferred3_1; + try { + const ptr0 = passStringToWasm0(name, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ptr1 = passArray8ToWasm0(content, wasm.__wbindgen_malloc); + const len1 = WASM_VECTOR_LEN; + const ret = wasm.workspace_ws_write(this.__wbg_ptr, ptr0, len0, ptr1, len1); + deferred3_0 = ret[0]; + deferred3_1 = ret[1]; + return getStringFromWasm0(ret[0], ret[1]); + } finally { + wasm.__wbindgen_free(deferred3_0, deferred3_1, 1); + } + } +} +if (Symbol.dispose) Workspace.prototype[Symbol.dispose] = Workspace.prototype.free; + +/** + * @param {Uint8Array} invite_secret + * @param {number} epoch + * @returns {Uint8Array} + */ +export function channel_key(invite_secret, epoch) { + const ptr0 = passArray8ToWasm0(invite_secret, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.channel_key(ptr0, len0, epoch); + var v2 = getArrayU8FromWasm0(ret[0], ret[1]).slice(); + wasm.__wbindgen_free(ret[0], ret[1] * 1, 1); + return v2; +} + +/** + * Prove hologram's **full graph pipeline** runs in the tab: build a graph, + * compile it to a content-addressed `.holo` archive, load an inference + * session, and execute it on real data. This is the exact mechanism a + * transformer runs through (just more ops + the weights as constants), so a + * passing softmax here de-risks the whole model path. + * @returns {string} + */ +export function hologram_graph_demo() { + let deferred1_0; + let deferred1_1; + try { + const ret = wasm.hologram_graph_demo(); + deferred1_0 = ret[0]; + deferred1_1 = ret[1]; + return getStringFromWasm0(ret[0], ret[1]); + } finally { + wasm.__wbindgen_free(deferred1_0, deferred1_1, 1); + } +} + +/** + * Run `runs` square f32 matmuls of dimension `dim` through hologram's CPU + * backend and report throughput as JSON `{ "dim", "ms", "gflops" }`. Timed + * with the JS clock (`std::time::Instant` is unavailable on wasm). + * @param {number} dim + * @param {number} runs + * @returns {string} + */ +export function hologram_matmul_bench(dim, runs) { + let deferred1_0; + let deferred1_1; + try { + const ret = wasm.hologram_matmul_bench(dim, runs); + deferred1_0 = ret[0]; + deferred1_1 = ret[1]; + return getStringFromWasm0(ret[0], ret[1]); + } finally { + wasm.__wbindgen_free(deferred1_0, deferred1_1, 1); + } +} + +/** + * The κ-label of bytes on the substrate's default σ-axis (blake3) — the same + * content address every peer computes (Law L1). + * @param {Uint8Array} bytes + * @returns {string} + */ +export function kappa(bytes) { + let deferred2_0; + let deferred2_1; + try { + const ptr0 = passArray8ToWasm0(bytes, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.kappa(ptr0, len0); + deferred2_0 = ret[0]; + deferred2_1 = ret[1]; + return getStringFromWasm0(ret[0], ret[1]); + } finally { + wasm.__wbindgen_free(deferred2_0, deferred2_1, 1); + } +} + +/** + * Run a full two-member MLS exchange in-tab and report the result as JSON: + * `{ ciphersuite, members, msg1, msg2, epoch }`. The two messages decrypting in + * order is the forward-secret ratchet working; `members == 2` and a non-zero + * epoch are the TreeKEM group state. + * @returns {string} + */ +export function mls_selftest() { + let deferred2_0; + let deferred2_1; + try { + const ret = wasm.mls_selftest(); + var ptr1 = ret[0]; + var len1 = ret[1]; + if (ret[3]) { + ptr1 = 0; len1 = 0; + throw takeFromExternrefTable0(ret[2]); + } + deferred2_0 = ptr1; + deferred2_1 = len1; + return getStringFromWasm0(ptr1, len1); + } finally { + wasm.__wbindgen_free(deferred2_0, deferred2_1, 1); + } +} + +/** + * Decrypt a [`seal_bytes`] blob under the channel `key` (wrong key / tampered + * ciphertext fails the Poly1305 tag). + * @param {Uint8Array} key + * @param {Uint8Array} ciphertext + * @returns {Uint8Array} + */ +export function open_bytes(key, ciphertext) { + const ptr0 = passArray8ToWasm0(key, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + const ptr1 = passArray8ToWasm0(ciphertext, wasm.__wbindgen_malloc); + const len1 = WASM_VECTOR_LEN; + const ret = wasm.open_bytes(ptr0, len0, ptr1, len1); + if (ret[3]) { + throw takeFromExternrefTable0(ret[2]); + } + var v3 = getArrayU8FromWasm0(ret[0], ret[1]).slice(); + wasm.__wbindgen_free(ret[0], ret[1] * 1, 1); + return v3; +} + +/** + * Continue a mind: given the current token sequence (`ids_json`), greedily + * generate `n_more` tokens. Returns `{ ids, text, ms }` — the new full + * sequence and its decoded text. Deterministic, so any holder of the same + * sequence continues into the identical thought. + * @param {string} ids_json + * @param {number} n_more + * @param {number} temp + * @param {number} seed + * @param {number} cap_hint + * @returns {string} + */ +export function qvac_continue(ids_json, n_more, temp, seed, cap_hint) { + let deferred2_0; + let deferred2_1; + try { + const ptr0 = passStringToWasm0(ids_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.qvac_continue(ptr0, len0, n_more, temp, seed, cap_hint); + deferred2_0 = ret[0]; + deferred2_1 = ret[1]; + return getStringFromWasm0(ret[0], ret[1]); + } finally { + wasm.__wbindgen_free(deferred2_0, deferred2_1, 1); + } +} + +/** + * Generate tokens from a tiny transformer **entirely in the browser**, through + * hologram — the whole LM (embedding, multi-head RoPE attention, SwiGLU MLP, + * LM head, token loop) runs in wasm. Returns JSON `{ tokens, ms }`. + * @param {number} max_new + * @param {number} temp + * @param {number} seed + * @returns {string} + */ +export function qvac_generate(max_new, temp, seed) { + let deferred1_0; + let deferred1_1; + try { + const ret = wasm.qvac_generate(max_new, temp, seed); + deferred1_0 = ret[0]; + deferred1_1 = ret[1]; + return getStringFromWasm0(ret[0], ret[1]); + } finally { + wasm.__wbindgen_free(deferred1_0, deferred1_1, 1); + } +} + +/** + * Generate from a **real GGUF model** entirely in the browser, through hologram. + * `gguf` is the fetched model file's bytes. Loads it, generates `max_new` tokens + * greedily/sampled from ``, detokenizes via the embedded vocab, and returns + * JSON `{ text, tokens, ms, arch }`. + * @param {Uint8Array} gguf + * @param {number} max_new + * @param {number} temp + * @param {number} seed + * @returns {string} + */ +export function qvac_generate_gguf(gguf, max_new, temp, seed) { + let deferred2_0; + let deferred2_1; + try { + const ptr0 = passArray8ToWasm0(gguf, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.qvac_generate_gguf(ptr0, len0, max_new, temp, seed); + deferred2_0 = ret[0]; + deferred2_1 = ret[1]; + return getStringFromWasm0(ret[0], ret[1]); + } finally { + wasm.__wbindgen_free(deferred2_0, deferred2_1, 1); + } +} + +/** + * Export the loaded model for the WebGPU engine — **per-block int8** (a scale per + * 32 weights, the GGUF's native precision) in `[out,in]` layout. Consumes the + * retained GGUF (freeing ~its bytes). Blob: `[u32 manifest_len][JSON][q+scales]`. + * @param {number} bits + * @returns {Uint8Array} + */ +export function qvac_gpu_export(bits) { + const ret = wasm.qvac_gpu_export(bits); + var v1 = getArrayU8FromWasm0(ret[0], ret[1]).slice(); + wasm.__wbindgen_free(ret[0], ret[1] * 1, 1); + return v1; +} + +/** + * Free the retained GGUF once all tensors have been streamed to the GPU. + */ +export function qvac_gpu_free() { + wasm.qvac_gpu_free(); +} + +/** + * **Streaming GPU export** — the manifest only (dims + tensor list). JS then + * pulls each tensor with [`qvac_gpu_tensor`] and uploads it, so the converted + * weights never coexist with the GGUF (the memory wall that blocks 1.7B+). + * @param {number} bits + * @returns {string} + */ +export function qvac_gpu_manifest(bits) { + let deferred1_0; + let deferred1_1; + try { + const ret = wasm.qvac_gpu_manifest(bits); + deferred1_0 = ret[0]; + deferred1_1 = ret[1]; + return getStringFromWasm0(ret[0], ret[1]); + } finally { + wasm.__wbindgen_free(deferred1_0, deferred1_1, 1); + } +} + +/** + * One tensor's GPU bytes (`[q][f32 scales]` or `[f32]`) — quantized on demand + * from the retained GGUF. Peak = GGUF + this one tensor. + * @param {string} name + * @param {number} bits + * @returns {Uint8Array} + */ +export function qvac_gpu_tensor(name, bits) { + const ptr0 = passStringToWasm0(name, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.qvac_gpu_tensor(ptr0, len0, bits); + var v2 = getArrayU8FromWasm0(ret[0], ret[1]).slice(); + wasm.__wbindgen_free(ret[0], ret[1] * 1, 1); + return v2; +} + +/** + * Load a GGUF model **for the GPU engine only** — parses metadata + tokenizer + * vocab/scores and retains the GGUF for [`qvac_gpu_export`], but does NOT build + * the CPU [`OwnedModel`]. That f32→int8 round-trip (≈ the whole model materialised + * twice) is what OOMs the tab on a 1.1B; skipping it is the difference between a + * 1.1B loading or crashing. Takes `Vec` (moved, not copied — one fewer ~640 MB + * copy than `&[u8].to_vec()`). Returns `{ ok, arch, vocab, bos, eos, add_bos }`. + * @param {Uint8Array} gguf + * @returns {string} + */ +export function qvac_load_gpu(gguf) { + let deferred2_0; + let deferred2_1; + try { + const ptr0 = passArray8ToWasm0(gguf, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.qvac_load_gpu(ptr0, len0); + deferred2_0 = ret[0]; + deferred2_1 = ret[1]; + return getStringFromWasm0(ret[0], ret[1]); + } finally { + wasm.__wbindgen_free(deferred2_0, deferred2_1, 1); + } +} + +/** + * Load a GGUF model into the page (once). Returns `{ ok, arch, vocab }`. + * @param {Uint8Array} gguf + * @returns {string} + */ +export function qvac_load_model(gguf) { + let deferred2_0; + let deferred2_1; + try { + const ptr0 = passArray8ToWasm0(gguf, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.qvac_load_model(ptr0, len0); + deferred2_0 = ret[0]; + deferred2_1 = ret[1]; + return getStringFromWasm0(ret[0], ret[1]); + } finally { + wasm.__wbindgen_free(deferred2_0, deferred2_1, 1); + } +} + +/** + * Route Rust panics to `console.error` (release wasm otherwise traps silently). + */ +export function qvac_panic_hook() { + wasm.qvac_panic_hook(); +} + +/** + * Tokenize text with the model's SentencePiece vocab + scores using llama.cpp's + * **greedy score-merge** algorithm (not unigram Viterbi — Llama's SPM merges the + * highest-scoring adjacent pair repeatedly), so a typed prompt becomes the *same* + * tokens the model trained on. Prepends ``; unknown chars fall back to bytes. + * @param {string} text + * @returns {string} + */ +export function qvac_tokenize(text) { + let deferred2_0; + let deferred2_1; + try { + const ptr0 = passStringToWasm0(text, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.qvac_tokenize(ptr0, len0); + deferred2_0 = ret[0]; + deferred2_1 = ret[1]; + return getStringFromWasm0(ret[0], ret[1]); + } finally { + wasm.__wbindgen_free(deferred2_0, deferred2_1, 1); + } +} + +/** + * Run a `.holo` compute artifact in the browser via the hologram executor + * compiled to wasm — the *browser `.holo` engine* (arc42 chapter 11, RT2; + * conformance `CC-2`). Returns the κ-label of the first output. Because the + * executor is deterministic and content-addressed, this κ equals the one the + * native executor produces for the same `.holo` (the browser engine equals the + * native one). + * @param {Uint8Array} archive + * @returns {string} + */ +export function run_holo(archive) { + let deferred3_0; + let deferred3_1; + try { + const ptr0 = passArray8ToWasm0(archive, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.run_holo(ptr0, len0); + var ptr2 = ret[0]; + var len2 = ret[1]; + if (ret[3]) { + ptr2 = 0; len2 = 0; + throw takeFromExternrefTable0(ret[2]); + } + deferred3_0 = ptr2; + deferred3_1 = len2; + return getStringFromWasm0(ptr2, len2); + } finally { + wasm.__wbindgen_free(deferred3_0, deferred3_1, 1); + } +} + +/** + * Derive a channel's symmetric E2E key from its **invite secret** and an + * `epoch` (HKDF-SHA256) — the simple "possession of the invite = membership" + * model (à la Keet room keys). Everyone holding the invite derives the same + * 32-byte key and can seal/open message bodies; the relay, holding only the + * channel κ, cannot. For closed-membership rotation that excludes a removed + * member, use the closed-channel [`ChatPeer::rekey`] path (HPKE per member) instead. + * Encrypt arbitrary bytes (a file) under a 32-byte channel `key` — + * ChaCha20-Poly1305 with a random nonce (the same AEAD as message bodies). The + * ciphertext is content: store it with `ChatPeer.ingest` (→ its κ) and ship it + * over the relay like any object; the relay never sees the plaintext file. + * @param {Uint8Array} key + * @param {Uint8Array} plaintext + * @returns {Uint8Array} + */ +export function seal_bytes(key, plaintext) { + const ptr0 = passArray8ToWasm0(key, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + const ptr1 = passArray8ToWasm0(plaintext, wasm.__wbindgen_malloc); + const len1 = WASM_VECTOR_LEN; + const ret = wasm.seal_bytes(ptr0, len0, ptr1, len1); + if (ret[3]) { + throw takeFromExternrefTable0(ret[2]); + } + var v3 = getArrayU8FromWasm0(ret[0], ret[1]).slice(); + wasm.__wbindgen_free(ret[0], ret[1] * 1, 1); + return v3; +} + +/** + * Validate that `module` is a recompiled userland fit for the *execution + * surface* (ADR-008; `CC-6`): specification-valid WebAssembly that imports only + * the substrate host ABI and presents the container ABI. This is the κ-boundary + * contract the browser peer enforces before a userland may be a holospace's + * code — ambient (WASI-style) imports and a missing container ABI are refused. + * @param {Uint8Array} module + */ +export function validate_userland(module) { + const ptr0 = passArray8ToWasm0(module, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.validate_userland(ptr0, len0); + if (ret[1]) { + throw takeFromExternrefTable0(ret[0]); + } +} + +/** + * Verify bytes against a claimed κ-label by re-derivation (Law L5). This is + * what makes content fetched from an untrusted gateway safe. + * @param {Uint8Array} bytes + * @param {string} kappa + * @returns {boolean} + */ +export function verify_kappa(bytes, kappa) { + const ptr0 = passArray8ToWasm0(bytes, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + const ptr1 = passStringToWasm0(kappa, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + const ret = wasm.verify_kappa(ptr0, len0, ptr1, len1); + if (ret[2]) { + throw takeFromExternrefTable0(ret[1]); + } + return ret[0] !== 0; +} +function __wbg_get_imports() { + const import0 = { + __proto__: null, + __wbg___wbindgen_is_function_754e9f305ff6029e: function(arg0) { + const ret = typeof(arg0) === 'function'; + return ret; + }, + __wbg___wbindgen_is_object_56732c2bc353f41d: function(arg0) { + const val = arg0; + const ret = typeof(val) === 'object' && val !== null; + return ret; + }, + __wbg___wbindgen_is_string_c236cabd84a4d769: function(arg0) { + const ret = typeof(arg0) === 'string'; + return ret; + }, + __wbg___wbindgen_is_undefined_67b456be8673d3d7: function(arg0) { + const ret = arg0 === undefined; + return ret; + }, + __wbg___wbindgen_throw_1506f2235d1bdba0: function(arg0, arg1) { + throw new Error(getStringFromWasm0(arg0, arg1)); + }, + __wbg__wbg_cb_unref_61db23ac97f16c31: function(arg0) { + arg0._wbg_cb_unref(); + }, + __wbg_call_9c758de292015997: function() { return handleError(function (arg0, arg1, arg2) { + const ret = arg0.call(arg1, arg2); + return ret; + }, arguments); }, + __wbg_crypto_38df2bab126b63dc: function(arg0) { + const ret = arg0.crypto; + return ret; + }, + __wbg_data_bd354b70c783c66e: function(arg0) { + const ret = arg0.data; + return ret; + }, + __wbg_error_db4567eeb936c56c: function(arg0, arg1) { + console.error(getStringFromWasm0(arg0, arg1)); + }, + __wbg_getRandomValues_c44a50d8cfdaebeb: function() { return handleError(function (arg0, arg1) { + arg0.getRandomValues(arg1); + }, arguments); }, + __wbg_length_4a591ecaa01354d9: function(arg0) { + const ret = arg0.length; + return ret; + }, + __wbg_msCrypto_bd5a034af96bcba6: function(arg0) { + const ret = arg0.msCrypto; + return ret; + }, + __wbg_new_578aeef4b6b94378: function(arg0) { + const ret = new Uint8Array(arg0); + return ret; + }, + __wbg_new_d7e476b433a26bea: function() { return handleError(function (arg0, arg1) { + const ret = new WebSocket(getStringFromWasm0(arg0, arg1)); + return ret; + }, arguments); }, + __wbg_new_with_length_36a4998e27b014c5: function(arg0) { + const ret = new Uint8Array(arg0 >>> 0); + return ret; + }, + __wbg_node_84ea875411254db1: function(arg0) { + const ret = arg0.node; + return ret; + }, + __wbg_now_190933fa139cc119: function() { + const ret = Date.now(); + return ret; + }, + __wbg_process_44c7a14e11e9f69e: function(arg0) { + const ret = arg0.process; + return ret; + }, + __wbg_prototypesetcall_3249fc62a0fafa30: function(arg0, arg1, arg2) { + Uint8Array.prototype.set.call(getArrayU8FromWasm0(arg0, arg1), arg2); + }, + __wbg_randomFillSync_6c25eac9869eb53c: function() { return handleError(function (arg0, arg1) { + arg0.randomFillSync(arg1); + }, arguments); }, + __wbg_require_b4edbdcf3e2a1ef0: function() { return handleError(function () { + const ret = module.require; + return ret; + }, arguments); }, + __wbg_send_4a773f523104d75e: function() { return handleError(function (arg0, arg1, arg2) { + arg0.send(getArrayU8FromWasm0(arg1, arg2)); + }, arguments); }, + __wbg_set_binaryType_41994c453b95bdd2: function(arg0, arg1) { + arg0.binaryType = __wbindgen_enum_BinaryType[arg1]; + }, + __wbg_set_onclose_13787fb31ae8aefd: function(arg0, arg1) { + arg0.onclose = arg1; + }, + __wbg_set_onmessage_9c6b4cb14e244b7f: function(arg0, arg1) { + arg0.onmessage = arg1; + }, + __wbg_set_onopen_db452f4233e99d7d: function(arg0, arg1) { + arg0.onopen = arg1; + }, + __wbg_static_accessor_GLOBAL_9d53f2689e622ca1: function() { + const ret = typeof global === 'undefined' ? null : global; + return isLikeNone(ret) ? 0 : addToExternrefTable0(ret); + }, + __wbg_static_accessor_GLOBAL_THIS_a1a35cec07001a8a: function() { + const ret = typeof globalThis === 'undefined' ? null : globalThis; + return isLikeNone(ret) ? 0 : addToExternrefTable0(ret); + }, + __wbg_static_accessor_SELF_4c59f6c7ea29a144: function() { + const ret = typeof self === 'undefined' ? null : self; + return isLikeNone(ret) ? 0 : addToExternrefTable0(ret); + }, + __wbg_static_accessor_WINDOW_e70ae9f2eb052253: function() { + const ret = typeof window === 'undefined' ? null : window; + return isLikeNone(ret) ? 0 : addToExternrefTable0(ret); + }, + __wbg_subarray_4aa221f6a4f5ab22: function(arg0, arg1, arg2) { + const ret = arg0.subarray(arg1 >>> 0, arg2 >>> 0); + return ret; + }, + __wbg_versions_276b2795b1c6a219: function(arg0) { + const ret = arg0.versions; + return ret; + }, + __wbindgen_cast_0000000000000001: function(arg0, arg1) { + // Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [Externref], shim_idx: 223, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`. + const ret = makeMutClosure(arg0, arg1, wasm_bindgen__convert__closures_____invoke__h9120712498c08fc8); + return ret; + }, + __wbindgen_cast_0000000000000002: function(arg0, arg1) { + // Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [NamedExternref("MessageEvent")], shim_idx: 223, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`. + const ret = makeMutClosure(arg0, arg1, wasm_bindgen__convert__closures_____invoke__h9120712498c08fc8_1); + return ret; + }, + __wbindgen_cast_0000000000000003: function(arg0, arg1) { + // Cast intrinsic for `Ref(Slice(U8)) -> NamedExternref("Uint8Array")`. + const ret = getArrayU8FromWasm0(arg0, arg1); + return ret; + }, + __wbindgen_cast_0000000000000004: function(arg0, arg1) { + // Cast intrinsic for `Ref(String) -> Externref`. + const ret = getStringFromWasm0(arg0, arg1); + return ret; + }, + __wbindgen_init_externref_table: function() { + const table = wasm.__wbindgen_externrefs; + const offset = table.grow(4); + table.set(0, undefined); + table.set(offset + 0, undefined); + table.set(offset + 1, null); + table.set(offset + 2, true); + table.set(offset + 3, false); + }, + }; + return { + __proto__: null, + "./holospaces_web_bg.js": import0, + }; +} + +function wasm_bindgen__convert__closures_____invoke__h9120712498c08fc8(arg0, arg1, arg2) { + wasm.wasm_bindgen__convert__closures_____invoke__h9120712498c08fc8(arg0, arg1, arg2); +} + +function wasm_bindgen__convert__closures_____invoke__h9120712498c08fc8_1(arg0, arg1, arg2) { + wasm.wasm_bindgen__convert__closures_____invoke__h9120712498c08fc8_1(arg0, arg1, arg2); +} + + +const __wbindgen_enum_BinaryType = ["blob", "arraybuffer"]; +const ChatPeerFinalization = (typeof FinalizationRegistry === 'undefined') + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry(ptr => wasm.__wbg_chatpeer_free(ptr, 1)); +const ConsoleFinalization = (typeof FinalizationRegistry === 'undefined') + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry(ptr => wasm.__wbg_console_free(ptr, 1)); +const DevcontainerImageFinalization = (typeof FinalizationRegistry === 'undefined') + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry(ptr => wasm.__wbg_devcontainerimage_free(ptr, 1)); +const LinuxVmFinalization = (typeof FinalizationRegistry === 'undefined') + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry(ptr => wasm.__wbg_linuxvm_free(ptr, 1)); +const MlsChangeFinalization = (typeof FinalizationRegistry === 'undefined') + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry(ptr => wasm.__wbg_mlschange_free(ptr, 1)); +const MlsChannelFinalization = (typeof FinalizationRegistry === 'undefined') + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry(ptr => wasm.__wbg_mlschannel_free(ptr, 1)); +const ObjectStoreFinalization = (typeof FinalizationRegistry === 'undefined') + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry(ptr => wasm.__wbg_objectstore_free(ptr, 1)); +const StreamingVmFinalization = (typeof FinalizationRegistry === 'undefined') + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry(ptr => wasm.__wbg_streamingvm_free(ptr, 1)); +const WorkspaceFinalization = (typeof FinalizationRegistry === 'undefined') + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry(ptr => wasm.__wbg_workspace_free(ptr, 1)); + +function addToExternrefTable0(obj) { + const idx = wasm.__externref_table_alloc(); + wasm.__wbindgen_externrefs.set(idx, obj); + return idx; +} + +function _assertClass(instance, klass) { + if (!(instance instanceof klass)) { + throw new Error(`expected instance of ${klass.name}`); + } +} + +const CLOSURE_DTORS = (typeof FinalizationRegistry === 'undefined') + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry(state => wasm.__wbindgen_destroy_closure(state.a, state.b)); + +function getArrayJsValueFromWasm0(ptr, len) { + ptr = ptr >>> 0; + const mem = getDataViewMemory0(); + const result = []; + for (let i = ptr; i < ptr + 4 * len; i += 4) { + result.push(wasm.__wbindgen_externrefs.get(mem.getUint32(i, true))); + } + wasm.__externref_drop_slice(ptr, len); + return result; +} + +function getArrayU8FromWasm0(ptr, len) { + ptr = ptr >>> 0; + return getUint8ArrayMemory0().subarray(ptr / 1, ptr / 1 + len); +} + +let cachedDataViewMemory0 = null; +function getDataViewMemory0() { + if (cachedDataViewMemory0 === null || cachedDataViewMemory0.buffer.detached === true || (cachedDataViewMemory0.buffer.detached === undefined && cachedDataViewMemory0.buffer !== wasm.memory.buffer)) { + cachedDataViewMemory0 = new DataView(wasm.memory.buffer); + } + return cachedDataViewMemory0; +} + +function getStringFromWasm0(ptr, len) { + return decodeText(ptr >>> 0, len); +} + +let cachedUint8ArrayMemory0 = null; +function getUint8ArrayMemory0() { + if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) { + cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer); + } + return cachedUint8ArrayMemory0; +} + +function handleError(f, args) { + try { + return f.apply(this, args); + } catch (e) { + const idx = addToExternrefTable0(e); + wasm.__wbindgen_exn_store(idx); + } +} + +function isLikeNone(x) { + return x === undefined || x === null; +} + +function makeMutClosure(arg0, arg1, f) { + const state = { a: arg0, b: arg1, cnt: 1 }; + const real = (...args) => { + + // First up with a closure we increment the internal reference + // count. This ensures that the Rust closure environment won't + // be deallocated while we're invoking it. + state.cnt++; + const a = state.a; + state.a = 0; + try { + return f(a, state.b, ...args); + } finally { + state.a = a; + real._wbg_cb_unref(); + } + }; + real._wbg_cb_unref = () => { + if (--state.cnt === 0) { + wasm.__wbindgen_destroy_closure(state.a, state.b); + state.a = 0; + CLOSURE_DTORS.unregister(state); + } + }; + CLOSURE_DTORS.register(real, state, state); + return real; +} + +function passArray8ToWasm0(arg, malloc) { + const ptr = malloc(arg.length * 1, 1) >>> 0; + getUint8ArrayMemory0().set(arg, ptr / 1); + WASM_VECTOR_LEN = arg.length; + return ptr; +} + +function passArrayJsValueToWasm0(array, malloc) { + const ptr = malloc(array.length * 4, 4) >>> 0; + for (let i = 0; i < array.length; i++) { + const add = addToExternrefTable0(array[i]); + getDataViewMemory0().setUint32(ptr + 4 * i, add, true); + } + WASM_VECTOR_LEN = array.length; + return ptr; +} + +function passStringToWasm0(arg, malloc, realloc) { + if (realloc === undefined) { + const buf = cachedTextEncoder.encode(arg); + const ptr = malloc(buf.length, 1) >>> 0; + getUint8ArrayMemory0().subarray(ptr, ptr + buf.length).set(buf); + WASM_VECTOR_LEN = buf.length; + return ptr; + } + + let len = arg.length; + let ptr = malloc(len, 1) >>> 0; + + const mem = getUint8ArrayMemory0(); + + let offset = 0; + + for (; offset < len; offset++) { + const code = arg.charCodeAt(offset); + if (code > 0x7F) break; + mem[ptr + offset] = code; + } + if (offset !== len) { + if (offset !== 0) { + arg = arg.slice(offset); + } + ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0; + const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len); + const ret = cachedTextEncoder.encodeInto(arg, view); + + offset += ret.written; + ptr = realloc(ptr, len, offset, 1) >>> 0; + } + + WASM_VECTOR_LEN = offset; + return ptr; +} + +function takeFromExternrefTable0(idx) { + const value = wasm.__wbindgen_externrefs.get(idx); + wasm.__externref_table_dealloc(idx); + return value; +} + +let cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }); +cachedTextDecoder.decode(); +const MAX_SAFARI_DECODE_BYTES = 2146435072; +let numBytesDecoded = 0; +function decodeText(ptr, len) { + numBytesDecoded += len; + if (numBytesDecoded >= MAX_SAFARI_DECODE_BYTES) { + cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }); + cachedTextDecoder.decode(); + numBytesDecoded = len; + } + return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len)); +} + +const cachedTextEncoder = new TextEncoder(); + +if (!('encodeInto' in cachedTextEncoder)) { + cachedTextEncoder.encodeInto = function (arg, view) { + const buf = cachedTextEncoder.encode(arg); + view.set(buf); + return { + read: arg.length, + written: buf.length + }; + }; +} + +let WASM_VECTOR_LEN = 0; + +let wasmModule, wasmInstance, wasm; +function __wbg_finalize_init(instance, module) { + wasmInstance = instance; + wasm = instance.exports; + wasmModule = module; + cachedDataViewMemory0 = null; + cachedUint8ArrayMemory0 = null; + wasm.__wbindgen_start(); + return wasm; +} + +async function __wbg_load(module, imports) { + if (typeof Response === 'function' && module instanceof Response) { + if (typeof WebAssembly.instantiateStreaming === 'function') { + try { + return await WebAssembly.instantiateStreaming(module, imports); + } catch (e) { + const validResponse = module.ok && expectedResponseType(module.type); + + if (validResponse && module.headers.get('Content-Type') !== 'application/wasm') { + console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e); + + } else { throw e; } + } + } + + const bytes = await module.arrayBuffer(); + return await WebAssembly.instantiate(bytes, imports); + } else { + const instance = await WebAssembly.instantiate(module, imports); + + if (instance instanceof WebAssembly.Instance) { + return { instance, module }; + } else { + return instance; + } + } + + function expectedResponseType(type) { + switch (type) { + case 'basic': case 'cors': case 'default': return true; + } + return false; + } +} + +function initSync(module) { + if (wasm !== undefined) return wasm; + + + if (module !== undefined) { + if (Object.getPrototypeOf(module) === Object.prototype) { + ({module} = module) + } else { + console.warn('using deprecated parameters for `initSync()`; pass a single object instead') + } + } + + const imports = __wbg_get_imports(); + if (!(module instanceof WebAssembly.Module)) { + module = new WebAssembly.Module(module); + } + const instance = new WebAssembly.Instance(module, imports); + return __wbg_finalize_init(instance, module); +} + +async function __wbg_init(module_or_path) { + if (wasm !== undefined) return wasm; + + + if (module_or_path !== undefined) { + if (Object.getPrototypeOf(module_or_path) === Object.prototype) { + ({module_or_path} = module_or_path) + } else { + console.warn('using deprecated parameters for the initialization function; pass a single object instead') + } + } + + if (module_or_path === undefined) { + module_or_path = new URL('holospaces_web_bg.wasm', import.meta.url); + } + const imports = __wbg_get_imports(); + + if (typeof module_or_path === 'string' || (typeof Request === 'function' && module_or_path instanceof Request) || (typeof URL === 'function' && module_or_path instanceof URL)) { + module_or_path = fetch(module_or_path); + } + + const { instance, module } = await __wbg_load(await module_or_path, imports); + + return __wbg_finalize_init(instance, module); +} + +export { initSync, __wbg_init as default };