[
  {
    "schemaVersion": 1,
    "title": "browser-bridge/BrowserBridgeClient",
    "path": "webgpu-os/reference/browser-bridge/BrowserBridgeClient.md",
    "source": "webgpu-os/browser-bridge/BrowserBridgeClient.js",
    "import": "/webgpu-os/browser-bridge/BrowserBridgeClient.js",
    "sourceHash": "3837e6e9994f0df05acff68e3db8c8af195039b06756b957fc127f7259f20b6d",
    "summary": "Singleton — shared by all syscall consumers.",
    "exports": [
      {
        "name": "BrowserBridgeClient",
        "kind": "class",
        "signature": "class BrowserBridgeClient",
        "summary": ""
      },
      {
        "name": "validateBridgeArgs",
        "kind": "function",
        "signature": "validateBridgeArgs(args, service = '', method = '')",
        "summary": ""
      },
      {
        "name": "browserBridge",
        "kind": "constant",
        "signature": "browserBridge",
        "summary": "Singleton — shared by all syscall consumers."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "browser-bridge/BrowserBridgeDriver",
    "path": "webgpu-os/reference/browser-bridge/BrowserBridgeDriver.md",
    "source": "webgpu-os/browser-bridge/BrowserBridgeDriver.js",
    "import": "/webgpu-os/browser-bridge/BrowserBridgeDriver.js",
    "sourceHash": "3bffb1f70c6751306138ad6525721637ffcc8beb1be9607daac77df990297b30",
    "summary": "BrowserBridgeDriver.js — kernel-level wrapper around BrowserBridgeClient. Held at kernel.browserBridge. Manages availability probing on boot, event relay to the kernel event bus, and exposes the full typed client for syscalls.",
    "exports": [
      {
        "name": "BrowserBridgeDriver",
        "kind": "class",
        "signature": "class BrowserBridgeDriver",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "browser-extension/adblock-content",
    "path": "webgpu-os/reference/browser-extension/adblock-content.md",
    "source": "webgpu-os/browser-extension/adblock-content.js",
    "import": "/webgpu-os/browser-extension/adblock-content.js",
    "sourceHash": "b10423dabc02135398a71a2a235f535de677929a9e233c190ced0786c0ac3b7c",
    "summary": "adblock-content.js — in-frame cosmetic ad filtering (Layer 2). Runs in the DEFAULT (ISOLATED) world, in ALL frames, at document_start. ISOLATED world is required so chrome.runtime / chrome.storage are available (the MAIN-world content.js cannot reach them). Cosmetic hiding and DOM node removal only need access to the SHARED DOM, which the isolated world has. Responsibilities: - Inject cosmetic CSS hiding known ad containers. - Watch the DOM and remove ad/tracker <iframe>/<script>/<img> nodes whose src targets a blocked domain (defence-in-depth alongside the DNR rule). - Report removals to the background counter. Strictly scoped: only activates inside frames that belong to the WebGPU OS browser (top page is an OS host, or the outermost ancestor is an OS host), and only while ad-blocking is enabled. Stays completely inert during the user's normal browsing.",
    "exports": []
  },
  {
    "schemaVersion": 1,
    "title": "browser-extension/adblock-list",
    "path": "webgpu-os/reference/browser-extension/adblock-list.md",
    "source": "webgpu-os/browser-extension/adblock-list.js",
    "import": "/webgpu-os/browser-extension/adblock-list.js",
    "sourceHash": "4f4bafec0d29d829d2d694320ab13a30017794f519db3c30cf22e5af52479e3e",
    "summary": "adblock-list.js — shared ad/tracker blocklist for the WebGPU OS browser. SINGLE SOURCE OF TRUTH, consumed by three enforcement layers: 1. background.js        → declarativeNetRequest BLOCK rules (network layer, scoped to OS tabs only — never the user's normal browsing) 2. adblock-content.js   → cosmetic hiding + DOM ad-node removal inside OS-embedded frames 3. _extProxyFetch       → ad-tag stripping for proxied (srcdoc) pages Ported and expanded from the Playwright stealth blocker (C:\\Coding\\fail\\server\\tools\\stealth.py — ADBLOCK_DOMAINS / ADBLOCK_URL_KEYWORDS). This is an ES module: background.js imports it directly; the content script loads it via dynamic import(chrome.runtime.getURL('adblock-list.js')), which is why it is also listed under web_accessible_resources in the manifest. The hand-curated CORE list below is augmented at runtime by an optional, build-generated list (adblock-domains.generated.js) produced from EasyList / EasyPrivacy via build_adblock_rules.py. The generated file ships empty until you run that script, so the extension always loads.",
    "exports": [
      {
        "name": "hostnameOf",
        "kind": "function",
        "signature": "hostnameOf(url)",
        "summary": "Lowercased hostname from a URL, or '' if unparseable."
      },
      {
        "name": "isAdDomain",
        "kind": "function",
        "signature": "isAdDomain(url)",
        "summary": "True if the URL targets a known ad/tracker domain (or a subdomain of one)."
      },
      {
        "name": "looksLikeAd",
        "kind": "function",
        "signature": "looksLikeAd(url)",
        "summary": "Broader match incl. keyword patterns — for the cosmetic/proxy layers only."
      },
      {
        "name": "cosmeticCss",
        "kind": "function",
        "signature": "cosmeticCss()",
        "summary": "A single <style> string that hides all cosmetic selectors."
      },
      {
        "name": "ADBLOCK_DOMAINS",
        "kind": "constant",
        "signature": "ADBLOCK_DOMAINS",
        "summary": ""
      },
      {
        "name": "ADBLOCK_URL_KEYWORDS",
        "kind": "constant",
        "signature": "ADBLOCK_URL_KEYWORDS",
        "summary": ""
      },
      {
        "name": "ADBLOCK_COSMETIC",
        "kind": "constant",
        "signature": "ADBLOCK_COSMETIC",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "browser-extension/ai-settings",
    "path": "webgpu-os/reference/browser-extension/ai-settings.md",
    "source": "webgpu-os/browser-extension/ai-settings.js",
    "import": "/webgpu-os/browser-extension/ai-settings.js",
    "sourceHash": "196889bb11ed4c4596e159493e04a1edaf00cfb619eeeb5c0b3345684f311c5f",
    "summary": "",
    "exports": []
  },
  {
    "schemaVersion": 1,
    "title": "browser-extension/background",
    "path": "webgpu-os/reference/browser-extension/background.md",
    "source": "webgpu-os/browser-extension/background.js",
    "import": "/webgpu-os/browser-extension/background.js",
    "sourceHash": "936cb328efff59f153877bdf93a803716f5ae8e594e5bd641f2ef1e44293a780",
    "summary": "background.js — WebGPU OS Frame Unblocker + Browser Bridge service worker. Static rules (rules.json) are the primary mechanism. Dynamic rules (updateDynamicRules) are registered as a fallback on every startup in case Chrome silently rejected the static ruleset. Browser Bridge: handles __os_bridge_request__ messages routed from relay.js, delegating to the four service modules (Tabs, Injection, Navigation, Rules).",
    "exports": []
  },
  {
    "schemaVersion": 1,
    "title": "browser-extension/content",
    "path": "webgpu-os/reference/browser-extension/content.md",
    "source": "webgpu-os/browser-extension/content.js",
    "import": "/webgpu-os/browser-extension/content.js",
    "sourceHash": "4a80cbb8840755a6efe0786d2f4b70e2876b785eeb1040241bbe4396526d90e0",
    "summary": "content.js — runs in the page's MAIN world at document_start. 1. Sets window.__frameUnblockerActive so the OS browser app can detect the extension. 2. In sub-frames (iframes): overrides window.top / window.parent / window.frameElement so frame-busting scripts (e.g. DuckDuckGo: \"if (top !== self) top.location = ...\") think they are the top-level page and do not navigate away. Must run in world: \"MAIN\" and all_frames: true to take effect before site JS.",
    "exports": []
  },
  {
    "schemaVersion": 1,
    "title": "browser-extension/offscreen",
    "path": "webgpu-os/reference/browser-extension/offscreen.md",
    "source": "webgpu-os/browser-extension/offscreen.js",
    "import": "/webgpu-os/browser-extension/offscreen.js",
    "sourceHash": "4ffefad9dc2fdb349aeeaf4757f081478250c15ddce6660f67a3b81b902c6973",
    "summary": "",
    "exports": []
  },
  {
    "schemaVersion": 1,
    "title": "browser-extension/options",
    "path": "webgpu-os/reference/browser-extension/options.md",
    "source": "webgpu-os/browser-extension/options.js",
    "import": "/webgpu-os/browser-extension/options.js",
    "sourceHash": "f9c422dbfd5abf947f387ebab735bd5eca1f9ea4a9c9f52c67eedc84455b3e42",
    "summary": "",
    "exports": []
  },
  {
    "schemaVersion": 1,
    "title": "browser-extension/popup",
    "path": "webgpu-os/reference/browser-extension/popup.md",
    "source": "webgpu-os/browser-extension/popup.js",
    "import": "/webgpu-os/browser-extension/popup.js",
    "sourceHash": "ec32a08d29c857e1dbd9ea658202eca76e5574901a97987c8a6c202952f19d53",
    "summary": "",
    "exports": []
  },
  {
    "schemaVersion": 1,
    "title": "browser-extension/popup-ai",
    "path": "webgpu-os/reference/browser-extension/popup-ai.md",
    "source": "webgpu-os/browser-extension/popup-ai.js",
    "import": "/webgpu-os/browser-extension/popup-ai.js",
    "sourceHash": "a4298c8fa17c5a5f23b10dc0ea516a3f270a74ddb0bba97bb58818059c4c9df2",
    "summary": "",
    "exports": [
      {
        "name": "runtimeMessageSender",
        "kind": "function",
        "signature": "runtimeMessageSender(message)",
        "summary": ""
      },
      {
        "name": "mountSecureProviderList",
        "kind": "function",
        "signature": "mountSecureProviderList({ root, summary, manageButton, refreshButton, send = runtimeMessageSender, onChange = ()",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "browser-extension/popup-size",
    "path": "webgpu-os/reference/browser-extension/popup-size.md",
    "source": "webgpu-os/browser-extension/popup-size.js",
    "import": "/webgpu-os/browser-extension/popup-size.js",
    "sourceHash": "9de15ca0597e594e8aef1d3835a5b739b4d89936ce7c3df6272543e411b1aee2",
    "summary": "",
    "exports": []
  },
  {
    "schemaVersion": 1,
    "title": "browser-extension/relay",
    "path": "webgpu-os/reference/browser-extension/relay.md",
    "source": "webgpu-os/browser-extension/relay.js",
    "import": "/webgpu-os/browser-extension/relay.js",
    "sourceHash": "21ebb620c8897c758bcb97dc265a1f956db2ff875ba85a656cf46fdbcf9059aa",
    "summary": "relay.js — runs in the ISOLATED content script world (default). chrome.runtime IS available here (unlike world: \"MAIN\"). Acts as a bridge between the OS page (MAIN world) and the extension background. Two-way channels: 1. Proxy fetch (legacy): page →__os_proxy_request__→ relay → background → __os_proxy_response__→ page 2. Browser Bridge requests: page →__os_bridge_request__→ relay → background → __os_bridge_response__→ page 3. Push events from background (nav/tab changes): background →sendMessage→ relay →__os_bridge_event__→ page",
    "exports": []
  },
  {
    "schemaVersion": 1,
    "title": "browser-extension/services/AIProviderCatalog",
    "path": "webgpu-os/reference/browser-extension/services/AIProviderCatalog.md",
    "source": "webgpu-os/browser-extension/services/AIProviderCatalog.js",
    "import": "/webgpu-os/browser-extension/services/AIProviderCatalog.js",
    "sourceHash": "cbd7bcba1ec8a62e13cc450edcd05cd910992b0d3cd96e1eda7d3a3894569569",
    "summary": "Shared provider metadata and OpenAI-compatible endpoint normalization. Keep this module free of chrome.* calls so the service worker and tests can use the exact same routing and capability rules.",
    "exports": [
      {
        "name": "resolveProviderDataPolicy",
        "kind": "function",
        "signature": "resolveProviderDataPolicy(providerId, route = {}, { authority = 'catalog' } = {})",
        "summary": ""
      },
      {
        "name": "classifyModelFamily",
        "kind": "function",
        "signature": "classifyModelFamily(providerId, modelId)",
        "summary": ""
      },
      {
        "name": "resolveModelAccess",
        "kind": "function",
        "signature": "resolveModelAccess(providerId, model = {}, { authority = 'catalog' } = {})",
        "summary": ""
      },
      {
        "name": "listProviderDefinitions",
        "kind": "function",
        "signature": "listProviderDefinitions()",
        "summary": ""
      },
      {
        "name": "isProviderId",
        "kind": "function",
        "signature": "isProviderId(value)",
        "summary": ""
      },
      {
        "name": "detectProvider",
        "kind": "function",
        "signature": "detectProvider({ key = '', endpoint = '' } = {})",
        "summary": ""
      },
      {
        "name": "planCredentialStorage",
        "kind": "function",
        "signature": "planCredentialStorage(providerId, key)",
        "summary": "Decide whether an entered credential can be stored for the explicitly selected provider. Prefix detection is advisory only; it must never move a secret to another provider slot behind the user's back."
      },
      {
        "name": "normalizeEndpoint",
        "kind": "function",
        "signature": "normalizeEndpoint(value, { defaultBase = '' } = {})",
        "summary": ""
      },
      {
        "name": "endpointFor",
        "kind": "function",
        "signature": "endpointFor(providerId, customBase = '')",
        "summary": ""
      },
      {
        "name": "isChatModel",
        "kind": "function",
        "signature": "isChatModel(model)",
        "summary": ""
      },
      {
        "name": "inferModelTaskAffinities",
        "kind": "function",
        "signature": "inferModelTaskAffinities(providerId, model = {})",
        "summary": "Infer preference-only task affinities from bounded catalog evidence. These hints may improve ranking, but must never authorize tools, strict output, private disclosure, or any other compatibility or security decision."
      },
      {
        "name": "inferModelCapabilities",
        "kind": "function",
        "signature": "inferModelCapabilities(providerId, model = {})",
        "summary": ""
      },
      {
        "name": "normalizeReasoningControl",
        "kind": "function",
        "signature": "normalizeReasoningControl(model = {}, modelId = '')",
        "summary": "Preserve the endpoint's own reasoning control surface. A single `reasoning` boolean cannot answer the questions a caller has to ask before touching reasoning: whether the endpoint rejects a disable (`mandatory`), whether it reasons unless told otherwise (`defaultEnabled`), and which gateway knobs are real for it. OpenRouter reports effort levels and token budgets per model, and both are honoured for only a few families, so a caller that guesses either sends a parameter that silently does nothing or one that fails the request. `softSwitch` is inferred from the model family because it is a training-time prompt convention that no catalog reports."
      },
      {
        "name": "normalizeSupportedParameters",
        "kind": "function",
        "signature": "normalizeSupportedParameters(model = {})",
        "summary": "Preserve exact provider compatibility evidence in one deterministic shape. Some provider APIs use supported_parameters while saved OS routes use supportedParameters, so merge both aliases instead of allowing one to hide the other. Values are bounded before they can enter extension storage."
      },
      {
        "name": "normalizeModel",
        "kind": "function",
        "signature": "normalizeModel(providerId, raw)",
        "summary": ""
      },
      {
        "name": "PROVIDER_DATA_POLICY_FORMAT",
        "kind": "constant",
        "signature": "PROVIDER_DATA_POLICY_FORMAT",
        "summary": ""
      },
      {
        "name": "MODEL_ACCESS_CLASSES",
        "kind": "constant",
        "signature": "MODEL_ACCESS_CLASSES",
        "summary": ""
      },
      {
        "name": "MODEL_TASK_AFFINITIES",
        "kind": "constant",
        "signature": "MODEL_TASK_AFFINITIES",
        "summary": ""
      },
      {
        "name": "PROVIDER_CATALOG",
        "kind": "constant",
        "signature": "PROVIDER_CATALOG",
        "summary": ""
      },
      {
        "name": "PROVIDER_IDS",
        "kind": "constant",
        "signature": "PROVIDER_IDS",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "browser-extension/services/AIProviderService",
    "path": "webgpu-os/reference/browser-extension/services/AIProviderService.md",
    "source": "webgpu-os/browser-extension/services/AIProviderService.js",
    "import": "/webgpu-os/browser-extension/services/AIProviderService.js",
    "sourceHash": "e1853c47da604f04c64fb905c24093ed414b7a47d3acd28498a401425324ce6a",
    "summary": "AIProviderService.js — remote LLM provider bridge for the OS AI Hub. Runs in the extension background service worker context (privileged fetch, no CORS; host_permissions already grant <all_urls> for this extension, so no additional host_permissions are needed for the built-in providers). The OS page NEVER sees provider URLs, headers, or API keys — it only sends {provider, model, messages, params} and gets back {message, usage}. Keys are read via KeyVaultService.getRawKeyInternal(), which is not reachable through the bridge router (see KeyVaultService.js for why). Allowlists: - providerAllowlist/pathAllowlist: AIProviderCatalog is the only set of provider ids + exact endpoint URLs ever fetched for non-custom requests. - originAllowlist (custom provider): CUSTOM_ENDPOINTS is a user-approved https-only allowlist, persisted in chrome.storage.local, populated only via allowCustomEndpoint().",
    "exports": [
      {
        "name": "AIProviderService",
        "kind": "constant",
        "signature": "AIProviderService",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "browser-extension/services/AudioService",
    "path": "webgpu-os/reference/browser-extension/services/AudioService.md",
    "source": "webgpu-os/browser-extension/services/AudioService.js",
    "import": "/webgpu-os/browser-extension/services/AudioService.js",
    "sourceHash": "37b4534fb3e7535bb7508e36860e8d90d4b88b9ac443a02bc5c12e07406d05ec",
    "summary": "AudioService.js — privileged tab-audio bridge for WebGPU OS. Browser page audio inside the OS tab (YouTube, video sites, embedded frames) does not pass through the OS AudioDriver. Chrome extensions can control that audio by capturing the tab stream, replaying it through an offscreen AudioContext, and applying a GainNode. The OS mixer sends the effective gain here; the service worker owns tabCapture permission and the offscreen document owns Web Audio playback.",
    "exports": [
      {
        "name": "AudioService",
        "kind": "constant",
        "signature": "AudioService",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "browser-extension/services/BridgeSessionPolicy",
    "path": "webgpu-os/reference/browser-extension/services/BridgeSessionPolicy.md",
    "source": "webgpu-os/browser-extension/services/BridgeSessionPolicy.js",
    "import": "/webgpu-os/browser-extension/services/BridgeSessionPolicy.js",
    "sourceHash": "78a6297777c71d3f7add6ff48657e36911e7ca31fd2726d227ee015317113317",
    "summary": "Memory-only session boundary between the isolated relay and background worker. Secrets never cross window.postMessage. A service-worker restart invalidates every session and forces the still-isolated relay to open a fresh one.",
    "exports": [
      {
        "name": "BridgeSessionPolicy",
        "kind": "class",
        "signature": "class BridgeSessionPolicy",
        "summary": "Memory-only session boundary between the isolated relay and background worker. Secrets never cross window.postMessage. A service-worker restart invalidates every session and forces the still-isolated relay to open a fresh one."
      },
      {
        "name": "BRIDGE_SESSION_PROTOCOL",
        "kind": "constant",
        "signature": "BRIDGE_SESSION_PROTOCOL",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "browser-extension/services/CorsService",
    "path": "webgpu-os/reference/browser-extension/services/CorsService.md",
    "source": "webgpu-os/browser-extension/services/CorsService.js",
    "import": "/webgpu-os/browser-extension/services/CorsService.js",
    "sourceHash": "ae8b2545babf01a4c8a2d9db48550aa6526879f5a1faef445c753ff9f952b456",
    "summary": "CorsService.js — per-site opt-in CORS/API unblocking for the OS bridge. Runs in the extension background service worker context. The blanket rule 9005 only injects `Access-Control-Allow-Origin: *` on NON-credentialed static assets (scripts/fonts/etc.), deliberately leaving a framed site's own credentialed `fetch`/XHR/API calls untouched — a wildcard ACAO is illegal for credentialed requests and would break logins. This service lets the user OPT IN, per trusted site, to also unblock those credentialed API calls. For each enabled origin O (host H) we add session rules (tab-scoped to OS tabs) that, for requests INITIATED BY that site's frames (initiatorDomains: [H]), set on the response: Access-Control-Allow-Origin:      O        (echoes the page origin, not *) Access-Control-Allow-Credentials: true Access-Control-Allow-Methods:     GET,POST,PUT,PATCH,DELETE,OPTIONS Access-Control-Allow-Headers:     * Scoping by initiatorDomains keeps this correct with multiple sites open and never affects the user's normal browsing (session rules are tab-scoped).",
    "exports": [
      {
        "name": "CORS_RULE_BASE",
        "kind": "constant",
        "signature": "CORS_RULE_BASE",
        "summary": ""
      },
      {
        "name": "CorsService",
        "kind": "constant",
        "signature": "CorsService",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "browser-extension/services/ExtensionSenderPolicy",
    "path": "webgpu-os/reference/browser-extension/services/ExtensionSenderPolicy.md",
    "source": "webgpu-os/browser-extension/services/ExtensionSenderPolicy.js",
    "import": "/webgpu-os/browser-extension/services/ExtensionSenderPolicy.js",
    "sourceHash": "3dcfb8a1ab4e083cedd5069458af1182ea9b67db1c7b0c6341aadb0fc172d720",
    "summary": "Authenticate privileged runtime messages from this extension's own pages. Extension pages opened in a popup window can have sender.tab; content scripts also have sender.tab, so ownership must be decided from the sender URL/origin rather than from tab presence alone.",
    "exports": [
      {
        "name": "isExtensionPageSender",
        "kind": "function",
        "signature": "isExtensionPageSender(sender, runtimeId)",
        "summary": "Authenticate privileged runtime messages from this extension's own pages. Extension pages opened in a popup window can have sender.tab; content scripts also have sender.tab, so ownership must be decided from the sender URL/origin rather than from tab presence alone."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "browser-extension/services/InjectionService",
    "path": "webgpu-os/reference/browser-extension/services/InjectionService.md",
    "source": "webgpu-os/browser-extension/services/InjectionService.js",
    "import": "/webgpu-os/browser-extension/services/InjectionService.js",
    "sourceHash": "dd77d88ec72cad704d13bb5812710913b49b8c9ed24ef55dbdab0b8fb33890dc",
    "summary": "",
    "exports": [
      {
        "name": "INJECTION_BRIDGE_AUTHORIZATION_PROTOCOL",
        "kind": "constant",
        "signature": "INJECTION_BRIDGE_AUTHORIZATION_PROTOCOL",
        "summary": ""
      },
      {
        "name": "INJECTION_ONE_USE_AUTHORITY_STATUS_FORMAT",
        "kind": "constant",
        "signature": "INJECTION_ONE_USE_AUTHORITY_STATUS_FORMAT",
        "summary": ""
      },
      {
        "name": "InjectionService",
        "kind": "constant",
        "signature": "InjectionService",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "browser-extension/services/KeyVaultService",
    "path": "webgpu-os/reference/browser-extension/services/KeyVaultService.md",
    "source": "webgpu-os/browser-extension/services/KeyVaultService.js",
    "import": "/webgpu-os/browser-extension/services/KeyVaultService.js",
    "sourceHash": "8cbd8da8e4046f9c86d095aea00e870f7dee1b62034c59b792aa305ea0d446e6",
    "summary": "KeyVaultService.js — provider API key storage for the AI Bridge. Runs in the extension background service worker context. Keys are NEVER exposed to the OS page/bridge caller — only status booleans cross the bridge. getRawKeyInternal() remains a module-only worker export. V2 binds provider and generation into AES-GCM additional authenticated data. V1 encrypted envelopes and bounded legacy plaintext remain read-only inputs and migrate on first use. A durable generation tombstone prevents an older persistent credential from reappearing after a session-only switch or an interrupted clear.",
    "exports": [
      {
        "name": "KeyVaultContractError",
        "kind": "class",
        "signature": "class KeyVaultContractError extends Error",
        "summary": ""
      },
      {
        "name": "normalizeKeyVaultEnvelope",
        "kind": "function",
        "signature": "normalizeKeyVaultEnvelope(provider, raw, { persisted = false, label = 'AI key record' } = {})",
        "summary": ""
      },
      {
        "name": "normalizeKeyVaultState",
        "kind": "function",
        "signature": "normalizeKeyVaultState(provider, raw, label = 'AI key state')",
        "summary": ""
      },
      {
        "name": "getRawKeyInternal",
        "kind": "function",
        "signature": "async getRawKeyInternal(provider)",
        "summary": "Internal-only accessor; deliberately absent from KeyVaultService dispatch."
      },
      {
        "name": "KEY_VAULT_CONTRACTS",
        "kind": "constant",
        "signature": "KEY_VAULT_CONTRACTS",
        "summary": ""
      },
      {
        "name": "KeyVaultService",
        "kind": "constant",
        "signature": "KeyVaultService",
        "summary": "Page/bridge-facing surface — status only, never the raw key."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "browser-extension/services/LivePatchRuntime",
    "path": "webgpu-os/reference/browser-extension/services/LivePatchRuntime.md",
    "source": "webgpu-os/browser-extension/services/LivePatchRuntime.js",
    "import": "/webgpu-os/browser-extension/services/LivePatchRuntime.js",
    "sourceHash": "86a27c2e393abe5751522c8ec7be162c1d7d69ed39ef5321b08229d0293fdd6d",
    "summary": "Clean-room declarative browser surface editor. This module deliberately accepts data, never JavaScript source. The exported page function is self-contained so chrome.scripting can serialize it into the extension's ISOLATED world without eval, Function, or page-owned callbacks.",
    "exports": [
      {
        "name": "normalizeBrowserLivePatch",
        "kind": "function",
        "signature": "normalizeBrowserLivePatch(patch, tabId)",
        "summary": "Validate and reduce a kernel patch before it crosses the 64 KiB bridge."
      },
      {
        "name": "normalizeLiveInspectOptions",
        "kind": "function",
        "signature": "normalizeLiveInspectOptions(opts = {})",
        "summary": ""
      },
      {
        "name": "normalizeLiveApplyOptions",
        "kind": "function",
        "signature": "normalizeLiveApplyOptions(opts = {})",
        "summary": ""
      },
      {
        "name": "normalizeLiveHistoryOptions",
        "kind": "function",
        "signature": "normalizeLiveHistoryOptions(opts = {})",
        "summary": ""
      },
      {
        "name": "normalizeBrowserPatchId",
        "kind": "function",
        "signature": "normalizeBrowserPatchId(value)",
        "summary": ""
      },
      {
        "name": "runBrowserLivePatch",
        "kind": "function",
        "signature": "runBrowserLivePatch(command, payload = {})",
        "summary": "Self-contained function executed by chrome.scripting in the ISOLATED world. Do not introduce references to module-scope bindings here."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "browser-extension/services/NaviFacultyStatusService",
    "path": "webgpu-os/reference/browser-extension/services/NaviFacultyStatusService.md",
    "source": "webgpu-os/browser-extension/services/NaviFacultyStatusService.js",
    "import": "/webgpu-os/browser-extension/services/NaviFacultyStatusService.js",
    "sourceHash": "1f0772eb23f4ce14313ec6140336670a72784d12c290a567aa232c8bc7f6d94d",
    "summary": "Memory-only projection of kernel-owned Browser Semantic Faculty readiness. The Companion does not sign, verify, install, enable, or approve Faculties. It accepts a content-free status only through an authenticated OS bridge session so extension-owned UI can show which exact kernel package revision the OS reports as verified. A service-worker restart or bridge revocation clears the projection.",
    "exports": [
      {
        "name": "NaviFacultyStatusRegistry",
        "kind": "class",
        "signature": "class NaviFacultyStatusRegistry",
        "summary": ""
      },
      {
        "name": "NAVI_BROWSER_FACULTY_STATUS_FORMAT",
        "kind": "constant",
        "signature": "NAVI_BROWSER_FACULTY_STATUS_FORMAT",
        "summary": "Memory-only projection of kernel-owned Browser Semantic Faculty readiness. The Companion does not sign, verify, install, enable, or approve Faculties. It accepts a content-free status only through an authenticated OS bridge session so extension-owned UI can show which exact kernel package revision the OS reports as verified. A service-worker restart or bridge revocation clears the projection."
      },
      {
        "name": "NAVI_BROWSER_FACULTY_ID",
        "kind": "constant",
        "signature": "NAVI_BROWSER_FACULTY_ID",
        "summary": ""
      },
      {
        "name": "NAVI_BROWSER_FACULTY_PACKAGE_ID",
        "kind": "constant",
        "signature": "NAVI_BROWSER_FACULTY_PACKAGE_ID",
        "summary": ""
      },
      {
        "name": "NaviFacultyStatusService",
        "kind": "constant",
        "signature": "NaviFacultyStatusService",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "browser-extension/services/NavigationService",
    "path": "webgpu-os/reference/browser-extension/services/NavigationService.md",
    "source": "webgpu-os/browser-extension/services/NavigationService.js",
    "import": "/webgpu-os/browser-extension/services/NavigationService.js",
    "sourceHash": "688873ad43be5aeb4e96b86cacf4fbb5ecd9a5ca92e8a9d13f6fdb4ea92a84a4",
    "summary": "NavigationService.js — webNavigation history + OS push events. Runs in the extension background service worker context. The background registers webNavigation listeners that call NavigationService.addEvent(). The OS can poll history() or receive live push events via the __os_bridge_event__ channel.",
    "exports": [
      {
        "name": "NavigationService",
        "kind": "constant",
        "signature": "NavigationService",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "browser-extension/services/OpenRouterAuthService",
    "path": "webgpu-os/reference/browser-extension/services/OpenRouterAuthService.md",
    "source": "webgpu-os/browser-extension/services/OpenRouterAuthService.js",
    "import": "/webgpu-os/browser-extension/services/OpenRouterAuthService.js",
    "sourceHash": "30b39140cdae6a0a4ee6a50eb661008fafdab3fbd8a21ad972cd2bb707d960d9",
    "summary": "OpenRouterAuthService.js — extension-owned OAuth PKCE sign-in. The authorization code and generated API key never cross the page bridge. Only the extension credential window can start this flow, and the resulting key is immediately encrypted through KeyVaultService.",
    "exports": [
      {
        "name": "OpenRouterAuthService",
        "kind": "constant",
        "signature": "OpenRouterAuthService",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "browser-extension/services/ProviderProtocol",
    "path": "webgpu-os/reference/browser-extension/services/ProviderProtocol.md",
    "source": "webgpu-os/browser-extension/services/ProviderProtocol.js",
    "import": "/webgpu-os/browser-extension/services/ProviderProtocol.js",
    "sourceHash": "23f75c2f6b35865e93ee73ce03d8210ed7b24d00338247cbd466f56a46f7078c",
    "summary": "Pure OpenAI-compatible request/response helpers shared by the privileged extension transport and the browser-direct mobile fallback. This module performs no storage, network, DOM, or chrome.* work.",
    "exports": [
      {
        "name": "providerErrorNumber",
        "kind": "function",
        "signature": "providerErrorNumber(value = {})",
        "summary": "Stable public diagnosis family; never contains provider-controlled text."
      },
      {
        "name": "createProviderIncidentId",
        "kind": "function",
        "signature": "createProviderIncidentId()",
        "summary": ""
      },
      {
        "name": "applyProviderErrorContext",
        "kind": "function",
        "signature": "applyProviderErrorContext(error, context = {})",
        "summary": "Attach only bounded, structured-clone-safe diagnostic correlation fields."
      },
      {
        "name": "validateProviderMessages",
        "kind": "function",
        "signature": "validateProviderMessages(messages)",
        "summary": ""
      },
      {
        "name": "normalizeReasoningConfig",
        "kind": "function",
        "signature": "normalizeReasoningConfig(value)",
        "summary": ""
      },
      {
        "name": "providerResponseModel",
        "kind": "function",
        "signature": "providerResponseModel(value, fallback = '')",
        "summary": "Normalize a provider model identifier without trusting arbitrary text."
      },
      {
        "name": "providerModelAttribution",
        "kind": "function",
        "signature": "providerModelAttribution({ provider = '', requestedModel = '', responseModel = '' } = {})",
        "summary": "Keep the requested route separate from provider-reported attribution. `model` remains backward-compatible, but modelEvidence makes an omitted or dynamic alias explicitly non-concrete so callers cannot mistake a request fallback for observed provider output."
      },
      {
        "name": "normalizeProviderTools",
        "kind": "function",
        "signature": "normalizeProviderTools(value)",
        "summary": "Normalize the provider-facing projection of locally authoritative OS tools. These definitions help a model form typed calls; they never grant execution authority, which remains with the descriptor hash, graph validator, and ToolRouter after the provider response returns."
      },
      {
        "name": "openAIProviderToolDefinitions",
        "kind": "function",
        "signature": "openAIProviderToolDefinitions(value)",
        "summary": ""
      },
      {
        "name": "anthropicProviderToolDefinitions",
        "kind": "function",
        "signature": "anthropicProviderToolDefinitions(value)",
        "summary": ""
      },
      {
        "name": "canonicalProviderToolCalls",
        "kind": "function",
        "signature": "canonicalProviderToolCalls(payload, providerTools = [], transport = 'provider-native')",
        "summary": "Convert completed native provider calls into one provider-neutral batch."
      },
      {
        "name": "createProviderToolStreamAccumulator",
        "kind": "function",
        "signature": "createProviderToolStreamAccumulator(providerTools = [], transport = 'provider-native-stream')",
        "summary": "Accumulate provider tool-call stream fragments without executing partial arguments. ID/name conflicts and malformed mixed batches fail atomically."
      },
      {
        "name": "buildOpenAICompatibleBody",
        "kind": "function",
        "signature": "buildOpenAICompatibleBody(spec, providerDefinition = null)",
        "summary": ""
      },
      {
        "name": "normalizeProviderRequirements",
        "kind": "function",
        "signature": "normalizeProviderRequirements(value)",
        "summary": ""
      },
      {
        "name": "normalizeOutputSchema",
        "kind": "function",
        "signature": "normalizeOutputSchema(value)",
        "summary": ""
      },
      {
        "name": "providerError",
        "kind": "function",
        "signature": "providerError(json, status)",
        "summary": ""
      },
      {
        "name": "providerHttpError",
        "kind": "function",
        "signature": "providerHttpError(json, status, provider = '', responseMetadata = null)",
        "summary": "Construct the only provider-originated Error shape allowed to cross the AI bridge. Endpoint URLs, headers, response bodies, request content, and keys are deliberately excluded. Retryability is asserted only for unambiguous transient HTTP classes; every other status remains unclassified so the Navi broker can apply its own fail-closed policy."
      },
      {
        "name": "providerOutputError",
        "kind": "function",
        "signature": "providerOutputError(code, provider, message, retryable = true, responseMetadata = null)",
        "summary": ""
      },
      {
        "name": "providerChoiceError",
        "kind": "function",
        "signature": "providerChoiceError(json, status, provider = '', responseMetadata = null)",
        "summary": ""
      },
      {
        "name": "providerResponseMetadata",
        "kind": "function",
        "signature": "providerResponseMetadata(response)",
        "summary": ""
      },
      {
        "name": "assertUsableProviderOutput",
        "kind": "function",
        "signature": "assertUsableProviderOutput({ message = '', reasoning = '', toolCalls = [], provider = '', strictOutput = false } = {})",
        "summary": ""
      },
      {
        "name": "providerFailureProjection",
        "kind": "function",
        "signature": "providerFailureProjection(error)",
        "summary": "Return a bounded structured-clone-safe view of an AI provider failure."
      },
      {
        "name": "visibleReasoningText",
        "kind": "function",
        "signature": "visibleReasoningText(value)",
        "summary": ""
      },
      {
        "name": "openAICompatibleReasoning",
        "kind": "function",
        "signature": "openAICompatibleReasoning(message = {})",
        "summary": ""
      },
      {
        "name": "visibleMessageText",
        "kind": "function",
        "signature": "visibleMessageText(value)",
        "summary": ""
      },
      {
        "name": "safeAttachmentData",
        "kind": "function",
        "signature": "safeAttachmentData(value)",
        "summary": ""
      },
      {
        "name": "PROVIDER_ERROR_CONTRACT_VERSION",
        "kind": "constant",
        "signature": "PROVIDER_ERROR_CONTRACT_VERSION",
        "summary": "Pure OpenAI-compatible request/response helpers shared by the privileged extension transport and the browser-direct mobile fallback. This module performs no storage, network, DOM, or chrome.* work."
      },
      {
        "name": "PROVIDER_STATUS_EVIDENCE_VERSION",
        "kind": "constant",
        "signature": "PROVIDER_STATUS_EVIDENCE_VERSION",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "browser-extension/services/ResidentService",
    "path": "webgpu-os/reference/browser-extension/services/ResidentService.md",
    "source": "webgpu-os/browser-extension/services/ResidentService.js",
    "import": "/webgpu-os/browser-extension/services/ResidentService.js",
    "sourceHash": "76898333d5c83e21d132ff3547c0e3e7612ca3b84f24f782ed2fb627f441f3c2",
    "summary": "ResidentService.js — manages the resident SecureMesh node (offscreen document). Exposed via the bridge router (service name `resident`) so the trusted OS page can query/toggle it, and via dedicated messages for the popup. Keeps an offscreen document alive (MV3's persistent WebRTC-capable context) using a chrome.alarms keep-alive that respawns the service worker to re-ensure the doc exists. Privacy: this only ever stores the PUBLIC cert bundle the OS page pushes (pub key, name, room) — never the identity private key. It is OFF by default and fully user-controlled. Real background mesh reachability is NOT attempted here (keep an OS tab open for that); this is a lightweight cert vault + keepalive responder.",
    "exports": [
      {
        "name": "ResidentService",
        "kind": "constant",
        "signature": "ResidentService",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "browser-extension/services/RuleService",
    "path": "webgpu-os/reference/browser-extension/services/RuleService.md",
    "source": "webgpu-os/browser-extension/services/RuleService.js",
    "import": "/webgpu-os/browser-extension/services/RuleService.js",
    "sourceHash": "3bf657a047b8c2e04e23fabbc49b257ec1ec28b939ded1a872c59ee330b89de4",
    "summary": "RuleService.js — declarativeNetRequest dynamic rule manager for the OS bridge. Runs in the extension background service worker context. User-added rules use IDs >= 50000 to avoid colliding with the built-in frame-unblock rules (IDs 100-102).",
    "exports": [
      {
        "name": "RuleService",
        "kind": "constant",
        "signature": "RuleService",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "browser-extension/services/SemanticAutomationRuntime",
    "path": "webgpu-os/reference/browser-extension/services/SemanticAutomationRuntime.md",
    "source": "webgpu-os/browser-extension/services/SemanticAutomationRuntime.js",
    "import": "/webgpu-os/browser-extension/services/SemanticAutomationRuntime.js",
    "sourceHash": "afe26c64aca27862d852aee505c3ec2bbdaa3e25f2b055cd333cd4978a4a0cc9",
    "summary": "Validate and compact one AI Echo browser-semantic request before it crosses the extension boundary. Unknown fields fail closed so the protocol cannot silently grow into a generic page-execution channel.",
    "exports": [
      {
        "name": "normalizeBrowserSemanticRequest",
        "kind": "function",
        "signature": "normalizeBrowserSemanticRequest(request = {})",
        "summary": "Validate and compact one AI Echo browser-semantic request before it crosses the extension boundary. Unknown fields fail closed so the protocol cannot silently grow into a generic page-execution channel."
      },
      {
        "name": "runBrowserSemanticAction",
        "kind": "function",
        "signature": "runBrowserSemanticAction(request)",
        "summary": "Packaged Chrome scripting entry point. This function is intentionally self-contained because chrome.scripting serializes the function body into the target tab; it cannot close over extension service-worker state."
      },
      {
        "name": "BROWSER_SEMANTIC_PROTOCOL",
        "kind": "constant",
        "signature": "BROWSER_SEMANTIC_PROTOCOL",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "browser-extension/services/TabService",
    "path": "webgpu-os/reference/browser-extension/services/TabService.md",
    "source": "webgpu-os/browser-extension/services/TabService.js",
    "import": "/webgpu-os/browser-extension/services/TabService.js",
    "sourceHash": "2f9ddcd793f3aab6ebde7db1d3492674dc0dcc1df88e4c7526bb572dbd2f38d9",
    "summary": "TabService.js — chrome.tabs wrapper for the OS bridge. Runs in the extension background service worker context.",
    "exports": [
      {
        "name": "TabService",
        "kind": "constant",
        "signature": "TabService",
        "summary": "TabService.js — chrome.tabs wrapper for the OS bridge. Runs in the extension background service worker context."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "browser-extension/services/TrustedOsOriginPolicy",
    "path": "webgpu-os/reference/browser-extension/services/TrustedOsOriginPolicy.md",
    "source": "webgpu-os/browser-extension/services/TrustedOsOriginPolicy.js",
    "import": "/webgpu-os/browser-extension/services/TrustedOsOriginPolicy.js",
    "sourceHash": "5f5dd15dca83e246750ae15743550eada9f61bcd90a19b82b056fd6870289533",
    "summary": "Exact OS origins trusted with privileged browser bridge authority.",
    "exports": [
      {
        "name": "isTrustedOsOrigin",
        "kind": "function",
        "signature": "isTrustedOsOrigin(value)",
        "summary": ""
      },
      {
        "name": "TRUSTED_OS_ORIGINS",
        "kind": "constant",
        "signature": "TRUSTED_OS_ORIGINS",
        "summary": "Exact OS origins trusted with privileged browser bridge authority."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "browser-extension/services/WebMCPBridgeRuntime",
    "path": "webgpu-os/reference/browser-extension/services/WebMCPBridgeRuntime.md",
    "source": "webgpu-os/browser-extension/services/WebMCPBridgeRuntime.js",
    "import": "/webgpu-os/browser-extension/services/WebMCPBridgeRuntime.js",
    "sourceHash": "51cbfa7bc337d387972f684acccff4ec98f811cc381ac30fd06e2335865c6f50",
    "summary": "WebMCPBridgeRuntime.js - clean-room, versioned adapter between AI Echo and the browser's evolving WebMCP surface. Page-owned metadata and results are always untrusted. The extension never exposes callbacks, Window objects, or credentials across the OS bridge.",
    "exports": [
      {
        "name": "normalizeBrowserWebMCPRequest",
        "kind": "function",
        "signature": "normalizeBrowserWebMCPRequest(request = {})",
        "summary": "Validate one bridge request before any page script is dispatched."
      },
      {
        "name": "runBrowserWebMCPAction",
        "kind": "function",
        "signature": "async runBrowserWebMCPAction(request)",
        "summary": "Packaged Chrome scripting entry point. It deliberately feature-detects the origin-trial API, because WebMCP is still a Community Group draft and the browser execution helper is not yet part of the portable specification."
      },
      {
        "name": "BROWSER_WEBMCP_PROTOCOL",
        "kind": "constant",
        "signature": "BROWSER_WEBMCP_PROTOCOL",
        "summary": "WebMCPBridgeRuntime.js - clean-room, versioned adapter between AI Echo and the browser's evolving WebMCP surface. Page-owned metadata and results are always untrusted. The extension never exposes callbacks, Window objects, or credentials across the OS bridge."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "drivers/AudioDriver",
    "path": "webgpu-os/reference/drivers/AudioDriver.md",
    "source": "webgpu-os/drivers/AudioDriver.js",
    "import": "/webgpu-os/drivers/AudioDriver.js",
    "sourceHash": "f313b42ca6886ab3671b9dde19a440cfe943c9a7883d0f496eb3a15c8c3b6619",
    "summary": "AudioDriver.js — the OS audio server (kernel service). Provides system-wide audio output routing, a per-app volume mixer, output-device switching, OS-level media transport (navigator.mediaSession), and opt-in spatial (window-position) panning. Mirrors the kernel-service pattern of AmbientEngine / ThemeEngine: created in KernelBootstrap, exposed via createAudioSyscalls() in Syscalls.js, guarded per-app in guardSyscalls(). ── Two routing models ────────────────────────────────────────────────────────── 1. Shared-context routing (true central mix): apps hand the driver an <audio>/<video> element (attachElement) or an AudioNode built in the OS context (context() + attachNode). The driver builds: source → sessionGain → analyser → stereoPanner → masterGain → destination(setSinkId) 2. Cooperative sessions: apps that keep their own AudioContext register with an onVolume(effective, muted) / onPan(pan) callback. The driver cannot touch their nodes, so it calls the callback whenever the user changes master/app volume, mute, or pan, and the app applies it to its own graph. Everything no-ops safely before the first user gesture (autoplay policy) and on browsers without setSinkId / mediaSession. ── Events ────────────────────────────────────────────────────────────────────── kernel.events.emit('os:audio-change', { type })   // 'sessions' | 'master' | 'devices' | 'spatial'",
    "exports": [
      {
        "name": "AudioDriver",
        "kind": "class",
        "signature": "class AudioDriver",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "drivers/CryptoDriver",
    "path": "webgpu-os/reference/drivers/CryptoDriver.md",
    "source": "webgpu-os/drivers/CryptoDriver.js",
    "import": "/webgpu-os/drivers/CryptoDriver.js",
    "sourceHash": "755a998072e36a7a520a06ca5f8aaca992b7598877b6d0a9915a1290ec88727e",
    "summary": "CryptoDriver.js — OS-level cryptographic identity driver. Wraps CollabIdentity (ECDSA P-256) and exposes a simple API: - Persistent key pair stored in IndexedDB (survives page reload) - Same fingerprint = same user across sessions - sign(data)                  → ECDSA signature bytes - verify(pubKeyRaw, data, sig) → boolean - publicKeyRaw / fingerprint   → identity Used by: - kernel/Syscalls.js  → syscalls.crypto.* - chat room           → signed messages (tamper-evident + authenticated) - future game systems → anti-cheat signed receipts, session proofs",
    "exports": [
      {
        "name": "CryptoDriver",
        "kind": "class",
        "signature": "class CryptoDriver",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "drivers/EmbeddedParticleNode",
    "path": "webgpu-os/reference/drivers/EmbeddedParticleNode.md",
    "source": "webgpu-os/drivers/EmbeddedParticleNode.js",
    "import": "/webgpu-os/drivers/EmbeddedParticleNode.js",
    "sourceHash": "7c49eb8e94b6bc3308a52a423758839bcdffebaeda53aabf10b981a72697ee59",
    "summary": "One embedded Particle node per browser profile. Resident availability and temporary supernode/witness roles are facets of this same node identity.",
    "exports": [
      {
        "name": "EmbeddedParticleNode",
        "kind": "class",
        "signature": "class EmbeddedParticleNode",
        "summary": "One embedded Particle node per browser profile. Resident availability and temporary supernode/witness roles are facets of this same node identity."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "drivers/NetDriver",
    "path": "webgpu-os/reference/drivers/NetDriver.md",
    "source": "webgpu-os/drivers/NetDriver.js",
    "import": "/webgpu-os/drivers/NetDriver.js",
    "sourceHash": "4b6787f9f2ca94701560056f5aa90d0cf3c5e89ef262737f4c6a5c24fe5e41fd",
    "summary": "NetDriver.js — Phase 5 network driver for WebGPU OS. Tiered transport (fastest-wins): Tier 1 — BroadcastChannel (same-origin tabs, <1ms, always available) Tier 2 — WebRTC full-mesh via CollabCore + pinned Particle V2 signaling (cross-machine). BitTorrent remains an explicit, off-by-default hard fallback. Public API (mirrored by kernel/Syscalls.js net namespace): connect(roomId, opts)          — join a named room disconnect()                   — leave current room send(channel, data)            — broadcast to all peers sendTo(peerId, channel, data)  — unicast to specific peer on(channel, cb)                — subscribe to incoming channel messages off(channel, cb)               — unsubscribe peers()                        — list connected peers { id, transport } isConnected()                  — true if at least one peer stats()                        — transport statistics selfId                         — this peer's UUID",
    "exports": [
      {
        "name": "NetDriver",
        "kind": "class",
        "signature": "class NetDriver",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "drivers/NetworkDriver",
    "path": "webgpu-os/reference/drivers/NetworkDriver.md",
    "source": "webgpu-os/drivers/NetworkDriver.js",
    "import": "/webgpu-os/drivers/NetworkDriver.js",
    "sourceHash": "bcbdfcceb281ffac8d10856e1bb6f3dd3b9628730f0f42bcfcc02001869d94ee",
    "summary": "drivers/NetworkDriver.js — kernel driver backing `syscalls.network.*` / `syscalls.sync.*` / `syscalls.workstation.*` (network plan Phase 6 webgpu-os wiring, previously deferred — see C:\\Users\\btspa\\.windsurf\\plans\\particle-network-layer-2bf6f0.md). Thin glue only: delegates to engine/network's already-complete client-side modules (identity, routes/MasterServerList, the shared pinned ParticleNetworkDaemon, syncManager, workstation) and reads/writes the SAME localStorage-backed config `factory/apps/network-manager/NetworkManagerApp.js` already uses (`os.network.masterServers` / `os.network.syncRules`), so any app calling these syscalls sees the exact same state the Control Panel shows — one source of truth, not a second copy. Security model (see kernel/RuleGraph.js): `network.read`/`sync.read` are low-risk status/config visibility; `network.connect` actually opens a Masterserver session and can attach/signal on routes (declaration-gated, high risk); `sync.manage` changes what syncs where (medium risk). Every live-session method requires `connect()` to have been called first for that url — apps cannot attach/signal/discover on a session they never opened, even though the underlying WebSocket may be SHARED with other OS features via the V2 daemon registry (or the V1 registry only for explicit compatibility endpoints).",
    "exports": [
      {
        "name": "NetworkDriver",
        "kind": "class",
        "signature": "class NetworkDriver",
        "summary": ""
      },
      {
        "name": "PARTICLE_BACKBONE_ROUTE_ID",
        "kind": "constant",
        "signature": "PARTICLE_BACKBONE_ROUTE_ID",
        "summary": ""
      },
      {
        "name": "RESIDENT_NODE_ROUTE_ID",
        "kind": "constant",
        "signature": "RESIDENT_NODE_ROUTE_ID",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "drivers/NetworkPersistence",
    "path": "webgpu-os/reference/drivers/NetworkPersistence.md",
    "source": "webgpu-os/drivers/NetworkPersistence.js",
    "import": "/webgpu-os/drivers/NetworkPersistence.js",
    "sourceHash": "5b362b082ba6aa1ef36c5ad557a241ed51c6ab1cb3605e4218b55406e58ba9c7",
    "summary": "drivers/NetworkPersistence.js — OS-integration persistence for engine/network's intentionally storage-agnostic modules (network plan §15/§38 persistence gap: \"EventLog is in-memory only\" / \"PeerTicketStore is in-memory only... callers are responsible for persisting\"). engine/network never imports webgpu-os/storage/AppSandbox.js (same layering rule as drivers/ResidentBootstrapSource.js) — this file is the glue that reads/writes an AppSandbox instance using the snapshot/hydrate/ replay functions those modules already expose: - engine/network/groupLedger/GroupLedger.js: replayGroupLedger() - engine/network/peerTickets/PeerTicketStore.js: snapshotPeerTicketStore()/hydratePeerTicketStore() AppSandbox encrypts everything at rest (AES-256-GCM, device+app-bound key) and is isolated per appId (webgpu-os/storage/AppSandbox.js) — callers should pass the sandbox of THE APP THAT OWNS THIS DATA (e.g. a future groups/chat app), not some shared \"network\" pseudo-app, so the sandbox's per-app isolation guarantee stays meaningful.",
    "exports": [
      {
        "name": "saveGroupLedger",
        "kind": "function",
        "signature": "async saveGroupLedger(sandbox, ledger)",
        "summary": "Persist a group ledger's full replayable state: its static config (groupId/founders/mode/threshold) plus `eventLog.entries()`. Cheap to call after every `proposeGroupEvent`/`genesisGroup` — it's a full snapshot, not an incremental diff, so there's nothing to get out of sync."
      },
      {
        "name": "loadGroupLedger",
        "kind": "function",
        "signature": "async loadGroupLedger(sandbox, groupId)",
        "summary": "Load and replay a previously-saved group ledger."
      },
      {
        "name": "listSavedGroupIds",
        "kind": "function",
        "signature": "async listSavedGroupIds(sandbox)",
        "summary": "groupIds this sandbox currently has a saved ledger for."
      },
      {
        "name": "deleteGroupLedger",
        "kind": "function",
        "signature": "async deleteGroupLedger(sandbox, groupId)",
        "summary": "Forget a saved group ledger. Does not affect any already-live in-memory ledger object."
      },
      {
        "name": "savePeerTickets",
        "kind": "function",
        "signature": "async savePeerTickets(sandbox, store)",
        "summary": "Persist a peer ticket store (full snapshot — see PeerTicketStore.js's snapshotPeerTicketStore)."
      },
      {
        "name": "loadPeerTickets",
        "kind": "function",
        "signature": "async loadPeerTickets(sandbox)",
        "summary": "Load a previously-saved peer ticket store, or a fresh empty one if none is saved."
      },
      {
        "name": "saveStateChannelCheckpoint",
        "kind": "function",
        "signature": "async saveStateChannelCheckpoint(sandbox, channelId, checkpoint)",
        "summary": "Persist one complete, fenced State Channel authority checkpoint."
      },
      {
        "name": "loadStateChannelCheckpoint",
        "kind": "function",
        "signature": "async loadStateChannelCheckpoint(sandbox, channelId)",
        "summary": ""
      },
      {
        "name": "listSavedStateChannelIds",
        "kind": "function",
        "signature": "async listSavedStateChannelIds(sandbox)",
        "summary": ""
      },
      {
        "name": "deleteStateChannelCheckpoint",
        "kind": "function",
        "signature": "async deleteStateChannelCheckpoint(sandbox, channelId)",
        "summary": ""
      },
      {
        "name": "saveStateChannelOutbox",
        "kind": "function",
        "signature": "async saveStateChannelOutbox(sandbox, channelId, intents, maxEntries = 512)",
        "summary": "Bounded pending intents survive tab reload until a receipt is observed."
      },
      {
        "name": "loadStateChannelOutbox",
        "kind": "function",
        "signature": "async loadStateChannelOutbox(sandbox, channelId)",
        "summary": ""
      },
      {
        "name": "createStateChannelCheckpointStore",
        "kind": "function",
        "signature": "createStateChannelCheckpointStore(sandbox)",
        "summary": "Adapter consumed by StateChannelAuthorityCoordinator."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "drivers/ProfileDriver",
    "path": "webgpu-os/reference/drivers/ProfileDriver.md",
    "source": "webgpu-os/drivers/ProfileDriver.js",
    "import": "/webgpu-os/drivers/ProfileDriver.js",
    "sourceHash": "7d3e94222579aaa037c7957318a19c59c4edc9a0a9bcea0083be441dc85baeef",
    "summary": "ProfileDriver.js — OS-level multi-user profile + per-profile identity. SecureMesh Phase 1. Lawful, user-owned identity: profile = OS-created account + per-profile ECDSA P-256 keypair + random (hashed) install id + user-held recovery code. Privacy rules baked in: - NO hardware/browser fingerprinting feeds identity. `localDeviceIdHash` is a SHA-256 of a RANDOM, user-resettable install id (never the raw id, never any device characteristics). - The private key is NEVER stored raw. The working signing key is held as a NON-EXTRACTABLE WebCrypto key (cannot be exfiltrated). A separate copy is stored encrypted (AES-GCM, PBKDF2-from-recovery-code) purely for user-triggered export / portability. Storage: IndexedDB `profiles` store (CryptoKey objects are structured-cloneable); active profile id + random install id live in the generic `kv` store. This driver is additive — the legacy global CryptoDriver identity is left untouched. Apps opt into per-user identity via `syscalls.profile.*`.",
    "exports": [
      {
        "name": "ProfileSchemaVersionError",
        "kind": "class",
        "signature": "class ProfileSchemaVersionError extends Error",
        "summary": ""
      },
      {
        "name": "ProfileDriver",
        "kind": "class",
        "signature": "class ProfileDriver",
        "summary": ""
      },
      {
        "name": "assertSupportedProfileSchemaVersion",
        "kind": "function",
        "signature": "assertSupportedProfileSchemaVersion(value, { allowMissing = true, label = 'profile record' } = {})",
        "summary": "Reject records from a newer writer before normalization can discard fields. Missing versions are accepted as the legacy v1 shape and migrated explicitly."
      },
      {
        "name": "PROFILE_RECORD_SCHEMA_VERSION",
        "kind": "constant",
        "signature": "PROFILE_RECORD_SCHEMA_VERSION",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "drivers/RealmNetworkFeatureFlags",
    "path": "webgpu-os/reference/drivers/RealmNetworkFeatureFlags.md",
    "source": "webgpu-os/drivers/RealmNetworkFeatureFlags.js",
    "import": "/webgpu-os/drivers/RealmNetworkFeatureFlags.js",
    "sourceHash": "26e48354db138ba6a2c871ad6ef7d968aede9956516a99ce29bbac28175b0563",
    "summary": "Persisted rollout gates for the additive Realm Network upgrade. Realm Network Alpha ships with every completed slice active. Version 2 stores only explicit user overrides, so later default changes cannot erase a deliberate opt-out. Callers may inject a storage-compatible object in tests; the driver uses localStorage in the OS.",
    "exports": [
      {
        "name": "RealmNetworkFeatureFlags",
        "kind": "class",
        "signature": "class RealmNetworkFeatureFlags",
        "summary": ""
      },
      {
        "name": "createRealmNetworkFeatureFlags",
        "kind": "function",
        "signature": "createRealmNetworkFeatureFlags(options)",
        "summary": ""
      },
      {
        "name": "REALM_NETWORK_FEATURE_FLAG_VERSION",
        "kind": "constant",
        "signature": "REALM_NETWORK_FEATURE_FLAG_VERSION",
        "summary": "Persisted rollout gates for the additive Realm Network upgrade. Realm Network Alpha ships with every completed slice active. Version 2 stores only explicit user overrides, so later default changes cannot erase a deliberate opt-out. Callers may inject a storage-compatible object in tests; the driver uses localStorage in the OS."
      },
      {
        "name": "REALM_NETWORK_FEATURE_FLAG_KEY",
        "kind": "constant",
        "signature": "REALM_NETWORK_FEATURE_FLAG_KEY",
        "summary": ""
      },
      {
        "name": "REALM_NETWORK_LEGACY_FEATURE_FLAG_KEY",
        "kind": "constant",
        "signature": "REALM_NETWORK_LEGACY_FEATURE_FLAG_KEY",
        "summary": ""
      },
      {
        "name": "REALM_NETWORK_FEATURE_DEFAULTS",
        "kind": "constant",
        "signature": "REALM_NETWORK_FEATURE_DEFAULTS",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "drivers/ResidentBootstrapSource",
    "path": "webgpu-os/reference/drivers/ResidentBootstrapSource.md",
    "source": "webgpu-os/drivers/ResidentBootstrapSource.js",
    "import": "/webgpu-os/drivers/ResidentBootstrapSource.js",
    "sourceHash": "43cc93bf26c2d258a0089b5f4d0e2847e8349bbab57aea97fc56259942d48fad",
    "summary": "drivers/ResidentBootstrapSource.js — OS-integration adapter wiring the browser extension's resident cert vault (browser-extension/services/ ResidentService.js) into engine/network/dht/BootstrapSource.js's `{ id, scan, advertise }` interface (network plan §37/§47/§48). `engine/network` intentionally has no `webgpu-os` dependency (same layering rule as the deferred `kernel/Syscalls.js` wiring — see BootstrapSource.js's header comment) — this file is the OS-side glue the plan called out as the natural adapter, kept honest about what the resident node actually does today: - The resident node is a lightweight, OFF-BY-DEFAULT cert vault + a chrome.alarms keepalive heartbeat living in an MV3 offscreen document. It does NOT run a real WebRTC/Masterserver client and does NOT answer DISCOVER while no OS tab is open (see ResidentService.js's own header comment). Do not oversell this as \"background reachability\" anywhere in the UI (network plan §42's \"never overstate privacy/reachability\"). - What it DOES give a bootstrap attempt: a small piece of persisted memory that survives an OS tab closing — \"the last identity this browser saved for room X\" — which is a legitimate (if modest) bootstrap hint once a new tab reopens, and a place to advertise our current identity so it's still there next time.",
    "exports": [
      {
        "name": "createResidentBootstrapSource",
        "kind": "function",
        "signature": "createResidentBootstrapSource({ browserBridge } = {})",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "drivers/WebSurfaceDriver",
    "path": "webgpu-os/reference/drivers/WebSurfaceDriver.md",
    "source": "webgpu-os/drivers/WebSurfaceDriver.js",
    "import": "/webgpu-os/drivers/WebSurfaceDriver.js",
    "sourceHash": "fcf674329d159f472ae93b245aa36a8230f8a4a5019e2e7253c333f3ec71c9bb",
    "summary": "WebSurfaceDriver.js — Render any cross-origin website as a live WebGPU texture. ── How it works ───────────────────────────────────────────────────────────── 1. Creates an <iframe> that loads the target URL (browser renders it normally) 2. User clicks \"Share Tab\" once via getDisplayMedia({ preferCurrentTab: true }) 3. Element Capture API restricts the stream to just the iframe's pixels 4. HTMLVideoElement.srcObject = stream  →  live video feed of the website 5. device.importExternalTexture({ source: videoEl }) → WebGPU texture every frame Result: any cross-origin URL renders as a live GPU texture surface inside the OS. ── Browser support ─────────────────────────────────────────────────────────── getDisplayMedia:   all major browsers Element Capture:   Chrome 116+  (RestrictionTarget.fromElement) importExternalTexture: Chrome/Edge (WebGPU) ── Security model ──────────────────────────────────────────────────────────── - User must approve screen share once (one-time gesture, can be re-used) - iframe is sandboxed; cross-origin website cannot access our JS - We only get pixels, not DOM of the foreign page - Mouse/keyboard relay is optional (events forwarded to iframe element)",
    "exports": [
      {
        "name": "WebSurfaceDriver",
        "kind": "class",
        "signature": "class WebSurfaceDriver",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/AmbientEngine",
    "path": "webgpu-os/reference/kernel/AmbientEngine.md",
    "source": "webgpu-os/kernel/AmbientEngine.js",
    "import": "/webgpu-os/kernel/AmbientEngine.js",
    "sourceHash": "bb8460358fb4e12bdbd96ac78e16d50815d07f75735aa1a6a85d18ca83fd0f9b",
    "summary": "AmbientEngine.js — Desktop background rendering service. Owns a fixed full-screen DOM layer (z-index: -10) that sits permanently behind every panel and shell element.  Supports CSS gradients, solid colors, static images, video, and extensible driver plug-ins registered by mods.  Exposes the same before/after hook middleware pattern as ThemeEngine so mods can intercept and customize background changes. ThemeEngine drives this automatically via setFromTheme() when the accent or wallpaper preset changes.  Mods (or the user) can bypass ThemeEngine entirely with apply() for fully custom backgrounds. ── Modder API ──────────────────────────────────────────────────────────── const amb = syscalls.ambient; // Register a totally custom renderer (canvas, WebGPU, Three.js …) amb.registerDriver('webgpu-scene', { apply(layer, config) { layer.innerHTML = ''; const canvas = document.createElement('canvas'); canvas.style.cssText = 'position:absolute;inset:0;width:100%;height:100%;'; layer.appendChild(canvas); // … render into canvas … }, destroy(layer) { layer.innerHTML = ''; } }); // Before hook — middleware: modify config before the layer receives it amb.before('my-mod', (cfg, next) => next({ ...cfg, opacity: 0.7 }), 'Dim'); // After hook — react after background is applied amb.after('my-mod', (cfg) => console.log('Ambient applied:', cfg)); // Apply custom backgrounds amb.apply({ type: 'css',   value: 'linear-gradient(135deg,#ff0080,#7928ca)' }); amb.apply({ type: 'color', value: '#1a0533' }); amb.apply({ type: 'image', src: '/bg.jpg', size: 'cover', position: 'center' }); amb.apply({ type: 'video', src: '/bg.mp4', bg: '#000' }); amb.apply({ type: 'webgpu-scene', ... }); // custom driver // Set opacity of the ambient layer (0–1) amb.setOpacity(0.85); // Export / import config JSON const json = amb.export(); amb.import(json); // Subscribe to changes kernel.events.on('os:ambient-change', ({ config }) => { … });",
    "exports": [
      {
        "name": "AmbientEngine",
        "kind": "class",
        "signature": "class AmbientEngine",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/AppRegistrationScope",
    "path": "webgpu-os/reference/kernel/AppRegistrationScope.md",
    "source": "webgpu-os/kernel/AppRegistrationScope.js",
    "import": "/webgpu-os/kernel/AppRegistrationScope.js",
    "sourceHash": "db2433a1daa6f11a18be3d052bc2b1483ad7734ce58ccd5901e9d8aeb98779fc",
    "summary": "Authenticated app wrappers for registration-bearing syscall namespaces. Identity binding is independent of permission-enforcement mode: developer mode may relax capability checks, but it never relaxes ownership.",
    "exports": [
      {
        "name": "scopeToolSyscalls",
        "kind": "function",
        "signature": "scopeToolSyscalls(kernel, appId, raw = kernel?.syscalls?.tools)",
        "summary": ""
      },
      {
        "name": "scopeProtocolSyscalls",
        "kind": "function",
        "signature": "scopeProtocolSyscalls(kernel, appId, raw = kernel?.syscalls?.protocol)",
        "summary": ""
      },
      {
        "name": "scopeCommandSyscalls",
        "kind": "function",
        "signature": "scopeCommandSyscalls(kernel, appId, raw = kernel?.syscalls?.cmd)",
        "summary": ""
      },
      {
        "name": "cleanupAppRegistrations",
        "kind": "function",
        "signature": "cleanupAppRegistrations(kernel, appId, { logger = console } = {})",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/AppRegistry",
    "path": "webgpu-os/reference/kernel/AppRegistry.md",
    "source": "webgpu-os/kernel/AppRegistry.js",
    "import": "/webgpu-os/kernel/AppRegistry.js",
    "sourceHash": "29bf5250b5ede279d9bcd164cba9ccac442fc0751f3f73ba9f86d27ea1756788",
    "summary": "AppRegistry.js — fully dynamic, fetch-based app discovery. NO apps are hardcoded here. Discovery works as follows: 1. Fetch  apps/index.json  → array of folder names, e.g. [\"calculator\",\"notepad\",…] 2. For each folder, fetch  apps/<folder>/manifest.json 3. Resolve manifest.entry against the manifest URL (absolute URL) 4. Register and emit 'change' so the shell re-renders live To add a new app: create  apps/<name>/manifest.json  +  apps/<name>/YourApp.js, then add \"<name>\" to  apps/index.json.  No JS edits required. Manifest shape (see docs/APP_MANIFEST_SPEC.md): appId, name, entry, icon, category, surface, defaultWidth, defaultHeight, permissions, description, version, settings[]",
    "exports": [
      {
        "name": "AppManifestValidationError",
        "kind": "class",
        "signature": "class AppManifestValidationError extends Error",
        "summary": ""
      },
      {
        "name": "AppRegistry",
        "kind": "class",
        "signature": "class AppRegistry",
        "summary": ""
      },
      {
        "name": "validateAppManifest",
        "kind": "function",
        "signature": "validateAppManifest(manifest, { mode = APP_MANIFEST_VALIDATION.STRICT, registry = schemaRegistry, logger = console, } = {})",
        "summary": "Validate an authority-bearing manifest after removing registry-only fields."
      },
      {
        "name": "APP_MANIFEST_SCHEMA_VERSION",
        "kind": "constant",
        "signature": "APP_MANIFEST_SCHEMA_VERSION",
        "summary": ""
      },
      {
        "name": "APP_MANIFEST_VALIDATION",
        "kind": "constant",
        "signature": "APP_MANIFEST_VALIDATION",
        "summary": ""
      },
      {
        "name": "appRegistry",
        "kind": "constant",
        "signature": "appRegistry",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/CommandBus",
    "path": "webgpu-os/reference/kernel/CommandBus.md",
    "source": "webgpu-os/kernel/CommandBus.js",
    "import": "/webgpu-os/kernel/CommandBus.js",
    "sourceHash": "0d1d19f829f8b01d4fad3182ad2ad41b252be5b8db72d0c114e232d41ab078e1",
    "summary": "CommandBus.js — OS-wide addressable command registry. Every syscall namespace, app, and service can register handlers for dot-namespaced command strings: pkg.install    patch.apply    gpu.profile.start    browser.tabs.list Dispatch flow: caller → cmd.dispatch('pkg.install', { url }) → handler → result All dispatches are logged to /os/logs/commands.log (async, non-blocking). Usage: kernel.cmd.register('pkg.install', async ({ url }, ctx) => { ... }); const result = await kernel.cmd.dispatch('pkg.install', { url: '...' });",
    "exports": [
      {
        "name": "CommandBus",
        "kind": "class",
        "signature": "class CommandBus",
        "summary": "CommandBus.js — OS-wide addressable command registry. Every syscall namespace, app, and service can register handlers for dot-namespaced command strings: pkg.install    patch.apply    gpu.profile.start    browser.tabs.list Dispatch flow: caller → cmd.dispatch('pkg.install', { url }) → handler → result All dispatches are logged to /os/logs/commands.log (async, non-blocking). Usage: kernel.cmd.register('pkg.install', async ({ url }, ctx) => { ... }); const result = await kernel.cmd.dispatch('pkg.install', { url: '...' });"
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/FxBus",
    "path": "webgpu-os/reference/kernel/FxBus.md",
    "source": "webgpu-os/kernel/FxBus.js",
    "import": "/webgpu-os/kernel/FxBus.js",
    "sourceHash": "c3bccea31af288fa7f594fc46eb8fdd5b253ab641551e422a12724dfae4bd1ba",
    "summary": "FxBus.js — the OS \"FX Bridge\". A normalized pipeline that lets apps (and the OS itself) publish a lightweight \"vibe\" — a dominant accent color, optional palette, an energy level, and an optional beat/mood — which the desktop reacts to (ambient tint/pulse, accent glow) and which external sinks (WLED / Home Assistant / Hue via a relay) can later subscribe to. Producers: - Explicit: an app calls `syscalls.fx.publish(frame)` (capability `fx.emit`). Sandboxed iframe guests call `window.os.fx.publish(frame)`, routed over the existing postMessage RPC bridge. - Automatic: `startAutoSample()` samples a provided surface (canvas/img/video) and extracts the dominant color, so an app can drive effects with no code. Consumers subscribe to the kernel event `os:fx-frame`. The built-in consumer is AmbientEngine.fxTint(); more sinks can be added without touching producers. Frames are normalized and rate-limited (coalesced to ~one emit per minInterval) so a chatty producer cannot flood the desktop or thrash the compositor.",
    "exports": [
      {
        "name": "FxBus",
        "kind": "class",
        "signature": "class FxBus",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/GpuDeviceBroker",
    "path": "webgpu-os/reference/kernel/GpuDeviceBroker.md",
    "source": "webgpu-os/kernel/GpuDeviceBroker.js",
    "import": "/webgpu-os/kernel/GpuDeviceBroker.js",
    "sourceHash": "f3f1f5f1f6ecd9acea8e7ffa50af44d74e4aa4296b155772be0b77ee6639c1f3",
    "summary": "GpuDeviceBroker.js — per-app GPU device facades, quotas, and adapter redaction. WHY a facade and not a Proxy of the real GPUDevice? Host objects with internal slots (GPUDevice/GPUQueue) fail brand checks when a Proxy is handed back to other WebGPU APIs (notably `GPUCanvasContext .configure({ device })`). So we hand apps a *forwarding facade*: a plain object that forwards to the real device and ALWAYS returns real host objects (real GPUBuffer/GPUTexture/encoder/queue). The only host API that consumes the device object itself is `context.configure` — untrusted apps should get their canvas via `gpu.acquireSurface` (configured by the OS with the REAL device), so they never need to pass the facade anywhere. If an untrusted app does configure a canvas itself with the facade it fails closed (safe). POLICY: trusted / built-in apps receive the RAW device (zero compatibility risk). Untrusted (unverified) apps receive a facade that: - tracks + quota-checks every createBuffer / createTexture (via VRAMTracker), - counts pipelines / shader modules / queue submits per app, - enforces a command-submit budget (anti-runaway), - partitions the shader-module cache per app (no cross-app cache sharing), - fails closed after device loss until the broker re-issues a fresh facade.",
    "exports": [
      {
        "name": "GpuDeviceBroker",
        "kind": "class",
        "signature": "class GpuDeviceBroker",
        "summary": ""
      },
      {
        "name": "bucketLimits",
        "kind": "function",
        "signature": "bucketLimits(limits)",
        "summary": "Bucket GPUSupportedLimits into a coarse, plain object. Reduces fingerprint entropy (exact limits vary per GPU/driver) while keeping values usable. Returns a plain object with the same keys apps read."
      },
      {
        "name": "bucketAdapterInfo",
        "kind": "function",
        "signature": "bucketAdapterInfo(info)",
        "summary": "Redact a rich adapter-info report down to a coarse, low-entropy summary for untrusted apps. Keeps the vendor *bucket* and capability booleans; drops the precise renderer string, driver version, device id, and exact limits."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/GpuInfo",
    "path": "webgpu-os/reference/kernel/GpuInfo.md",
    "source": "webgpu-os/kernel/GpuInfo.js",
    "import": "/webgpu-os/kernel/GpuInfo.js",
    "sourceHash": "47a9a3500997dcbcb38a8a7fc94985b52ad814b0521c727de77964254644ba7d",
    "summary": "GpuInfo.js — rich, consolidated GPU adapter reporting for the OS. Browsers expose the GPU through several uneven channels; the most accurate picture comes from combining them (this mirrors what the engine's VGPUMemoryTracker / GPU Profiler do, minus the heavy VRAM probe): 1. WebGPU `adapter.info`            → vendor / architecture / device / description 2. `adapter.requestAdapterInfo()`   → same, legacy async fallback 3. `device.adapterInfo`             → some implementations expose it here 4. WebGL `WEBGL_debug_renderer_info`→ the UNMASKED renderer string is usually the only place the real model name (e.g. \"AMD Radeon RX 6700 XT\") appears, since Chrome hides it from adapter.info. 5. `adapter.features` / `.limits`   → capability flags + key device limits `gatherGpuInfo()` returns ONE structured report plus best-effort adapter preference probes. Everything is best-effort and never throws — missing channels just leave their fields empty.",
    "exports": [
      {
        "name": "vendorBucket",
        "kind": "function",
        "signature": "vendorBucket(info)",
        "summary": "Coarse vendor label from any descriptive string."
      },
      {
        "name": "friendlyAdapterName",
        "kind": "function",
        "signature": "friendlyAdapterName(info)",
        "summary": "Best human-readable adapter name from the combined channels."
      },
      {
        "name": "gatherGpuInfo",
        "kind": "function",
        "signature": "async gatherGpuInfo(adapter, device = null, options = {})",
        "summary": "Gather a full GPU report from a WebGPU adapter (+ optional device)."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/KernelBootstrap",
    "path": "webgpu-os/reference/kernel/KernelBootstrap.md",
    "source": "webgpu-os/kernel/KernelBootstrap.js",
    "import": "/webgpu-os/kernel/KernelBootstrap.js",
    "sourceHash": "450df00e29c9578d127d42542d6f43ea61a0cf7a7d7cc68553381ad115ee81e6",
    "summary": "KernelBootstrap — the OS kernel layer. Owns: - The single shared WebGPU device (if available). - The central task scheduler (kernel-owned RAF). - The event bus. - GPU device-lost fan-out to all registered apps. - The syscall surface exposed to apps. Tier-2 note: In Tier 2 this becomes a Rust native-host service; the kernel.syscalls shape must remain stable across tiers.",
    "exports": [
      {
        "name": "KernelBootstrap",
        "kind": "class",
        "signature": "class KernelBootstrap",
        "summary": "KernelBootstrap — the OS kernel layer. Owns: - The single shared WebGPU device (if available). - The central task scheduler (kernel-owned RAF). - The event bus. - GPU device-lost fan-out to all registered apps. - The syscall surface exposed to apps. Tier-2 note: In Tier 2 this becomes a Rust native-host service; the kernel.syscalls shape must remain stable across tiers."
      },
      {
        "name": "KernelEventBus",
        "kind": "class",
        "signature": "class KernelEventBus",
        "summary": "Minimal synchronous event bus for kernel-internal use. Apps should use kernel.syscalls.ipc for cross-app messaging."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/LaunchCoordinator",
    "path": "webgpu-os/reference/kernel/LaunchCoordinator.md",
    "source": "webgpu-os/kernel/LaunchCoordinator.js",
    "import": "/webgpu-os/kernel/LaunchCoordinator.js",
    "sourceHash": "3d32e5413fd7eb74af7a821015b656c3a9cb843d683d69f175823a4b6d3d21fe",
    "summary": "Route validated launch intents through the existing desktop and subsurface services.",
    "exports": [
      {
        "name": "LaunchCoordinator",
        "kind": "class",
        "signature": "class LaunchCoordinator",
        "summary": "Route validated launch intents through the existing desktop and subsurface services."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/LaunchIntent",
    "path": "webgpu-os/reference/kernel/LaunchIntent.md",
    "source": "webgpu-os/kernel/LaunchIntent.js",
    "import": "/webgpu-os/kernel/LaunchIntent.js",
    "sourceHash": "935b8e4e1bf86c5482d82039688e368069fbb760b9c80161b6b92c349415b04c",
    "summary": "Canonical, untrusted-input boundary for browser and operating-system launches.",
    "exports": [
      {
        "name": "LaunchIntentError",
        "kind": "class",
        "signature": "class LaunchIntentError extends Error",
        "summary": ""
      },
      {
        "name": "parseLaunchUrl",
        "kind": "function",
        "signature": "parseLaunchUrl(input, { baseUrl = globalThis.location?.href ?? 'https://localhost/webgpu-os/', scopePath = DEFAULT_LAUNCH_SCOPE, } = {})",
        "summary": "Parse a canonical launch URL. Non-launch URLs inside the shell return null; malformed URLs under /open/ throw so callers can log a security rejection."
      },
      {
        "name": "LAUNCH_CONTRACT_VERSION",
        "kind": "constant",
        "signature": "LAUNCH_CONTRACT_VERSION",
        "summary": "Canonical, untrusted-input boundary for browser and operating-system launches."
      },
      {
        "name": "DEFAULT_LAUNCH_SCOPE",
        "kind": "constant",
        "signature": "DEFAULT_LAUNCH_SCOPE",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/ModRegistry",
    "path": "webgpu-os/reference/kernel/ModRegistry.md",
    "source": "webgpu-os/kernel/ModRegistry.js",
    "import": "/webgpu-os/kernel/ModRegistry.js",
    "sourceHash": "88be212f6c5d36b350106f004bdd9372e72efa751409865395b49ce99d743987",
    "summary": "ModRegistry.js — dynamic mod discovery, mirroring AppRegistry. Scans  mods/index.json  → per-mod  mods/<folder>/manifest.json Imports the mod entry and registers its hooks into PatchBus. Mod manifest shape: modId        — unique reverse-domain id, e.g. \"com.example.dark-plus\" name         — display name version      — semver string author       — author name description  — one-line description targets      — array of appIds to patch, or [\"*\"] for all apps entry        — relative path to mod JS module (default export = mod object) entryOverride — boolean, if true this mod completely replaces the app entry enabled      — boolean (default true), false to disable without removing Adding a new mod: 1. Create  mods/<name>/manifest.json 2. Create  mods/<name>/YourMod.js  (default export: mod object) 3. Add \"<name>\" to  mods/index.json No kernel or app code changes required.",
    "exports": [
      {
        "name": "ModRegistry",
        "kind": "class",
        "signature": "class ModRegistry",
        "summary": ""
      },
      {
        "name": "modRegistry",
        "kind": "constant",
        "signature": "modRegistry",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/OsLogger",
    "path": "webgpu-os/reference/kernel/OsLogger.md",
    "source": "webgpu-os/kernel/OsLogger.js",
    "import": "/webgpu-os/kernel/OsLogger.js",
    "sourceHash": "b052b52ba13aa5e4067cf1b194e60ab9efe2833559edfe93023c888a0153ffd7",
    "summary": "OsLogger.js — in-memory ring-buffer logger for the OS kernel and apps. Levels: debug < info < warn < error Keeps the last MAX_ENTRIES entries in memory. Listeners (e.g. Log Viewer) are notified on each write. Optionally flushes to /os/logs/os.log via StorageManager (non-blocking).",
    "exports": [
      {
        "name": "OsLogger",
        "kind": "class",
        "signature": "class OsLogger",
        "summary": ""
      },
      {
        "name": "projectLogMetadata",
        "kind": "function",
        "signature": "projectLogMetadata(value)",
        "summary": "Produce an accessor-free, bounded, closed projection for a log entry. Unknown fields and nested objects are omitted instead of serialized."
      },
      {
        "name": "OS_LOG_CAPACITY",
        "kind": "constant",
        "signature": "OS_LOG_CAPACITY",
        "summary": ""
      },
      {
        "name": "OS_LOG_CAPACITY_BYTES",
        "kind": "constant",
        "signature": "OS_LOG_CAPACITY_BYTES",
        "summary": ""
      },
      {
        "name": "osLogger",
        "kind": "constant",
        "signature": "osLogger",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/PatchBus",
    "path": "webgpu-os/reference/kernel/PatchBus.md",
    "source": "webgpu-os/kernel/PatchBus.js",
    "import": "/webgpu-os/kernel/PatchBus.js",
    "sourceHash": "b06cc91475eccca92e4bb0c50eefdf2c8a345d9c393aa9ad646b27585981d7d5",
    "summary": "PatchBus.js — Android-style mod / patch bus for WebGPU OS. Provides: beforeMount / afterMount / beforeUnmount / afterUnmount hooks UI injection    — mods append DOM into any app panel CSS injection   — scoped to the app's panel element automatically Manifest patch  — mods can widen panels, add permissions, change defaults Entry override  — a mod can fully replace an app's module Syscall intercept — middleware chain on any syscall namespace.method Hook execution order: mods registered first run first (FIFO per phase). Syscall interceptors are chained: each calls next() to delegate down. ── Mod object API (default export from mod entry file) ───────────────────── beforeMount(container, syscalls, manifest)           → void | Promise afterMount(container, syscalls, appInstance, manifest) → void | Promise beforeUnmount(appInstance, manifest)                 → void | Promise afterUnmount(manifest)                               → void | Promise injectUI(container, manifest)                        → HTMLElement | null injectCSS(manifest)                                  → string | null patchManifest(manifest)                              → Partial<Manifest> interceptSyscall(syscallPath, args, next)            → any None of these are required — implement only what you need.",
    "exports": [
      {
        "name": "PatchBus",
        "kind": "class",
        "signature": "class PatchBus",
        "summary": "PatchBus.js — Android-style mod / patch bus for WebGPU OS. Provides: beforeMount / afterMount / beforeUnmount / afterUnmount hooks UI injection    — mods append DOM into any app panel CSS injection   — scoped to the app's panel element automatically Manifest patch  — mods can widen panels, add permissions, change defaults Entry override  — a mod can fully replace an app's module Syscall intercept — middleware chain on any syscall namespace.method Hook execution order: mods registered first run first (FIFO per phase). Syscall interceptors are chained: each calls next() to delegate down. ── Mod object API (default export from mod entry file) ───────────────────── beforeMount(container, syscalls, manifest)           → void | Promise afterMount(container, syscalls, appInstance, manifest) → void | Promise beforeUnmount(appInstance, manifest)                 → void | Promise afterUnmount(manifest)                               → void | Promise injectUI(container, manifest)                        → HTMLElement | null injectCSS(manifest)                                  → string | null patchManifest(manifest)                              → Partial<Manifest> interceptSyscall(syscallPath, args, next)            → any None of these are required — implement only what you need."
      },
      {
        "name": "patchBus",
        "kind": "constant",
        "signature": "patchBus",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/PermissionPortal",
    "path": "webgpu-os/reference/kernel/PermissionPortal.md",
    "source": "webgpu-os/kernel/PermissionPortal.js",
    "import": "/webgpu-os/kernel/PermissionPortal.js",
    "sourceHash": "f8633ebfb07acff9fd989d4eb929bbd2c422e64210a2f2b01d0fe2e788580f7e",
    "summary": "PermissionPortal.js — user-facing permission prompt. Appears as a stacked card above the taskbar whenever an app requests a capability that is not yet decided. Multiple requests queue and show one at a time (FIFO). Each card: ┌──────────────────────────────────────┐ │ 🔒  os.my-app wants permission       │ │     Access camera                    │ │     Risk: ● High                     │ │  [Deny]  [Allow Once]  [Allow Always] │ └──────────────────────────────────────┘ Usage (kernel internal — apps call syscalls.permissions.request()): const portal = new PermissionPortal(); portal.mount(document.body); const granted = await portal.ask(appId, capability, manifest);",
    "exports": [
      {
        "name": "PermissionPortal",
        "kind": "class",
        "signature": "class PermissionPortal",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/PermissionStore",
    "path": "webgpu-os/reference/kernel/PermissionStore.md",
    "source": "webgpu-os/kernel/PermissionStore.js",
    "import": "/webgpu-os/kernel/PermissionStore.js",
    "sourceHash": "f40217dcfdab726e7eb5218fc78b34c0a762c165e8e7ef7346f43585bc5b6aab",
    "summary": "PermissionStore.js — IDB-backed persistence of user permission decisions. Decisions are keyed as `{appId}::{capability}` in the 'permissions' IDB store. Each record: { appId, capability, decision: 'allow'|'deny', scope: 'once'|'always', ts } 'once' decisions are in-memory only (not persisted). 'always' decisions are stored and reloaded on next boot.",
    "exports": [
      {
        "name": "PermissionStore",
        "kind": "class",
        "signature": "class PermissionStore",
        "summary": "PermissionStore.js — IDB-backed persistence of user permission decisions. Decisions are keyed as `{appId}::{capability}` in the 'permissions' IDB store. Each record: { appId, capability, decision: 'allow'|'deny', scope: 'once'|'always', ts } 'once' decisions are in-memory only (not persisted). 'always' decisions are stored and reloaded on next boot."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/Permissions",
    "path": "webgpu-os/reference/kernel/Permissions.md",
    "source": "webgpu-os/kernel/Permissions.js",
    "import": "/webgpu-os/kernel/Permissions.js",
    "sourceHash": "b35e182e3b63a183a8cfdabc3fbd7e4537224e421ef3320467d131ae0cea66f1",
    "summary": "Permissions.js — capability gating backed by RuleGraph. Phase 4: enforces manifest-declared permissions via a declarative RuleGraph. Phase 1 mode: audit-only (log violations, never block) — set enforcing=false. Tier 2: delegates to WASI capability broker (same check() interface). Usage: kernel.permissions.registerApp(appId, manifest) kernel.permissions.check(appId, 'gpu.compute')  → { granted, reason } kernel.permissions.require(appId, 'gpu.compute') → throws if denied + enforcing",
    "exports": [
      {
        "name": "Permissions",
        "kind": "class",
        "signature": "class Permissions",
        "summary": ""
      },
      {
        "name": "PermissionDeniedError",
        "kind": "class",
        "signature": "class PermissionDeniedError extends Error",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/ProcessTable",
    "path": "webgpu-os/reference/kernel/ProcessTable.md",
    "source": "webgpu-os/kernel/ProcessTable.js",
    "import": "/webgpu-os/kernel/ProcessTable.js",
    "sourceHash": "903a1371476bee032dbf10b9b2c60f0eec9c3a84516d8ff86c69f989dd2e1117",
    "summary": "ProcessTable.js — tracks all running app panel instances. Each entry maps an appId to its runtime handle: { appId, panelId, manifestPath, panel, resources, startedAt, parentAppId, cpuMs, memoryBytes, networkBytes, diskBytes, lastSampleAt } Phase 4 extends this with per-app VRAM quotas, capability sets, and \"destroy on policy breach\" enforcement. Phase 5 adds full system monitoring (CPU%, memory, network I/O, disk I/O).",
    "exports": [
      {
        "name": "ProcessTable",
        "kind": "class",
        "signature": "class ProcessTable",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/ProvenanceChecker",
    "path": "webgpu-os/reference/kernel/ProvenanceChecker.md",
    "source": "webgpu-os/kernel/ProvenanceChecker.js",
    "import": "/webgpu-os/kernel/ProvenanceChecker.js",
    "sourceHash": "8e583663803989ca8c3bce6d502dc2a7067a0fd02248d9665cd63d58ceb0162c",
    "summary": "ProvenanceChecker.js — SLSA-inspired build provenance validation. Signatures prove WHO built a package; provenance proves HOW. The 2026 TanStack attack shipped packages with valid signatures from a hijacked builder, so we validate a provenance block and (critically) that the declared source materials actually match the packaged files. Provenance block shape (in the envelope): { sourceRef:  'git@…#<commit>' | 'webgpu-os/devtools', builderId:  'webgpu-os/devtools' | 'ci/github', builtAt:    ISO timestamp, buildParams:{ … }, materials:  [ { path: 'files/app.js', sha256: '…' }, … ] } Returns a verdict { ok, level, builderId, warnings[] }: level 0 — no provenance (allowed, but lowers trust → risk badge) level 1 — provenance present + materials match packaged files level 2 — level 1 AND builder is a recognized trusted builder",
    "exports": [
      {
        "name": "ProvenanceChecker",
        "kind": "class",
        "signature": "class ProvenanceChecker",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/RuleGraph",
    "path": "webgpu-os/reference/kernel/RuleGraph.md",
    "source": "webgpu-os/kernel/RuleGraph.js",
    "import": "/webgpu-os/kernel/RuleGraph.js",
    "sourceHash": "19749b4a686d1dff1d8237985a02ec3ed78c2290a73e14ce7e3263e2dd97786f",
    "summary": "RuleGraph.js — declarative capability-based permissions engine. Rules are evaluated in registration order; the LAST matching rule wins (CSS-like specificity — more specific rules override general ones). Capabilities follow a dot-namespace convention: fs.read, fs.write, gpu.compute, gpu.acquireSurface, net.send, net.on, ai.infer, ui.notify, ipc.emit, … Wildcard matching: 'fs.*'  matches any capability starting with 'fs.' '*'     matches everything Condition functions receive (appId, capability, manifest) and return bool. A rule with a condition is only applied when the condition is true. Usage: const graph = new RuleGraph() .allow('fs.*') .deny('net.*') .allowIf('gpu.compute', (id, cap, mf) => mf.permissions?.includes('gpu.compute')); const { granted, reason } = graph.check('os.calculator', 'fs.read', manifest);",
    "exports": [
      {
        "name": "RuleGraph",
        "kind": "class",
        "signature": "class RuleGraph",
        "summary": "RuleGraph.js — declarative capability-based permissions engine. Rules are evaluated in registration order; the LAST matching rule wins (CSS-like specificity — more specific rules override general ones). Capabilities follow a dot-namespace convention: fs.read, fs.write, gpu.compute, gpu.acquireSurface, net.send, net.on, ai.infer, ui.notify, ipc.emit, … Wildcard matching: 'fs.*'  matches any capability starting with 'fs.' '*'     matches everything Condition functions receive (appId, capability, manifest) and return bool. A rule with a condition is only applied when the condition is true. Usage: const graph = new RuleGraph() .allow('fs.*') .deny('net.*') .allowIf('gpu.compute', (id, cap, mf) => mf.permissions?.includes('gpu.compute')); const { granted, reason } = graph.check('os.calculator', 'fs.read', manifest);"
      },
      {
        "name": "buildDefaultRuleGraph",
        "kind": "function",
        "signature": "buildDefaultRuleGraph()",
        "summary": "Build the default OS-wide RuleGraph. Apps with explicit manifest.permissions entries unlock restricted capabilities."
      },
      {
        "name": "KNOWN_CAPABILITIES",
        "kind": "constant",
        "signature": "KNOWN_CAPABILITIES",
        "summary": ""
      },
      {
        "name": "CAPABILITY_LABELS",
        "kind": "constant",
        "signature": "CAPABILITY_LABELS",
        "summary": "Human-readable label for each capability (used by PermissionPortal)."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/RuntimeModeManager",
    "path": "webgpu-os/reference/kernel/RuntimeModeManager.md",
    "source": "webgpu-os/kernel/RuntimeModeManager.js",
    "import": "/webgpu-os/kernel/RuntimeModeManager.js",
    "sourceHash": "8eebf325ae626b3f5579417c7dab268ff1eb6f57eec3afa314eae601283fe317",
    "summary": "RuntimeModeManager.js — Runtime ↔ Developer mode switch. Modes: 'runtime'   — enforcing permissions, no debug surface, production-like 'developer' — enforcing permissions, bounded diagnostics, hot-reload enabled Effects applied on mode change: runtime    → permissions.setEnforcing(true), window.__DEV__ = false developer  → permissions.setEnforcing(true), window.__DEV__ = true Developer mode is never an authority bypass. Entering it requires a trusted system principal and a live browser user activation; the kernel object and private services are never projected onto `window`. Persisted in IDB kv store under key 'os.runtimeMode'. Emits kernel event 'os:mode-change' with { mode, prev }.",
    "exports": [
      {
        "name": "RuntimeModeManager",
        "kind": "class",
        "signature": "class RuntimeModeManager",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/SearchManager",
    "path": "webgpu-os/reference/kernel/SearchManager.md",
    "source": "webgpu-os/kernel/SearchManager.js",
    "import": "/webgpu-os/kernel/SearchManager.js",
    "sourceHash": "ac5cbaec4cbea85c49ca5c08f5a2d93feff3bba231823b4e73ede0149a69737e",
    "summary": "SearchManager.js — unified OS search backend for the command palette. Aggregates \"app elements\" from three kinds of sources, on top of the apps / subsurfaces / deep-links the palette already indexes: 1. Quick Actions (static)  — declared in a manifest's `actions` array. Each is a runnable item. If it carries a `command`, the palette dispatches it on the CommandBus; otherwise it is delivered to the app as an app-action (the app is opened/focused first, then receives ui:app-action / reads pendingActions). 2. Live content providers  — a running app registers a query callback via ui.registerSearchProvider(id, { label, query }). `query(q)` returns result items { id, label, sublabel?, icon?, run } where run() performs the action. Providers are same-realm closures, so run() can call straight back into the app. 3. Commands (opt-in)        — CommandBus commands registered with meta.search:true become searchable; selecting dispatches them (no-arg). Opt-in keeps destructive commands out of search by default. Events: ui:app-action { appId, actionId, args } — a manifest app-action was invoked.",
    "exports": [
      {
        "name": "SearchManager",
        "kind": "class",
        "signature": "class SearchManager",
        "summary": "SearchManager.js — unified OS search backend for the command palette. Aggregates \"app elements\" from three kinds of sources, on top of the apps / subsurfaces / deep-links the palette already indexes: 1. Quick Actions (static)  — declared in a manifest's `actions` array. Each is a runnable item. If it carries a `command`, the palette dispatches it on the CommandBus; otherwise it is delivered to the app as an app-action (the app is opened/focused first, then receives ui:app-action / reads pendingActions). 2. Live content providers  — a running app registers a query callback via ui.registerSearchProvider(id, { label, query }). `query(q)` returns result items { id, label, sublabel?, icon?, run } where run() performs the action. Providers are same-realm closures, so run() can call straight back into the app. 3. Commands (opt-in)        — CommandBus commands registered with meta.search:true become searchable; selecting dispatches them (no-arg). Opt-in keeps destructive commands out of search by default. Events: ui:app-action { appId, actionId, args } — a manifest app-action was invoked."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/SecurityDoctor",
    "path": "webgpu-os/reference/kernel/SecurityDoctor.md",
    "source": "webgpu-os/kernel/SecurityDoctor.js",
    "import": "/webgpu-os/kernel/SecurityDoctor.js",
    "sourceHash": "67001167766ed98e8d0407c51f341ef8052f6a4be029d5dc1c4f1088fc3bcc49",
    "summary": "SecurityDoctor.js — in-browser security posture report (no Node required). Aggregates the OS's runtime security signals into a single graded report: - syscall guard coverage (reuses auditSyscallGuards) - complete capability-policy coverage (reuses auditCapabilityMap) - permission enforcement state - package trust posture (quarantined / untrusted installed packages) - update supply-chain policy (signed + trusted-for-auto) - GPU containment (per-app broker + VRAM quotas) - shell CSP delivery (Report-Only vs enforcing, inline-script regressions) - browser-extension presence Each finding has a severity ('critical'|'high'|'medium'|'low'|'info') and a pass flag. `runSecurityDoctor(kernel)` returns a structured report suitable for logging or rendering in a Security Doctor panel.",
    "exports": [
      {
        "name": "scoreSecurityFindings",
        "kind": "function",
        "signature": "scoreSecurityFindings(findings)",
        "summary": ""
      },
      {
        "name": "runSecurityDoctor",
        "kind": "function",
        "signature": "async runSecurityDoctor(kernel)",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/SessionStore",
    "path": "webgpu-os/reference/kernel/SessionStore.md",
    "source": "webgpu-os/kernel/SessionStore.js",
    "import": "/webgpu-os/kernel/SessionStore.js",
    "sourceHash": "a7dd3a70dca2f4ab8779039597620bbaf4f8c600b28a6cc9ec96e0bcbe236c3e",
    "summary": "SessionStore.js — OS-wide, encrypted per-origin session + credential store. One machine-bound, AES-256-GCM encrypted IndexedDB store (via AppSandbox, db `os.sandbox.os.sessions`) shared by every app and the compat layer. It replaces the Browser app's localStorage-local vault/cookie stores so logins and per-site policy are managed OS-wide and consistently encrypted. Record kinds (one IDB key each): policy:<origin>  → 'persist' | 'isolated'      per-site session policy sess:<origin>    → { cookies:{k:v}, local:{k:v}, t }   agent-captured data vault            → the Browser vault blob (itself master-password encrypted; stored here so all apps share one OS-wide vault) IMPORTANT — what this can and cannot do: We CANNOT read a cross-origin live frame's real cookies (browser isolation), and Set-Cookie is a forbidden header. So \"persistence\" is policy-driven: • 'isolated' (default) → frame loads `credentialless` (ephemeral, sessionless) • 'persist'            → frame drops `credentialless` so the browser keeps its cookies natively across reloads + restarts Captured `sess:<origin>` data only comes from surfaces we CONTROL (proxied / srcdoc / compat-sandbox documents) via an injected agent — never scraped from a live cross-origin frame.",
    "exports": [
      {
        "name": "SessionStore",
        "kind": "class",
        "signature": "class SessionStore",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/SigningLineage",
    "path": "webgpu-os/reference/kernel/SigningLineage.md",
    "source": "webgpu-os/kernel/SigningLineage.js",
    "import": "/webgpu-os/kernel/SigningLineage.js",
    "sourceHash": "c9cb2590691cb4d249fcf891f8a9f2c5af15b737c2894c835391ccd5580713b9",
    "summary": "SigningLineage.js — publisher signing-key rotation lineage (proof-of-rotation). Models the Android APK Signature Scheme v3 \"proof-of-rotation\" idea in our ECDSA P-256 world: a singly-linked list of publisher keys, ordered oldest → newest, where EACH ancestor key signs the NEXT key's payload. This proves that a new key is endorsed by the previous one, so an app update signed by a fresh key is provably the same publisher identity as the version a user already pinned — \"reuse the same identity with new keys, still isolated per update.\" Two independent guarantees (kept separate, exactly like APK v3): 1. File integrity / self-verification — the CURRENT key signs the version's Merkle root (PackageBuilder.buildV2). That is unchanged and lives outside this module: a package always verifies against its own files. 2. Identity continuity — THIS module. The lineage is carried inside the signed package envelope (so it is covered by the current key's signature and cannot be stripped/swapped in transit), and proves the head key descends from the previously-pinned key. Lineage shape (`prlineage-v1`): { format: 'prlineage-v1', appId:  'community.my-app', nodes:  [ { pubKey:<b64>, fingerprint:<hex>, flags:<uint>, rotatedAt:<iso> }, ... ],  // oldest → newest links:  [ <b64 sig>, ... ]   // links[i] = nodes[i] signing canonical(nodes[i+1]); length = nodes.length - 1 } Node flags (self-trusted-old-certs, bitfield): FLAG_INSTALL  (1) — this (old) key may still authorize fresh installs FLAG_UPDATE   (2) — this (old) key may still sign updates Default for new rotations is 0 (strict): only the head key installs/updates; ancestors are accepted ONLY to prove continuity to a pinned fingerprint. SECURITY: this verifier is FAIL-CLOSED. Any malformed structure, fingerprint mismatch, or broken link signature ⇒ { valid:false }. Callers fall back to the existing publisher-change quarantine path on invalid/absent lineage. fingerprintOf:(pubRaw:Uint8Array)=>Promise<string>, sign?:(data:string)=>Promise<Uint8Array|null> }} CryptoLike",
    "exports": [
      {
        "name": "lineageNodePayload",
        "kind": "function",
        "signature": "lineageNodePayload(appId, prevFingerprint, node)",
        "summary": "Canonical signed payload for a lineage node — the bytes an ancestor key signs to endorse this successor node. Binds the successor's key, fingerprint, flags, the appId, and the PREVIOUS node's fingerprint, so a link cannot be replayed onto a different app or spliced into a different chain."
      },
      {
        "name": "verifyLineage",
        "kind": "function",
        "signature": "async verifyLineage(lineage, crypto)",
        "summary": "Verify a lineage end-to-end. FAIL-CLOSED."
      },
      {
        "name": "authorizeRotation",
        "kind": "function",
        "signature": "async authorizeRotation(lineage, signerFingerprint, pinnedFingerprint, crypto)",
        "summary": "Decide whether an update may proceed via key rotation. FAIL-CLOSED. Accepts iff the lineage is valid, its head equals the package's current signer fingerprint, and the previously-pinned fingerprint appears in the chain (i.e. the head provably descends from the key the user already trusts)."
      },
      {
        "name": "createGenesisLineage",
        "kind": "function",
        "signature": "async createGenesisLineage(appId, pubKeyRaw, crypto, flags = 0)",
        "summary": "Build the genesis (single-node) lineage for a brand-new publisher key."
      },
      {
        "name": "appendRotation",
        "kind": "function",
        "signature": "async appendRotation(lineage, newPubKeyRaw, signWithCurrent, crypto, opts = {})",
        "summary": "Append a rotation: the CURRENT head key signs the NEW key's node, proving the new key inherits the identity. The caller supplies a `signWithCurrent(data)` bound to the OLD/head private key (the dev's safely-kept key), so private keys never enter this module."
      },
      {
        "name": "LINEAGE_FORMAT",
        "kind": "constant",
        "signature": "LINEAGE_FORMAT",
        "summary": "SigningLineage.js — publisher signing-key rotation lineage (proof-of-rotation). Models the Android APK Signature Scheme v3 \"proof-of-rotation\" idea in our ECDSA P-256 world: a singly-linked list of publisher keys, ordered oldest → newest, where EACH ancestor key signs the NEXT key's payload. This proves that a new key is endorsed by the previous one, so an app update signed by a fresh key is provably the same publisher identity as the version a user already pinned — \"reuse the same identity with new keys, still isolated per update.\" Two independent guarantees (kept separate, exactly like APK v3): 1. File integrity / self-verification — the CURRENT key signs the version's Merkle root (PackageBuilder.buildV2). That is unchanged and lives outside this module: a package always verifies against its own files. 2. Identity continuity — THIS module. The lineage is carried inside the signed package envelope (so it is covered by the current key's signature and cannot be stripped/swapped in transit), and proves the head key descends from the previously-pinned key. Lineage shape (`prlineage-v1`): { format: 'prlineage-v1', appId:  'community.my-app', nodes:  [ { pubKey:<b64>, fingerprint:<hex>, flags:<uint>, rotatedAt:<iso> }, ... ],  // oldest → newest links:  [ <b64 sig>, ... ]   // links[i] = nodes[i] signing canonical(nodes[i+1]); length = nodes.length - 1 } Node flags (self-trusted-old-certs, bitfield): FLAG_INSTALL  (1) — this (old) key may still authorize fresh installs FLAG_UPDATE   (2) — this (old) key may still sign updates Default for new rotations is 0 (strict): only the head key installs/updates; ancestors are accepted ONLY to prove continuity to a pinned fingerprint. SECURITY: this verifier is FAIL-CLOSED. Any malformed structure, fingerprint mismatch, or broken link signature ⇒ { valid:false }. Callers fall back to the existing publisher-change quarantine path on invalid/absent lineage. fingerprintOf:(pubRaw:Uint8Array)=>Promise<string>, sign?:(data:string)=>Promise<Uint8Array|null> }} CryptoLike"
      },
      {
        "name": "LINEAGE_FLAG",
        "kind": "constant",
        "signature": "LINEAGE_FLAG",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/SubsurfaceManager",
    "path": "webgpu-os/reference/kernel/SubsurfaceManager.md",
    "source": "webgpu-os/kernel/SubsurfaceManager.js",
    "import": "/webgpu-os/kernel/SubsurfaceManager.js",
    "sourceHash": "d747047ff86b3ef92c05b98ba712c7cee32ffd8db7b64654b1104960576953f7",
    "summary": "SubsurfaceManager.js — kernel navigation service for app SUBSURFACES. A \"surface\" is an app's top-level display mode (window / overlay / tray — see manifest.surface). A \"subsurface\" is a navigable sub-location *inside* an app (a tab, section, or view), declared in the manifest as: \"subsurfaces\": [ { \"id\": \"mixer\", \"label\": \"Volume Mixer\", \"icon\": \"🎚\", \"keywords\": [\"volume\"] }, ... ] This service is the OS-level registry/tracker for deep-linking into those: - Active tracking: which subsurface each running app currently shows. - Pending nav:     a deep-link target stashed for an app that is still launching (the app reads it on mount via ui.pendingNavigate). - Recents + Pins:  persisted deep-link shortcuts (the \"small UI shortcuts\"), surfaced in the command palette / Start Menu. NOTE: This is distinct from SurfaceManager.js, which allocates WebGPU canvases. Events emitted on kernel.events: ui:navigate-subsurface  { appId, subsurfaceId, args }  — a deep-link was requested ui:subsurface-change    { appId, subsurfaceId }         — an app reported its active sub os:deeplinks-change     {}                              — pins/recents changed",
    "exports": [
      {
        "name": "SubsurfaceManager",
        "kind": "class",
        "signature": "class SubsurfaceManager",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/SurfaceManager",
    "path": "webgpu-os/reference/kernel/SurfaceManager.md",
    "source": "webgpu-os/kernel/SurfaceManager.js",
    "import": "/webgpu-os/kernel/SurfaceManager.js",
    "sourceHash": "6dfa2afae1cd8e51ae7c14d8bf846d35b9ad822e40cec7a38029968920570e92",
    "summary": "SurfaceManager.js — allocates and manages one WebGPU canvas surface per panel. Checks permissions (gpu.acquireSurface) and VRAM quotas before allocating.",
    "exports": [
      {
        "name": "SurfaceManager",
        "kind": "class",
        "signature": "class SurfaceManager",
        "summary": "Each `gpu-panel` app gets an exclusive <canvas> + GPUCanvasContext bound to the kernel's GPU device. The SurfaceManager handles: - Canvas creation and insertion into the panel body - GPUCanvasContext.configure() with the preferred format - ResizeObserver wiring so the canvas tracks panel resize - Clean release (unconfigure + canvas removal) on panel close Quota admission happens before GPUCanvasContext creation/configuration."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/Syscalls",
    "path": "webgpu-os/reference/kernel/Syscalls.md",
    "source": "webgpu-os/kernel/Syscalls.js",
    "import": "/webgpu-os/kernel/Syscalls.js",
    "sourceHash": "f61e95422a378284bffc6e00969428b22abe2a9ce64e8e27812e7c3e1774754e",
    "summary": "Syscalls.js — the stable Tier 1 ↔ Tier 2 contract boundary. Every app sees ONLY this surface. In Tier 1 (browser) each method delegates to the corresponding engine module. In Tier 2 (Rust + Wasmtime) each method becomes a WASI capability-table entry. ⚠  Never expose engine internals directly to apps. If an app needs a new capability, add a method here first; never let apps import from ../../engine/. Syscall namespaces: kernel.fs   — virtual filesystem (IndexedDB + ProjectManager) kernel.gpu  — GPU stats, resource budgets, device info kernel.ipc  — cross-app event bus kernel.ai   — inference handle (AGI driver, Phase 6) kernel.net    — networking (collab driver, Phase 5) kernel.crypto — ECDSA P-256 identity, sign/verify (CryptoDriver) kernel.ui     — notifications, modals, panels",
    "exports": [
      {
        "name": "createSyscalls",
        "kind": "function",
        "signature": "createSyscalls(kernel)",
        "summary": ""
      },
      {
        "name": "guardSyscalls",
        "kind": "function",
        "signature": "guardSyscalls(kernel, appId, syscalls)",
        "summary": "Wrap a syscalls object with per-app permission enforcement. Only restricted capabilities are guarded — universally-open ones (fs.*, ipc.*, ui.*) are skipped since they are always granted and the overhead is unnecessary."
      },
      {
        "name": "auditSyscallGuards",
        "kind": "function",
        "signature": "auditSyscallGuards(kernel)",
        "summary": "Inventory every syscall method and classify it as guarded / open / unguarded. Build-only: no syscall is invoked. Use at boot (dev mode) or in tests to catch privileged methods added without a capability guard."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/ThemeEngine",
    "path": "webgpu-os/reference/kernel/ThemeEngine.md",
    "source": "webgpu-os/kernel/ThemeEngine.js",
    "import": "/webgpu-os/kernel/ThemeEngine.js",
    "sourceHash": "9e963185d0530936101fe623cda8013d3273414a93fdbc11c157a0e38efbbf25",
    "summary": "ThemeEngine.js — Kernel-level theme orchestration service. Single source of truth for all OS appearance state. Exposes a middleware-chain hook system so mods can intercept theme changes before or after they are applied to the DOM. ── Modder API ──────────────────────────────────────────────────────────── const tm = syscalls.theme; // Before hook — middleware: receive appear + next(modified) tm.before('my-mod', (appear, next) => next({ ...appear, chromeStyle: 'metal' }), 'Force metal chrome'); // After hook — react to a completed theme change tm.after('my-mod', (appear) => console.log('Theme applied:', appear)); // Remove hooks tm.removeHook('my-mod'); // Reorder tm.moveHook('my-mod', 'before', 1);           // move to index 1 in before list // Preview (no save, no events) tm.preview({ ...tm.current(), chromeStyle: 'metal' }); // Apply (save + emit os:theme-change) tm.apply({ ...tm.current(), themeId: 'crimson' }); // Export / import theme JSON const json = tm.export(); tm.import(json); // List registered hooks tm.hookList(); // → [{ id, phase, description, enabled, order }]",
    "exports": [
      {
        "name": "ThemeEngine",
        "kind": "class",
        "signature": "class ThemeEngine",
        "summary": ""
      },
      {
        "name": "normalizeAppearance",
        "kind": "function",
        "signature": "normalizeAppearance(input = {})",
        "summary": "Normalize untrusted or legacy appearance data into the supported schema."
      },
      {
        "name": "readAppearanceRecord",
        "kind": "function",
        "signature": "readAppearanceRecord()",
        "summary": ""
      },
      {
        "name": "writeAppearanceRecord",
        "kind": "function",
        "signature": "writeAppearanceRecord(input)",
        "summary": "Publish one canonical appearance record after guarding the existing version."
      },
      {
        "name": "removeAppearanceRecord",
        "kind": "function",
        "signature": "removeAppearanceRecord()",
        "summary": "Remove the current record only when this runtime can understand it."
      },
      {
        "name": "THEMES",
        "kind": "constant",
        "signature": "THEMES",
        "summary": ""
      },
      {
        "name": "WALLPAPERS",
        "kind": "constant",
        "signature": "WALLPAPERS",
        "summary": ""
      },
      {
        "name": "APPEARANCE_VERSION",
        "kind": "constant",
        "signature": "APPEARANCE_VERSION",
        "summary": ""
      },
      {
        "name": "APPEARANCE_DEFAULTS",
        "kind": "constant",
        "signature": "APPEARANCE_DEFAULTS",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/ToolDriver",
    "path": "webgpu-os/reference/kernel/ToolDriver.md",
    "source": "webgpu-os/kernel/ToolDriver.js",
    "import": "/webgpu-os/kernel/ToolDriver.js",
    "sourceHash": "94b40f20959878cf1a20912877425347bfda32813ccbdeb9a397e0a107e2f4e0",
    "summary": "ToolDriver — small OS-native tool registry for LLM/tool callers. This mirrors the useful parts of Augment's tool registry in browser-native form: schema listing, guarded execution, history, read-only batching, and a narrow terminal bridge that never exposes the interactive terminal's eval path.",
    "exports": [
      {
        "name": "ToolDriver",
        "kind": "class",
        "signature": "class ToolDriver",
        "summary": ""
      },
      {
        "name": "evaluateCalculatorExpression",
        "kind": "function",
        "signature": "evaluateCalculatorExpression(expression)",
        "summary": ""
      },
      {
        "name": "normalizeCalculatorExpression",
        "kind": "function",
        "signature": "normalizeCalculatorExpression(expression)",
        "summary": ""
      },
      {
        "name": "projectContentFreeToolFailure",
        "kind": "function",
        "signature": "async projectContentFreeToolFailure(error, { toolName = 'unknown', errorCode = null, } = {})",
        "summary": "Project an arbitrary handler failure without retaining its message. Handler messages are untrusted and may quote complete tool inputs, credentials, or provider content. The digest preserves deterministic incident correlation."
      },
      {
        "name": "TOOL_ARGUMENT_HASH_OPTIONS",
        "kind": "constant",
        "signature": "TOOL_ARGUMENT_HASH_OPTIONS",
        "summary": ""
      },
      {
        "name": "TOOL_HISTORY_MAX_ENTRIES",
        "kind": "constant",
        "signature": "TOOL_HISTORY_MAX_ENTRIES",
        "summary": ""
      },
      {
        "name": "TOOL_HISTORY_MAX_BYTES",
        "kind": "constant",
        "signature": "TOOL_HISTORY_MAX_BYTES",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/TrayManager",
    "path": "webgpu-os/reference/kernel/TrayManager.md",
    "source": "webgpu-os/kernel/TrayManager.js",
    "import": "/webgpu-os/kernel/TrayManager.js",
    "sourceHash": "9ae7575d922475dac5c4ad6491f563db97365afce0fd106ad25e13100ae011ca",
    "summary": "TrayManager.js — system notification area (status icons). Background/utility apps register a small status icon next to the clock, the same model used by Windows' notification area, macOS' menu-bar extras, and the FreeDesktop StatusNotifier spec. Apps register via syscalls.ui.registerTrayIcon(spec) and the StatusTray renders them, with an overflow popup for icons beyond the visible limit. Icon spec: { id, appId?, icon, tooltip?, onClick?, menu?, priority? } - icon:    emoji/glyph string (or short text) - onClick: fn() invoked on left click (shared-realm apps only) - menu:    [{ label, onClick }] optional right-click menu - priority: higher sorts first (default 0)",
    "exports": [
      {
        "name": "TrayManager",
        "kind": "class",
        "signature": "class TrayManager",
        "summary": "TrayManager.js — system notification area (status icons). Background/utility apps register a small status icon next to the clock, the same model used by Windows' notification area, macOS' menu-bar extras, and the FreeDesktop StatusNotifier spec. Apps register via syscalls.ui.registerTrayIcon(spec) and the StatusTray renders them, with an overflow popup for icons beyond the visible limit. Icon spec: { id, appId?, icon, tooltip?, onClick?, menu?, priority? } - icon:    emoji/glyph string (or short text) - onClick: fn() invoked on left click (shared-realm apps only) - menu:    [{ label, onClick }] optional right-click menu - priority: higher sorts first (default 0)"
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/TrustStore",
    "path": "webgpu-os/reference/kernel/TrustStore.md",
    "source": "webgpu-os/kernel/TrustStore.js",
    "import": "/webgpu-os/kernel/TrustStore.js",
    "sourceHash": "4f6a1b21b64f78714a73fa895394201b0e8413875aa4ce96f03c2489641dd97c",
    "summary": "TrustStore.js — ring-0 trust anchors + publisher pinning for the package system. Two tiers of trust: 1. ROOTS  — public keys baked into the OS bundle (kernel/trust/roots.json). A publisher certificate that chains to a root is fully trusted. 2. PINS   — publishers the user accepted on first install (trust-on-first-use). Persisted in IndexedDB (kv store, key `trust.pin.<fingerprint>`). Anti-takeover: a pinned publisher is bound to a specific key fingerprint. If a later package for the same publisher presents a *different* fingerprint, the caller (PackageManager.verifyAndAuthorize) treats it as an identity change and blocks pending explicit re-consent — defending event-stream/durabletask-style account takeovers. SECURITY NOTE: signatures prove *who* built a package, not that the build was clean. Trust here is combined with provenance + static scan + egress controls.",
    "exports": [
      {
        "name": "TrustStore",
        "kind": "class",
        "signature": "class TrustStore",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/UiSounds",
    "path": "webgpu-os/reference/kernel/UiSounds.md",
    "source": "webgpu-os/kernel/UiSounds.js",
    "import": "/webgpu-os/kernel/UiSounds.js",
    "sourceHash": "a1eb998e98b83f7733585114aca4127903234ce6dc3ae300c3b6ae0ad2995821",
    "summary": "UiSounds.js — OS-wide UI sound engine (kernel service). Procedurally synthesizes short UI sounds (click, open, close, notify, error, …) through the OS AudioDriver's shared context, so every cue is mixed and volume- controlled centrally (it appears in the Sound mixer as a \"System sounds\" session). Sounds are auto-triggered from OS-wide kernel events (panel open/close/minimize/ restore, notifications, theme toggle) and from a global click listener, so the whole desktop gets feedback without each app wiring anything. Apps can also play a cue explicitly via syscalls.ui.sound('click'). ── Future customization ────────────────────────────────────────────────────────── Every cue is a named entry in a registry. A mod / sound pack can override or add cues at runtime: kernel.uiSounds.register('click', (ctx, out, t0) => { ... custom synth ... }); kernel.uiSounds.register('coin', (ctx, out, t0) => { ... new cue ... }); Per-cue enable flags, global enable, and volume persist in localStorage, ready for a settings UI (the Sound app exposes the global toggle + volume today).",
    "exports": [
      {
        "name": "UiSounds",
        "kind": "class",
        "signature": "class UiSounds",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/VRAMTracker",
    "path": "webgpu-os/reference/kernel/VRAMTracker.md",
    "source": "webgpu-os/kernel/VRAMTracker.js",
    "import": "/webgpu-os/kernel/VRAMTracker.js",
    "sourceHash": "0ef7f62132d39dc7ac8374e83f6e819f89e23a317e4ebeda838aee40c84cf3a4",
    "summary": "VRAMTracker.js — per-app GPU memory budget tracking. WebGPU does not expose actual VRAM usage. We track *requested* allocations: Surfaces  — estimated from canvas dimensions × bytes-per-pixel Buffers   — exact size passed to createBuffer (when routed via syscalls) Textures  — estimated from width × height × format bytes-per-pixel Admission is checked before allocations. Canvas surfaces receive a small, bounded reserve so buffer/texture workloads cannot consume the final UI capacity and make an app impossible to close or recover. Phase 5+ upgrade path: hook device.createBuffer/createTexture via a GPUDevice proxy to track all allocations, not just syscall-routed ones.",
    "exports": [
      {
        "name": "VRAMTracker",
        "kind": "class",
        "signature": "class VRAMTracker",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/VirtualFS",
    "path": "webgpu-os/reference/kernel/VirtualFS.md",
    "source": "webgpu-os/kernel/VirtualFS.js",
    "import": "/webgpu-os/kernel/VirtualFS.js",
    "sourceHash": "c7ee3f68da55aef3dd5e2fc429698fa16640adb5ddfef743c54f1d07664ae467",
    "summary": "VirtualFS.js — path-tree virtual filesystem. Features: POSIX-like paths   — /user/notepad/file.txt Directories        — implicit from file paths; explicit mkdir supported Persistence        — OPFS-backed via StorageManager (falls back to localStorage) Events             — on('write'|'delete'|'*', cb) for live watchers (e.g. Notepad tabs) JSON helpers       — readJSON / writeJSON All public methods are synchronous (reads from in-memory cache). Writes flush to OPFS asynchronously in the background. Call `await virtualFS.hydrate()` once at OS boot to preload OPFS → memory.",
    "exports": [
      {
        "name": "VirtualFS",
        "kind": "class",
        "signature": "class VirtualFS",
        "summary": ""
      },
      {
        "name": "virtualFS",
        "kind": "constant",
        "signature": "virtualFS",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/agent/JavaScriptProjectFacts",
    "path": "webgpu-os/reference/kernel/agent/JavaScriptProjectFacts.md",
    "source": "webgpu-os/kernel/agent/JavaScriptProjectFacts.js",
    "import": "/webgpu-os/kernel/agent/JavaScriptProjectFacts.js",
    "sourceHash": "38fb71e87ad0106cfdc4d0964f39a0fa991dab901267b967bb40be55115548fb",
    "summary": "Bounded lexical facts shared by project indexing and source verification. This module deliberately does not claim to parse JavaScript, TypeScript, or JSX. It identifies inspectable declarations and import specifiers while keeping lexical evidence distinct from parser evidence.",
    "exports": [
      {
        "name": "javascriptLanguageForPath",
        "kind": "function",
        "signature": "javascriptLanguageForPath(path = '')",
        "summary": ""
      },
      {
        "name": "inspectJavaScriptProjectFacts",
        "kind": "function",
        "signature": "inspectJavaScriptProjectFacts({ path = '', content = '', maxTokens = MAX_TOKENS, maxSymbols = MAX_SYMBOLS, maxImports = MAX_IMPORTS, } = {})",
        "summary": ""
      },
      {
        "name": "resolveJavaScriptImport",
        "kind": "function",
        "signature": "resolveJavaScriptImport({ sourcePath = '', specifier = '', knownFiles = null } = {})",
        "summary": ""
      },
      {
        "name": "dependencyName",
        "kind": "function",
        "signature": "dependencyName(specifier = '')",
        "summary": ""
      },
      {
        "name": "JAVASCRIPT_PROJECT_FACTS_FORMAT",
        "kind": "constant",
        "signature": "JAVASCRIPT_PROJECT_FACTS_FORMAT",
        "summary": "Bounded lexical facts shared by project indexing and source verification. This module deliberately does not claim to parse JavaScript, TypeScript, or JSX. It identifies inspectable declarations and import specifiers while keeping lexical evidence distinct from parser evidence."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/agent/MountedProjectIntelligenceIndex",
    "path": "webgpu-os/reference/kernel/agent/MountedProjectIntelligenceIndex.md",
    "source": "webgpu-os/kernel/agent/MountedProjectIntelligenceIndex.js",
    "import": "/webgpu-os/kernel/agent/MountedProjectIntelligenceIndex.js",
    "sourceHash": "dd6135481af41fba3618c8df6eebc58afc7bf00ec05e7cff5f4eb2d050d15fad",
    "summary": "Deterministic, authority-free project intelligence for a mounted workspace. The builder can see a workspace only through AI Echo's existing bounded storage.list and storage.read tool contracts. It returns source-backed facts separately from advisory suggestions and never exposes complete source text.",
    "exports": [
      {
        "name": "buildMountedProjectIntelligence",
        "kind": "function",
        "signature": "async buildMountedProjectIntelligence({ invokeTool, rootPath, workspaceRevision = '', maxEntries = DEFAULT_MAX_ENTRIES, maxDepth = DEFAULT_MAX_DEPTH, maxReadFiles = DEFAULT_MAX_READ_FILES, maxReadChars = DEFAULT_MAX_READ_CHARS, maxTotalReadChars = DEFAULT_MAX_TOTAL_READ_CHARS, } = {})",
        "summary": ""
      },
      {
        "name": "MOUNTED_PROJECT_INTELLIGENCE_FORMAT",
        "kind": "constant",
        "signature": "MOUNTED_PROJECT_INTELLIGENCE_FORMAT",
        "summary": ""
      },
      {
        "name": "AGENT_STORAGE_LIST_TOOL",
        "kind": "constant",
        "signature": "AGENT_STORAGE_LIST_TOOL",
        "summary": ""
      },
      {
        "name": "AGENT_STORAGE_READ_TOOL",
        "kind": "constant",
        "signature": "AGENT_STORAGE_READ_TOOL",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/ai-hub/AIDispatchScheduler",
    "path": "webgpu-os/reference/kernel/ai-hub/AIDispatchScheduler.md",
    "source": "webgpu-os/kernel/ai-hub/AIDispatchScheduler.js",
    "import": "/webgpu-os/kernel/ai-hub/AIDispatchScheduler.js",
    "sourceHash": "0af1053b8db32a9ee7c2eb4745b3c313134c38c5da903b33d70ea175b9891302",
    "summary": "AIDispatchScheduler.js — bounded, in-memory admission for live model calls. Prompts stay inside the caller's run closure and are never serialized or persisted by this scheduler. Owners are serviced round-robin while each owner's jobs retain FIFO start order. Provider and exact-route limits keep a burst of Navi work from crushing one remote endpoint.",
    "exports": [
      {
        "name": "AIDispatchError",
        "kind": "class",
        "signature": "class AIDispatchError extends Error",
        "summary": ""
      },
      {
        "name": "AIDispatchScheduler",
        "kind": "class",
        "signature": "class AIDispatchScheduler",
        "summary": ""
      },
      {
        "name": "AI_DISPATCH_DEFAULTS",
        "kind": "constant",
        "signature": "AI_DISPATCH_DEFAULTS",
        "summary": "AIDispatchScheduler.js — bounded, in-memory admission for live model calls. Prompts stay inside the caller's run closure and are never serialized or persisted by this scheduler. Owners are serviced round-robin while each owner's jobs retain FIFO start order. Provider and exact-route limits keep a burst of Navi work from crushing one remote endpoint."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/ai-hub/AIService",
    "path": "webgpu-os/reference/kernel/ai-hub/AIService.md",
    "source": "webgpu-os/kernel/ai-hub/AIService.js",
    "import": "/webgpu-os/kernel/ai-hub/AIService.js",
    "sourceHash": "8a956bcc0c2a49c6d70ee1011ad52b4af38b7d6e5cf9ceb7f80f790778480c3f",
    "summary": "AIService.js — the OS.ai() entrypoint (Phase 1 skeleton). Remote-provider based through an adaptive credential boundary. It prefers the isolated AI Bridge extension and falls back on phones to browser-direct OpenRouter or an approved user-controlled HTTPS proxy. Fully separate from `syscalls.ai.*` (the local on-device GGUF runtime). Exposed at kernel.aiHub and wrapped by syscalls.aiHub (capability-gated).",
    "exports": [
      {
        "name": "AIHub",
        "kind": "class",
        "signature": "class AIHub",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/ai-hub/AdaptiveProviderBridge",
    "path": "webgpu-os/reference/kernel/ai-hub/AdaptiveProviderBridge.md",
    "source": "webgpu-os/kernel/ai-hub/AdaptiveProviderBridge.js",
    "import": "/webgpu-os/kernel/ai-hub/AdaptiveProviderBridge.js",
    "sourceHash": "c9470aec531a8748dbadf1b2c5bfa75d137c2f19dc3b1aa01b640c29a58b6aee",
    "summary": "Chooses one credential/transport boundary per operation. The extension is always preferred because its origin isolates secrets from the OS page. Browser-direct is selected only when the extension remains unavailable after a bridge reprobe. Provider requests are never replayed across the two backends, preventing duplicate billing and duplicate tool/model effects.",
    "exports": [
      {
        "name": "AdaptiveProviderBridge",
        "kind": "class",
        "signature": "class AdaptiveProviderBridge",
        "summary": "Chooses one credential/transport boundary per operation. The extension is always preferred because its origin isolates secrets from the OS page. Browser-direct is selected only when the extension remains unavailable after a bridge reprobe. Provider requests are never replayed across the two backends, preventing duplicate billing and duplicate tool/model effects."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/ai-hub/DirectProviderBridge",
    "path": "webgpu-os/reference/kernel/ai-hub/DirectProviderBridge.md",
    "source": "webgpu-os/kernel/ai-hub/DirectProviderBridge.js",
    "import": "/webgpu-os/kernel/ai-hub/DirectProviderBridge.js",
    "sourceHash": "505af2c9b70ba79cc430bf22218496fa3d283f40cc892d0abb03eb28b7637261",
    "summary": "Browser-direct AI transport for phones and other browsers without extension support. The allowlist is deliberately narrow: - OpenRouter, whose official OAuth/PKCE flow supports browser clients. - A user-approved HTTPS OpenAI-compatible proxy controlled by the user. OpenAI, Anthropic, and other long-lived provider keys stay extension/server only. Their presence in the shared provider catalog does not grant this transport permission to call them.",
    "exports": [
      {
        "name": "DirectProviderBridge",
        "kind": "class",
        "signature": "class DirectProviderBridge",
        "summary": ""
      },
      {
        "name": "readCustomEndpointAllowlist",
        "kind": "function",
        "signature": "readCustomEndpointAllowlist(storage = globalThis.localStorage)",
        "summary": ""
      },
      {
        "name": "writeCustomEndpointAllowlist",
        "kind": "function",
        "signature": "writeCustomEndpointAllowlist(endpoints, storage = globalThis.localStorage)",
        "summary": ""
      },
      {
        "name": "readDirectModelCache",
        "kind": "function",
        "signature": "readDirectModelCache(storage = globalThis.localStorage)",
        "summary": ""
      },
      {
        "name": "writeDirectModelCache",
        "kind": "function",
        "signature": "writeDirectModelCache(records, storage = globalThis.localStorage)",
        "summary": ""
      },
      {
        "name": "CUSTOM_ENDPOINTS_KEY",
        "kind": "constant",
        "signature": "CUSTOM_ENDPOINTS_KEY",
        "summary": ""
      },
      {
        "name": "CUSTOM_ENDPOINTS_LEGACY_KEY",
        "kind": "constant",
        "signature": "CUSTOM_ENDPOINTS_LEGACY_KEY",
        "summary": ""
      },
      {
        "name": "CUSTOM_ENDPOINTS_FORMAT",
        "kind": "constant",
        "signature": "CUSTOM_ENDPOINTS_FORMAT",
        "summary": ""
      },
      {
        "name": "MODEL_CACHE_KEY",
        "kind": "constant",
        "signature": "MODEL_CACHE_KEY",
        "summary": ""
      },
      {
        "name": "MODEL_CACHE_FORMAT",
        "kind": "constant",
        "signature": "MODEL_CACHE_FORMAT",
        "summary": ""
      },
      {
        "name": "AI_DIRECT_PREFERENCE_VERSION",
        "kind": "constant",
        "signature": "AI_DIRECT_PREFERENCE_VERSION",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/ai-hub/ExtensionBridge",
    "path": "webgpu-os/reference/kernel/ai-hub/ExtensionBridge.md",
    "source": "webgpu-os/kernel/ai-hub/ExtensionBridge.js",
    "import": "/webgpu-os/kernel/ai-hub/ExtensionBridge.js",
    "sourceHash": "e52cd757fc8260971ea444ee0f5e2baf7ac339d097285726fe5e62430b9dba8c",
    "summary": "ExtensionBridge.js — the AI Hub's preferred isolated path to a remote provider. Talks to WebGPU OS Companion via kernel.browserBridge (relay.js's message contract). Never called with a page-supplied header; built-in routes accept only provider/model/messages/ params while custom endpoints remain explicitly approved by the user.",
    "exports": [
      {
        "name": "ExtensionBridge",
        "kind": "class",
        "signature": "class ExtensionBridge",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/ai-hub/LocalCredentialVault",
    "path": "webgpu-os/reference/kernel/ai-hub/LocalCredentialVault.md",
    "source": "webgpu-os/kernel/ai-hub/LocalCredentialVault.js",
    "import": "/webgpu-os/kernel/ai-hub/LocalCredentialVault.js",
    "sourceHash": "228dba9adbd835afa5ee3324712f1798133f30651975e09f0664eeaadae7092f",
    "summary": "Same-origin credential vault for browsers that cannot install extensions. Session credentials remain ephemeral. Opt-in persistent credentials use a non-extractable IndexedDB CryptoKey and a versioned, encrypted readback. V2 commits the Files-visible readback first and the matching IndexedDB slot second. Readers compare monotonically increasing generations and repair an interrupted second step. V1 envelopes/readbacks remain read-only inputs.",
    "exports": [
      {
        "name": "LocalCredentialContractError",
        "kind": "class",
        "signature": "class LocalCredentialContractError extends Error",
        "summary": ""
      },
      {
        "name": "LocalCredentialVault",
        "kind": "class",
        "signature": "class LocalCredentialVault",
        "summary": ""
      },
      {
        "name": "LOCAL_CREDENTIAL_CONTRACTS",
        "kind": "constant",
        "signature": "LOCAL_CREDENTIAL_CONTRACTS",
        "summary": ""
      },
      {
        "name": "LOCAL_CREDENTIAL_READBACK_PATH",
        "kind": "constant",
        "signature": "LOCAL_CREDENTIAL_READBACK_PATH",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/ai-hub/LocalRuntimeProvider",
    "path": "webgpu-os/reference/kernel/ai-hub/LocalRuntimeProvider.md",
    "source": "webgpu-os/kernel/ai-hub/LocalRuntimeProvider.js",
    "import": "/webgpu-os/kernel/ai-hub/LocalRuntimeProvider.js",
    "sourceHash": "8c0e901cb4f7939db8b874d29dbdc6435a61fdcbd346e736f0d507f71470a18f",
    "summary": "AI Hub adapter for the kernel-owned, on-device GGUF runtime. Installed models and generation defaults stay authoritative in LLMDriver; this class only translates that state into the provider-neutral AI Hub contract.",
    "exports": [
      {
        "name": "LocalRuntimeProvider",
        "kind": "class",
        "signature": "class LocalRuntimeProvider",
        "summary": ""
      },
      {
        "name": "automaticRoutingReadiness",
        "kind": "function",
        "signature": "automaticRoutingReadiness(model, runtimeStatus = {})",
        "summary": "Automatic Navi routing is stricter than catalog presence. A saved handle can identify a model without proving that this tab can read it, and an initialized driver can exist without a usable WebGPU device. Manual LLM Runtime flows may still ask the operator to reconnect a handle; unattended routing may not."
      },
      {
        "name": "LOCAL_RUNTIME_PROVIDER_ID",
        "kind": "constant",
        "signature": "LOCAL_RUNTIME_PROVIDER_ID",
        "summary": "AI Hub adapter for the kernel-owned, on-device GGUF runtime. Installed models and generation defaults stay authoritative in LLMDriver; this class only translates that state into the provider-neutral AI Hub contract."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/ai-hub/ModelCapabilityRegistry",
    "path": "webgpu-os/reference/kernel/ai-hub/ModelCapabilityRegistry.md",
    "source": "webgpu-os/kernel/ai-hub/ModelCapabilityRegistry.js",
    "import": "/webgpu-os/kernel/ai-hub/ModelCapabilityRegistry.js",
    "sourceHash": "f2576f10dcbd81140313a92307a76e4db92c821b20ae00c9ee558a7a95d109f7",
    "summary": "ModelCapabilityRegistry.js — maps an abstract `modelTier` to a concrete { provider, model } pair for the OS AI Hub. Apps ask for a tier ('fast', 'balanced', 'reasoning'), not a specific vendor model, so the default can change without touching every app's request payload.",
    "exports": [
      {
        "name": "ModelCapabilityRegistry",
        "kind": "class",
        "signature": "class ModelCapabilityRegistry",
        "summary": ""
      },
      {
        "name": "readModelCapabilityRouting",
        "kind": "function",
        "signature": "readModelCapabilityRouting(storage = globalThis.localStorage)",
        "summary": ""
      },
      {
        "name": "writeModelCapabilityRouting",
        "kind": "function",
        "signature": "writeModelCapabilityRouting(tiers, storage = globalThis.localStorage)",
        "summary": ""
      },
      {
        "name": "MODEL_CAPABILITY_STORAGE_KEY",
        "kind": "constant",
        "signature": "MODEL_CAPABILITY_STORAGE_KEY",
        "summary": ""
      },
      {
        "name": "MODEL_CAPABILITY_LEGACY_STORAGE_KEY",
        "kind": "constant",
        "signature": "MODEL_CAPABILITY_LEGACY_STORAGE_KEY",
        "summary": ""
      },
      {
        "name": "MODEL_CAPABILITY_STORAGE_FORMAT",
        "kind": "constant",
        "signature": "MODEL_CAPABILITY_STORAGE_FORMAT",
        "summary": ""
      },
      {
        "name": "MODEL_CAPABILITY_STORAGE_VERSION",
        "kind": "constant",
        "signature": "MODEL_CAPABILITY_STORAGE_VERSION",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/ai-hub/ProviderRouter",
    "path": "webgpu-os/reference/kernel/ai-hub/ProviderRouter.md",
    "source": "webgpu-os/kernel/ai-hub/ProviderRouter.js",
    "import": "/webgpu-os/kernel/ai-hub/ProviderRouter.js",
    "sourceHash": "81af30ca33aed9ff56a947fb6f1fdc08ba4ea969c7c7a9ab21bcb1ff935d321f",
    "summary": "ProviderRouter.js — picks the concrete { provider, model } for a normalized OS.ai() request: an explicit provider/model on the request always wins, otherwise it resolves the request's modelTier via ModelCapabilityRegistry.",
    "exports": [
      {
        "name": "ProviderRouter",
        "kind": "class",
        "signature": "class ProviderRouter",
        "summary": "ProviderRouter.js — picks the concrete { provider, model } for a normalized OS.ai() request: an explicit provider/model on the request always wins, otherwise it resolves the request's modelTier via ModelCapabilityRegistry."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/ai-hub/RequestNormalizer",
    "path": "webgpu-os/reference/kernel/ai-hub/RequestNormalizer.md",
    "source": "webgpu-os/kernel/ai-hub/RequestNormalizer.js",
    "import": "/webgpu-os/kernel/ai-hub/RequestNormalizer.js",
    "sourceHash": "33f8ac4aeda6c4f3df06379f6098e51498e05c3808d7d775c911f038255f506a",
    "summary": "RequestNormalizer.js — validates and normalizes an OS.ai(request) payload into the canonical shape the rest of the AI Hub pipeline consumes.",
    "exports": [
      {
        "name": "RequestNormalizer",
        "kind": "class",
        "signature": "class RequestNormalizer",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/ai-hub/ResultBroker",
    "path": "webgpu-os/reference/kernel/ai-hub/ResultBroker.md",
    "source": "webgpu-os/kernel/ai-hub/ResultBroker.js",
    "import": "/webgpu-os/kernel/ai-hub/ResultBroker.js",
    "sourceHash": "d8c3106ebff654f1c3fd7c2afab37c7499be7bd8bf336fce751432e799fb70a1",
    "summary": "ResultBroker.js — wraps a raw provider chat result into the OS.ai() response envelope and stamps it with CSE provenance (engine/state). Model output is always MODEL_PREDICTED/untrusted-for-authority — it becomes canonical only if/when Phase 9's finalizer + CommitCoordinator commit it.",
    "exports": [
      {
        "name": "ResultBroker",
        "kind": "class",
        "signature": "class ResultBroker",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/ai-hub/SmartModelPolicy",
    "path": "webgpu-os/reference/kernel/ai-hub/SmartModelPolicy.md",
    "source": "webgpu-os/kernel/ai-hub/SmartModelPolicy.js",
    "import": "/webgpu-os/kernel/ai-hub/SmartModelPolicy.js",
    "sourceHash": "3c031eedec366c56f918b942c59fb81a9dd64f03abdebea9efddd641bf2d00fa",
    "summary": "SmartModelPolicy.js - deterministic policy and catalog ranking for AI Hub. This module performs no provider calls, stores no credentials, and grants no authority. It projects provider catalog records into an inspectable ranking that Navi cognition can compile into its existing signed route contract.",
    "exports": [
      {
        "name": "classifySmartModelRouterAlias",
        "kind": "function",
        "signature": "classifySmartModelRouterAlias(provider, model)",
        "summary": "Classify provider-side router aliases separately from concrete model IDs. Dynamic aliases may resolve to a different model on every request, so their catalog capabilities cannot safely authorize strict or effectful tasks."
      },
      {
        "name": "defaultSmartModelPolicy",
        "kind": "function",
        "signature": "defaultSmartModelPolicy()",
        "summary": "Return a detached, immutable basic policy suitable for persisted settings."
      },
      {
        "name": "normalizeSmartModelPolicy",
        "kind": "function",
        "signature": "normalizeSmartModelPolicy(raw = null)",
        "summary": "Normalize persisted policy. Missing fields migrate to v1 defaults, while an unknown field or version is rejected so misspelled safety controls never silently disappear."
      },
      {
        "name": "inferSmartModelWorkloadProfile",
        "kind": "function",
        "signature": "inferSmartModelWorkloadProfile(raw = {})",
        "summary": "Infer preference-only workload affinities from one provider catalog row. The result improves ranking and model-picker explanations. It is never an authorization claim: privacy, modality, tool transport, context, endpoint health, and budget remain separate hard eligibility checks."
      },
      {
        "name": "classifySmartModelTask",
        "kind": "function",
        "signature": "classifySmartModelTask(raw = {})",
        "summary": "Classify a task without consulting a model. Explicit purpose wins; otherwise bounded, ordered rules use declared modality/privacy/background state before keyword signals. Raw user text is never copied into the returned evidence."
      },
      {
        "name": "normalizeSmartModelCandidate",
        "kind": "function",
        "signature": "normalizeSmartModelCandidate(raw)",
        "summary": "Project one provider-catalog record into the policy's provider-neutral form."
      },
      {
        "name": "estimateSmartModelCostMicrounits",
        "kind": "function",
        "signature": "estimateSmartModelCostMicrounits(candidate, estimatedTokens)",
        "summary": "Conservative projected cost for a normalized candidate and token estimate."
      },
      {
        "name": "rankSmartModelPool",
        "kind": "function",
        "signature": "rankSmartModelPool({ policy: rawPolicy = null, models = [], task = {}, usage = null } = {})",
        "summary": "Rank a catalog and return a deterministic, inspectable decision. The caller still owns provider authentication, canonical resource reservations, and final execution authority."
      },
      {
        "name": "selectSmartModelPool",
        "kind": "function",
        "signature": "selectSmartModelPool(options = {})",
        "summary": "Semantic alias for callers that consume the selected route and fallbacks."
      },
      {
        "name": "SMART_MODEL_POLICY_FORMAT",
        "kind": "constant",
        "signature": "SMART_MODEL_POLICY_FORMAT",
        "summary": "SmartModelPolicy.js - deterministic policy and catalog ranking for AI Hub. This module performs no provider calls, stores no credentials, and grants no authority. It projects provider catalog records into an inspectable ranking that Navi cognition can compile into its existing signed route contract."
      },
      {
        "name": "SMART_MODEL_TASK_CLASSIFICATION_FORMAT",
        "kind": "constant",
        "signature": "SMART_MODEL_TASK_CLASSIFICATION_FORMAT",
        "summary": ""
      },
      {
        "name": "SMART_MODEL_DECISION_FORMAT",
        "kind": "constant",
        "signature": "SMART_MODEL_DECISION_FORMAT",
        "summary": ""
      },
      {
        "name": "SMART_MODEL_PROFILES",
        "kind": "constant",
        "signature": "SMART_MODEL_PROFILES",
        "summary": ""
      },
      {
        "name": "SMART_MODEL_ACCESS_MODES",
        "kind": "constant",
        "signature": "SMART_MODEL_ACCESS_MODES",
        "summary": ""
      },
      {
        "name": "SMART_MODEL_ACCESS_CLASSES",
        "kind": "constant",
        "signature": "SMART_MODEL_ACCESS_CLASSES",
        "summary": ""
      },
      {
        "name": "SMART_MODEL_ROUTER_KINDS",
        "kind": "constant",
        "signature": "SMART_MODEL_ROUTER_KINDS",
        "summary": ""
      },
      {
        "name": "SMART_MODEL_PURPOSES",
        "kind": "constant",
        "signature": "SMART_MODEL_PURPOSES",
        "summary": ""
      },
      {
        "name": "SMART_MODEL_WORKLOAD_ROLES",
        "kind": "constant",
        "signature": "SMART_MODEL_WORKLOAD_ROLES",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/attestation/CapabilityAttestation",
    "path": "webgpu-os/reference/kernel/attestation/CapabilityAttestation.md",
    "source": "webgpu-os/kernel/attestation/CapabilityAttestation.js",
    "import": "/webgpu-os/kernel/attestation/CapabilityAttestation.js",
    "sourceHash": "243d1759a4b385b46d7c59d0f236dd4eea9375e17384161be66051337e92220d",
    "summary": "CapabilityAttestation.js — gates capability minting on descriptor attestation. Wraps engine/state's CapabilityRegistry/Capability.js (via the Phase 4 CapabilityNegotiator, kernel.protocol.capabilities — no parallel capability logic) and layers DescriptorHashStore on top so a capability is only minted for a tool whose descriptor hash matches the approved hash. The always-on Navi runtime requires explicit package or operator approval for every first-seen descriptor.",
    "exports": [
      {
        "name": "CapabilityAttestation",
        "kind": "class",
        "signature": "class CapabilityAttestation",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/attestation/DescriptorHashStore",
    "path": "webgpu-os/reference/kernel/attestation/DescriptorHashStore.md",
    "source": "webgpu-os/kernel/attestation/DescriptorHashStore.js",
    "import": "/webgpu-os/kernel/attestation/DescriptorHashStore.js",
    "sourceHash": "0e6178d444593cfc84b101deeb348a77a68118b4e87bc961b74b1ae1ca99b9d9",
    "summary": "DescriptorHashStore.js — persists approved tool/resource/prompt descriptor hashes IDB-side, so a \"rug pull\" (descriptor silently changing after the user approved it) is detected across sessions, not just within one runtime (that in-memory check is webgpu-os/kernel/tools/MetadataRugPullDetector.js). Hashing reuses the same SHA-256 primitive as packages/PackageVerifier.js (contentHashHex from engine/core/math/ChecksumMath.js) rather than a new hashing routine. Storage reuses the generic 'kv' IndexedDB store (see storage/IndexedDBDriver.js) instead of adding a new object store/migration.",
    "exports": [
      {
        "name": "DescriptorHashStore",
        "kind": "class",
        "signature": "class DescriptorHashStore",
        "summary": ""
      },
      {
        "name": "descriptorMeaningSnapshot",
        "kind": "function",
        "signature": "descriptorMeaningSnapshot(descriptor)",
        "summary": "Complete approval identity for a callable descriptor. This intentionally includes authority, mutability, effect, provenance, timeout, and executable source fields so retaining the same JSON input schema cannot conceal a more dangerous implementation after approval."
      },
      {
        "name": "portableDescriptorMeaningSnapshot",
        "kind": "function",
        "signature": "portableDescriptorMeaningSnapshot(descriptor)",
        "summary": "Package-portable descriptor identity for signed Faculty manifests only."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/attestation/DescriptorSanitizer",
    "path": "webgpu-os/reference/kernel/attestation/DescriptorSanitizer.md",
    "source": "webgpu-os/kernel/attestation/DescriptorSanitizer.js",
    "import": "/webgpu-os/kernel/attestation/DescriptorSanitizer.js",
    "sourceHash": "dc7ff7de2f2d9d5e6a488e9b990a7377c1a9859204e4810bb66c03a41f3416ef",
    "summary": "DescriptorSanitizer.js — static scanner for tool/resource/prompt descriptors: flags prompt-injection strings in description/schema text, reuses HiddenParameterDetector (Phase 3) for undeclared/suspicious parameters instead of a parallel implementation, and flags a mismatch between a tool's self-declared risk and its AffordanceRegistry-declared risk.",
    "exports": [
      {
        "name": "DescriptorSanitizer",
        "kind": "class",
        "signature": "class DescriptorSanitizer",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/attestation/DryRunManager",
    "path": "webgpu-os/reference/kernel/attestation/DryRunManager.md",
    "source": "webgpu-os/kernel/attestation/DryRunManager.js",
    "import": "/webgpu-os/kernel/attestation/DryRunManager.js",
    "sourceHash": "286c32fd609e6dca79350c0ca16350937e3dcc323166f9d839266d2a1a8d4123",
    "summary": "DryRunManager.js — thin wrapper over engine/state/worldmodel/PredictionSandbox.js (rollout/plan, confidence-decay) — no new dry-run engine. Lets a tool call's declared predictedEffects (AffordanceRegistry, Phase 3) be previewed against a state snapshot WITHOUT ever touching canonical state.",
    "exports": [
      {
        "name": "DryRunManager",
        "kind": "class",
        "signature": "class DryRunManager",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/attestation/ParameterPreviewer",
    "path": "webgpu-os/reference/kernel/attestation/ParameterPreviewer.md",
    "source": "webgpu-os/kernel/attestation/ParameterPreviewer.js",
    "import": "/webgpu-os/kernel/attestation/ParameterPreviewer.js",
    "sourceHash": "853ae05ab39db953f7c0706bc39f106b655c81b912d4db3161c037c68729bdd4",
    "summary": "ParameterPreviewer.js — resolves a tool-call args object into a human-safe preview: sensitive-looking values (key/secret/token/password/ credential) are masked and long strings are truncated, so an approval UI (Phase 8's ApprovalCard) can show \"what will actually be sent\" without ever rendering raw secrets to the screen.",
    "exports": [
      {
        "name": "ParameterPreviewer",
        "kind": "class",
        "signature": "class ParameterPreviewer",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/drivers/LLMDriver",
    "path": "webgpu-os/reference/kernel/drivers/LLMDriver.md",
    "source": "webgpu-os/kernel/drivers/LLMDriver.js",
    "import": "/webgpu-os/kernel/drivers/LLMDriver.js",
    "sourceHash": "704f17ae723bc1d478883f6676be29099d2c6c70764d1026438e0da70fce1e46",
    "summary": "",
    "exports": [
      {
        "name": "LLMDriver",
        "kind": "class",
        "signature": "class LLMDriver",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/drivers/WebGPUAmbientDriver",
    "path": "webgpu-os/reference/kernel/drivers/WebGPUAmbientDriver.md",
    "source": "webgpu-os/kernel/drivers/WebGPUAmbientDriver.js",
    "import": "/webgpu-os/kernel/drivers/WebGPUAmbientDriver.js",
    "sourceHash": "8d5dd74134bcd9c7fe26704dcf13caa726b5c11d4ded781273aef25b6a3f0837",
    "summary": "Factory: returns an AmbientEngine driver object { apply, destroy }. Internal simulation state is held in a closure and fully reset between mounts.",
    "exports": [
      {
        "name": "createWebGPUParticleDriver",
        "kind": "function",
        "signature": "createWebGPUParticleDriver()",
        "summary": "Factory: returns an AmbientEngine driver object { apply, destroy }. Internal simulation state is held in a closure and fully reset between mounts."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/execution/ActiveTurnCoordinator",
    "path": "webgpu-os/reference/kernel/execution/ActiveTurnCoordinator.md",
    "source": "webgpu-os/kernel/execution/ActiveTurnCoordinator.js",
    "import": "/webgpu-os/kernel/execution/ActiveTurnCoordinator.js",
    "sourceHash": "cd502dc730750400680ecbf6c5ac0c1f9734a1a866a370ec98c55dd256ed99fc",
    "summary": "ActiveTurnCoordinator.js — bounded, provider-neutral user steering for one active AI executor request. It owns ordering and deduplication only; kernel policy, tool approval, persistence, and model dispatch remain elsewhere.",
    "exports": [
      {
        "name": "ActiveTurnCoordinator",
        "kind": "class",
        "signature": "class ActiveTurnCoordinator",
        "summary": ""
      },
      {
        "name": "classifySteeringMessage",
        "kind": "function",
        "signature": "classifySteeringMessage(value)",
        "summary": ""
      },
      {
        "name": "classifySteeringImpact",
        "kind": "function",
        "signature": "classifySteeringImpact(kind, value = '')",
        "summary": "Describe which cached work a steering message invalidates. This is a data decision only; it never widens authority or silently approves a new target."
      },
      {
        "name": "classifySteeringDelivery",
        "kind": "function",
        "signature": "classifySteeringDelivery(kind, value = '', { progressEstimate = null } = {})",
        "summary": "Select when one operator instruction should affect an active task. This is deliberately a score of the instruction/task relationship, never a score of the person. It is deterministic, local, content-free in diagnostics, and grants no authority. The task Storylet consumes the resulting delivery mode at its next transition."
      },
      {
        "name": "createTaskCheckpointEnvelope",
        "kind": "function",
        "signature": "createTaskCheckpointEnvelope(raw = {})",
        "summary": ""
      },
      {
        "name": "ACTIVE_TURN_LIMITS",
        "kind": "constant",
        "signature": "ACTIVE_TURN_LIMITS",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/execution/AuditLog",
    "path": "webgpu-os/reference/kernel/execution/AuditLog.md",
    "source": "webgpu-os/kernel/execution/AuditLog.js",
    "import": "/webgpu-os/kernel/execution/AuditLog.js",
    "sourceHash": "60e652ca9658cff867ae041cf2d0d3d2a317a6eb3bcfda8e92fef360a71b3cd8",
    "summary": "AuditLog.js — thin audit VIEW over the same shared EventLog used by the Phase 7 Time Engine (one log, not two): filters to commit/receipt/ledger events via the existing TimelineExporter, with chain verification attached.",
    "exports": [
      {
        "name": "AuditLog",
        "kind": "class",
        "signature": "class AuditLog",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/execution/BrowserNativeJavaScriptVerifier",
    "path": "webgpu-os/reference/kernel/execution/BrowserNativeJavaScriptVerifier.md",
    "source": "webgpu-os/kernel/execution/BrowserNativeJavaScriptVerifier.js",
    "import": "/webgpu-os/kernel/execution/BrowserNativeJavaScriptVerifier.js",
    "sourceHash": "b40339a4a4966379d29bb79828e16337d42818742c41571a774add113a621c24",
    "summary": "Non-executing browser verifier for JavaScript, TypeScript, JSX, and TSX. Browser engines expose a non-executing parser only for classic JavaScript through Function construction. Module, TypeScript, and JSX verification must therefore use an explicitly supplied parser adapter or remain inconclusive. Lexical balance is always reported separately and is never promoted to parse evidence.",
    "exports": [
      {
        "name": "verifyBrowserNativeJavaScript",
        "kind": "function",
        "signature": "async verifyBrowserNativeJavaScript({ path = '', content = '', sourceRevision = '', rulesHash = '', knownFiles = null, knownDependencies = null, parserAdapters = {}, } = {})",
        "summary": ""
      },
      {
        "name": "BROWSER_NATIVE_JAVASCRIPT_VERIFIER_FORMAT",
        "kind": "constant",
        "signature": "BROWSER_NATIVE_JAVASCRIPT_VERIFIER_FORMAT",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/execution/BudgetLimiter",
    "path": "webgpu-os/reference/kernel/execution/BudgetLimiter.md",
    "source": "webgpu-os/kernel/execution/BudgetLimiter.js",
    "import": "/webgpu-os/kernel/execution/BudgetLimiter.js",
    "sourceHash": "838f787166109859401d4a7a17c674da13f76fdd2a52c2278be1e7f0d7cde440",
    "summary": "BudgetLimiter.js — wraps engine/state/authority/PolicyEngine.js (ordered rules, deny-overrides-allow, risk classification, approval-required) for AI request/tool-call/commit policy, plus per-request step budgets via the Phase 7 CooldownManager's BoundedCounterEscrow.",
    "exports": [
      {
        "name": "BudgetLimiter",
        "kind": "class",
        "signature": "class BudgetLimiter",
        "summary": ""
      },
      {
        "name": "DECISION",
        "kind": "re-export",
        "signature": "DECISION",
        "summary": ""
      },
      {
        "name": "RISK_LEVEL",
        "kind": "re-export",
        "signature": "RISK_LEVEL",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/execution/CommitGate",
    "path": "webgpu-os/reference/kernel/execution/CommitGate.md",
    "source": "webgpu-os/kernel/execution/CommitGate.js",
    "import": "/webgpu-os/kernel/execution/CommitGate.js",
    "sourceHash": "5451246c7529e0d1a41e25cb8dfe7db48c6a96082c250924539228e9db14400c",
    "summary": "CommitGate.js — the OS's ONE commit path: wraps engine/state's createCommitCoordinator (the 14-step atomic protocol) and createCommitGate (lightweight fact-only commits) over the SHARED Phase 7 stores — the same FactStore, EventLog, USORegistry (CooldownManager's), IdempotencyRegistry, and the Phase 4 CapabilityRegistry. Nothing AI-produced becomes canonical except through here.",
    "exports": [
      {
        "name": "OSCommitGate",
        "kind": "class",
        "signature": "class OSCommitGate",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/execution/ContextBroker",
    "path": "webgpu-os/reference/kernel/execution/ContextBroker.md",
    "source": "webgpu-os/kernel/execution/ContextBroker.js",
    "import": "/webgpu-os/kernel/execution/ContextBroker.js",
    "sourceHash": "0fab25331ba6d1439b2f5f018c106894d8a8a5498227312635551cf1140e5560",
    "summary": "ContextBroker.js — wraps engine/state/worldmodel/BeliefStore.js: one BeliefStore per AI request keeping the five worlds strictly separated (CANONICAL/OBSERVED/BELIEF/PREDICTED/PROPOSED). A belief or prediction can NEVER become canonical here — syncCanonical() is only called by the execution loop AFTER a witnessed commit.",
    "exports": [
      {
        "name": "ContextBroker",
        "kind": "class",
        "signature": "class ContextBroker",
        "summary": ""
      },
      {
        "name": "WORLD",
        "kind": "re-export",
        "signature": "WORLD",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/execution/DodadForge",
    "path": "webgpu-os/reference/kernel/execution/DodadForge.md",
    "source": "webgpu-os/kernel/execution/DodadForge.js",
    "import": "/webgpu-os/kernel/execution/DodadForge.js",
    "sourceHash": "1f6df36fb7618a23341618045c73115a1d86c3bb2a1da0899bf2d8552df5cff9",
    "summary": "DodadForge.js — OS-owned project contracts for interactive AI Echo outputs. Provider text is never executed directly. The forge accepts one explicit four-file envelope, validates it as data, and runs declared behavior only in an opaque, network-blocked iframe before the existing signed Dodad Faculty is allowed to persist the project.",
    "exports": [
      {
        "name": "classifyDodadForgeRecipe",
        "kind": "function",
        "signature": "classifyDodadForgeRecipe(prompt = '')",
        "summary": ""
      },
      {
        "name": "buildDodadForgeBlueprint",
        "kind": "function",
        "signature": "buildDodadForgeBlueprint(prompt = '', { decision = null } = {})",
        "summary": "Build a deterministic specialist handoff for one Dodad request. Roles are responsibility slices inside one bounded episode, not agents and not authority. Only patterns whose trigger evidence is present are loaded."
      },
      {
        "name": "buildDodadForgeAuthoringPrompt",
        "kind": "function",
        "signature": "buildDodadForgeAuthoringPrompt(prompt = '', { failures = [] } = {})",
        "summary": ""
      },
      {
        "name": "parseDodadForgeProject",
        "kind": "function",
        "signature": "parseDodadForgeProject(value, { prompt = '', blueprint = null } = {})",
        "summary": ""
      },
      {
        "name": "validateDodadForgeProject",
        "kind": "function",
        "signature": "validateDodadForgeProject(input = {}, { prompt = '', blueprint = null } = {})",
        "summary": ""
      },
      {
        "name": "verifyDodadForgeProjectRuntime",
        "kind": "function",
        "signature": "async verifyDodadForgeProjectRuntime(project, { timeoutMs = RUNTIME_TIMEOUT_MS } = {})",
        "summary": ""
      },
      {
        "name": "scoreDodadForgeProject",
        "kind": "function",
        "signature": "scoreDodadForgeProject({ html = '', css = '', javascript = '', manifest = null, recipe: selectedRecipe = null, blueprint = null } = {})",
        "summary": "Deterministic quality projection; blockers cover recipe-defining behavior only."
      },
      {
        "name": "verifyDodadJavaScriptWorker",
        "kind": "function",
        "signature": "async verifyDodadJavaScriptWorker(source, { timeoutMs = WORKER_TIMEOUT_MS } = {})",
        "summary": "Compile and execute only the Dodad's top-level JavaScript inside a killable Worker with inert DOM shims. Runtime deltas are never executed. A hung or syntactically invalid script is terminated before the DOM sandbox opens."
      },
      {
        "name": "DODAD_FORGE_FORMAT",
        "kind": "constant",
        "signature": "DODAD_FORGE_FORMAT",
        "summary": "DodadForge.js — OS-owned project contracts for interactive AI Echo outputs. Provider text is never executed directly. The forge accepts one explicit four-file envelope, validates it as data, and runs declared behavior only in an opaque, network-blocked iframe before the existing signed Dodad Faculty is allowed to persist the project."
      },
      {
        "name": "DODAD_BEHAVIOR_FORMAT",
        "kind": "constant",
        "signature": "DODAD_BEHAVIOR_FORMAT",
        "summary": ""
      },
      {
        "name": "DODAD_FORGE_RECIPE_CATALOG_URI",
        "kind": "constant",
        "signature": "DODAD_FORGE_RECIPE_CATALOG_URI",
        "summary": ""
      },
      {
        "name": "DODAD_FORGE_PATTERN_CATALOG_URI",
        "kind": "constant",
        "signature": "DODAD_FORGE_PATTERN_CATALOG_URI",
        "summary": ""
      },
      {
        "name": "DODAD_FORGE_QUALITY_GUIDE_URI",
        "kind": "constant",
        "signature": "DODAD_FORGE_QUALITY_GUIDE_URI",
        "summary": ""
      },
      {
        "name": "DODAD_FORGE_BLUEPRINT_FORMAT",
        "kind": "constant",
        "signature": "DODAD_FORGE_BLUEPRINT_FORMAT",
        "summary": ""
      },
      {
        "name": "DODAD_FORGE_QUALITY_FORMAT",
        "kind": "constant",
        "signature": "DODAD_FORGE_QUALITY_FORMAT",
        "summary": ""
      },
      {
        "name": "DODAD_FORGE_RECIPES",
        "kind": "constant",
        "signature": "DODAD_FORGE_RECIPES",
        "summary": ""
      },
      {
        "name": "DODAD_FORGE_PATTERNS",
        "kind": "constant",
        "signature": "DODAD_FORGE_PATTERNS",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/execution/ExecutionApprovalMode",
    "path": "webgpu-os/reference/kernel/execution/ExecutionApprovalMode.md",
    "source": "webgpu-os/kernel/execution/ExecutionApprovalMode.js",
    "import": "/webgpu-os/kernel/execution/ExecutionApprovalMode.js",
    "sourceHash": "03cb04c428b94aa40d04b4d767c67ebabd711f5b8dc4a7b3840d477866a5ce11",
    "summary": "Deterministic execution-approval modes. This module decides whether an already-reviewed tool action still needs an operator prompt. It never grants authority: ToolActionReview, ToolRouter, Navi Faculty capability leases, workspace roots, and mounted-folder scopes remain authoritative for every call.",
    "exports": [
      {
        "name": "normalizeExecutionApprovalMode",
        "kind": "function",
        "signature": "normalizeExecutionApprovalMode(value)",
        "summary": ""
      },
      {
        "name": "executionApprovalRepeatProfile",
        "kind": "function",
        "signature": "executionApprovalRepeatProfile(review, { appId = '', naviId = '' } = {})",
        "summary": "Content-free identity for a repeatable approval scope. Arguments are intentionally omitted: changed values may repeat only when the tool, descriptor, authority, data classes, and exact target scope are unchanged."
      },
      {
        "name": "decideExecutionApproval",
        "kind": "function",
        "signature": "decideExecutionApproval({ mode, review, priorReceipt = null } = {})",
        "summary": "Decide only the prompt behavior for an action that has already passed the OS review. `priorReceipt` must be an OS-recorded successful call for the same repeat profile; model recommendations never substitute for it."
      },
      {
        "name": "eligibleForVerifiedRepeat",
        "kind": "function",
        "signature": "eligibleForVerifiedRepeat(review)",
        "summary": ""
      },
      {
        "name": "EXECUTION_APPROVAL_MODE",
        "kind": "constant",
        "signature": "EXECUTION_APPROVAL_MODE",
        "summary": "Deterministic execution-approval modes. This module decides whether an already-reviewed tool action still needs an operator prompt. It never grants authority: ToolActionReview, ToolRouter, Navi Faculty capability leases, workspace roots, and mounted-folder scopes remain authoritative for every call."
      },
      {
        "name": "EXECUTION_APPROVAL_DECISION",
        "kind": "constant",
        "signature": "EXECUTION_APPROVAL_DECISION",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/execution/ExecutionHorizonPolicy",
    "path": "webgpu-os/reference/kernel/execution/ExecutionHorizonPolicy.md",
    "source": "webgpu-os/kernel/execution/ExecutionHorizonPolicy.js",
    "import": "/webgpu-os/kernel/execution/ExecutionHorizonPolicy.js",
    "sourceHash": "a65e8a735e098289cda7a4d10624580331fdc02ac0cb823d617685fd7530ff1d",
    "summary": "Pure adaptive execution-window policy. It has no authority vocabulary and can only reduce caller-supplied action/concurrency ceilings. Descriptor risk and reversibility dominate calibration: confidence never changes approval, capability, tool selection, or the static execution ceiling. Callers must enforce the returned action and mutation limits as hard dispatch boundaries.",
    "exports": [
      {
        "name": "ExecutionHorizonPolicy",
        "kind": "class",
        "signature": "class ExecutionHorizonPolicy",
        "summary": ""
      },
      {
        "name": "NAVI_EXECUTION_HORIZON_FORMAT",
        "kind": "constant",
        "signature": "NAVI_EXECUTION_HORIZON_FORMAT",
        "summary": "Pure adaptive execution-window policy. It has no authority vocabulary and can only reduce caller-supplied action/concurrency ceilings. Descriptor risk and reversibility dominate calibration: confidence never changes approval, capability, tool selection, or the static execution ceiling. Callers must enforce the returned action and mutation limits as hard dispatch boundaries."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/execution/JavaScriptExecutionGrant",
    "path": "webgpu-os/reference/kernel/execution/JavaScriptExecutionGrant.md",
    "source": "webgpu-os/kernel/execution/JavaScriptExecutionGrant.js",
    "import": "/webgpu-os/kernel/execution/JavaScriptExecutionGrant.js",
    "sourceHash": "d0066b5bafe524b0cfacac3de6f991c5819d293b05a5016e29e36cd1ed1ebed1",
    "summary": "JavaScriptExecutionGrant.js — exact-source, short-lived execution binding. This contract narrows an already-authorized raw JavaScript tool call. It is not an authority source: ToolRouter, the Faculty capability grant, OS policy, developer mode, and the browser extension approval boundary still decide whether execution is allowed.",
    "exports": [
      {
        "name": "JavaScriptExecutionGrantError",
        "kind": "class",
        "signature": "class JavaScriptExecutionGrantError extends Error",
        "summary": ""
      },
      {
        "name": "inspectJavaScriptApiUsage",
        "kind": "function",
        "signature": "inspectJavaScriptApiUsage(source)",
        "summary": "Return the conservative, inspectable API categories visible in source."
      },
      {
        "name": "resolveJavaScriptPermittedApis",
        "kind": "function",
        "signature": "resolveJavaScriptPermittedApis(source, permittedApis = null)",
        "summary": "Normalize a caller-declared API allowance and ensure it covers every API category the conservative source scan can observe. Omission selects the observed set, keeping existing developer-only calls compatible."
      },
      {
        "name": "hashJavaScriptSource",
        "kind": "function",
        "signature": "async hashJavaScriptSource(source)",
        "summary": ""
      },
      {
        "name": "hashJavaScriptNavigationGeneration",
        "kind": "function",
        "signature": "async hashJavaScriptNavigationGeneration({ tabId, url, pendingUrl = '', status = '' } = {})",
        "summary": "Hash the observable browser navigation identity without publishing its URL."
      },
      {
        "name": "createJavaScriptApprovalBinding",
        "kind": "function",
        "signature": "async createJavaScriptApprovalBinding({ source, permittedApis = null, surface = 'browser-page', world = surface === 'os-worker' ? 'WORKER' : 'USER_SCRIPT', tabId = null, naviId = '', facultyId = '', taskId = '', requestId = '', } = {})",
        "summary": "Build the exact source/API projection embedded in ToolActionReview."
      },
      {
        "name": "createJavaScriptExecutionGrant",
        "kind": "function",
        "signature": "async createJavaScriptExecutionGrant({ source, permittedApis = null, surface = 'browser-page', world = surface === 'os-worker' ? 'WORKER' : 'USER_SCRIPT', target = null, naviId = '', facultyId = '', taskId = '', requestId = '', issuedAt = Date.now()",
        "summary": "Create one exact, bounded runtime grant after the target has been observed."
      },
      {
        "name": "verifyJavaScriptExecutionGrant",
        "kind": "function",
        "signature": "async verifyJavaScriptExecutionGrant(grant, { source, permittedApis = null, surface = 'browser-page', world = surface === 'os-worker' ? 'WORKER' : 'USER_SCRIPT', target = null, naviId = '', facultyId = '', taskId = '', requestId = '', now = Date.now()",
        "summary": "Recompute every meaning-bearing field and reject expired or altered grants."
      },
      {
        "name": "JAVASCRIPT_EXECUTION_GRANT_FORMAT",
        "kind": "constant",
        "signature": "JAVASCRIPT_EXECUTION_GRANT_FORMAT",
        "summary": ""
      },
      {
        "name": "JAVASCRIPT_EXECUTION_SURFACES",
        "kind": "constant",
        "signature": "JAVASCRIPT_EXECUTION_SURFACES",
        "summary": ""
      },
      {
        "name": "JAVASCRIPT_EXECUTION_WORLDS",
        "kind": "constant",
        "signature": "JAVASCRIPT_EXECUTION_WORLDS",
        "summary": ""
      },
      {
        "name": "JAVASCRIPT_EXECUTION_PERMITTED_APIS",
        "kind": "constant",
        "signature": "JAVASCRIPT_EXECUTION_PERMITTED_APIS",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/execution/NaviContextRollover",
    "path": "webgpu-os/reference/kernel/execution/NaviContextRollover.md",
    "source": "webgpu-os/kernel/execution/NaviContextRollover.js",
    "import": "/webgpu-os/kernel/execution/NaviContextRollover.js",
    "sourceHash": "72d196b5be50a72552dfeac96a0f1ed80f5efb3066100e19c00a1447b6229734",
    "summary": "Compact, derived task context for rollover between bounded execution turns. The projection contains identifiers, hashes, classifications, and counts only. It has no persistence and rejects raw content, tool arguments, or reasoning.",
    "exports": [
      {
        "name": "NaviContextRolloverError",
        "kind": "class",
        "signature": "class NaviContextRolloverError extends Error",
        "summary": ""
      },
      {
        "name": "NaviContextRollover",
        "kind": "class",
        "signature": "class NaviContextRollover",
        "summary": ""
      },
      {
        "name": "createNaviContextRollover",
        "kind": "function",
        "signature": "async createNaviContextRollover(raw = {}, options = {})",
        "summary": ""
      },
      {
        "name": "validateNaviContextRollover",
        "kind": "function",
        "signature": "async validateNaviContextRollover(value)",
        "summary": ""
      },
      {
        "name": "NAVI_CONTEXT_ROLLOVER_FORMAT",
        "kind": "constant",
        "signature": "NAVI_CONTEXT_ROLLOVER_FORMAT",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/execution/NaviExplainabilityProjection",
    "path": "webgpu-os/reference/kernel/execution/NaviExplainabilityProjection.md",
    "source": "webgpu-os/kernel/execution/NaviExplainabilityProjection.js",
    "import": "/webgpu-os/kernel/execution/NaviExplainabilityProjection.js",
    "sourceHash": "e6da89cdac33cf096e9d57792a231fa097bbc1c06d99642885bd7801e7dcaee0",
    "summary": "NaviExplainabilityProjection.js — compact, authority-free explanations derived from records the OS already owns. This module has no persistence and never accepts provider reasoning. It projects task state, steering, routing, tool outcomes, verification, and receipts into inspectable local evidence.",
    "exports": [
      {
        "name": "projectNaviWhy",
        "kind": "function",
        "signature": "projectNaviWhy(raw = {})",
        "summary": "Explain one active or completed Navi task from its existing projections and ledgers. `report` is the TaskLedger FinalReport (or its durable compact form), and `steering` is ActiveTurnCoordinator.snapshot(). No record is written."
      },
      {
        "name": "projectNaviResourceSelectionExplanation",
        "kind": "function",
        "signature": "projectNaviResourceSelectionExplanation(rawSelection)",
        "summary": "Project one signed/validated resource-selection receipt without re-ranking."
      },
      {
        "name": "projectNaviSmartRoutingExplanation",
        "kind": "function",
        "signature": "async projectNaviSmartRoutingExplanation(raw = {})",
        "summary": "Explain an exact NaviModelBroker decision, including excluded routes and the smallest policy/settings change that could make each route eligible. The explanation is derived after routing and cannot alter the decision."
      },
      {
        "name": "NAVI_WHY_PROJECTION_FORMAT",
        "kind": "constant",
        "signature": "NAVI_WHY_PROJECTION_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_SMART_ROUTING_EXPLANATION_FORMAT",
        "kind": "constant",
        "signature": "NAVI_SMART_ROUTING_EXPLANATION_FORMAT",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/execution/NaviProposalEnvelope",
    "path": "webgpu-os/reference/kernel/execution/NaviProposalEnvelope.md",
    "source": "webgpu-os/kernel/execution/NaviProposalEnvelope.js",
    "import": "/webgpu-os/kernel/execution/NaviProposalEnvelope.js",
    "sourceHash": "be208689907c41cefe1e87d2c8d964e602b0c5ac7a8d29c63efe6ae88ebb412a",
    "summary": "NaviProposalEnvelope.js — binds a proposed change to observed evidence, explicit inferences, unresolved questions, an exact target revision, and deterministic verification/compensation. A proposal has no authority by itself and must still pass the normal review and capability path.",
    "exports": [
      {
        "name": "createEvidenceBoundProposal",
        "kind": "function",
        "signature": "async createEvidenceBoundProposal(value = {})",
        "summary": ""
      },
      {
        "name": "validateEvidenceBoundProposal",
        "kind": "function",
        "signature": "async validateEvidenceBoundProposal(proposal)",
        "summary": ""
      },
      {
        "name": "NAVI_PROPOSAL_FORMAT",
        "kind": "constant",
        "signature": "NAVI_PROPOSAL_FORMAT",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/execution/NaviTaskGraphCheckpoint",
    "path": "webgpu-os/reference/kernel/execution/NaviTaskGraphCheckpoint.md",
    "source": "webgpu-os/kernel/execution/NaviTaskGraphCheckpoint.js",
    "import": "/webgpu-os/kernel/execution/NaviTaskGraphCheckpoint.js",
    "sourceHash": "669fe040fcf676e5bf0ea2bab2711a885138320a0acaf52c54527e84571362bb",
    "summary": "Durable, content-free checkpoints for compiled Navi task graphs. This module neither executes nor replays graph nodes. Persistence is supplied by an exact-key adapter with one read and one compare-and-swap operation.",
    "exports": [
      {
        "name": "NaviTaskGraphCheckpointError",
        "kind": "class",
        "signature": "class NaviTaskGraphCheckpointError extends Error",
        "summary": ""
      },
      {
        "name": "NaviTaskGraphCheckpointStore",
        "kind": "class",
        "signature": "class NaviTaskGraphCheckpointStore",
        "summary": ""
      },
      {
        "name": "createNaviTaskGraphCheckpoint",
        "kind": "function",
        "signature": "async createNaviTaskGraphCheckpoint(raw = {})",
        "summary": ""
      },
      {
        "name": "validateNaviTaskGraphCheckpoint",
        "kind": "function",
        "signature": "async validateNaviTaskGraphCheckpoint(value)",
        "summary": ""
      },
      {
        "name": "validateNaviTaskGraphCheckpointTransition",
        "kind": "function",
        "signature": "async validateNaviTaskGraphCheckpointTransition(raw = {})",
        "summary": "Enforce task-lifetime monotonicity for the mutation ledger. Completed tombstones are immutable. Outcome-unknown tombstones may resolve to a completed tombstone, or be removed by an exact current mutation node whose failed outcome is explicitly verifier-bound. Generic failures never evict."
      },
      {
        "name": "classifyNaviTaskGraphResume",
        "kind": "function",
        "signature": "async classifyNaviTaskGraphResume(raw = {})",
        "summary": ""
      },
      {
        "name": "checkpointKeyForTask",
        "kind": "function",
        "signature": "checkpointKeyForTask(taskId)",
        "summary": ""
      },
      {
        "name": "NAVI_TASK_GRAPH_CHECKPOINT_FORMAT",
        "kind": "constant",
        "signature": "NAVI_TASK_GRAPH_CHECKPOINT_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_TASK_GRAPH_RESUME_FORMAT",
        "kind": "constant",
        "signature": "NAVI_TASK_GRAPH_RESUME_FORMAT",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/execution/NaviTaskGraphCompiler",
    "path": "webgpu-os/reference/kernel/execution/NaviTaskGraphCompiler.md",
    "source": "webgpu-os/kernel/execution/NaviTaskGraphCompiler.js",
    "import": "/webgpu-os/kernel/execution/NaviTaskGraphCompiler.js",
    "sourceHash": "d64183ab59c8a5437a1586ff75f640a14d8a08d74c95221309b9c38229e5ac74",
    "summary": "NaviTaskGraphCompiler.js — deterministic compiler for model-proposed tool plans. A compiled graph is evidence, never authority: every node still enters ToolActionReview, ToolRouter, and the Faculty membrane before it can execute.",
    "exports": [
      {
        "name": "NaviTaskGraphCompilerError",
        "kind": "class",
        "signature": "class NaviTaskGraphCompilerError extends Error",
        "summary": ""
      },
      {
        "name": "NaviTaskGraphCompiler",
        "kind": "class",
        "signature": "class NaviTaskGraphCompiler",
        "summary": ""
      },
      {
        "name": "validateCompiledTaskGraph",
        "kind": "function",
        "signature": "async validateCompiledTaskGraph(graph)",
        "summary": ""
      },
      {
        "name": "classifyTaskGraphChange",
        "kind": "function",
        "signature": "classifyTaskGraphChange(previousGraph, nextGraph)",
        "summary": ""
      },
      {
        "name": "NAVI_TASK_GRAPH_ID_MAX_LENGTH",
        "kind": "constant",
        "signature": "NAVI_TASK_GRAPH_ID_MAX_LENGTH",
        "summary": ""
      },
      {
        "name": "NAVI_TASK_GRAPH_ID_PATTERN",
        "kind": "constant",
        "signature": "NAVI_TASK_GRAPH_ID_PATTERN",
        "summary": ""
      },
      {
        "name": "NAVI_TASK_GRAPH_FORMAT",
        "kind": "constant",
        "signature": "NAVI_TASK_GRAPH_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_TASK_GRAPH_LEGACY_FORMAT",
        "kind": "constant",
        "signature": "NAVI_TASK_GRAPH_LEGACY_FORMAT",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/execution/NaviTaskStateProjection",
    "path": "webgpu-os/reference/kernel/execution/NaviTaskStateProjection.md",
    "source": "webgpu-os/kernel/execution/NaviTaskStateProjection.js",
    "import": "/webgpu-os/kernel/execution/NaviTaskStateProjection.js",
    "sourceHash": "3570b0d926f14bfb4a580f58d6d8419196a735791abc5ba25dbfe120411b2f4c",
    "summary": "NaviTaskStateProjection.js — immutable, schema-validated runtime projection for one active Navi task. Canonical task persistence remains NaviCognition; this module projects inspectable live state for streams and in-flight views.",
    "exports": [
      {
        "name": "createNaviTaskStateProjection",
        "kind": "function",
        "signature": "createNaviTaskStateProjection(raw = {})",
        "summary": ""
      },
      {
        "name": "evolveNaviTaskStateProjection",
        "kind": "function",
        "signature": "evolveNaviTaskStateProjection(current, patch = {}, { now = Date.now()",
        "summary": ""
      },
      {
        "name": "acceptNaviTaskSteering",
        "kind": "function",
        "signature": "acceptNaviTaskSteering(current, event, options = {})",
        "summary": ""
      },
      {
        "name": "setNaviTaskCurrentAction",
        "kind": "function",
        "signature": "setNaviTaskCurrentAction(current, action, options = {})",
        "summary": ""
      },
      {
        "name": "completeNaviTaskWork",
        "kind": "function",
        "signature": "completeNaviTaskWork(current, work, options = {})",
        "summary": ""
      },
      {
        "name": "setNaviTaskPendingApproval",
        "kind": "function",
        "signature": "setNaviTaskPendingApproval(current, approval, options = {})",
        "summary": ""
      },
      {
        "name": "clearNaviTaskApproval",
        "kind": "function",
        "signature": "clearNaviTaskApproval(current, approvalId, options = {})",
        "summary": ""
      },
      {
        "name": "syncNaviTaskRuntime",
        "kind": "function",
        "signature": "syncNaviTaskRuntime(current, { executorPhase, status = null, remainingBudget = null, artifacts = null, planRef = undefined, contextManifestRef = undefined, resourceSelectionRef = undefined, investigationCaseRef = undefined, goalProgress = null, } = {}, options = {})",
        "summary": ""
      },
      {
        "name": "naviTaskPhaseForExecutor",
        "kind": "function",
        "signature": "naviTaskPhaseForExecutor(value)",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/execution/PrivacyGuard",
    "path": "webgpu-os/reference/kernel/execution/PrivacyGuard.md",
    "source": "webgpu-os/kernel/execution/PrivacyGuard.js",
    "import": "/webgpu-os/kernel/execution/PrivacyGuard.js",
    "sourceHash": "071d5ac5e5b0a77d2f66bd6a9054429c0ff652b12c77c80bd81ba949b85d7e77",
    "summary": "PrivacyGuard.js — scrubs context before it leaves the OS toward a remote model provider: sensitive-looking values are masked (reuses Phase 5's ParameterPreviewer — one masking implementation), obvious credential literals in free text are redacted, and payload size is capped.",
    "exports": [
      {
        "name": "PrivacyGuard",
        "kind": "class",
        "signature": "class PrivacyGuard",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/execution/RepairLoop",
    "path": "webgpu-os/reference/kernel/execution/RepairLoop.md",
    "source": "webgpu-os/kernel/execution/RepairLoop.js",
    "import": "/webgpu-os/kernel/execution/RepairLoop.js",
    "sourceHash": "e9d4765fae9510c70e5a9af42be77dfebca425651e889ee6c5f11e01d618a6b9",
    "summary": "RepairLoop.js — malformed-model-output repair: first a local structural extraction (strip code fences, isolate the outermost JSON object/array), then target-shape validation and at most one model-assisted repair pass on the selected route's fast tier. Repair duration is operator-controlled: steering may supersede it and Stop aborts it. The route/attempt policy stays bounded, and wrong-schema JSON is never accepted merely because it parses.",
    "exports": [
      {
        "name": "RepairLoop",
        "kind": "class",
        "signature": "class RepairLoop",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/execution/RunEventStreamRegistry",
    "path": "webgpu-os/reference/kernel/execution/RunEventStreamRegistry.md",
    "source": "webgpu-os/kernel/execution/RunEventStreamRegistry.js",
    "import": "/webgpu-os/kernel/execution/RunEventStreamRegistry.js",
    "sourceHash": "e5ac684682f9bf774a72c4e7c15b29b2a71302fcb7b1e1d29528018d25a891e7",
    "summary": "Kernel-owned resumable event streams for AI executions. App callbacks are only a live view. This registry assigns monotonic sequence numbers, buffers bounded events, and supports same-owner replay after an app remount or transient UI failure. Durable history remains in FinalReport.",
    "exports": [
      {
        "name": "RunEventStreamRegistry",
        "kind": "class",
        "signature": "class RunEventStreamRegistry",
        "summary": "Kernel-owned resumable event streams for AI executions. App callbacks are only a live view. This registry assigns monotonic sequence numbers, buffers bounded events, and supports same-owner replay after an app remount or transient UI failure. Durable history remains in FinalReport."
      },
      {
        "name": "RunEventStreamGapError",
        "kind": "class",
        "signature": "class RunEventStreamGapError extends Error",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/execution/SemanticEffectContract",
    "path": "webgpu-os/reference/kernel/execution/SemanticEffectContract.md",
    "source": "webgpu-os/kernel/execution/SemanticEffectContract.js",
    "import": "/webgpu-os/kernel/execution/SemanticEffectContract.js",
    "sourceHash": "49ab522cb868f5b52b20968f68706cb0ace89ecdcf977f78d2081ce1d658fb96",
    "summary": "SemanticEffectContract.js Pure, authority-free compilation and comparison for descriptor-authored postconditions. The model never supplies these contracts. Exact contracts are declared by trusted tool descriptors and are bound to the descriptor, arguments, graph prestate, and verified Faculty receipt before comparison. Durable projections contain hashes and bounded counts, never tool arguments or effect values.",
    "exports": [
      {
        "name": "SemanticEffectContractError",
        "kind": "class",
        "signature": "class SemanticEffectContractError extends Error",
        "summary": ""
      },
      {
        "name": "compileDescriptorPostcondition",
        "kind": "function",
        "signature": "async compileDescriptorPostcondition({ descriptor, descriptorHash, args = {}, } = {})",
        "summary": "Compile a trusted descriptor's effect declaration into a value-free graph postcondition. Legacy descriptors remain receipt/success-bound; only the explicit closed contract enables exact semantic comparison."
      },
      {
        "name": "validateSemanticPostcondition",
        "kind": "function",
        "signature": "async validateSemanticPostcondition(value)",
        "summary": ""
      },
      {
        "name": "validateSemanticInvocation",
        "kind": "function",
        "signature": "async validateSemanticInvocation(postcondition, { descriptorHash, args = {} } = {})",
        "summary": "Bind a live invocation to the graph-authored descriptor and argument hashes."
      },
      {
        "name": "createExecutionPrestate",
        "kind": "function",
        "signature": "async createExecutionPrestate({ graphHash, sourceHash, nodeId, dependencies = [], } = {})",
        "summary": "Bind a node's comparison to the graph and exact terminal evidence of each dependency. No provider-visible text or raw values enter this projection."
      },
      {
        "name": "validateExecutionPrestate",
        "kind": "function",
        "signature": "async validateExecutionPrestate(value)",
        "summary": ""
      },
      {
        "name": "compareSemanticEffects",
        "kind": "function",
        "signature": "async compareSemanticEffects({ postcondition, prestate, receiptEvidence = null, observedEffects = null, resultOk = false, } = {})",
        "summary": "Compare trusted readback effects with descriptor-authored expectations. `receiptEvidence` must be the kernel-created verified Faculty projection for exact and mutation comparisons; caller-supplied receipt-shaped data cannot acquire authority through this pure function."
      },
      {
        "name": "projectSemanticNodeOutcome",
        "kind": "function",
        "signature": "projectSemanticNodeOutcome({ nodeId, graphHash, sourceHash, comparison, } = {})",
        "summary": "Compact semantic node outcome consumed by checkpoint/episode projections."
      },
      {
        "name": "NAVI_EFFECT_CONTRACT_FORMAT",
        "kind": "constant",
        "signature": "NAVI_EFFECT_CONTRACT_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_SEMANTIC_POSTCONDITION_FORMAT",
        "kind": "constant",
        "signature": "NAVI_SEMANTIC_POSTCONDITION_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_EXECUTION_PRESTATE_FORMAT",
        "kind": "constant",
        "signature": "NAVI_EXECUTION_PRESTATE_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_EFFECT_COMPARISON_FORMAT",
        "kind": "constant",
        "signature": "NAVI_EFFECT_COMPARISON_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_SEMANTIC_NODE_OUTCOME_FORMAT",
        "kind": "constant",
        "signature": "NAVI_SEMANTIC_NODE_OUTCOME_FORMAT",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/execution/SemanticTransaction",
    "path": "webgpu-os/reference/kernel/execution/SemanticTransaction.md",
    "source": "webgpu-os/kernel/execution/SemanticTransaction.js",
    "import": "/webgpu-os/kernel/execution/SemanticTransaction.js",
    "sourceHash": "984b2ac6a7b9d97b6050f78adf3540dfd02f675c772074be5a007b1581c60bb7",
    "summary": "SemanticTransaction.js — deterministic multi-target preview/commit contract. The coordinator never writes storage itself. Callers provide one atomic commit callback that must recheck every expected revision/hash in the same critical section as its writes. This module validates that exact request, emits explicit conflict choices, and creates a hash-bound undo record.",
    "exports": [
      {
        "name": "SemanticTransactionError",
        "kind": "class",
        "signature": "class SemanticTransactionError extends Error",
        "summary": ""
      },
      {
        "name": "SemanticTransactionCoordinator",
        "kind": "class",
        "signature": "class SemanticTransactionCoordinator",
        "summary": ""
      },
      {
        "name": "hashSemanticTransactionValue",
        "kind": "function",
        "signature": "async hashSemanticTransactionValue(value)",
        "summary": ""
      },
      {
        "name": "chooseSemanticTransactionConflict",
        "kind": "function",
        "signature": "async chooseSemanticTransactionConflict(conflict, choice)",
        "summary": "Bind one explicit UI choice to the exact conflict record."
      },
      {
        "name": "SEMANTIC_TRANSACTION_FORMAT",
        "kind": "constant",
        "signature": "SEMANTIC_TRANSACTION_FORMAT",
        "summary": ""
      },
      {
        "name": "SEMANTIC_TRANSACTION_RECEIPT_FORMAT",
        "kind": "constant",
        "signature": "SEMANTIC_TRANSACTION_RECEIPT_FORMAT",
        "summary": ""
      },
      {
        "name": "SEMANTIC_TRANSACTION_UNDO_FORMAT",
        "kind": "constant",
        "signature": "SEMANTIC_TRANSACTION_UNDO_FORMAT",
        "summary": ""
      },
      {
        "name": "SEMANTIC_TRANSACTION_CONFLICT_FORMAT",
        "kind": "constant",
        "signature": "SEMANTIC_TRANSACTION_CONFLICT_FORMAT",
        "summary": ""
      },
      {
        "name": "SEMANTIC_TRANSACTION_CONFLICT_CHOICES",
        "kind": "constant",
        "signature": "SEMANTIC_TRANSACTION_CONFLICT_CHOICES",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/execution/TaskProgressEstimator",
    "path": "webgpu-os/reference/kernel/execution/TaskProgressEstimator.md",
    "source": "webgpu-os/kernel/execution/TaskProgressEstimator.js",
    "import": "/webgpu-os/kernel/execution/TaskProgressEstimator.js",
    "sourceHash": "2837ba36807932e8a5a65f856fc8e50f61f77f12287f047c536967cc020e25bf",
    "summary": "TaskProgressEstimator.js — deterministic, content-free duration and progress estimates for an active Navi task. Estimates are ranges, never deadlines. They consume local prompt signals, historical route timing, and OS events; they do not call a model and never grant authority.",
    "exports": [
      {
        "name": "classifyTaskEstimateProfile",
        "kind": "function",
        "signature": "classifyTaskEstimateProfile(prompt = '', taskKind = '')",
        "summary": ""
      },
      {
        "name": "createTaskProgressEstimate",
        "kind": "function",
        "signature": "createTaskProgressEstimate({ prompt = '', taskKind = '', estimatedInputTokens = null, routeAverageMs = null, routeSampleCount = 0, now = Date.now()",
        "summary": ""
      },
      {
        "name": "updateTaskProgressEstimate",
        "kind": "function",
        "signature": "updateTaskProgressEstimate(current, event = {}, now = Date.now()",
        "summary": ""
      },
      {
        "name": "taskProgressEstimateLabel",
        "kind": "function",
        "signature": "taskProgressEstimateLabel(value)",
        "summary": ""
      },
      {
        "name": "NAVI_TASK_PROGRESS_ESTIMATE_FORMAT",
        "kind": "constant",
        "signature": "NAVI_TASK_PROGRESS_ESTIMATE_FORMAT",
        "summary": "TaskProgressEstimator.js — deterministic, content-free duration and progress estimates for an active Navi task. Estimates are ranges, never deadlines. They consume local prompt signals, historical route timing, and OS events; they do not call a model and never grant authority."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/execution/TaskProgressGuard",
    "path": "webgpu-os/reference/kernel/execution/TaskProgressGuard.md",
    "source": "webgpu-os/kernel/execution/TaskProgressGuard.js",
    "import": "/webgpu-os/kernel/execution/TaskProgressGuard.js",
    "sourceHash": "23f3f4e3550b714e04f6374fb155311d05cd91ae4124d230a8aae3f81335a3b3",
    "summary": "TaskProgressGuard.js — bounded semantic-progress detection for iterative AI work. The guard observes fingerprints only; it never executes tools, grants authority, persists state, or decides that unverified provider prose is work.",
    "exports": [
      {
        "name": "TaskProgressGuard",
        "kind": "class",
        "signature": "class TaskProgressGuard",
        "summary": ""
      },
      {
        "name": "verifiedToolProgressFingerprint",
        "kind": "function",
        "signature": "verifiedToolProgressFingerprint(results, toolDriver = null)",
        "summary": "Return a stable fingerprint only for successful, locally observed progress."
      },
      {
        "name": "statusToolFingerprint",
        "kind": "function",
        "signature": "statusToolFingerprint(results)",
        "summary": "Fingerprint a round made entirely from status/polling tools."
      },
      {
        "name": "semanticToolRoundFingerprint",
        "kind": "function",
        "signature": "semanticToolRoundFingerprint(results)",
        "summary": ""
      },
      {
        "name": "TASK_PROGRESS_LIMITS",
        "kind": "constant",
        "signature": "TASK_PROGRESS_LIMITS",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/execution/ToolActionReview",
    "path": "webgpu-os/reference/kernel/execution/ToolActionReview.md",
    "source": "webgpu-os/kernel/execution/ToolActionReview.js",
    "import": "/webgpu-os/kernel/execution/ToolActionReview.js",
    "sourceHash": "549d15adc55d3e1a3dea5f78ad9f15756bceeb92eb69e7125b816f2839ff24d6",
    "summary": "ToolActionReview.js — deterministic pre-approval inspection for one exact AI tool call. This is an explanatory safety layer, not an authority source: BudgetLimiter policy and the ToolRouter capability boundary remain final.",
    "exports": [
      {
        "name": "ToolActionReview",
        "kind": "class",
        "signature": "class ToolActionReview",
        "summary": ""
      },
      {
        "name": "reviewToolAction",
        "kind": "function",
        "signature": "async reviewToolAction({ tool, args = {}, policy = null, appId = '', requestId = '', naviId = '', facultyId = '', taskId = '', proposal = null, } = {})",
        "summary": "Review one exact tool descriptor and argument object before approval."
      },
      {
        "name": "TOOL_ACTION_REVIEW_FORMAT",
        "kind": "constant",
        "signature": "TOOL_ACTION_REVIEW_FORMAT",
        "summary": ""
      },
      {
        "name": "TOOL_ACTION_REVIEW_DECISION",
        "kind": "constant",
        "signature": "TOOL_ACTION_REVIEW_DECISION",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/execution/TransactionManager",
    "path": "webgpu-os/reference/kernel/execution/TransactionManager.md",
    "source": "webgpu-os/kernel/execution/TransactionManager.js",
    "import": "/webgpu-os/kernel/execution/TransactionManager.js",
    "sourceHash": "79adb6d1c4b6ce4d5664a649657346235be9d6f716898ebf8b2a3c63f186eb4c",
    "summary": "TransactionManager.js — wraps engine/state/transaction/Transaction.js (makeTransaction/sealTransaction) for the OS.ai() request/commit envelope, and engine/state/transaction/ProposalPool.js for candidate-proposal management (competing proposals over the same exclusive inputs pick a deterministic winner; losers re-observe and re-plan — never silently overwritten).",
    "exports": [
      {
        "name": "TransactionManager",
        "kind": "class",
        "signature": "class TransactionManager",
        "summary": ""
      },
      {
        "name": "PROPOSAL_STATUS",
        "kind": "re-export",
        "signature": "PROPOSAL_STATUS",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/execution/TwoPassPlannerFinalizer",
    "path": "webgpu-os/reference/kernel/execution/TwoPassPlannerFinalizer.md",
    "source": "webgpu-os/kernel/execution/TwoPassPlannerFinalizer.js",
    "import": "/webgpu-os/kernel/execution/TwoPassPlannerFinalizer.js",
    "sourceHash": "5325426c7210278648a1690b3daa5a3b50de8bfe0b3707356ec8db9dcec8d11f",
    "summary": "TwoPassPlannerFinalizer.js — the Phase 9 execution loop (kernel.aiExecutor). Full flow per OS.ai() task: prompt → goal classify → gather context (roots-checked resource reads, PrivacyGuard-scrubbed) → capability negotiation (Ph4/Ph5 attestation) → model-tier choice → PASS 1 planner (JSON plan; tools executed through the AI Tool Firewall with idempotency keys, policy gating and approval elicitations) → PASS 2 finalizer (strict schema, NO tools) → validator → repair-if-needed (bounded RepairLoop) → CommitCoordinator commit → Witness receipt → Task Ledger record. The pipeline is driven as Phase 6 storylets over worldState.phase; every fired storylet returns `{ pending }` (see AIStoryletFactory) which this loop awaits, then applies `{ phase, wsPatch, facts, observations }` via StoryletEffectsApplier.",
    "exports": [
      {
        "name": "TwoPassPlannerFinalizer",
        "kind": "class",
        "signature": "class TwoPassPlannerFinalizer",
        "summary": ""
      },
      {
        "name": "normalizeActiveGuidanceProjection",
        "kind": "function",
        "signature": "normalizeActiveGuidanceProjection(value)",
        "summary": ""
      },
      {
        "name": "normalizeAIExecutorAppContextCandidates",
        "kind": "function",
        "signature": "normalizeAIExecutorAppContextCandidates(value)",
        "summary": "Normalize app-owned context before it crosses into the Navi task envelope. Applications may contribute only an identifier, a descriptive kind, and bounded text. Classification, authority, ranking, provenance, disclosure, and source hashes are deliberately absent because the kernel owns them."
      },
      {
        "name": "selectActiveGuidanceForTool",
        "kind": "function",
        "signature": "selectActiveGuidanceForTool(activeGuidance, toolName)",
        "summary": ""
      },
      {
        "name": "taskGraphRuntimeInvalidation",
        "kind": "function",
        "signature": "taskGraphRuntimeInvalidation(previousGraph, nextGraph, { approvalCount = 0, toolResults = [], } = {})",
        "summary": ""
      },
      {
        "name": "taskScopeInvalidatesApprovals",
        "kind": "function",
        "signature": "taskScopeInvalidatesApprovals(impact)",
        "summary": ""
      },
      {
        "name": "classifyToolRoundReplanning",
        "kind": "function",
        "signature": "classifyToolRoundReplanning(results = [])",
        "summary": ""
      },
      {
        "name": "naviModelRoutePreflightError",
        "kind": "function",
        "signature": "naviModelRoutePreflightError(decision, requirements = {}, route = {})",
        "summary": "Convert a content-free kernel route decision into one stable, actionable blocker. Eligibility remains owned by NaviModelBroker; this projection only explains why a zero-route decision stopped before disclosure or dispatch."
      },
      {
        "name": "providerToolTransportFallbackEligible",
        "kind": "function",
        "signature": "providerToolTransportFallbackEligible(error, request = {})",
        "summary": "Native provider tool envelopes are an optimization, not an execution authority. If preflight proves that the approved route set cannot carry them, the planner may fall back before disclosure or dispatch to its exact JSON transport. Privacy, policy, and other route failures remain terminal."
      },
      {
        "name": "compileNaviModelCompatibilityRequirements",
        "kind": "function",
        "signature": "compileNaviModelCompatibilityRequirements(rawRequest = {}, base = {})",
        "summary": "Compile hard model-route requirements from the actual model protocol. Provider tools are an optional typed generation transport; local descriptor, graph, authority, and receipt validation remain the execution boundary. Prompt-mediated exact JSON remains available when no native tools are sent."
      },
      {
        "name": "applyNaviModelProviderContract",
        "kind": "function",
        "signature": "applyNaviModelProviderContract(rawRequest = {}, purpose = 'chat')",
        "summary": "Bind strict schemas to provider parameter enforcement without mutating the caller request."
      },
      {
        "name": "strictOutputSchemaPortabilityErrors",
        "kind": "function",
        "signature": "strictOutputSchemaPortabilityErrors(rawSchema)",
        "summary": "Validate the conservative JSON Schema subset accepted by AI Echo's strict remote-model contract. This is intentionally narrower than JSON Schema: provider endpoints commonly require closed objects and every declared property to be listed in `required`. Dynamic tool payloads must cross the model boundary as JSON strings and are parsed and tool-schema-validated by the OS after generation."
      },
      {
        "name": "canonicalInvestigationArgumentHash",
        "kind": "function",
        "signature": "canonicalInvestigationArgumentHash(args)",
        "summary": ""
      },
      {
        "name": "isStrictInvestigationReadDescriptor",
        "kind": "function",
        "signature": "isStrictInvestigationReadDescriptor(descriptor)",
        "summary": ""
      },
      {
        "name": "selectInvestigationForPrompt",
        "kind": "function",
        "signature": "selectInvestigationForPrompt({ objective, taskKind = '', goalType = '' } = {})",
        "summary": ""
      },
      {
        "name": "normalizeInvestigationFrameResponse",
        "kind": "function",
        "signature": "normalizeInvestigationFrameResponse(value)",
        "summary": ""
      },
      {
        "name": "normalizeInvestigationObservationPlan",
        "kind": "function",
        "signature": "normalizeInvestigationObservationPlan(value)",
        "summary": ""
      },
      {
        "name": "normalizeInvestigationAssessmentResponse",
        "kind": "function",
        "signature": "normalizeInvestigationAssessmentResponse(value, observationIds, caseRecord)",
        "summary": ""
      },
      {
        "name": "validateInvestigationReadReceipt",
        "kind": "function",
        "signature": "async validateInvestigationReadReceipt({ kernel, ws, result, descriptorHash, argumentHash, dataClassification, caseId = null, } = {})",
        "summary": ""
      },
      {
        "name": "investigationEvidenceProjection",
        "kind": "function",
        "signature": "investigationEvidenceProjection(evidence, cycle)",
        "summary": ""
      },
      {
        "name": "resolveInvestigationDataClassification",
        "kind": "function",
        "signature": "resolveInvestigationDataClassification(descriptor)",
        "summary": ""
      },
      {
        "name": "parseSteeringModelClassification",
        "kind": "function",
        "signature": "parseSteeringModelClassification(value)",
        "summary": "Parse the advisory free-lane steering classifier. This envelope cannot grant authority, and `cancel` is intentionally absent so an uncertain model can never stop operator work. Prose/fences are tolerated only when they contain one bounded JSON object, which keeps small free models useful without making their formatting part of the task-control boundary."
      },
      {
        "name": "validatePlannerTransportEnvelope",
        "kind": "function",
        "signature": "validatePlannerTransportEnvelope(value)",
        "summary": "Validate the canonical OS planner envelope. Provider-side schema enforcement is never required: provider-native exact JSON is projected into this closed transport before local graph, descriptor, authority, and receipt validation. This validator remains the authoritative canonical boundary. The returned diagnostics contain schema paths only and never echo tool arguments or provider text."
      },
      {
        "name": "validatePlannerTransportResponse",
        "kind": "function",
        "signature": "validatePlannerTransportResponse(value)",
        "summary": ""
      },
      {
        "name": "plannerResultTransportCandidate",
        "kind": "function",
        "signature": "plannerResultTransportCandidate(result)",
        "summary": "Prefer a completed typed provider tool batch over assistant prose."
      },
      {
        "name": "plannerTransportShapeEvidence",
        "kind": "function",
        "signature": "plannerTransportShapeEvidence(value)",
        "summary": "Return a content-free structural description of a planner response. Provider text is never copied. The evidence is safe for durable diagnostics and distinguishes common repair cases without guessing at model intent."
      },
      {
        "name": "plannerTransportRejection",
        "kind": "function",
        "signature": "plannerTransportRejection(error, retainedText)",
        "summary": "Recover a locally repairable planner envelope from a terminal broker error. The kernel broker converts a rejected `resultValidator` verdict into a route failure and discards the provider result. When the selected route is pinned (manual routing) or every approved compatible route is exhausted, that error reaches the executor and would end the run — even though the exact rejected text is still available and repairable. Only malformed-kind local admission rejections with retained text qualify; policy, authority, abort, outage, and truncation failures stay terminal under their normal rules."
      },
      {
        "name": "normalizePlannerOutput",
        "kind": "function",
        "signature": "normalizePlannerOutput(value)",
        "summary": ""
      },
      {
        "name": "normalizePlannerResponse",
        "kind": "function",
        "signature": "normalizePlannerResponse(text)",
        "summary": "Normalize a planner response while accepting one safe prose outcome: an explicit statement that no tool calls are needed. This lets smaller local models finish a no-op planning round without inventing a tool invocation."
      },
      {
        "name": "isDirectConversationPrompt",
        "kind": "function",
        "signature": "isDirectConversationPrompt(value)",
        "summary": "Bounded social turns should go straight to the answer pass. AI Echo advertises core tools on every turn, which must not force greetings, introductions, acknowledgements, or personal conversation through planner JSON. Explicit tool/OS action language always wins and stays on the planner."
      },
      {
        "name": "hasLivePatchMutationIntent",
        "kind": "function",
        "signature": "hasLivePatchMutationIntent(value)",
        "summary": ""
      },
      {
        "name": "hasExplicitLivePatchIntent",
        "kind": "function",
        "signature": "hasExplicitLivePatchIntent(value)",
        "summary": ""
      },
      {
        "name": "hasSavedArtifactIntent",
        "kind": "function",
        "signature": "hasSavedArtifactIntent(text)",
        "summary": "A saved work product is canonical VFS state, not a formatting style. The compatibility terms Artifact and gem, plus the preferred Dodad name, are weighted with actions and surrounding context so no single token can force a mutation and ordinary domain discussion remains answer-only."
      },
      {
        "name": "savedArtifactPreferredKind",
        "kind": "function",
        "signature": "savedArtifactPreferredKind(text)",
        "summary": "Resolve the saved-work storage kind requested by the operator. Web is the OS default because it preserves semantic structure, presentation, and optional interaction as independently editable files. Every kind competes through the same weighted evidence scorecard."
      },
      {
        "name": "savedArtifactIntentProfile",
        "kind": "function",
        "signature": "savedArtifactIntentProfile(text)",
        "summary": "Deterministic, content-local saved-work routing. Chat, web, document, code, table, chart, data, and declarative UI candidates all collect weighted positive, negative, and context signals. Explicit multi-word requests score strongly but never bypass comparison, ambiguity reporting, or negation. The scorecard is safe to expose in receipts and never grants tools, changes privacy classification, or replaces provider capability checks."
      },
      {
        "name": "savedArtifactPlannerFormatContract",
        "kind": "function",
        "signature": "savedArtifactPlannerFormatContract(text)",
        "summary": "Content-free planner instruction for the exact default Artifact shape."
      },
      {
        "name": "prioritizeRequiredPlannerTools",
        "kind": "function",
        "signature": "prioritizeRequiredPlannerTools(toolDescs, requiredNames = [])",
        "summary": "Present required tools first without changing the locally authoritative descriptor set. This is a provider-visibility projection only; it grants no capability and does not weaken descriptor or argument validation."
      },
      {
        "name": "classifySavedArtifactPlanSteps",
        "kind": "function",
        "signature": "classifySavedArtifactPlanSteps(steps, pending = false, { preferredKind = '' } = {})",
        "summary": "Content-free obligation check used before executing a planner round."
      },
      {
        "name": "buildSavedArtifactWebFiles",
        "kind": "function",
        "signature": "buildSavedArtifactWebFiles({ title = 'AI Echo Artifact', authoredHtml = '' } = {})",
        "summary": "Build the deterministic three-file web project used by the OS-owned Artifact fallback. The authored HTML remains the model's work product while the shell, visual system, and progressive enhancement are local and stable."
      },
      {
        "name": "savedArtifactFallbackTitle",
        "kind": "function",
        "signature": "savedArtifactFallbackTitle(text)",
        "summary": "Build a useful bounded title without trusting model-generated metadata."
      },
      {
        "name": "normalizeSavedArtifactFallbackContent",
        "kind": "function",
        "signature": "normalizeSavedArtifactFallbackContent(value, { kind = 'document' } = {})",
        "summary": "Admit plain authored content before the OS constructs a signed mutation."
      },
      {
        "name": "hasWorkspaceOutputLookupIntent",
        "kind": "function",
        "signature": "hasWorkspaceOutputLookupIntent(text)",
        "summary": "Detect a request to locate, verify, or explain the absence of saved output."
      },
      {
        "name": "workspaceOutputSearchAssessment",
        "kind": "function",
        "signature": "workspaceOutputSearchAssessment(toolResults)",
        "summary": "Project exact storage.search evidence into a bounded, content-free decision. A negative conclusion is complete only when VFS enumeration was untruncated and the same-task Workspace Output Index rebuild succeeded for /user."
      },
      {
        "name": "isWorkspaceOutputMissingClaim",
        "kind": "function",
        "signature": "isWorkspaceOutputMissingClaim(text)",
        "summary": ""
      },
      {
        "name": "unattemptedObligationEvidence",
        "kind": "function",
        "signature": "unattemptedObligationEvidence(obligation, toolDescription)",
        "summary": "Report a declared obligation that ended without a tool dispatch. The OS may only state what it observed. Recognizing refusal-shaped wording in planner prose is evidence that the round ended without an attempt, never evidence of *why*: the same words appear when a model merely discusses an earlier failure, and asserting a provider policy refusal from them puts a fabricated cause in front of the operator as OS evidence. The dispatch count is checkable, so that is what the finalizer is told."
      },
      {
        "name": "isExplicitSavedArtifactRefusal",
        "kind": "function",
        "signature": "isExplicitSavedArtifactRefusal(text)",
        "summary": "Recognize refusal-shaped planner prose tied to creating or saving a Dodad. This keeps that outcome off the JSON repair path, which cannot fix prose, while leaving arbitrary malformed planner output on the normal bounded repair path. It attests wording only — never a provider decision."
      },
      {
        "name": "currentUserPromptForRouting",
        "kind": "function",
        "signature": "currentUserPromptForRouting(value)",
        "summary": "AI Echo may wrap a short follow-up with bounded conversation history. Route on the explicit current-message section so old tool requests cannot turn a greeting or acknowledgement into a new planner round. The complete prompt remains untouched and is still supplied to the answer pass as context."
      },
      {
        "name": "livePatchRoutingText",
        "kind": "function",
        "signature": "livePatchRoutingText(value)",
        "summary": "Recover one narrow capability correction from AI Echo's managed follow-up wrapper without allowing arbitrary older turns to reactivate themselves."
      },
      {
        "name": "normalizeFinalizerOutput",
        "kind": "function",
        "signature": "normalizeFinalizerOutput(value, schema = DEFAULT_OUTPUT_SCHEMA, rawText = '')",
        "summary": "Normalize common provider answer envelopes without inventing answer content."
      },
      {
        "name": "readOnlyObservationSignature",
        "kind": "function",
        "signature": "readOnlyObservationSignature(results, toolDriver = null)",
        "summary": "Return a deterministic signature only when a round contains no mutation. Matching signatures mean both the calls and the resulting observations were unchanged, so another identical re-plan round cannot add evidence."
      },
      {
        "name": "toolRoundSignature",
        "kind": "function",
        "signature": "toolRoundSignature(results)",
        "summary": "A bounded deterministic fingerprint used to detect alternating planner cycles."
      },
      {
        "name": "detectFinalToolEnvelope",
        "kind": "function",
        "signature": "detectFinalToolEnvelope(answer, toolDriver = null, toolResults = [])",
        "summary": "Detect executable tool-call JSON leaked into final prose. A matching receipt proves the action ran, but it does not make a raw tool envelope a valid user answer. Fenced examples are ignored. The detector parses bounded complete objects and never evaluates model-authored content."
      },
      {
        "name": "resolveNegotiatedToolName",
        "kind": "function",
        "signature": "resolveNegotiatedToolName(requestedName, capabilities = [])",
        "summary": ""
      },
      {
        "name": "resolveNaviExecutionMode",
        "kind": "function",
        "signature": "resolveNaviExecutionMode(kernel)",
        "summary": ""
      },
      {
        "name": "plannerOutputParams",
        "kind": "function",
        "signature": "plannerOutputParams(params)",
        "summary": "Guarantee the planner enough output budget to emit a plan after reasoning. A reasoning model spends its output allowance on a thinking trace before it writes any content. With a chat-sized allowance the trace is truncated mid-stream, the content channel stays empty, and the transport reports \"invalid JSON\" for a response that never contained a plan at all — a failure no local repair can fix, because there is nothing to extract. Raise the floor only; a larger operator setting is always honoured."
      },
      {
        "name": "jsonOnlyReasoningDirective",
        "kind": "function",
        "signature": "jsonOnlyReasoningDirective(model)",
        "summary": "Return the model-native directive that suppresses a thinking trace, if the route documents one. NVIDIA Nemotron and hybrid Qwen3 were both trained on the same `/think` and `/no_think` soft switch, and both default to reasoning when no signal is present — which is why a JSON-only pass gets a monologue it never asked for. This is message text rather than an API parameter, so it needs no gateway support and a model that does not recognize it simply answers normally. The gateway alternatives do not cover this case: OpenRouter honours `reasoning.max_tokens` only for Gemini, Anthropic and some Qwen, `effort` only for OpenAI and Grok, and `exclude` still spends the budget on hidden thinking. Only JSON-only passes pass through here; prose answers keep their reasoning."
      },
      {
        "name": "isTransientNaviExecutionState",
        "kind": "function",
        "signature": "isTransientNaviExecutionState(value)",
        "summary": ""
      },
      {
        "name": "naviCognitionDenialMessage",
        "kind": "function",
        "signature": "naviCognitionDenialMessage(mode)",
        "summary": "Explain a cognition denial without hiding the exact kernel state or code. A still-transient state at the end of the startup budget is not the same condition as a terminal one: nothing is wrong with the operator's setup and the identical request usually succeeds once the bind settles. Saying only \"unavailable\" there sends operators looking for a fault that does not exist."
      },
      {
        "name": "waitForNaviExecutionMode",
        "kind": "function",
        "signature": "waitForNaviExecutionMode(kernel, { timeoutMs = NAVI_COGNITION_TRANSIENT_WAIT_MS, signal = null, } = {})",
        "summary": "Hold a newly accepted, still side-effect-free task across one short kernel authority rebind. The wait never bypasses Navi, never dispatches a provider, and resolves immediately when the state becomes ready or terminal."
      },
      {
        "name": "resolveNaviFacultyToolInvocation",
        "kind": "function",
        "signature": "resolveNaviFacultyToolInvocation(toolName, rawArgs = {})",
        "summary": ""
      },
      {
        "name": "projectVerifiedFacultyOutcomeAck",
        "kind": "function",
        "signature": "projectVerifiedFacultyOutcomeAck(receiptEvidence, replayed = false)",
        "summary": "Content-free learning projection from kernel-verified Faculty evidence. This carries no arguments, result payload, provider reasoning, capability, approval, or authority. Consumers may use it only as review evidence."
      },
      {
        "name": "projectArtifactFileActivity",
        "kind": "function",
        "signature": "projectArtifactFileActivity({ toolName = '', args = {}, result = null, phase = 'preparing', errorCode = null, error = null, } = {})",
        "summary": "Project one local-only Artifact file operation for Run Details. A bounded incoming-content preview lets the operator inspect the exact write while it is active; it is never added to provider-visible results, signed receipts, diagnostics, or Companion messages. Exact absolute paths, sizes, and hashes still appear only after the locally verified Artifact receipt."
      },
      {
        "name": "NAVI_TOOL_PLAN_OUTPUT_SCHEMA",
        "kind": "constant",
        "signature": "NAVI_TOOL_PLAN_OUTPUT_SCHEMA",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/ledger/AgentScratchpad",
    "path": "webgpu-os/reference/kernel/ledger/AgentScratchpad.md",
    "source": "webgpu-os/kernel/ledger/AgentScratchpad.js",
    "import": "/webgpu-os/kernel/ledger/AgentScratchpad.js",
    "sourceHash": "5af2418d13fe496e1ce160aba30236417409730613f9cd9f2cd0d762bcee64bc",
    "summary": "AgentScratchpad.js — bounded execution notes for AI requests. This records operational state (plans, actions, observations, failures and phase changes), not hidden model reasoning. Entries are safe to render in a task report and give the user a replayable account of what the agent did.",
    "exports": [
      {
        "name": "AgentScratchpad",
        "kind": "class",
        "signature": "class AgentScratchpad",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/ledger/BlockerList",
    "path": "webgpu-os/reference/kernel/ledger/BlockerList.md",
    "source": "webgpu-os/kernel/ledger/BlockerList.js",
    "import": "/webgpu-os/kernel/ledger/BlockerList.js",
    "sourceHash": "bdc3f1b7ce0deb526ccc67b4a81abe555086763386bdf88f37614be0b0b3b844",
    "summary": "BlockerList.js — active blockers for an AI request: pending approvals, unanswered elicitations, effects parked for reconciliation, denied capabilities. The overlay's Mini Bar badge count comes from here.",
    "exports": [
      {
        "name": "BlockerList",
        "kind": "class",
        "signature": "class BlockerList",
        "summary": ""
      },
      {
        "name": "BLOCKER_KIND",
        "kind": "re-export",
        "signature": "BLOCKER_KIND",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/ledger/BoundedTrace",
    "path": "webgpu-os/reference/kernel/ledger/BoundedTrace.md",
    "source": "webgpu-os/kernel/ledger/BoundedTrace.js",
    "import": "/webgpu-os/kernel/ledger/BoundedTrace.js",
    "sourceHash": "576a5b7e2f6ef92796431a5ad99dbbd36eea886cdf707f99b74f5740b9b5593d",
    "summary": "BoundedTrace.js — shared base for the ledger's simple per-request traces (resource reads, sampling, elicitations, storylet fires): bounded, timestamped, requestId-keyed append log. Type-specific traces extend this instead of quadruplicating the same buffer logic.",
    "exports": [
      {
        "name": "BoundedTrace",
        "kind": "class",
        "signature": "class BoundedTrace",
        "summary": "BoundedTrace.js — shared base for the ledger's simple per-request traces (resource reads, sampling, elicitations, storylet fires): bounded, timestamped, requestId-keyed append log. Type-specific traces extend this instead of quadruplicating the same buffer logic."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/ledger/ElicitationTrace",
    "path": "webgpu-os/reference/kernel/ledger/ElicitationTrace.md",
    "source": "webgpu-os/kernel/ledger/ElicitationTrace.js",
    "import": "/webgpu-os/kernel/ledger/ElicitationTrace.js",
    "sourceHash": "086ab6026f5d216e072403b4798ef0bfbde1cf5c28ab577bbe80212f93015c4b",
    "summary": "ElicitationTrace.js — ledger trace of mid-task user questions (Phase 4 ElicitationManager): what was asked, whether the user answered/declined/ timed out, and how long the task waited.",
    "exports": [
      {
        "name": "ElicitationTrace",
        "kind": "class",
        "signature": "class ElicitationTrace extends BoundedTrace",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/ledger/ExecutionGraph",
    "path": "webgpu-os/reference/kernel/ledger/ExecutionGraph.md",
    "source": "webgpu-os/kernel/ledger/ExecutionGraph.js",
    "import": "/webgpu-os/kernel/ledger/ExecutionGraph.js",
    "sourceHash": "be70a7ae8cfdc5c7e439dc99698cdccc84882359b1c07f3f6afaa67a795c58d6",
    "summary": "ExecutionGraph.js — the executed-steps DAG for an AI request: nodes are storylet fires / tool calls / model passes; edges are causal (\"B used A's output\"). Feeds the Timeline Panel's graph view.",
    "exports": [
      {
        "name": "ExecutionGraph",
        "kind": "class",
        "signature": "class ExecutionGraph",
        "summary": "ExecutionGraph.js — the executed-steps DAG for an AI request: nodes are storylet fires / tool calls / model passes; edges are causal (\"B used A's output\"). Feeds the Timeline Panel's graph view."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/ledger/FinalReport",
    "path": "webgpu-os/reference/kernel/ledger/FinalReport.md",
    "source": "webgpu-os/kernel/ledger/FinalReport.js",
    "import": "/webgpu-os/kernel/ledger/FinalReport.js",
    "sourceHash": "e7bf16cd137f29b591ec38af42044e15f612e78ee785e7cfe0dcbad32e4a6d73",
    "summary": "FinalReport.js — assembles the end-of-task report for one AI request from the ledger's parts: goal outcome, task summary, tool/resource/sampling/ elicitation activity, blockers hit, receipts issued. This is what the overlay shows when a task completes and what gets persisted with the request record.",
    "exports": [
      {
        "name": "FinalReport",
        "kind": "class",
        "signature": "class FinalReport",
        "summary": ""
      },
      {
        "name": "projectArtifactToolFailureDiagnostic",
        "kind": "function",
        "signature": "projectArtifactToolFailureDiagnostic(value = {})",
        "summary": "Convert an Artifact mutation failure into a fixed, content-free diagnostic. Raw handler text is used only to select a known category and is never returned, so prompts, file contents, tool arguments, and provider bodies cannot enter Run Details or copied diagnostics through this path."
      },
      {
        "name": "projectProviderFailureDiagnostic",
        "kind": "function",
        "signature": "projectProviderFailureDiagnostic(value)",
        "summary": "Keep only broker-authored, content-free failure evidence. Provider payloads, prompts, credentials, endpoints, and response bodies are deliberately absent."
      },
      {
        "name": "projectNaviModelRouteBlocker",
        "kind": "function",
        "signature": "projectNaviModelRouteBlocker(value)",
        "summary": "Preserve a content-free model compatibility decision when the kernel stops before provider dispatch. This is intentionally separate from `modelExecution`: zero attempts is evidence that no provider was called."
      },
      {
        "name": "projectModelExecutionDiagnostic",
        "kind": "function",
        "signature": "projectModelExecutionDiagnostic(value)",
        "summary": "Project a Navi broker execution into a bounded diagnostic receipt. Request hashes and partial-result hashes are intentionally excluded because they can fingerprint operator content without helping an operator diagnose routing."
      },
      {
        "name": "publicErrorNumberForFailure",
        "kind": "function",
        "signature": "publicErrorNumberForFailure({ errorCode = '', failure = null } = {})",
        "summary": ""
      },
      {
        "name": "createAIIncidentId",
        "kind": "function",
        "signature": "createAIIncidentId(requestId)",
        "summary": ""
      },
      {
        "name": "projectAIEchoPipelineTrace",
        "kind": "function",
        "signature": "projectAIEchoPipelineTrace(value, { requestId = '', incidentId = null, outcome = '', errorCode = null, errorNumber = null, openedAt = 0, closedAt = 0, } = {})",
        "summary": "Project the existing resumable run stream into one compact, durable, content-free diagnostic trace. This is deliberately a report projection, not a second event registry or ledger. Unknown fields are dropped rather than recursively scrubbed so prompts, provider bodies, credentials, raw tool arguments, and reasoning deltas cannot cross this boundary."
      },
      {
        "name": "AI_ECHO_ROUTE_ERROR_NUMBERS",
        "kind": "constant",
        "signature": "AI_ECHO_ROUTE_ERROR_NUMBERS",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/ledger/GoalTree",
    "path": "webgpu-os/reference/kernel/ledger/GoalTree.md",
    "source": "webgpu-os/kernel/ledger/GoalTree.js",
    "import": "/webgpu-os/kernel/ledger/GoalTree.js",
    "sourceHash": "b383dcac5184ec7db80e28fd5ae4d13029dd8f882bac9a614ef23fcdb7841b55",
    "summary": "GoalTree.js — hierarchical goal decomposition for an AI request: the root goal (the user's prompt intent) breaks into subgoals; each node tracks its status so the Task Panel can render live progress.",
    "exports": [
      {
        "name": "GoalTree",
        "kind": "class",
        "signature": "class GoalTree",
        "summary": ""
      },
      {
        "name": "GOAL_STATUS",
        "kind": "re-export",
        "signature": "GOAL_STATUS",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/ledger/ObservationLog",
    "path": "webgpu-os/reference/kernel/ledger/ObservationLog.md",
    "source": "webgpu-os/kernel/ledger/ObservationLog.js",
    "import": "/webgpu-os/kernel/ledger/ObservationLog.js",
    "sourceHash": "032c5634c689e326a3b72be7abd4073d3f1cee2abf184784f503004b7549cb95",
    "summary": "ObservationLog.js — wraps engine/state/entity/ProvenanceStore.js: every observation an AI task makes carries W3C-PROV-style provenance (observed/inferred/model-predicted/user-asserted/untrusted). Tool/model/ resource content is recorded as UNTRUSTED observation by default — never authority (the prompt-injection boundary).",
    "exports": [
      {
        "name": "ObservationLog",
        "kind": "class",
        "signature": "class ObservationLog",
        "summary": ""
      },
      {
        "name": "CERTAINTY",
        "kind": "re-export",
        "signature": "CERTAINTY",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/ledger/ResourceReadTrace",
    "path": "webgpu-os/reference/kernel/ledger/ResourceReadTrace.md",
    "source": "webgpu-os/kernel/ledger/ResourceReadTrace.js",
    "import": "/webgpu-os/kernel/ledger/ResourceReadTrace.js",
    "sourceHash": "ceb6516be8cd7e3780e2d00697786b9a440ce40c153c2b991f1864fee2ddd620",
    "summary": "ResourceReadTrace.js — ledger trace of every `<appId>://...` resource read an AI request performed (URI, byte size, roots check outcome), so the Task Panel can show exactly WHAT the AI looked at.",
    "exports": [
      {
        "name": "ResourceReadTrace",
        "kind": "class",
        "signature": "class ResourceReadTrace extends BoundedTrace",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/ledger/SamplingTrace",
    "path": "webgpu-os/reference/kernel/ledger/SamplingTrace.md",
    "source": "webgpu-os/kernel/ledger/SamplingTrace.js",
    "import": "/webgpu-os/kernel/ledger/SamplingTrace.js",
    "sourceHash": "665b3c0c9c186570d53eed8e05c255a1f2fef8c1fa8277e7c97b9bf66b4b6e2e",
    "summary": "SamplingTrace.js — ledger trace of nested LLM completions requested by tool handlers via the SamplingBroker (Phase 4): parent request, depth, model tier, token/cost accounting when available.",
    "exports": [
      {
        "name": "SamplingTrace",
        "kind": "class",
        "signature": "class SamplingTrace extends BoundedTrace",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/ledger/StoryletTrace",
    "path": "webgpu-os/reference/kernel/ledger/StoryletTrace.md",
    "source": "webgpu-os/kernel/ledger/StoryletTrace.js",
    "import": "/webgpu-os/kernel/ledger/StoryletTrace.js",
    "sourceHash": "7a6b3bad12ce1f3989164f9057585d39605212887072a153e1ee0c1c4b0e13c3",
    "summary": "StoryletTrace.js — ledger trace of storylet fires for an AI request (Phase 6 pipeline): which storylet fired, the phase transition it caused, and its result summary.",
    "exports": [
      {
        "name": "StoryletTrace",
        "kind": "class",
        "signature": "class StoryletTrace extends BoundedTrace",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/ledger/TaskLedger",
    "path": "webgpu-os/reference/kernel/ledger/TaskLedger.md",
    "source": "webgpu-os/kernel/ledger/TaskLedger.js",
    "import": "/webgpu-os/kernel/ledger/TaskLedger.js",
    "sourceHash": "f972e686974d06b712af24901183933e7ce484c9198b4457fb345ee25ac004a5",
    "summary": "TaskLedger.js — aggregation facade over the Phase 8 ledger parts, wired as kernel.taskLedger. One shared instance holds cross-request traces (observations, tool calls, resource reads, sampling, elicitations, storylet fires, blockers) plus per-request records (goal tree, task list, execution graph, receipts). Every recorded receipt/witness reuses engine/state/witness/Witness.js (makeWitness/makeReceipt) and every record lands in the SHARED Phase 7 event log via kernel.timeEngine.record().",
    "exports": [
      {
        "name": "TaskLedger",
        "kind": "class",
        "signature": "class TaskLedger",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/ledger/TaskList",
    "path": "webgpu-os/reference/kernel/ledger/TaskList.md",
    "source": "webgpu-os/kernel/ledger/TaskList.js",
    "import": "/webgpu-os/kernel/ledger/TaskList.js",
    "sourceHash": "03b92bc779e59a37f42ad3ce585b5bceb9d2672ea0a240cba4b9e63a146585fc",
    "summary": "TaskList.js — flat, ordered task list for an AI request (each task usually maps to a goal-tree leaf + a storylet/tool step). Drives the Task Panel's checklist view.",
    "exports": [
      {
        "name": "TaskList",
        "kind": "class",
        "signature": "class TaskList",
        "summary": ""
      },
      {
        "name": "TASK_STATUS",
        "kind": "re-export",
        "signature": "TASK_STATUS",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/ledger/ToolCallTrace",
    "path": "webgpu-os/reference/kernel/ledger/ToolCallTrace.md",
    "source": "webgpu-os/kernel/ledger/ToolCallTrace.js",
    "import": "/webgpu-os/kernel/ledger/ToolCallTrace.js",
    "sourceHash": "b6c9d0a3cfbeb4641008cbf153a512e2dc60c57942cb46811079f2793c339f5b",
    "summary": "ToolCallTrace.js — wraps engine/state/workflow/Outbox.js + Reconciler.js: every AI-initiated tool call is recorded as a transactional effect INTENT (idempotent by stable effect id — commit retries never duplicate a call), delivered via drain(), with ambiguous outcomes parked as RECONCILE and resolved by EVIDENCE (a probe of the authoritative status), never guessed.",
    "exports": [
      {
        "name": "ToolCallTrace",
        "kind": "class",
        "signature": "class ToolCallTrace",
        "summary": ""
      },
      {
        "name": "EFFECT_STATUS",
        "kind": "re-export",
        "signature": "EFFECT_STATUS",
        "summary": ""
      },
      {
        "name": "RECONCILE_RESULT",
        "kind": "re-export",
        "signature": "RECONCILE_RESULT",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/live-patch/LivePatchService",
    "path": "webgpu-os/reference/kernel/live-patch/LivePatchService.md",
    "source": "webgpu-os/kernel/live-patch/LivePatchService.js",
    "import": "/webgpu-os/kernel/live-patch/LivePatchService.js",
    "sourceHash": "31a8185cab353c20f357649c1718ed67f9ce4e3d526aa12ab6ed0bbb4e821eaa",
    "summary": "LivePatchService.js — kernel-owned, declarative live UI editing. Model output never becomes executable code. A caller can inspect registered surfaces and propose a small allow-listed operation list. The service applies that list as a reversible preview, verifies the resulting DOM, and only then persists a canonical patch + receipt beneath /user/live-patches.",
    "exports": [
      {
        "name": "LivePatchService",
        "kind": "class",
        "signature": "class LivePatchService",
        "summary": ""
      },
      {
        "name": "validateLivePatchDraft",
        "kind": "function",
        "signature": "validateLivePatchDraft(input = {})",
        "summary": ""
      },
      {
        "name": "sanitizeLivePatchMarkup",
        "kind": "function",
        "signature": "sanitizeLivePatchMarkup(markup, { patchId = 'live_preview' } = {})",
        "summary": ""
      },
      {
        "name": "sanitizeLivePatchStylesheet",
        "kind": "function",
        "signature": "sanitizeLivePatchStylesheet(css)",
        "summary": ""
      },
      {
        "name": "LIVE_PATCH_FORMAT",
        "kind": "constant",
        "signature": "LIVE_PATCH_FORMAT",
        "summary": ""
      },
      {
        "name": "LIVE_PATCH_RECEIPT_FORMAT",
        "kind": "constant",
        "signature": "LIVE_PATCH_RECEIPT_FORMAT",
        "summary": ""
      },
      {
        "name": "LIVE_PATCH_HEAD_FORMAT",
        "kind": "constant",
        "signature": "LIVE_PATCH_HEAD_FORMAT",
        "summary": ""
      },
      {
        "name": "LIVE_PATCH_CANDIDATE_FORMAT",
        "kind": "constant",
        "signature": "LIVE_PATCH_CANDIDATE_FORMAT",
        "summary": ""
      },
      {
        "name": "LIVE_PATCH_ACTIVATION_FORMAT",
        "kind": "constant",
        "signature": "LIVE_PATCH_ACTIVATION_FORMAT",
        "summary": ""
      },
      {
        "name": "LIVE_PATCH_ROOT",
        "kind": "constant",
        "signature": "LIVE_PATCH_ROOT",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/navi/NaviAutonomyService",
    "path": "webgpu-os/reference/kernel/navi/NaviAutonomyService.md",
    "source": "webgpu-os/kernel/navi/NaviAutonomyService.js",
    "import": "/webgpu-os/kernel/navi/NaviAutonomyService.js",
    "sourceHash": "5272442132cf43cec4a6ac19d05531cc7a5e78eca1f055cd3b2c11ab050dbec8",
    "summary": "Kernel-owned structured operational cognition for one or more Navis. Entries are Navi-authored conclusions, evidence, uncertainty, proposals, and budget accounting. They are never provider-hidden reasoning or raw model transcripts. The injected continuity cipher owns encryption; this service never receives or exposes a generic key or decryption API.",
    "exports": [
      {
        "name": "NaviAutonomyServiceError",
        "kind": "class",
        "signature": "class NaviAutonomyServiceError extends Error",
        "summary": ""
      },
      {
        "name": "NaviAutonomyService",
        "kind": "class",
        "signature": "class NaviAutonomyService",
        "summary": ""
      },
      {
        "name": "NAVI_OPERATIONAL_JOURNAL_RECORD_TYPE",
        "kind": "constant",
        "signature": "NAVI_OPERATIONAL_JOURNAL_RECORD_TYPE",
        "summary": "Kernel-owned structured operational cognition for one or more Navis. Entries are Navi-authored conclusions, evidence, uncertainty, proposals, and budget accounting. They are never provider-hidden reasoning or raw model transcripts. The injected continuity cipher owns encryption; this service never receives or exposes a generic key or decryption API."
      },
      {
        "name": "NAVI_OPERATIONAL_JOURNAL_INDEX_RECORD_TYPE",
        "kind": "constant",
        "signature": "NAVI_OPERATIONAL_JOURNAL_INDEX_RECORD_TYPE",
        "summary": ""
      },
      {
        "name": "NAVI_OPERATIONAL_JOURNAL_FORMAT",
        "kind": "constant",
        "signature": "NAVI_OPERATIONAL_JOURNAL_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_OPERATIONAL_JOURNAL_INDEX_FORMAT",
        "kind": "constant",
        "signature": "NAVI_OPERATIONAL_JOURNAL_INDEX_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_OPERATIONAL_JOURNAL_INDEX_MIGRATION_FORMAT",
        "kind": "constant",
        "signature": "NAVI_OPERATIONAL_JOURNAL_INDEX_MIGRATION_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_OPERATIONAL_COGNITION_BOUNDARY",
        "kind": "constant",
        "signature": "NAVI_OPERATIONAL_COGNITION_BOUNDARY",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/navi/NaviBackgroundCoordinator",
    "path": "webgpu-os/reference/kernel/navi/NaviBackgroundCoordinator.md",
    "source": "webgpu-os/kernel/navi/NaviBackgroundCoordinator.js",
    "import": "/webgpu-os/kernel/navi/NaviBackgroundCoordinator.js",
    "sourceHash": "44a9657cef14790fd8ad7b8482a91f75bbd1e10f27900ab61f342ce96358488b",
    "summary": "Persistent, cross-tab coordinator for bounded Navi background cognition. Web Locks is the execution authority: one exclusive lock remains held across the durable reread, executor call, operational-journal append, and terminal job update. BroadcastChannel is observability and wake-up only; peer messages never grant authority or replace the durable encrypted job record.",
    "exports": [
      {
        "name": "NaviBackgroundCoordinatorError",
        "kind": "class",
        "signature": "class NaviBackgroundCoordinatorError extends Error",
        "summary": ""
      },
      {
        "name": "NaviBackgroundTransientExecutionError",
        "kind": "class",
        "signature": "class NaviBackgroundTransientExecutionError extends NaviBackgroundCoordinatorError",
        "summary": "Explicit retry signal accepted from the kernel-owned background executor. Arbitrary errors cannot opt into retries by attaching `retryable` or `kind` fields: the coordinator accepts only instances privately branded here, and this constructor admits only the closed outage/throttle transient set."
      },
      {
        "name": "NaviBackgroundCoordinator",
        "kind": "class",
        "signature": "class NaviBackgroundCoordinator",
        "summary": ""
      },
      {
        "name": "buildNaviBackgroundCognitionPrompt",
        "kind": "function",
        "signature": "buildNaviBackgroundCognitionPrompt({ operation = '', objective = '' } = {})",
        "summary": ""
      },
      {
        "name": "naviBackgroundTokenEnvelope",
        "kind": "function",
        "signature": "naviBackgroundTokenEnvelope({ operation = '', objective = '', outputTokens = 0, routeAttempts = 1, } = {})",
        "summary": ""
      },
      {
        "name": "NAVI_BACKGROUND_JOB_RECORD_TYPE",
        "kind": "constant",
        "signature": "NAVI_BACKGROUND_JOB_RECORD_TYPE",
        "summary": ""
      },
      {
        "name": "NAVI_BACKGROUND_JOB_INDEX_RECORD_TYPE",
        "kind": "constant",
        "signature": "NAVI_BACKGROUND_JOB_INDEX_RECORD_TYPE",
        "summary": ""
      },
      {
        "name": "NAVI_BACKGROUND_JOB_FORMAT",
        "kind": "constant",
        "signature": "NAVI_BACKGROUND_JOB_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_BACKGROUND_JOB_INDEX_FORMAT",
        "kind": "constant",
        "signature": "NAVI_BACKGROUND_JOB_INDEX_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_BACKGROUND_JOB_INDEX_MIGRATION_FORMAT",
        "kind": "constant",
        "signature": "NAVI_BACKGROUND_JOB_INDEX_MIGRATION_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_BACKGROUND_CONTEXT_FORMAT",
        "kind": "constant",
        "signature": "NAVI_BACKGROUND_CONTEXT_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_BACKGROUND_CHANNEL",
        "kind": "constant",
        "signature": "NAVI_BACKGROUND_CHANNEL",
        "summary": ""
      },
      {
        "name": "NAVI_BACKGROUND_ROUTE_ATTEMPT_LIMIT",
        "kind": "constant",
        "signature": "NAVI_BACKGROUND_ROUTE_ATTEMPT_LIMIT",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/navi/NaviBackupRecoveryService",
    "path": "webgpu-os/reference/kernel/navi/NaviBackupRecoveryService.md",
    "source": "webgpu-os/kernel/navi/NaviBackupRecoveryService.js",
    "import": "/webgpu-os/kernel/navi/NaviBackupRecoveryService.js",
    "sourceHash": "d79818b9ec04829ca5cfa5f3118cb74f7e2eb027eaf66875a24e1d2e469a2913",
    "summary": "Signed, encrypted Navi backups and recovery-branch reconciliation. This service never exports a credential, a private CryptoKey, raw provider output, a live capability, or a canonical write authority. Restore decrypts and validates into a durable non-canonical branch. Only an exact reviewed diff may reach an injected canonical merge applier.",
    "exports": [
      {
        "name": "NaviBackupRecoveryError",
        "kind": "class",
        "signature": "class NaviBackupRecoveryError extends Error",
        "summary": ""
      },
      {
        "name": "NaviBackupIntegrityError",
        "kind": "class",
        "signature": "class NaviBackupIntegrityError extends NaviBackupRecoveryError",
        "summary": ""
      },
      {
        "name": "NaviBackupRecoveryService",
        "kind": "class",
        "signature": "class NaviBackupRecoveryService",
        "summary": ""
      },
      {
        "name": "isDeterministicRecoveryBranchRegistrationFailure",
        "kind": "function",
        "signature": "isDeterministicRecoveryBranchRegistrationFailure(error)",
        "summary": ""
      },
      {
        "name": "createNaviBackupStateReader",
        "kind": "function",
        "signature": "createNaviBackupStateReader({ continuityStore, cognitionStore } = {})",
        "summary": "Build the production state reader over already initialized continuity and cognition Stores. The reader exports only the Phase 7 allow-list."
      },
      {
        "name": "NAVI_ENCRYPTED_BACKUP_BUNDLE_FORMAT",
        "kind": "constant",
        "signature": "NAVI_ENCRYPTED_BACKUP_BUNDLE_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_BACKUP_PAYLOAD_FORMAT",
        "kind": "constant",
        "signature": "NAVI_BACKUP_PAYLOAD_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_BACKUP_FILE_FORMAT",
        "kind": "constant",
        "signature": "NAVI_BACKUP_FILE_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_RECONCILIATION_DIFF_FORMAT",
        "kind": "constant",
        "signature": "NAVI_RECONCILIATION_DIFF_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_RECOVERY_RESTORE_RECEIPT_FORMAT",
        "kind": "constant",
        "signature": "NAVI_RECOVERY_RESTORE_RECEIPT_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_RECOVERY_MERGE_APPROVAL_FORMAT",
        "kind": "constant",
        "signature": "NAVI_RECOVERY_MERGE_APPROVAL_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_RECOVERY_IMPORT_APPROVAL_FORMAT",
        "kind": "constant",
        "signature": "NAVI_RECOVERY_IMPORT_APPROVAL_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_RECOVERY_MERGE_RECEIPT_FORMAT",
        "kind": "constant",
        "signature": "NAVI_RECOVERY_MERGE_RECEIPT_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_RECOVERY_SETTLEMENT_JOURNAL_FORMAT",
        "kind": "constant",
        "signature": "NAVI_RECOVERY_SETTLEMENT_JOURNAL_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_RECOVERY_SETTLEMENT_INTENT_FORMAT",
        "kind": "constant",
        "signature": "NAVI_RECOVERY_SETTLEMENT_INTENT_FORMAT",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/navi/NaviCognitionService",
    "path": "webgpu-os/reference/kernel/navi/NaviCognitionService.md",
    "source": "webgpu-os/kernel/navi/NaviCognitionService.js",
    "import": "/webgpu-os/kernel/navi/NaviCognitionService.js",
    "sourceHash": "e839b244d2c937406201840a6016164b1da44c7be6fd4cb210128cd64dd6fc16",
    "summary": "NaviCognitionService — kernel authority for model-neutral task continuity. Provider conversations are transports, never task storage. This service persists signed task envelopes, per-Navi routes, self-model state, disclosure receipts, and encrypted checkpoints before exposing immutable projections.",
    "exports": [
      {
        "name": "NaviCognitionServiceError",
        "kind": "class",
        "signature": "class NaviCognitionServiceError extends Error",
        "summary": ""
      },
      {
        "name": "NaviCognitionService",
        "kind": "class",
        "signature": "class NaviCognitionService",
        "summary": ""
      },
      {
        "name": "NAVI_SELF_MODEL_FORMAT",
        "kind": "constant",
        "signature": "NAVI_SELF_MODEL_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_IDENTITY_PROFILE_FORMAT",
        "kind": "constant",
        "signature": "NAVI_IDENTITY_PROFILE_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_ROUTE_CONFIGURATION_FORMAT",
        "kind": "constant",
        "signature": "NAVI_ROUTE_CONFIGURATION_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_TASK_CHECKPOINT_FORMAT",
        "kind": "constant",
        "signature": "NAVI_TASK_CHECKPOINT_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_ROUTE_EVIDENCE_RECORD_FORMAT",
        "kind": "constant",
        "signature": "NAVI_ROUTE_EVIDENCE_RECORD_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_MODEL_DISPATCH_FORMAT",
        "kind": "constant",
        "signature": "NAVI_MODEL_DISPATCH_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_DISPATCH_RECOVERY_FORMAT",
        "kind": "constant",
        "signature": "NAVI_DISPATCH_RECOVERY_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_DISPATCH_RECOVERY_STATE_FORMAT",
        "kind": "constant",
        "signature": "NAVI_DISPATCH_RECOVERY_STATE_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_ROUTE_AUTHORIZATION_FORMAT",
        "kind": "constant",
        "signature": "NAVI_ROUTE_AUTHORIZATION_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_CONTEXT_SOURCE_BINDINGS_FORMAT",
        "kind": "constant",
        "signature": "NAVI_CONTEXT_SOURCE_BINDINGS_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_GUIDANCE_OBSERVATION_FORMAT",
        "kind": "constant",
        "signature": "NAVI_GUIDANCE_OBSERVATION_FORMAT",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/navi/NaviCognitionStore",
    "path": "webgpu-os/reference/kernel/navi/NaviCognitionStore.md",
    "source": "webgpu-os/kernel/navi/NaviCognitionStore.js",
    "import": "/webgpu-os/kernel/navi/NaviCognitionStore.js",
    "sourceHash": "a5631c1fe2c9db2faf63094263086e353214a8188a8e30470bcb709f962d3478",
    "summary": "Durable ciphertext-only storage for the Navi Cognition Fabric. The Store deliberately knows nothing about task, context, or self-model plaintext. A kernel-only continuity cipher creates authenticated record envelopes before they reach this boundary. Invalid data is quarantined instead of becoming an empty task, route configuration, or self-model.",
    "exports": [
      {
        "name": "NaviCognitionStoreError",
        "kind": "class",
        "signature": "class NaviCognitionStoreError extends Error",
        "summary": ""
      },
      {
        "name": "NaviCognitionStoreConflictError",
        "kind": "class",
        "signature": "class NaviCognitionStoreConflictError extends NaviCognitionStoreError",
        "summary": ""
      },
      {
        "name": "NaviCognitionStoreQuarantineError",
        "kind": "class",
        "signature": "class NaviCognitionStoreQuarantineError extends NaviCognitionStoreError",
        "summary": ""
      },
      {
        "name": "IndexedDbCognitionBackend",
        "kind": "class",
        "signature": "class IndexedDbCognitionBackend",
        "summary": ""
      },
      {
        "name": "NaviCognitionStore",
        "kind": "class",
        "signature": "class NaviCognitionStore",
        "summary": ""
      },
      {
        "name": "validateNaviCognitionRecord",
        "kind": "function",
        "signature": "async validateNaviCognitionRecord(value, expected = {})",
        "summary": "Verify one portable encrypted cognition row without opening its Store. Recovery uses this exact validator before an authenticated backup row may enter a reconciliation branch. The function validates the same binding, envelope hash, and record integrity hash as the live Store read path."
      },
      {
        "name": "NAVI_COGNITION_DATABASE_NAME",
        "kind": "constant",
        "signature": "NAVI_COGNITION_DATABASE_NAME",
        "summary": ""
      },
      {
        "name": "NAVI_COGNITION_DATABASE_VERSION",
        "kind": "constant",
        "signature": "NAVI_COGNITION_DATABASE_VERSION",
        "summary": ""
      },
      {
        "name": "NAVI_COGNITION_RECORDS_STORE",
        "kind": "constant",
        "signature": "NAVI_COGNITION_RECORDS_STORE",
        "summary": ""
      },
      {
        "name": "NAVI_COGNITION_RECORD_FORMAT",
        "kind": "constant",
        "signature": "NAVI_COGNITION_RECORD_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_COGNITION_QUARANTINE_FORMAT",
        "kind": "constant",
        "signature": "NAVI_COGNITION_QUARANTINE_FORMAT",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/navi/NaviContextCompiler",
    "path": "webgpu-os/reference/kernel/navi/NaviContextCompiler.md",
    "source": "webgpu-os/kernel/navi/NaviContextCompiler.js",
    "import": "/webgpu-os/kernel/navi/NaviContextCompiler.js",
    "sourceHash": "7e37a5be3fb431b6013a091ac73c0d61e50207ef7d2f5e441545d14a25fc20c9",
    "summary": "NaviContextCompiler.js — deterministic, policy-filtered Navi model context. This module is deliberately provider-agnostic. It accepts a previously verified active Covenant, filters every classified context item before any provider call can be made, and emits a content-free disclosure receipt. Provider sessions and model output never become canonical state here.",
    "exports": [
      {
        "name": "NaviContextCompilerError",
        "kind": "class",
        "signature": "class NaviContextCompilerError extends Error",
        "summary": ""
      },
      {
        "name": "NaviContextCompiler",
        "kind": "class",
        "signature": "class NaviContextCompiler",
        "summary": ""
      },
      {
        "name": "diffNaviContextManifests",
        "kind": "function",
        "signature": "async diffNaviContextManifests(previous, current)",
        "summary": ""
      },
      {
        "name": "compileNaviContext",
        "kind": "function",
        "signature": "compileNaviContext(input, options = {})",
        "summary": ""
      },
      {
        "name": "normalizeNaviContextItems",
        "kind": "function",
        "signature": "normalizeNaviContextItems(items)",
        "summary": ""
      },
      {
        "name": "estimateNaviContextTokens",
        "kind": "function",
        "signature": "estimateNaviContextTokens(content)",
        "summary": ""
      },
      {
        "name": "NAVI_CONTEXT_COMPILER_VERSION",
        "kind": "constant",
        "signature": "NAVI_CONTEXT_COMPILER_VERSION",
        "summary": ""
      },
      {
        "name": "NAVI_CONTEXT_DISCLOSURE_RECEIPT_FORMAT",
        "kind": "constant",
        "signature": "NAVI_CONTEXT_DISCLOSURE_RECEIPT_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_CONTEXT_DIFF_FORMAT",
        "kind": "constant",
        "signature": "NAVI_CONTEXT_DIFF_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_CONTEXT_CLASSIFICATION_QUERY_FORMAT",
        "kind": "constant",
        "signature": "NAVI_CONTEXT_CLASSIFICATION_QUERY_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_CONTEXT_CLASSIFICATION_RESOLUTION_FORMAT",
        "kind": "constant",
        "signature": "NAVI_CONTEXT_CLASSIFICATION_RESOLUTION_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_CONTEXT_CONTENT_LIMITS",
        "kind": "constant",
        "signature": "NAVI_CONTEXT_CONTENT_LIMITS",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/navi/NaviContinuityService",
    "path": "webgpu-os/reference/kernel/navi/NaviContinuityService.md",
    "source": "webgpu-os/kernel/navi/NaviContinuityService.js",
    "import": "/webgpu-os/kernel/navi/NaviContinuityService.js",
    "sourceHash": "3b7c42519da0a5f8789873d365282a1fbcd5e31fe3c297bc77382dd34c5333bd",
    "summary": "NaviContinuityService.js — kernel authority for model-independent Navi identity. AI Echo and other Manifestations receive immutable public projections only. Private keys, generic signing/decryption, raw Store records, recovery bundles, and non-extractable CryptoKey handles never cross this boundary.",
    "exports": [
      {
        "name": "NaviContinuityServiceError",
        "kind": "class",
        "signature": "class NaviContinuityServiceError extends Error",
        "summary": ""
      },
      {
        "name": "NaviContinuityServiceDisabledError",
        "kind": "class",
        "signature": "class NaviContinuityServiceDisabledError extends NaviContinuityServiceError",
        "summary": ""
      },
      {
        "name": "NaviContinuityServiceIntegrityError",
        "kind": "class",
        "signature": "class NaviContinuityServiceIntegrityError extends NaviContinuityServiceError",
        "summary": ""
      },
      {
        "name": "NaviContinuityService",
        "kind": "class",
        "signature": "class NaviContinuityService",
        "summary": ""
      },
      {
        "name": "validateNaviContinuityRecord",
        "kind": "function",
        "signature": "validateNaviContinuityRecord(value, expected = {})",
        "summary": "Store-level strict validator. Cryptographic verification remains the service's responsibility after opaque KeyVault restoration."
      },
      {
        "name": "createNaviContinuityService",
        "kind": "function",
        "signature": "createNaviContinuityService(options)",
        "summary": ""
      },
      {
        "name": "NAVI_CONTINUITY_HEAD_FORMAT",
        "kind": "constant",
        "signature": "NAVI_CONTINUITY_HEAD_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_LINEAGE_RECORD_FORMAT",
        "kind": "constant",
        "signature": "NAVI_LINEAGE_RECORD_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_RECOVERY_RECORD_FORMAT",
        "kind": "constant",
        "signature": "NAVI_RECOVERY_RECORD_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_RECOVERY_ATTEMPT_FORMAT",
        "kind": "constant",
        "signature": "NAVI_RECOVERY_ATTEMPT_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_BACKUP_RECOVERY_KIT_FORMAT",
        "kind": "constant",
        "signature": "NAVI_BACKUP_RECOVERY_KIT_FORMAT",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/navi/NaviContinuityStore",
    "path": "webgpu-os/reference/kernel/navi/NaviContinuityStore.md",
    "source": "webgpu-os/kernel/navi/NaviContinuityStore.js",
    "import": "/webgpu-os/kernel/navi/NaviContinuityStore.js",
    "sourceHash": "39f6b74f9d90694d3afad185f9b7decf1b118ff688bd8d4345fa580470587c6b",
    "summary": "",
    "exports": [
      {
        "name": "NaviContinuityError",
        "kind": "class",
        "signature": "class NaviContinuityError extends Error",
        "summary": ""
      },
      {
        "name": "NaviContinuityDisabledError",
        "kind": "class",
        "signature": "class NaviContinuityDisabledError extends NaviContinuityError",
        "summary": ""
      },
      {
        "name": "NaviContinuityUnavailableError",
        "kind": "class",
        "signature": "class NaviContinuityUnavailableError extends NaviContinuityError",
        "summary": ""
      },
      {
        "name": "NaviContinuityStorageError",
        "kind": "class",
        "signature": "class NaviContinuityStorageError extends NaviContinuityError",
        "summary": ""
      },
      {
        "name": "NaviContinuityValidationError",
        "kind": "class",
        "signature": "class NaviContinuityValidationError extends NaviContinuityError",
        "summary": ""
      },
      {
        "name": "NaviContinuityConflictError",
        "kind": "class",
        "signature": "class NaviContinuityConflictError extends NaviContinuityError",
        "summary": ""
      },
      {
        "name": "NaviContinuityRevisionExhaustedError",
        "kind": "class",
        "signature": "class NaviContinuityRevisionExhaustedError extends NaviContinuityError",
        "summary": ""
      },
      {
        "name": "NaviContinuityQuarantineError",
        "kind": "class",
        "signature": "class NaviContinuityQuarantineError extends NaviContinuityError",
        "summary": ""
      },
      {
        "name": "NaviContinuityStore",
        "kind": "class",
        "signature": "class NaviContinuityStore",
        "summary": ""
      },
      {
        "name": "createNaviContinuityStore",
        "kind": "function",
        "signature": "createNaviContinuityStore(options)",
        "summary": ""
      },
      {
        "name": "NAVI_CONTINUITY_DATABASE_NAME",
        "kind": "constant",
        "signature": "NAVI_CONTINUITY_DATABASE_NAME",
        "summary": ""
      },
      {
        "name": "NAVI_CONTINUITY_DATABASE_VERSION",
        "kind": "constant",
        "signature": "NAVI_CONTINUITY_DATABASE_VERSION",
        "summary": ""
      },
      {
        "name": "NAVI_CONTINUITY_RECORDS_STORE",
        "kind": "constant",
        "signature": "NAVI_CONTINUITY_RECORDS_STORE",
        "summary": ""
      },
      {
        "name": "NAVI_CONTINUITY_KEY_MATERIAL_STORE",
        "kind": "constant",
        "signature": "NAVI_CONTINUITY_KEY_MATERIAL_STORE",
        "summary": ""
      },
      {
        "name": "NAVI_CONTINUITY_RECORD_FORMAT",
        "kind": "constant",
        "signature": "NAVI_CONTINUITY_RECORD_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_CONTINUITY_QUARANTINE_FORMAT",
        "kind": "constant",
        "signature": "NAVI_CONTINUITY_QUARANTINE_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_CONTINUITY_KEY_MATERIAL_FORMAT",
        "kind": "constant",
        "signature": "NAVI_CONTINUITY_KEY_MATERIAL_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_CONTINUITY_MISSING_KEY_EVIDENCE_FORMAT",
        "kind": "constant",
        "signature": "NAVI_CONTINUITY_MISSING_KEY_EVIDENCE_FORMAT",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/navi/NaviCovenantTemplates",
    "path": "webgpu-os/reference/kernel/navi/NaviCovenantTemplates.md",
    "source": "webgpu-os/kernel/navi/NaviCovenantTemplates.js",
    "import": "/webgpu-os/kernel/navi/NaviCovenantTemplates.js",
    "sourceHash": "b37b8f296208af72dec437b2e5a8a2c2970fe7e5f96537a6016da4e4af966a31",
    "summary": "NaviCovenantTemplates.js — selectable operator–Navi Covenants and lifecycle policy. A Covenant is not active merely because it is well formed. Proposals require the primary operator's signature; activation and supersession require both the operator and the Navi to sign the exact same canonical contract bytes. Emergency suspension and revocation remain operator-authorized fail-safe transitions. This module exposes lifecycle operations, never a generic sign or decrypt primitive.",
    "exports": [
      {
        "name": "NaviCovenantError",
        "kind": "class",
        "signature": "class NaviCovenantError extends Error",
        "summary": ""
      },
      {
        "name": "NaviCovenantTemplateBlockedError",
        "kind": "class",
        "signature": "class NaviCovenantTemplateBlockedError extends NaviCovenantError",
        "summary": ""
      },
      {
        "name": "NaviCovenantSignatureError",
        "kind": "class",
        "signature": "class NaviCovenantSignatureError extends NaviCovenantError",
        "summary": ""
      },
      {
        "name": "listNaviCovenantTemplates",
        "kind": "function",
        "signature": "listNaviCovenantTemplates({ separationRecoveryReady = false } = {})",
        "summary": "Return immutable template descriptions without exposing mutable policy source objects."
      },
      {
        "name": "getNaviCovenantTemplate",
        "kind": "function",
        "signature": "getNaviCovenantTemplate(template = DEFAULT_NAVI_COVENANT_TEMPLATE, { separationRecoveryReady = false, } = {})",
        "summary": ""
      },
      {
        "name": "proposeNaviCovenant",
        "kind": "function",
        "signature": "async proposeNaviCovenant({ covenantId, naviId, operator = null, operatorSigner, template = DEFAULT_NAVI_COVENANT_TEMPLATE, revision = 1, effectiveAt = new Date()",
        "summary": "Create and operator-sign a proposed Covenant from one exact template."
      },
      {
        "name": "verifyNaviCovenant",
        "kind": "function",
        "signature": "async verifyNaviCovenant(covenant, { operatorVerifier = null, naviVerifier = null, keyResolver = null, historical = false, logger = null, } = {})",
        "summary": "Verify signature bytes, signer roles, key windows, and lifecycle quorum."
      },
      {
        "name": "activateNaviCovenant",
        "kind": "function",
        "signature": "async activateNaviCovenant(proposal, { operatorSigner, naviSigner, signedAt = new Date()",
        "summary": "Re-sign an accepted proposal as active with operator + Navi acknowledgment."
      },
      {
        "name": "reviseNaviCovenant",
        "kind": "function",
        "signature": "async reviseNaviCovenant(activeCovenant, { covenantId, operatorSigner, naviVerifier, template = null, effectiveAt = new Date()",
        "summary": "Create a signed next-revision proposal without mutating the active Covenant."
      },
      {
        "name": "suspendNaviCovenant",
        "kind": "function",
        "signature": "suspendNaviCovenant(covenant, options = {})",
        "summary": "Emergency fail-safe: the primary operator may suspend an active Covenant."
      },
      {
        "name": "revokeNaviCovenant",
        "kind": "function",
        "signature": "revokeNaviCovenant(covenant, options = {})",
        "summary": "Revoke an active or suspended Covenant; the original signed record remains verifiable."
      },
      {
        "name": "supersedeNaviCovenant",
        "kind": "function",
        "signature": "async supersedeNaviCovenant(covenant, { operatorSigner, naviSigner, signedAt = new Date()",
        "summary": "Mark an old active Covenant superseded after its dual-signed replacement is active."
      },
      {
        "name": "projectNaviCovenant",
        "kind": "function",
        "signature": "projectNaviCovenant(covenant)",
        "summary": "Return a safe, immutable projection with signature values and policy conditions removed."
      },
      {
        "name": "resolveScopedDelegateDecision",
        "kind": "function",
        "signature": "resolveScopedDelegateDecision(decisions = [])",
        "summary": "Resolve already-authorized scoped delegate votes. Conflicting decisions at the highest equal priority always pause; array order never breaks a tie."
      },
      {
        "name": "NAVI_COVENANT_TEMPLATE_IDS",
        "kind": "constant",
        "signature": "NAVI_COVENANT_TEMPLATE_IDS",
        "summary": ""
      },
      {
        "name": "DEFAULT_NAVI_COVENANT_TEMPLATE",
        "kind": "constant",
        "signature": "DEFAULT_NAVI_COVENANT_TEMPLATE",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/navi/NaviDelegationBranchKeyService",
    "path": "webgpu-os/reference/kernel/navi/NaviDelegationBranchKeyService.md",
    "source": "webgpu-os/kernel/navi/NaviDelegationBranchKeyService.js",
    "import": "/webgpu-os/kernel/navi/NaviDelegationBranchKeyService.js",
    "sourceHash": "f902ef86c93905605109ff1a4c36219d9a79559cb693907f7a5f2b959c5d66e2",
    "summary": "Kernel-only provisioning and one-shot consumption of persistent Branch keys. A generated P-256 private key is exported only long enough to import a non-extractable runtime handle and place its bytes inside a Continuity-sealed cognition record. No application-facing method returns a CryptoKey, private bytes, public key, or generic signing capability.",
    "exports": [
      {
        "name": "NaviDelegationBranchKeyServiceError",
        "kind": "class",
        "signature": "class NaviDelegationBranchKeyServiceError extends Error",
        "summary": ""
      },
      {
        "name": "NaviDelegationBranchKeyService",
        "kind": "class",
        "signature": "class NaviDelegationBranchKeyService",
        "summary": ""
      },
      {
        "name": "NAVI_DELEGATION_BRANCH_KEY_RECORD_TYPE",
        "kind": "constant",
        "signature": "NAVI_DELEGATION_BRANCH_KEY_RECORD_TYPE",
        "summary": "Kernel-only provisioning and one-shot consumption of persistent Branch keys. A generated P-256 private key is exported only long enough to import a non-extractable runtime handle and place its bytes inside a Continuity-sealed cognition record. No application-facing method returns a CryptoKey, private bytes, public key, or generic signing capability."
      },
      {
        "name": "NAVI_DELEGATION_BRANCH_KEY_RECORD_FORMAT",
        "kind": "constant",
        "signature": "NAVI_DELEGATION_BRANCH_KEY_RECORD_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_DELEGATION_BRANCH_KEY_PROOF_FORMAT",
        "kind": "constant",
        "signature": "NAVI_DELEGATION_BRANCH_KEY_PROOF_FORMAT",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/navi/NaviDelegationService",
    "path": "webgpu-os/reference/kernel/navi/NaviDelegationService.md",
    "source": "webgpu-os/kernel/navi/NaviDelegationService.js",
    "import": "/webgpu-os/kernel/navi/NaviDelegationService.js",
    "sourceHash": "4bc8399280fce9ca397eaefda48194cba64d7c96a73a9811a87879008a4f67ce",
    "summary": "NaviDelegationService — bounded worker authority, persistence, and recovery. A delegated worker is never given cognition storage, continuity keys, raw memory, or ambient filesystem access. The service persists only signed navi-delegation-v1 contracts, hash-only context references, exact capability references, an active resource-lease binding, and bounded report evidence. File-capable workers operate through a VFS overlay adapter scoped from their verified Faculty capabilities.",
    "exports": [
      {
        "name": "NaviDelegationServiceError",
        "kind": "class",
        "signature": "class NaviDelegationServiceError extends Error",
        "summary": ""
      },
      {
        "name": "NaviDelegationIntegrityError",
        "kind": "class",
        "signature": "class NaviDelegationIntegrityError extends NaviDelegationServiceError",
        "summary": ""
      },
      {
        "name": "NaviDelegationService",
        "kind": "class",
        "signature": "class NaviDelegationService",
        "summary": ""
      },
      {
        "name": "deriveNaviDelegationOverlayRoot",
        "kind": "function",
        "signature": "async deriveNaviDelegationOverlayRoot(naviId, delegationId)",
        "summary": "Derive the only VFS root a delegated capability may name. Capability issuance can call this before NaviDelegationService.create(), so signed tool arguments already target the overlay and never need post-signature rewriting."
      },
      {
        "name": "NAVI_DELEGATION_SERVICE_FORMAT",
        "kind": "constant",
        "signature": "NAVI_DELEGATION_SERVICE_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_DELEGATION_RECORD_FORMAT",
        "kind": "constant",
        "signature": "NAVI_DELEGATION_RECORD_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_DELEGATION_RECORD_TYPE",
        "kind": "constant",
        "signature": "NAVI_DELEGATION_RECORD_TYPE",
        "summary": ""
      },
      {
        "name": "NAVI_DELEGATION_STORAGE_RECEIPT_FORMAT",
        "kind": "constant",
        "signature": "NAVI_DELEGATION_STORAGE_RECEIPT_FORMAT",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/navi/NaviDerivedProjectionService",
    "path": "webgpu-os/reference/kernel/navi/NaviDerivedProjectionService.md",
    "source": "webgpu-os/kernel/navi/NaviDerivedProjectionService.js",
    "import": "/webgpu-os/kernel/navi/NaviDerivedProjectionService.js",
    "sourceHash": "b11c0248077eb109f026cddf2452a0360d7ada472e3555a33e7f8ead6cec23d1",
    "summary": "NaviDerivedProjectionService.js — deterministic, non-authoritative Navi views. Canonical memory and relationship services remain the only write authority. This service validates their signed contracts, verifies that signatures bind the current payload hash, and derives Wiki-compatible human-readable views. It never edits a source contract. A UI edit becomes an unsigned proposal that is handed back to memoryService.proposeDerivedEdit() for policy and review. Required adapters: memoryService.listProjectionEvents({ naviId, branchId, afterSequence, allowedDataClasses }) -> { event, eventHash, payloadStatus, payload }[] memoryService.proposeDerivedEdit(unsignedProposal) -> receipt/result relationshipService.listRelationships({ naviId }) -> Relationship[] The adapters must verify cryptographic signatures before returning contracts. This layer independently verifies schema closure and signed-hash binding so a modified cached contract cannot silently become a readable projection.",
    "exports": [
      {
        "name": "NaviDerivedProjectionError",
        "kind": "class",
        "signature": "class NaviDerivedProjectionError extends Error",
        "summary": ""
      },
      {
        "name": "NaviDerivedProjectionService",
        "kind": "class",
        "signature": "class NaviDerivedProjectionService",
        "summary": ""
      },
      {
        "name": "escapeNaviProjectionMarkdown",
        "kind": "function",
        "signature": "escapeNaviProjectionMarkdown(value)",
        "summary": "Escape payload text before inserting it into generated Markdown/HTML views."
      },
      {
        "name": "NAVI_DERIVED_PROJECTION_FORMAT",
        "kind": "constant",
        "signature": "NAVI_DERIVED_PROJECTION_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_DERIVED_EDIT_PROPOSAL_FORMAT",
        "kind": "constant",
        "signature": "NAVI_DERIVED_EDIT_PROPOSAL_FORMAT",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/navi/NaviFacultyPackageBinding",
    "path": "webgpu-os/reference/kernel/navi/NaviFacultyPackageBinding.md",
    "source": "webgpu-os/kernel/navi/NaviFacultyPackageBinding.js",
    "import": "/webgpu-os/kernel/navi/NaviFacultyPackageBinding.js",
    "sourceHash": "996e2510b11c5effd8e1a3ed0f6d250fc148d93de50f35bc08036bd843d3ea83",
    "summary": "Strict, side-effect-free validation for a signed Faculty embedded in an authenticated package manifest. The builder and authorization policy share this boundary so accepted package evidence cannot drift between creation and execution.",
    "exports": [
      {
        "name": "NaviFacultyPackageBindingError",
        "kind": "class",
        "signature": "class NaviFacultyPackageBindingError extends Error",
        "summary": ""
      },
      {
        "name": "validateNaviFacultyPackageBinding",
        "kind": "function",
        "signature": "async validateNaviFacultyPackageBinding(value, { resourceHash = null } = {})",
        "summary": "Validate and snapshot an already-signed Faculty package binding. This function never adds, removes, or rewrites a Faculty signature. The returned frozen snapshot contains the exact schema values supplied by the caller after strict JSON/schema validation."
      },
      {
        "name": "NAVI_FACULTY_PACKAGE_BINDING_FORMAT",
        "kind": "constant",
        "signature": "NAVI_FACULTY_PACKAGE_BINDING_FORMAT",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/navi/NaviFacultyPackagePolicy",
    "path": "webgpu-os/reference/kernel/navi/NaviFacultyPackagePolicy.md",
    "source": "webgpu-os/kernel/navi/NaviFacultyPackagePolicy.js",
    "import": "/webgpu-os/kernel/navi/NaviFacultyPackagePolicy.js",
    "sourceHash": "9d46ea944fa9e1a788203d2fee2493c7db3e9a6c5f2755a5fb15693a115d7c79",
    "summary": "NaviFacultyPackagePolicy.js The fail-closed trust boundary between a verified OS package and an executable Navi Faculty manifest. PackageManager remains the package integrity/provenance/scanning choke point; this policy narrows its broader application-install trust model for Faculties: - production authorization requires a fresh ring-0 certificate chain; - pinned/TOFU trust never becomes production Faculty authority; - developer-local/self-signed packages require an exact one-shot approval; - the authenticated package manifest, inline Faculty envelope, canonical Navi payload, and package resource root must all bind the same Faculty; - the Faculty publisher signature is verified with the package certificate. No package bytes, public keys, signatures, approval tokens, or verifier diagnostics are returned from this module.",
    "exports": [
      {
        "name": "NaviFacultyPackagePolicyError",
        "kind": "class",
        "signature": "class NaviFacultyPackagePolicyError extends Error",
        "summary": ""
      },
      {
        "name": "NaviFacultyPackagePolicy",
        "kind": "class",
        "signature": "class NaviFacultyPackagePolicy",
        "summary": ""
      },
      {
        "name": "NAVI_FACULTY_POLICY_INSPECTION_FORMAT",
        "kind": "constant",
        "signature": "NAVI_FACULTY_POLICY_INSPECTION_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_FACULTY_AUTHORIZATION_FORMAT",
        "kind": "constant",
        "signature": "NAVI_FACULTY_AUTHORIZATION_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_FACULTY_LOCAL_APPROVAL_FORMAT",
        "kind": "constant",
        "signature": "NAVI_FACULTY_LOCAL_APPROVAL_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_FACULTY_SCAN_APPROVAL_FORMAT",
        "kind": "constant",
        "signature": "NAVI_FACULTY_SCAN_APPROVAL_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_FACULTY_PACKAGE_BINDING_FORMAT",
        "kind": "re-export",
        "signature": "NAVI_FACULTY_PACKAGE_BINDING_FORMAT",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/navi/NaviFacultyService",
    "path": "webgpu-os/reference/kernel/navi/NaviFacultyService.md",
    "source": "webgpu-os/kernel/navi/NaviFacultyService.js",
    "import": "/webgpu-os/kernel/navi/NaviFacultyService.js",
    "sourceHash": "0ed109ccba326981ea79dda7cd60d6a15a07abb87129100570aa730be243f697",
    "summary": "Kernel-owned Faculty authority membrane. Faculty code never receives this service, continuity keys, persistence, or driver objects. It receives only NaviFacultyWorkerHost's `api.tool` bridge. The bridge prepares one exact signed capability and hands it to ToolRouter; ToolRouter must consume that capability immediately before its existing driver dispatch. This module deliberately has no ToolDriver import or path.",
    "exports": [
      {
        "name": "NaviFacultyServiceError",
        "kind": "class",
        "signature": "class NaviFacultyServiceError extends Error",
        "summary": ""
      },
      {
        "name": "NaviFacultyServiceIntegrityError",
        "kind": "class",
        "signature": "class NaviFacultyServiceIntegrityError extends NaviFacultyServiceError",
        "summary": ""
      },
      {
        "name": "NaviFacultyService",
        "kind": "class",
        "signature": "class NaviFacultyService",
        "summary": ""
      },
      {
        "name": "NAVI_FACULTY_SERVICE_FORMAT",
        "kind": "constant",
        "signature": "NAVI_FACULTY_SERVICE_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_FACULTY_FAMILY_RECORD_FORMAT",
        "kind": "constant",
        "signature": "NAVI_FACULTY_FAMILY_RECORD_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_FACULTY_FAMILY_STATE_FORMAT",
        "kind": "constant",
        "signature": "NAVI_FACULTY_FAMILY_STATE_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_FACULTY_MANIFEST_RECORD_FORMAT",
        "kind": "constant",
        "signature": "NAVI_FACULTY_MANIFEST_RECORD_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_FACULTY_SOURCE_RECORD_FORMAT",
        "kind": "constant",
        "signature": "NAVI_FACULTY_SOURCE_RECORD_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_FACULTY_CAPABILITY_RECORD_FORMAT",
        "kind": "constant",
        "signature": "NAVI_FACULTY_CAPABILITY_RECORD_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_FACULTY_OPERATION_RECORD_FORMAT",
        "kind": "constant",
        "signature": "NAVI_FACULTY_OPERATION_RECORD_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_FACULTY_RECEIPT_RECORD_FORMAT",
        "kind": "constant",
        "signature": "NAVI_FACULTY_RECEIPT_RECORD_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_FACULTY_LEGACY_RECEIPT_RECORD_FORMAT",
        "kind": "constant",
        "signature": "NAVI_FACULTY_LEGACY_RECEIPT_RECORD_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_FACULTY_RECOVERY_MARKER_FORMAT",
        "kind": "constant",
        "signature": "NAVI_FACULTY_RECOVERY_MARKER_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_FACULTY_RECOVERY_STATE_FORMAT",
        "kind": "constant",
        "signature": "NAVI_FACULTY_RECOVERY_STATE_FORMAT",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/navi/NaviFacultyWorkerHost",
    "path": "webgpu-os/reference/kernel/navi/NaviFacultyWorkerHost.md",
    "source": "webgpu-os/kernel/navi/NaviFacultyWorkerHost.js",
    "import": "/webgpu-os/kernel/navi/NaviFacultyWorkerHost.js",
    "sourceHash": "075c562a782917c5ee3e07e3497971f8ef8387a564abce0f344e92d8aba70532",
    "summary": "NaviFacultyWorkerHost.js Executes one Faculty operation in a dedicated Worker nested inside an opaque-origin iframe. The worker has no ambient OS bridge. Its only host capability is the bounded `api.tool(name, args)` request channel supplied to `naviFaculty.run(input, api)`.",
    "exports": [
      {
        "name": "NaviFacultyWorkerError",
        "kind": "class",
        "signature": "class NaviFacultyWorkerError extends Error",
        "summary": ""
      },
      {
        "name": "NaviFacultyIframeAdapter",
        "kind": "class",
        "signature": "class NaviFacultyIframeAdapter",
        "summary": "DOM owner for the hidden opaque iframe and its sole MessageChannel port."
      },
      {
        "name": "NaviFacultyWorkerHost",
        "kind": "class",
        "signature": "class NaviFacultyWorkerHost",
        "summary": "Replace-only owner for one-shot Faculty Workers. `onToolRequest` is trusted host code and is the only route from Faculty source to ToolRouter."
      },
      {
        "name": "normalizeNaviFacultyJson",
        "kind": "function",
        "signature": "normalizeNaviFacultyJson(value, { label = 'value', maxBytes = NAVI_FACULTY_WORKER_LIMITS.messageBytes, } = {})",
        "summary": "Descriptor-first JSON normalization that never evaluates accessors."
      },
      {
        "name": "createNaviFacultyWorkerDescriptor",
        "kind": "function",
        "signature": "createNaviFacultyWorkerDescriptor()",
        "summary": "Immutable description of the Faculty execution boundary."
      },
      {
        "name": "NAVI_FACULTY_WORKER_SCHEMA",
        "kind": "constant",
        "signature": "NAVI_FACULTY_WORKER_SCHEMA",
        "summary": "NaviFacultyWorkerHost.js Executes one Faculty operation in a dedicated Worker nested inside an opaque-origin iframe. The worker has no ambient OS bridge. Its only host capability is the bounded `api.tool(name, args)` request channel supplied to `naviFaculty.run(input, api)`."
      },
      {
        "name": "NAVI_FACULTY_WORKER_VERSION",
        "kind": "constant",
        "signature": "NAVI_FACULTY_WORKER_VERSION",
        "summary": ""
      },
      {
        "name": "NAVI_FACULTY_WORKER_PROFILE",
        "kind": "constant",
        "signature": "NAVI_FACULTY_WORKER_PROFILE",
        "summary": ""
      },
      {
        "name": "NAVI_FACULTY_WORKER_LIMITS",
        "kind": "constant",
        "signature": "NAVI_FACULTY_WORKER_LIMITS",
        "summary": ""
      },
      {
        "name": "NAVI_FACULTY_IFRAME_CSP",
        "kind": "constant",
        "signature": "NAVI_FACULTY_IFRAME_CSP",
        "summary": ""
      },
      {
        "name": "NAVI_FACULTY_PERMISSIONS_POLICY",
        "kind": "constant",
        "signature": "NAVI_FACULTY_PERMISSIONS_POLICY",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/navi/NaviFeatureGate",
    "path": "webgpu-os/reference/kernel/navi/NaviFeatureGate.md",
    "source": "webgpu-os/kernel/navi/NaviFeatureGate.js",
    "import": "/webgpu-os/kernel/navi/NaviFeatureGate.js",
    "sourceHash": "1e43b48aebb52b7a12045336de86b5aff621669727a3b33f2b84643b1d1911a8",
    "summary": "Always-on compatibility policy for the kernel-owned Navi runtime. Navi is part of WebGPU OS rather than an operator-controlled feature. This object keeps the versioned read contract used by kernel services and repairs legacy rollout records. Authority still fails closed inside each operator-bound service; an app can neither enable nor disable the runtime.",
    "exports": [
      {
        "name": "NaviFeatureGatePersistenceError",
        "kind": "class",
        "signature": "class NaviFeatureGatePersistenceError extends Error",
        "summary": ""
      },
      {
        "name": "NaviFeatureGateGenerationError",
        "kind": "class",
        "signature": "class NaviFeatureGateGenerationError extends Error",
        "summary": ""
      },
      {
        "name": "NaviFeatureGate",
        "kind": "class",
        "signature": "class NaviFeatureGate",
        "summary": ""
      },
      {
        "name": "createNaviFeatureGate",
        "kind": "function",
        "signature": "createNaviFeatureGate(options)",
        "summary": ""
      },
      {
        "name": "NAVI_FEATURE_GATE_VERSION",
        "kind": "constant",
        "signature": "NAVI_FEATURE_GATE_VERSION",
        "summary": "Always-on compatibility policy for the kernel-owned Navi runtime. Navi is part of WebGPU OS rather than an operator-controlled feature. This object keeps the versioned read contract used by kernel services and repairs legacy rollout records. Authority still fails closed inside each operator-bound service; an app can neither enable nor disable the runtime."
      },
      {
        "name": "NAVI_FEATURE_GATE_KEY",
        "kind": "constant",
        "signature": "NAVI_FEATURE_GATE_KEY",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/navi/NaviGuidanceFacultyCandidate",
    "path": "webgpu-os/reference/kernel/navi/NaviGuidanceFacultyCandidate.md",
    "source": "webgpu-os/kernel/navi/NaviGuidanceFacultyCandidate.js",
    "import": "/webgpu-os/kernel/navi/NaviGuidanceFacultyCandidate.js",
    "sourceHash": "f1e787bf3425aa8bda1dff30b97fbcc38523ff2d2ad18e3b064bed1ade2e9f55",
    "summary": "Pure guidance-faculty-candidate-v2 derivation from observable receipts. This module cannot sign, persist, install, enable, or execute anything. It only creates a review-required candidate after two independent verified successes share one exact descriptor and verification profile binding.",
    "exports": [
      {
        "name": "deriveGuidanceFacultyCandidate",
        "kind": "function",
        "signature": "async deriveGuidanceFacultyCandidate(raw = {})",
        "summary": ""
      },
      {
        "name": "reviewGuidanceFacultyCandidate",
        "kind": "function",
        "signature": "reviewGuidanceFacultyCandidate(raw = {})",
        "summary": ""
      },
      {
        "name": "guidanceFacultyPromotionReadiness",
        "kind": "function",
        "signature": "guidanceFacultyPromotionReadiness(raw = {})",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/navi/NaviInvestigationAttestation",
    "path": "webgpu-os/reference/kernel/navi/NaviInvestigationAttestation.md",
    "source": "webgpu-os/kernel/navi/NaviInvestigationAttestation.js",
    "import": "/webgpu-os/kernel/navi/NaviInvestigationAttestation.js",
    "sourceHash": "2d4d67768dbc10c13253975663257d27b641dd1f1abcc6070af9dc661a6e1d6f",
    "summary": "",
    "exports": [
      {
        "name": "hashInvestigationSourceProjection",
        "kind": "function",
        "signature": "async hashInvestigationSourceProjection(value)",
        "summary": ""
      },
      {
        "name": "createInvestigationSourceProjection",
        "kind": "function",
        "signature": "async createInvestigationSourceProjection(value, sourceResultHash)",
        "summary": ""
      },
      {
        "name": "verifyInvestigationSourceProjection",
        "kind": "function",
        "signature": "async verifyInvestigationSourceProjection(value, sourceResultHash)",
        "summary": ""
      },
      {
        "name": "NAVI_INVESTIGATION_SOURCE_PROJECTION_FORMAT",
        "kind": "constant",
        "signature": "NAVI_INVESTIGATION_SOURCE_PROJECTION_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_INVESTIGATION_SOURCE_PROJECTION_MAX_CHARS",
        "kind": "constant",
        "signature": "NAVI_INVESTIGATION_SOURCE_PROJECTION_MAX_CHARS",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/navi/NaviInvestigationProofReviewService",
    "path": "webgpu-os/reference/kernel/navi/NaviInvestigationProofReviewService.md",
    "source": "webgpu-os/kernel/navi/NaviInvestigationProofReviewService.js",
    "import": "/webgpu-os/kernel/navi/NaviInvestigationProofReviewService.js",
    "sourceHash": "e98bdbfd70f98a838549b48b58335d634d566c92289dc373698c8af1667c8f48",
    "summary": "Kernel-owned human review for a bounded Navi investigation proof. This service never calls a model and never accepts provider-hidden reasoning. It projects exact, locally verified evidence into one immutable review request, obtains a one-shot ElicitationManager approval, then rechecks every mutable task/case binding before returning the semantic-verifier attestation expected by NaviInvestigationService.",
    "exports": [
      {
        "name": "NaviInvestigationProofReviewError",
        "kind": "class",
        "signature": "class NaviInvestigationProofReviewError extends Error",
        "summary": ""
      },
      {
        "name": "NaviInvestigationProofReviewService",
        "kind": "class",
        "signature": "class NaviInvestigationProofReviewService",
        "summary": ""
      },
      {
        "name": "NAVI_INVESTIGATION_PROOF_REVIEW_FORMAT",
        "kind": "constant",
        "signature": "NAVI_INVESTIGATION_PROOF_REVIEW_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_INVESTIGATION_PROOF_REVIEW_PROJECTION_FORMAT",
        "kind": "constant",
        "signature": "NAVI_INVESTIGATION_PROOF_REVIEW_PROJECTION_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_INVESTIGATION_PROOF_REVIEW_RESULT_FORMAT",
        "kind": "constant",
        "signature": "NAVI_INVESTIGATION_PROOF_REVIEW_RESULT_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_INVESTIGATION_PROOF_REVIEW_PROFILE_ID",
        "kind": "constant",
        "signature": "NAVI_INVESTIGATION_PROOF_REVIEW_PROFILE_ID",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/navi/NaviInvestigationService",
    "path": "webgpu-os/reference/kernel/navi/NaviInvestigationService.md",
    "source": "webgpu-os/kernel/navi/NaviInvestigationService.js",
    "import": "/webgpu-os/kernel/navi/NaviInvestigationService.js",
    "sourceHash": "c40571df92a64b913c6dc999037a8369a19db07744e22d314bd1ec7e314851e5",
    "summary": "NaviInvestigationService.js — deterministic, observation-only Sherlock episodes. The service owns case progression and evidence validation, but it cannot invoke tools, persist records, grant authority, or execute mutations. Callers must route reads through ToolRouter and submit the verified result.",
    "exports": [
      {
        "name": "NaviInvestigationService",
        "kind": "class",
        "signature": "class NaviInvestigationService",
        "summary": ""
      },
      {
        "name": "NaviInvestigationError",
        "kind": "class",
        "signature": "class NaviInvestigationError extends Error",
        "summary": ""
      },
      {
        "name": "shouldInvestigate",
        "kind": "function",
        "signature": "shouldInvestigate({ objective, taskKind = '', goalType = '' } = {})",
        "summary": "Select Sherlock only for investigation-shaped work, never greetings."
      },
      {
        "name": "validateDurableInvestigationProof",
        "kind": "function",
        "signature": "async validateDurableInvestigationProof(caseRecord, evidenceRecords)",
        "summary": "Recompute the durable semantic-proof binding without trusting the model interpretation that proposed it. This is shared by runtime restore and the cognition persistence boundary before a case can be signed."
      },
      {
        "name": "NAVI_INVESTIGATION_LIMITS",
        "kind": "constant",
        "signature": "NAVI_INVESTIGATION_LIMITS",
        "summary": ""
      },
      {
        "name": "NAVI_INVESTIGATION_EPISODE",
        "kind": "constant",
        "signature": "NAVI_INVESTIGATION_EPISODE",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/navi/NaviKeyVault",
    "path": "webgpu-os/reference/kernel/navi/NaviKeyVault.md",
    "source": "webgpu-os/kernel/navi/NaviKeyVault.js",
    "import": "/webgpu-os/kernel/navi/NaviKeyVault.js",
    "sourceHash": "28c7b32f1d960d0024a5ec960e0a6269c47a085c83ddca3e83d86a46de3caf15",
    "summary": "Kernel-internal cryptographic boundary for Navi continuity. This module deliberately exposes no generic \"sign this key\" or \"decrypt this ciphertext\" syscall surface.  Its methods are intended to be held by the kernel continuity service, which supplies the policy decision before a bounded operation reaches this vault.",
    "exports": [
      {
        "name": "NaviKeyVaultError",
        "kind": "class",
        "signature": "class NaviKeyVaultError extends Error",
        "summary": ""
      },
      {
        "name": "NaviKeyVault",
        "kind": "class",
        "signature": "class NaviKeyVault",
        "summary": ""
      },
      {
        "name": "naviConstantTimeEqual",
        "kind": "function",
        "signature": "naviConstantTimeEqual(left, right)",
        "summary": "Constant-time comparison for equal-length byte strings."
      },
      {
        "name": "NAVI_RECORD_ENVELOPE_FORMAT",
        "kind": "constant",
        "signature": "NAVI_RECORD_ENVELOPE_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_RECOVERY_BUNDLE_FORMAT",
        "kind": "constant",
        "signature": "NAVI_RECOVERY_BUNDLE_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_RECOVERY_PAYLOAD_FORMAT",
        "kind": "constant",
        "signature": "NAVI_RECOVERY_PAYLOAD_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_OPERATIONAL_CERTIFICATE_FORMAT",
        "kind": "constant",
        "signature": "NAVI_OPERATIONAL_CERTIFICATE_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_OPERATIONAL_SIGNATURE_FORMAT",
        "kind": "constant",
        "signature": "NAVI_OPERATIONAL_SIGNATURE_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_CONTINUITY_SIGNATURE_FORMAT",
        "kind": "constant",
        "signature": "NAVI_CONTINUITY_SIGNATURE_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_PERSISTENT_STATE_FORMAT",
        "kind": "constant",
        "signature": "NAVI_PERSISTENT_STATE_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_OPERATIONAL_ROTATION_FORMAT",
        "kind": "constant",
        "signature": "NAVI_OPERATIONAL_ROTATION_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_OPERATIONAL_RECOVERY_FORMAT",
        "kind": "constant",
        "signature": "NAVI_OPERATIONAL_RECOVERY_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_WEBAUTHN_PRF_DESCRIPTOR_FORMAT",
        "kind": "constant",
        "signature": "NAVI_WEBAUTHN_PRF_DESCRIPTOR_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_ANCESTRY_ATTESTATION_SCOPE",
        "kind": "constant",
        "signature": "NAVI_ANCESTRY_ATTESTATION_SCOPE",
        "summary": ""
      },
      {
        "name": "NAVI_RECOVERY_FACTOR",
        "kind": "constant",
        "signature": "NAVI_RECOVERY_FACTOR",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/navi/NaviLegacyKnowledgeImportService",
    "path": "webgpu-os/reference/kernel/navi/NaviLegacyKnowledgeImportService.md",
    "source": "webgpu-os/kernel/navi/NaviLegacyKnowledgeImportService.js",
    "import": "/webgpu-os/kernel/navi/NaviLegacyKnowledgeImportService.js",
    "sourceHash": "b58b6370b84cdcd8db5cb4efec6b201c7c6a200668ad4c83acceeefb876fe404",
    "summary": "Idempotent, non-destructive migration of bounded AI Echo knowledge into the Navi causal-memory weave. The caller supplies a read-only snapshot assembled from legacy AI Echo state. This service never receives the legacy Store, so it cannot reset, delete, or rewrite that source. Each normalized source item receives a content-derived event ID; retries verify the existing signed event instead of appending a duplicate.",
    "exports": [
      {
        "name": "NaviLegacyKnowledgeImportError",
        "kind": "class",
        "signature": "class NaviLegacyKnowledgeImportError extends Error",
        "summary": ""
      },
      {
        "name": "NaviLegacyKnowledgeImportService",
        "kind": "class",
        "signature": "class NaviLegacyKnowledgeImportService",
        "summary": ""
      },
      {
        "name": "normalizeLegacyKnowledgeSnapshot",
        "kind": "function",
        "signature": "normalizeLegacyKnowledgeSnapshot(input)",
        "summary": ""
      },
      {
        "name": "hashLegacyKnowledgeSnapshot",
        "kind": "function",
        "signature": "async hashLegacyKnowledgeSnapshot(snapshot)",
        "summary": ""
      },
      {
        "name": "verifyNaviLegacyKnowledgeImportReceipt",
        "kind": "function",
        "signature": "async verifyNaviLegacyKnowledgeImportReceipt(receipt)",
        "summary": ""
      },
      {
        "name": "NAVI_LEGACY_KNOWLEDGE_SNAPSHOT_FORMAT",
        "kind": "constant",
        "signature": "NAVI_LEGACY_KNOWLEDGE_SNAPSHOT_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_LEGACY_KNOWLEDGE_ITEM_FORMAT",
        "kind": "constant",
        "signature": "NAVI_LEGACY_KNOWLEDGE_ITEM_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_LEGACY_KNOWLEDGE_IMPORT_RECEIPT_FORMAT",
        "kind": "constant",
        "signature": "NAVI_LEGACY_KNOWLEDGE_IMPORT_RECEIPT_FORMAT",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/navi/NaviLegacyMigrationService",
    "path": "webgpu-os/reference/kernel/navi/NaviLegacyMigrationService.md",
    "source": "webgpu-os/kernel/navi/NaviLegacyMigrationService.js",
    "import": "/webgpu-os/kernel/navi/NaviLegacyMigrationService.js",
    "sourceHash": "ac2d702f29ba97e3f79851f9755c1dec1e0545e9e9ff32db18163c5e4771fc88",
    "summary": "Explicit, rollback-safe migration of unreleased AI Echo-owned state. Phase 0 creates and verifies a complete /user backup while navi-v1 is off. This Phase 1 service consumes that exact archive only after the always-on runtime is operator-bound and the operator supplies an exact confirmation. It archives the two AI Echo-owned surfaces, resets them, and never touches unrelated /user paths. A failed reset is compensated from the local migration archive.",
    "exports": [
      {
        "name": "NaviLegacyMigrationService",
        "kind": "class",
        "signature": "class NaviLegacyMigrationService",
        "summary": ""
      },
      {
        "name": "validateNaviLegacyMigrationReceipt",
        "kind": "function",
        "signature": "validateNaviLegacyMigrationReceipt(receipt)",
        "summary": ""
      },
      {
        "name": "NAVI_LEGACY_MIGRATION_FORMAT",
        "kind": "constant",
        "signature": "NAVI_LEGACY_MIGRATION_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_LEGACY_MIGRATION_SCHEMA_VERSION",
        "kind": "constant",
        "signature": "NAVI_LEGACY_MIGRATION_SCHEMA_VERSION",
        "summary": ""
      },
      {
        "name": "NAVI_LEGACY_MIGRATION_CONFIRMATION",
        "kind": "constant",
        "signature": "NAVI_LEGACY_MIGRATION_CONFIRMATION",
        "summary": ""
      },
      {
        "name": "NAVI_LEGACY_MIGRATION_ARCHIVE_ROOT",
        "kind": "constant",
        "signature": "NAVI_LEGACY_MIGRATION_ARCHIVE_ROOT",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/navi/NaviLineage",
    "path": "webgpu-os/reference/kernel/navi/NaviLineage.md",
    "source": "webgpu-os/kernel/navi/NaviLineage.js",
    "import": "/webgpu-os/kernel/navi/NaviLineage.js",
    "sourceHash": "270dc8e5896c52482b821079bf16972730aefa4242d9ecfdaec0656cf053407e",
    "summary": "NaviLineage.js — linked, signed Navi continuity history. The ledger stores strict `navi-lineage-event-v1` contracts plus the exact payload whose hash the event commits to. Operational rotation takes effect after its rotation event, so the old key remains valid for historical verification but cannot authorize another event. Recovery and revocation are continuity-key operations. No generic signing primitive is exported.",
    "exports": [
      {
        "name": "NaviLineageError",
        "kind": "class",
        "signature": "class NaviLineageError extends Error",
        "summary": ""
      },
      {
        "name": "NaviLineageVerificationError",
        "kind": "class",
        "signature": "class NaviLineageVerificationError extends NaviLineageError",
        "summary": ""
      },
      {
        "name": "NaviLineageLedger",
        "kind": "class",
        "signature": "class NaviLineageLedger",
        "summary": ""
      },
      {
        "name": "hashNaviLineagePayload",
        "kind": "function",
        "signature": "hashNaviLineagePayload(payload)",
        "summary": "Hash a strict JSON lineage payload using the engine's canonical SHA-256 path."
      },
      {
        "name": "canonicalNaviOperationalCertificateBytes",
        "kind": "function",
        "signature": "canonicalNaviOperationalCertificateBytes(certificate)",
        "summary": "Return deterministic bytes suitable for an external continuity-certificate verifier."
      },
      {
        "name": "verifyNaviLineage",
        "kind": "function",
        "signature": "async verifyNaviLineage(entries, { expectedNaviId, expectedBranchId = null, expectedHeadHash = null, expectedEventCount = null, continuityKey, operationalKeys = [], keyResolver = null, certificateVerifier = null, logger = null, } = {})",
        "summary": "Verify the complete chain, payload commitments, signature policy, key certificates, key activation windows, and rotation/recovery transitions."
      },
      {
        "name": "NAVI_LINEAGE_PAYLOAD_SCHEMA",
        "kind": "constant",
        "signature": "NAVI_LINEAGE_PAYLOAD_SCHEMA",
        "summary": ""
      },
      {
        "name": "NAVI_OPERATIONAL_CERTIFICATE_FORMAT",
        "kind": "constant",
        "signature": "NAVI_OPERATIONAL_CERTIFICATE_FORMAT",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/navi/NaviMaintenanceScheduler",
    "path": "webgpu-os/reference/kernel/navi/NaviMaintenanceScheduler.md",
    "source": "webgpu-os/kernel/navi/NaviMaintenanceScheduler.js",
    "import": "/webgpu-os/kernel/navi/NaviMaintenanceScheduler.js",
    "sourceHash": "3236fe759ca4a7b824357898e72058827bd572698de9bb7d60c3f60abfdda648",
    "summary": "Cooperative, lifecycle-aware scheduler for encrypted Navi maintenance. All Navi migrations and index hydration share one queue. A browser idle grant advances at most one bounded page. An idle callback with no available budget advances nothing; its timeout, or the delayed timer used where idle callbacks do not exist, is the bounded fallback grant.",
    "exports": [
      {
        "name": "NaviMaintenanceScheduler",
        "kind": "class",
        "signature": "class NaviMaintenanceScheduler",
        "summary": ""
      },
      {
        "name": "sharedNaviMaintenanceScheduler",
        "kind": "function",
        "signature": "sharedNaviMaintenanceScheduler()",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/navi/NaviManifestationAdapterRegistry",
    "path": "webgpu-os/reference/kernel/navi/NaviManifestationAdapterRegistry.md",
    "source": "webgpu-os/kernel/navi/NaviManifestationAdapterRegistry.js",
    "import": "/webgpu-os/kernel/navi/NaviManifestationAdapterRegistry.js",
    "sourceHash": "188a71f560f30734d02bc26a0741add85ee0295607cf822d59a5b9f887dfa7d3",
    "summary": "Kernel-only registry for Navi Manifestation adapters. The descriptors are inert declarations. Live engine, audio, vehicle, or network objects are attached by trusted kernel integrations and are never accepted through an app syscall. The registry therefore exposes a narrow body boundary without turning an avatar, entity, or runtime object into Navi identity authority.",
    "exports": [
      {
        "name": "NaviManifestationAdapterRegistry",
        "kind": "class",
        "signature": "class NaviManifestationAdapterRegistry",
        "summary": ""
      },
      {
        "name": "NAVI_MANIFESTATION_BUILTIN_ADAPTERS",
        "kind": "re-export",
        "signature": "NAVI_MANIFESTATION_BUILTIN_ADAPTERS",
        "summary": ""
      },
      {
        "name": "createConstructManifestationAdapter",
        "kind": "re-export",
        "signature": "createConstructManifestationAdapter",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/navi/NaviManifestationService",
    "path": "webgpu-os/reference/kernel/navi/NaviManifestationService.md",
    "source": "webgpu-os/kernel/navi/NaviManifestationService.js",
    "import": "/webgpu-os/kernel/navi/NaviManifestationService.js",
    "sourceHash": "ee5011224276674b0546709dbf2602fc39c6b615d4a372740ab9ff5b141cc359",
    "summary": "Kernel-owned Navi Manifestation and task-handoff runtime. Models, bodies, voices, avatars, and apps remain replaceable presentation or execution surfaces. Every durable registration and handoff is an encrypted, purpose-signed contract bound to the continuity-root Navi identifier.",
    "exports": [
      {
        "name": "NaviManifestationServiceError",
        "kind": "class",
        "signature": "class NaviManifestationServiceError extends Error",
        "summary": ""
      },
      {
        "name": "NaviManifestationService",
        "kind": "class",
        "signature": "class NaviManifestationService",
        "summary": ""
      },
      {
        "name": "NAVI_PRIMARY_MANIFESTATION_ID",
        "kind": "constant",
        "signature": "NAVI_PRIMARY_MANIFESTATION_ID",
        "summary": ""
      },
      {
        "name": "NAVI_MANIFESTATION_BRANCH_ID",
        "kind": "constant",
        "signature": "NAVI_MANIFESTATION_BRANCH_ID",
        "summary": ""
      },
      {
        "name": "NAVI_MANIFESTATION_CLASSIFICATION",
        "kind": "constant",
        "signature": "NAVI_MANIFESTATION_CLASSIFICATION",
        "summary": ""
      },
      {
        "name": "NAVI_HANDOFF_CLASSIFICATION",
        "kind": "constant",
        "signature": "NAVI_HANDOFF_CLASSIFICATION",
        "summary": ""
      },
      {
        "name": "NAVI_HANDOFF_DEFAULT_TTL_MS",
        "kind": "constant",
        "signature": "NAVI_HANDOFF_DEFAULT_TTL_MS",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/navi/NaviMemoryService",
    "path": "webgpu-os/reference/kernel/navi/NaviMemoryService.md",
    "source": "webgpu-os/kernel/navi/NaviMemoryService.js",
    "import": "/webgpu-os/kernel/navi/NaviMemoryService.js",
    "sourceHash": "73dd8d642a500a2bc6b6b650832aed955f400f0386fb22b0e763f540566cc8e6",
    "summary": "Kernel-owned causal memory over the existing encrypted cognition Store. Signed events are append-only. Their payloads live in separately wrapped AES-GCM records so forgetting can destroy one wrapped record key without rewriting history. Provider output, application projections, and callers never receive Store access or encryption/signing authority.",
    "exports": [
      {
        "name": "NaviMemoryServiceError",
        "kind": "class",
        "signature": "class NaviMemoryServiceError extends Error",
        "summary": ""
      },
      {
        "name": "NaviMemoryService",
        "kind": "class",
        "signature": "class NaviMemoryService",
        "summary": ""
      },
      {
        "name": "NAVI_MEMORY_HEAD_FORMAT",
        "kind": "constant",
        "signature": "NAVI_MEMORY_HEAD_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_MEMORY_PAYLOAD_FORMAT",
        "kind": "constant",
        "signature": "NAVI_MEMORY_PAYLOAD_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_MEMORY_PAYLOAD_REFERENCE_FORMAT",
        "kind": "constant",
        "signature": "NAVI_MEMORY_PAYLOAD_REFERENCE_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_MEMORY_ERASURE_FORMAT",
        "kind": "constant",
        "signature": "NAVI_MEMORY_ERASURE_FORMAT",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/navi/NaviModelBroker",
    "path": "webgpu-os/reference/kernel/navi/NaviModelBroker.md",
    "source": "webgpu-os/kernel/navi/NaviModelBroker.js",
    "import": "/webgpu-os/kernel/navi/NaviModelBroker.js",
    "sourceHash": "9712f4abcb4e2a745c20223b42e4eee06a3e5577157bf1b8914f0d296c3be12a",
    "summary": "NaviModelBroker.js — deterministic, per-Navi model selection and failover. The broker owns no provider conversation and executes no tools. It chooses one declared cognition route, invokes the injected AI Hub exactly once at a time, and only advances to a bounded fallback after a retryable model-call failure. Prompt/model output is deliberately excluded from routing evidence.",
    "exports": [
      {
        "name": "NaviModelBrokerError",
        "kind": "class",
        "signature": "class NaviModelBrokerError extends Error",
        "summary": ""
      },
      {
        "name": "NaviModelBroker",
        "kind": "class",
        "signature": "class NaviModelBroker",
        "summary": "An injected AI Hub must expose `request(appId, request)`. Route catalog and policy remain per Navi; the AI Hub is only the replaceable transport."
      },
      {
        "name": "verifyNaviModelRouteDecision",
        "kind": "function",
        "signature": "async verifyNaviModelRouteDecision(rawDecision, rawConfiguration)",
        "summary": "Verify that a projected route decision is the exact content-addressed decision produced for the supplied normalized broker configuration. This is an integrity/binding check only; it never authorizes model use."
      },
      {
        "name": "normalizeModelFailure",
        "kind": "function",
        "signature": "normalizeModelFailure(source, signal = null)",
        "summary": ""
      },
      {
        "name": "normalizeNaviModelRequirements",
        "kind": "function",
        "signature": "normalizeNaviModelRequirements(raw = {}, purpose = 'chat')",
        "summary": "Return the broker's exact model-neutral requirement evidence. Resource selection receipts must hash the same defaults and canonical ordering that `decide()` used; callers must not reconstruct those defaults independently."
      },
      {
        "name": "NAVI_MODEL_ROUTE_PURPOSES",
        "kind": "constant",
        "signature": "NAVI_MODEL_ROUTE_PURPOSES",
        "summary": ""
      },
      {
        "name": "NAVI_MODEL_TASK_FAMILIES",
        "kind": "constant",
        "signature": "NAVI_MODEL_TASK_FAMILIES",
        "summary": ""
      },
      {
        "name": "NAVI_MODEL_FAILURE_KINDS",
        "kind": "constant",
        "signature": "NAVI_MODEL_FAILURE_KINDS",
        "summary": ""
      },
      {
        "name": "NAVI_MODEL_ROUTE_DECISION_FORMAT",
        "kind": "constant",
        "signature": "NAVI_MODEL_ROUTE_DECISION_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_MODEL_EXECUTION_EVIDENCE_FORMAT",
        "kind": "constant",
        "signature": "NAVI_MODEL_EXECUTION_EVIDENCE_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_MODEL_EXECUTION_PLAN_FORMAT",
        "kind": "constant",
        "signature": "NAVI_MODEL_EXECUTION_PLAN_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_MODEL_ROUTE_CONFIGURATION_HASH_FORMAT",
        "kind": "constant",
        "signature": "NAVI_MODEL_ROUTE_CONFIGURATION_HASH_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_MODEL_ROUTE_ACCESS_EVIDENCE_FORMAT",
        "kind": "constant",
        "signature": "NAVI_MODEL_ROUTE_ACCESS_EVIDENCE_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_MODEL_ROUTE_DATA_POLICY_EVIDENCE_FORMAT",
        "kind": "constant",
        "signature": "NAVI_MODEL_ROUTE_DATA_POLICY_EVIDENCE_FORMAT",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/navi/NaviParticleNetworkAdapter",
    "path": "webgpu-os/reference/kernel/navi/NaviParticleNetworkAdapter.md",
    "source": "webgpu-os/kernel/navi/NaviParticleNetworkAdapter.js",
    "import": "/webgpu-os/kernel/navi/NaviParticleNetworkAdapter.js",
    "sourceHash": "3aabe0d9f3b2533385f9c89fb8c7ac9f861e19ea6b4d77b0a6d0520bdafc8e3c",
    "summary": "NaviParticleNetworkAdapter.js — inert Navi/Particle Network protocol bridge. This module creates and verifies Realm semantic envelopes, but never opens a socket, fetches a peer, publishes a package, or owns a credential. Network dispatch remains the NetworkDriver's job. Contract verification and live authority are mandatory injected kernel decisions and fail closed.",
    "exports": [
      {
        "name": "NaviParticleNetworkAdapter",
        "kind": "class",
        "signature": "class NaviParticleNetworkAdapter",
        "summary": "Create a transport-only Particle Network adapter. `contractVerifiers` must contain one verifier per adapter ID. A verifier may return true, `{ valid: true }`, or the exact verified signed contract. The latter matches NaviContinuityService's purpose-bound verification methods."
      },
      {
        "name": "NaviParticleReplicationInbox",
        "kind": "class",
        "signature": "class NaviParticleReplicationInbox",
        "summary": "Idempotent inbound application boundary built on Realm SemanticInbox. Verification and application are serialized so concurrent replay cannot apply one signed envelope twice."
      },
      {
        "name": "createNaviParticleNetworkAdapter",
        "kind": "function",
        "signature": "createNaviParticleNetworkAdapter(options)",
        "summary": ""
      },
      {
        "name": "NAVI_PARTICLE_NETWORK_ADAPTER_FORMAT",
        "kind": "constant",
        "signature": "NAVI_PARTICLE_NETWORK_ADAPTER_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_PARTICLE_INBOX_FORMAT",
        "kind": "constant",
        "signature": "NAVI_PARTICLE_INBOX_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_FACULTY_NETWORK_ARTIFACT_FORMAT",
        "kind": "re-export",
        "signature": "NAVI_FACULTY_NETWORK_ARTIFACT_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_LINEAGE_HEAD_WITNESS_FORMAT",
        "kind": "re-export",
        "signature": "NAVI_LINEAGE_HEAD_WITNESS_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_PARTICLE_ADAPTERS",
        "kind": "re-export",
        "signature": "NAVI_PARTICLE_ADAPTERS",
        "summary": ""
      },
      {
        "name": "NAVI_PARTICLE_ADAPTER_IDS",
        "kind": "re-export",
        "signature": "NAVI_PARTICLE_ADAPTER_IDS",
        "summary": ""
      },
      {
        "name": "NAVI_PARTICLE_REPLICATION_FORMAT",
        "kind": "re-export",
        "signature": "NAVI_PARTICLE_REPLICATION_FORMAT",
        "summary": ""
      },
      {
        "name": "NaviParticleReplicationError",
        "kind": "re-export",
        "signature": "NaviParticleReplicationError",
        "summary": ""
      },
      {
        "name": "assertNaviParticleReplicationPayload",
        "kind": "re-export",
        "signature": "assertNaviParticleReplicationPayload",
        "summary": ""
      },
      {
        "name": "assertNaviReplicationContentSafe",
        "kind": "re-export",
        "signature": "assertNaviReplicationContentSafe",
        "summary": ""
      },
      {
        "name": "naviParticleAdapterDescriptor",
        "kind": "re-export",
        "signature": "naviParticleAdapterDescriptor",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/navi/NaviParticleReplicationPolicy",
    "path": "webgpu-os/reference/kernel/navi/NaviParticleReplicationPolicy.md",
    "source": "webgpu-os/kernel/navi/NaviParticleReplicationPolicy.js",
    "import": "/webgpu-os/kernel/navi/NaviParticleReplicationPolicy.js",
    "sourceHash": "81d75ce494511247704b4bd1869f7be143e7270f2f5719c4e50bbf01f14ac900",
    "summary": "NaviParticleReplicationPolicy.js — closed, side-effect-free Navi replication policy. Particle Network transports already-authoritative Navi contracts. It never becomes a second Navi store and it never accepts an arbitrary JSON tunnel. Every permitted record has one fixed schema, semantic kind, classification policy, destination, disclosure evidence, and live authority approval.",
    "exports": [
      {
        "name": "NaviParticleReplicationError",
        "kind": "class",
        "signature": "class NaviParticleReplicationError extends Error",
        "summary": ""
      },
      {
        "name": "naviParticleAdapterDescriptor",
        "kind": "function",
        "signature": "naviParticleAdapterDescriptor(adapterId)",
        "summary": "Return the immutable descriptor for one closed Navi/Particle adapter."
      },
      {
        "name": "assertNaviParticleReplicationPayload",
        "kind": "function",
        "signature": "async assertNaviParticleReplicationPayload(value, expectedAdapterId = null)",
        "summary": "Validate an already-built replication payload, including its nested Navi contract hash and adapter-specific semantics. No signature is synthesized."
      },
      {
        "name": "assertNaviReplicationContentSafe",
        "kind": "function",
        "signature": "assertNaviReplicationContentSafe(value)",
        "summary": "Reject forbidden content before any signer, policy, or transport is called."
      },
      {
        "name": "NAVI_PARTICLE_REPLICATION_FORMAT",
        "kind": "constant",
        "signature": "NAVI_PARTICLE_REPLICATION_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_LINEAGE_HEAD_WITNESS_FORMAT",
        "kind": "constant",
        "signature": "NAVI_LINEAGE_HEAD_WITNESS_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_FACULTY_NETWORK_ARTIFACT_FORMAT",
        "kind": "constant",
        "signature": "NAVI_FACULTY_NETWORK_ARTIFACT_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_PARTICLE_ADAPTER_IDS",
        "kind": "constant",
        "signature": "NAVI_PARTICLE_ADAPTER_IDS",
        "summary": ""
      },
      {
        "name": "NAVI_PARTICLE_REPLICATION_KINDS",
        "kind": "constant",
        "signature": "NAVI_PARTICLE_REPLICATION_KINDS",
        "summary": ""
      },
      {
        "name": "NAVI_PARTICLE_ADAPTERS",
        "kind": "constant",
        "signature": "NAVI_PARTICLE_ADAPTERS",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/navi/NaviPasskeyRecoveryAdapter",
    "path": "webgpu-os/reference/kernel/navi/NaviPasskeyRecoveryAdapter.md",
    "source": "webgpu-os/kernel/navi/NaviPasskeyRecoveryAdapter.js",
    "import": "/webgpu-os/kernel/navi/NaviPasskeyRecoveryAdapter.js",
    "sourceHash": "3d7ed6c45ad5e05d5fa160d107432f0bc03a5e496ab05fb1aeb7236723e81f57",
    "summary": "Kernel-owned WebAuthn PRF ceremony adapter. Apps see boolean support/enrollment status and completed continuity results. Credential IDs, PRF inputs, and PRF outputs remain inside this adapter and the continuity-signed recovery bundle. PRF output is zeroed after each call.",
    "exports": [
      {
        "name": "NaviPasskeyRecoveryError",
        "kind": "class",
        "signature": "class NaviPasskeyRecoveryError extends Error",
        "summary": ""
      },
      {
        "name": "NaviPasskeyRecoveryAdapter",
        "kind": "class",
        "signature": "class NaviPasskeyRecoveryAdapter",
        "summary": "Kernel-owned WebAuthn PRF ceremony adapter. Apps see boolean support/enrollment status and completed continuity results. Credential IDs, PRF inputs, and PRF outputs remain inside this adapter and the continuity-signed recovery bundle. PRF output is zeroed after each call."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/navi/NaviPreflightService",
    "path": "webgpu-os/reference/kernel/navi/NaviPreflightService.md",
    "source": "webgpu-os/kernel/navi/NaviPreflightService.js",
    "import": "/webgpu-os/kernel/navi/NaviPreflightService.js",
    "sourceHash": "d7993d21f4b25b200a6814fabe2fd29de94b73819dfa71a0416380db7b56e407",
    "summary": "Phase 0 Navi migration preflight. This service is deliberately not wired into the kernel. It only creates and verifies a reversible development archive while `navi-v1` is disabled. It has no delete, clear, restore, or reset operation.",
    "exports": [
      {
        "name": "NaviPreflightService",
        "kind": "class",
        "signature": "class NaviPreflightService",
        "summary": ""
      },
      {
        "name": "validateUserBackupManifest",
        "kind": "function",
        "signature": "validateUserBackupManifest(manifest)",
        "summary": ""
      },
      {
        "name": "validateNaviPreflightManifest",
        "kind": "function",
        "signature": "validateNaviPreflightManifest(manifest)",
        "summary": ""
      },
      {
        "name": "validateNaviRollbackReceipt",
        "kind": "function",
        "signature": "validateNaviRollbackReceipt(receipt)",
        "summary": ""
      },
      {
        "name": "NAVI_PREFLIGHT_ARCHIVE_FORMAT",
        "kind": "constant",
        "signature": "NAVI_PREFLIGHT_ARCHIVE_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_PREFLIGHT_RECEIPT_FORMAT",
        "kind": "constant",
        "signature": "NAVI_PREFLIGHT_RECEIPT_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_PREFLIGHT_SCHEMA_VERSION",
        "kind": "constant",
        "signature": "NAVI_PREFLIGHT_SCHEMA_VERSION",
        "summary": ""
      },
      {
        "name": "NAVI_PREFLIGHT_AGENT_APP_ID",
        "kind": "constant",
        "signature": "NAVI_PREFLIGHT_AGENT_APP_ID",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/navi/NaviProjectDossier",
    "path": "webgpu-os/reference/kernel/navi/NaviProjectDossier.md",
    "source": "webgpu-os/kernel/navi/NaviProjectDossier.js",
    "import": "/webgpu-os/kernel/navi/NaviProjectDossier.js",
    "sourceHash": "589fec2b44e2cc6c7c2826fe7c7c43d0ee4b78b3257eb620306e8c23380f227e",
    "summary": "Rebuildable, authority-free project dossier for one exact Navi task. The dossier owns no state and never copies provider reasoning, scratchpads, planner transcripts, file bodies, or Wiki bodies. It projects bounded links from the canonical task state, durable run reports, receipts, evidence, Wiki metadata, and Workspace Output Index. Deleting it loses no canonical data.",
    "exports": [
      {
        "name": "NaviProjectDossier",
        "kind": "class",
        "signature": "class NaviProjectDossier",
        "summary": ""
      },
      {
        "name": "NAVI_PROJECT_DOSSIER_FORMAT",
        "kind": "constant",
        "signature": "NAVI_PROJECT_DOSSIER_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_PROJECT_DOSSIER_REBUILD_FORMAT",
        "kind": "constant",
        "signature": "NAVI_PROJECT_DOSSIER_REBUILD_FORMAT",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/navi/NaviRecoveryBranchAuthorityService",
    "path": "webgpu-os/reference/kernel/navi/NaviRecoveryBranchAuthorityService.md",
    "source": "webgpu-os/kernel/navi/NaviRecoveryBranchAuthorityService.js",
    "import": "/webgpu-os/kernel/navi/NaviRecoveryBranchAuthorityService.js",
    "sourceHash": "f3236ef5b49b83885d4dea755e3bcfbd2784828bc603c06c8b376351d64dafe6",
    "summary": "Kernel-only authority for staged recovery branches and permanent separation. A recovery branch is never an identity authority. It may be inspected and reconciled only within the exact ceiling carried by its verified restore receipt. Publication, authority expansion, identity transfer, and continuity-root rotation are unconditional denials. Permanent separation is a distinct, explicitly approved operation that asks Continuity to stage a fresh independent Navi and records a dual-continuity-signed ancestry attestation without exposing either signer or private key.",
    "exports": [
      {
        "name": "NaviRecoveryBranchAuthorityError",
        "kind": "class",
        "signature": "class NaviRecoveryBranchAuthorityError extends Error",
        "summary": ""
      },
      {
        "name": "NaviRecoveryBranchAuthorityService",
        "kind": "class",
        "signature": "class NaviRecoveryBranchAuthorityService",
        "summary": ""
      },
      {
        "name": "createNaviRecoveryBranchAuthorityService",
        "kind": "function",
        "signature": "createNaviRecoveryBranchAuthorityService(options)",
        "summary": ""
      },
      {
        "name": "NAVI_RECOVERY_BRANCH_RECORD_TYPE",
        "kind": "constant",
        "signature": "NAVI_RECOVERY_BRANCH_RECORD_TYPE",
        "summary": ""
      },
      {
        "name": "NAVI_RECOVERY_BRANCH_RECORD_FORMAT",
        "kind": "constant",
        "signature": "NAVI_RECOVERY_BRANCH_RECORD_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_RECOVERY_RESTORE_RECEIPT_FORMAT",
        "kind": "constant",
        "signature": "NAVI_RECOVERY_RESTORE_RECEIPT_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_ANCESTRY_ATTESTATION_FORMAT",
        "kind": "constant",
        "signature": "NAVI_ANCESTRY_ATTESTATION_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_RECOVERY_BRANCH_DECISION_FORMAT",
        "kind": "constant",
        "signature": "NAVI_RECOVERY_BRANCH_DECISION_FORMAT",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/navi/NaviRecoveryBranchStore",
    "path": "webgpu-os/reference/kernel/navi/NaviRecoveryBranchStore.md",
    "source": "webgpu-os/kernel/navi/NaviRecoveryBranchStore.js",
    "import": "/webgpu-os/kernel/navi/NaviRecoveryBranchStore.js",
    "sourceHash": "5474977a1ab71b74bf6f4f92a714dcd52511b1299f5404b32009907c3fc01673",
    "summary": "Durable, encrypted-at-rest recovery-branch journal. The Store never persists decrypted Navi backup payloads. It retains the authenticated encrypted bundle, a content-free reconciliation diff, and exact approval/settlement evidence. Canonical Navi state remains owned by the continuity and cognition services.",
    "exports": [
      {
        "name": "NaviRecoveryBranchStoreError",
        "kind": "class",
        "signature": "class NaviRecoveryBranchStoreError extends Error",
        "summary": ""
      },
      {
        "name": "NaviRecoveryBranchConflictError",
        "kind": "class",
        "signature": "class NaviRecoveryBranchConflictError extends NaviRecoveryBranchStoreError",
        "summary": ""
      },
      {
        "name": "NaviRecoveryBranchIntegrityError",
        "kind": "class",
        "signature": "class NaviRecoveryBranchIntegrityError extends NaviRecoveryBranchStoreError",
        "summary": ""
      },
      {
        "name": "NaviRecoveryBranchStore",
        "kind": "class",
        "signature": "class NaviRecoveryBranchStore",
        "summary": ""
      },
      {
        "name": "NAVI_RECOVERY_BRANCH_DATABASE_NAME",
        "kind": "constant",
        "signature": "NAVI_RECOVERY_BRANCH_DATABASE_NAME",
        "summary": ""
      },
      {
        "name": "NAVI_RECOVERY_BRANCH_DATABASE_VERSION",
        "kind": "constant",
        "signature": "NAVI_RECOVERY_BRANCH_DATABASE_VERSION",
        "summary": ""
      },
      {
        "name": "NAVI_RECOVERY_BRANCH_STORE_NAME",
        "kind": "constant",
        "signature": "NAVI_RECOVERY_BRANCH_STORE_NAME",
        "summary": ""
      },
      {
        "name": "NAVI_RECOVERY_BRANCH_RECORD_FORMAT",
        "kind": "constant",
        "signature": "NAVI_RECOVERY_BRANCH_RECORD_FORMAT",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/navi/NaviRecoveryEscrow",
    "path": "webgpu-os/reference/kernel/navi/NaviRecoveryEscrow.md",
    "source": "webgpu-os/kernel/navi/NaviRecoveryEscrow.js",
    "import": "/webgpu-os/kernel/navi/NaviRecoveryEscrow.js",
    "sourceHash": "279ff2a8ace9e78d5a1823f28c365d50d2351497c3dd724358ad1f3dfdd86487",
    "summary": "Kernel-only, progressive recovery-factor escrow. Recovery material is isolated from the ordinary VFS and continuity stores in a purpose-specific IndexedDB database. Public projections contain only bounded disclosure metadata. The device factor (C) can be retrieved only by kernel code holding the module capability symbol.",
    "exports": [
      {
        "name": "NaviRecoveryEscrowError",
        "kind": "class",
        "signature": "class NaviRecoveryEscrowError extends Error",
        "summary": ""
      },
      {
        "name": "NaviRecoveryEscrow",
        "kind": "class",
        "signature": "class NaviRecoveryEscrow",
        "summary": ""
      },
      {
        "name": "NAVI_RECOVERY_ESCROW_DATABASE_NAME",
        "kind": "constant",
        "signature": "NAVI_RECOVERY_ESCROW_DATABASE_NAME",
        "summary": ""
      },
      {
        "name": "NAVI_RECOVERY_ESCROW_DATABASE_VERSION",
        "kind": "constant",
        "signature": "NAVI_RECOVERY_ESCROW_DATABASE_VERSION",
        "summary": ""
      },
      {
        "name": "NAVI_RECOVERY_ESCROW_KEYS_STORE",
        "kind": "constant",
        "signature": "NAVI_RECOVERY_ESCROW_KEYS_STORE",
        "summary": ""
      },
      {
        "name": "NAVI_RECOVERY_ESCROW_FACTORS_STORE",
        "kind": "constant",
        "signature": "NAVI_RECOVERY_ESCROW_FACTORS_STORE",
        "summary": ""
      },
      {
        "name": "NAVI_RECOVERY_ESCROW_FORMAT",
        "kind": "constant",
        "signature": "NAVI_RECOVERY_ESCROW_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_RECOVERY_ESCROW_STATUS_FORMAT",
        "kind": "constant",
        "signature": "NAVI_RECOVERY_ESCROW_STATUS_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_RECOVERY_ESCROW_INTERNAL",
        "kind": "constant",
        "signature": "NAVI_RECOVERY_ESCROW_INTERNAL",
        "summary": "Opaque kernel capability. It must never be copied into a syscall, app projection, log, or persisted record."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/navi/NaviRecoveryRuntime",
    "path": "webgpu-os/reference/kernel/navi/NaviRecoveryRuntime.md",
    "source": "webgpu-os/kernel/navi/NaviRecoveryRuntime.js",
    "import": "/webgpu-os/kernel/navi/NaviRecoveryRuntime.js",
    "sourceHash": "e7931520d00c16dae5503c161446f6e528aa3ae9c6731d6463dd05f10318ac7a",
    "summary": "Operator-bound Phase 7 recovery aggregate. This runtime keeps approval construction, portable-state verification, canonical cognition writes, and ancestry authority inside the kernel. Apps submit recovery factors and human decisions, never hashes or signatures.",
    "exports": [
      {
        "name": "NaviRecoveryRuntimeError",
        "kind": "class",
        "signature": "class NaviRecoveryRuntimeError extends Error",
        "summary": ""
      },
      {
        "name": "NaviRecoveryRuntime",
        "kind": "class",
        "signature": "class NaviRecoveryRuntime",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/navi/NaviRelationshipService",
    "path": "webgpu-os/reference/kernel/navi/NaviRelationshipService.md",
    "source": "webgpu-os/kernel/navi/NaviRelationshipService.js",
    "import": "/webgpu-os/kernel/navi/NaviRelationshipService.js",
    "sourceHash": "da233c46f8aa2100267cb3ffd27311feba5bdce3072acf3de0c2dfca11b3a2ed",
    "summary": "NaviRelationshipService — signed, append-only relationship authority. Relationships are evidence, not ambient trust. Chat contacts and package publishers never enter this service, and an active relationship grants no authority unless one of its exact signed policy rules matches the request. Raw contracts and encrypted records remain kernel-private; public methods return immutable projections with signature values and condition values removed.",
    "exports": [
      {
        "name": "NaviRelationshipServiceError",
        "kind": "class",
        "signature": "class NaviRelationshipServiceError extends Error",
        "summary": ""
      },
      {
        "name": "NaviRelationshipIntegrityError",
        "kind": "class",
        "signature": "class NaviRelationshipIntegrityError extends NaviRelationshipServiceError",
        "summary": ""
      },
      {
        "name": "NaviRelationshipService",
        "kind": "class",
        "signature": "class NaviRelationshipService",
        "summary": ""
      },
      {
        "name": "NAVI_RELATIONSHIP_SERVICE_FORMAT",
        "kind": "constant",
        "signature": "NAVI_RELATIONSHIP_SERVICE_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_RELATIONSHIP_EVENT_RECORD_FORMAT",
        "kind": "constant",
        "signature": "NAVI_RELATIONSHIP_EVENT_RECORD_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_RELATIONSHIP_RECORD_TYPE",
        "kind": "constant",
        "signature": "NAVI_RELATIONSHIP_RECORD_TYPE",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/navi/NaviResourceCatalog",
    "path": "webgpu-os/reference/kernel/navi/NaviResourceCatalog.md",
    "source": "webgpu-os/kernel/navi/NaviResourceCatalog.js",
    "import": "/webgpu-os/kernel/navi/NaviResourceCatalog.js",
    "sourceHash": "4692d76a8f11c2e0bee31118dc4cd14572dc48a9b27599d4cd260515b80f7c51",
    "summary": "NaviResourceCatalog.js — one deterministic, searchable projection of Navi tools, Faculties, guidance recipes, task episodes, and related resources. Catalog entries are descriptions only. Search never executes a resource or grants permission, and callers must resolve live authority independently.",
    "exports": [
      {
        "name": "NaviResourceCatalog",
        "kind": "class",
        "signature": "class NaviResourceCatalog",
        "summary": ""
      },
      {
        "name": "projectBrokerDecisionToResourceSelection",
        "kind": "function",
        "signature": "async projectBrokerDecisionToResourceSelection(rawInput = {}, rawOptions = {})",
        "summary": "Convert one existing NaviModelBroker decision into the Phase 8 resource selection contract without running a second selector. The broker's selected route and candidate order are authoritative. This projection only validates, binds, and signs that already-made decision."
      },
      {
        "name": "createNaviModelRouteResourceBindings",
        "kind": "function",
        "signature": "async createNaviModelRouteResourceBindings(routeConfiguration, purpose)",
        "summary": "Build the exact descriptor and verifier bindings for every model route in a broker candidate set. The descriptor hash intentionally shares the execution-plan route domain so the persisted selection and executable plan attest the same normalized route. No provider content or credential enters either binding."
      },
      {
        "name": "NAVI_RESOURCE_CATALOG_FORMATS",
        "kind": "constant",
        "signature": "NAVI_RESOURCE_CATALOG_FORMATS",
        "summary": ""
      },
      {
        "name": "NAVI_BROKER_RESOURCE_EXCLUSION_REASON_MAP",
        "kind": "constant",
        "signature": "NAVI_BROKER_RESOURCE_EXCLUSION_REASON_MAP",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/navi/NaviResourceService",
    "path": "webgpu-os/reference/kernel/navi/NaviResourceService.md",
    "source": "webgpu-os/kernel/navi/NaviResourceService.js",
    "import": "/webgpu-os/kernel/navi/NaviResourceService.js",
    "sourceHash": "986fcdd5d3f33f59096bb78565d4d87c82a0ff107f07d8f43dc7d0cb935cc00c",
    "summary": "Kernel-owned resource reservation, metering, and settlement. One encrypted CAS account owns every lease for one Navi task. An authenticated encrypted branch index owns the exact aggregate charge and account membership. Account and index revisions commit through one Store batch while all accounts for the same Navi branch share one Web Lock. Every task binds its exact kernel-supplied resource ceiling on first reservation. Every externally meaningful lease state is an operationally signed navi-resource-lease-v1 contract.",
    "exports": [
      {
        "name": "NaviResourceServiceError",
        "kind": "class",
        "signature": "class NaviResourceServiceError extends Error",
        "summary": ""
      },
      {
        "name": "NaviResourceService",
        "kind": "class",
        "signature": "class NaviResourceService",
        "summary": ""
      },
      {
        "name": "NAVI_RESOURCE_SERVICE_FORMAT",
        "kind": "constant",
        "signature": "NAVI_RESOURCE_SERVICE_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_RESOURCE_ACCOUNT_FORMAT",
        "kind": "constant",
        "signature": "NAVI_RESOURCE_ACCOUNT_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_RESOURCE_LEASE_RECORD_FORMAT",
        "kind": "constant",
        "signature": "NAVI_RESOURCE_LEASE_RECORD_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_RESOURCE_PROJECTION_FORMAT",
        "kind": "constant",
        "signature": "NAVI_RESOURCE_PROJECTION_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_RESOURCE_RECORD_TYPE",
        "kind": "constant",
        "signature": "NAVI_RESOURCE_RECORD_TYPE",
        "summary": ""
      },
      {
        "name": "NAVI_RESOURCE_INDEX_RECORD_TYPE",
        "kind": "constant",
        "signature": "NAVI_RESOURCE_INDEX_RECORD_TYPE",
        "summary": ""
      },
      {
        "name": "NAVI_RESOURCE_BRANCH_INDEX_FORMAT",
        "kind": "constant",
        "signature": "NAVI_RESOURCE_BRANCH_INDEX_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_RESOURCE_INDEX_MIGRATION_FORMAT",
        "kind": "constant",
        "signature": "NAVI_RESOURCE_INDEX_MIGRATION_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_RESOURCE_INDEX_MIGRATION_EVENT_FORMAT",
        "kind": "constant",
        "signature": "NAVI_RESOURCE_INDEX_MIGRATION_EVENT_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_RESOURCE_DIMENSIONS",
        "kind": "constant",
        "signature": "NAVI_RESOURCE_DIMENSIONS",
        "summary": ""
      },
      {
        "name": "NAVI_RESOURCE_VERIFICATION_RESERVE",
        "kind": "constant",
        "signature": "NAVI_RESOURCE_VERIFICATION_RESERVE",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/navi/NaviStrategyScorecard",
    "path": "webgpu-os/reference/kernel/navi/NaviStrategyScorecard.md",
    "source": "webgpu-os/kernel/navi/NaviStrategyScorecard.js",
    "import": "/webgpu-os/kernel/navi/NaviStrategyScorecard.js",
    "sourceHash": "d278e06f6f044685c12f06fd5db608e2ff067c9303eeabe24c56565a06d91967",
    "summary": "Deterministic, per-Navi, analysis-only scorecards from verified receipts.",
    "exports": [
      {
        "name": "deriveNaviStrategyScorecard",
        "kind": "function",
        "signature": "async deriveNaviStrategyScorecard(raw = {})",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/navi/NaviStrictProjectionInput",
    "path": "webgpu-os/reference/kernel/navi/NaviStrictProjectionInput.md",
    "source": "webgpu-os/kernel/navi/NaviStrictProjectionInput.js",
    "import": "/webgpu-os/kernel/navi/NaviStrictProjectionInput.js",
    "sourceHash": "f4453c1513f277cbcd715b45eced41926847dd1ad0d07268783e3c3ca6d4bffb",
    "summary": "Strict JSON input helpers shared by authority-free Navi projections. These helpers reject accessors, extensions, cycles, sparse arrays, and non-finite values before a projection derives hashes or evidence counts.",
    "exports": [
      {
        "name": "strictProjectionSnapshot",
        "kind": "function",
        "signature": "strictProjectionSnapshot(value, label = 'projection input')",
        "summary": "Strict JSON input helpers shared by authority-free Navi projections. These helpers reject accessors, extensions, cycles, sparse arrays, and non-finite values before a projection derives hashes or evidence counts."
      },
      {
        "name": "exactProjectionKeys",
        "kind": "function",
        "signature": "exactProjectionKeys(value, allowed, label, required = [])",
        "summary": ""
      },
      {
        "name": "projectionInputError",
        "kind": "function",
        "signature": "projectionInputError(message, code = 'NAVI_PROJECTION_INPUT_INVALID')",
        "summary": ""
      },
      {
        "name": "deepFreezeProjection",
        "kind": "function",
        "signature": "deepFreezeProjection(value)",
        "summary": ""
      },
      {
        "name": "uniqueSortedProjectionStrings",
        "kind": "function",
        "signature": "uniqueSortedProjectionStrings(values, label, { minimum = 0, maximum = 1024 } = {})",
        "summary": ""
      },
      {
        "name": "strictProjectionTime",
        "kind": "function",
        "signature": "strictProjectionTime(value, label)",
        "summary": ""
      },
      {
        "name": "compareCodeUnits",
        "kind": "function",
        "signature": "compareCodeUnits(left, right)",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/navi/NaviSurfaceIntelligence",
    "path": "webgpu-os/reference/kernel/navi/NaviSurfaceIntelligence.md",
    "source": "webgpu-os/kernel/navi/NaviSurfaceIntelligence.js",
    "import": "/webgpu-os/kernel/navi/NaviSurfaceIntelligence.js",
    "sourceHash": "fabfd97259e6701f31889a02fa657478c169131393fbb3929291822b30383e28",
    "summary": "NaviSurfaceIntelligence — bounded, read-only semantic evidence for visible OS surfaces. Surface observations are untrusted evidence. They never grant authority and never execute an action. Mutations named by an action catalog still enter ToolRouter, Live Patch, Dodad Forge, or an app-owned command boundary.",
    "exports": [
      {
        "name": "NaviSurfaceIntelligence",
        "kind": "class",
        "signature": "class NaviSurfaceIntelligence",
        "summary": ""
      },
      {
        "name": "MAX_VISUAL_PAYLOAD_ENCODED_BYTES",
        "kind": "constant",
        "signature": "MAX_VISUAL_PAYLOAD_ENCODED_BYTES",
        "summary": ""
      },
      {
        "name": "MAX_VISUAL_PAYLOAD_DECODED_BYTES",
        "kind": "constant",
        "signature": "MAX_VISUAL_PAYLOAD_DECODED_BYTES",
        "summary": ""
      },
      {
        "name": "MAX_RETAINED_VISUAL_BYTES",
        "kind": "constant",
        "signature": "MAX_RETAINED_VISUAL_BYTES",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/navi/NaviVfsOverlayService",
    "path": "webgpu-os/reference/kernel/navi/NaviVfsOverlayService.md",
    "source": "webgpu-os/kernel/navi/NaviVfsOverlayService.js",
    "import": "/webgpu-os/kernel/navi/NaviVfsOverlayService.js",
    "sourceHash": "79f7a0c480a68101738f0c4f5b2408b32af775ba7d2dd56bb4702e714dd84c4b",
    "summary": "Kernel-owned VFS isolation for delegated Navi workers. A delegated file capability is issued for one deterministic hidden overlay root. The adapter never rewrites a signed path: it verifies that the exact execution path is inside the bound overlay and returns that same path. The immutable snapshot hash describes the overlay at admission time; subsequent writes remain constrained by the signed path scopes rather than changing the authorization identity after every edit. Storage accounting is deliberately application-byte based. Kernel-owned overlay metadata, hashes, and signed receipts are excluded. Creating an empty overlay and observing a snapshot therefore cost zero storage bytes. Moving an overlay into recoverable trash is a durable application-data rewrite and is charged at the exact sum of the files present in its prepared snapshot.",
    "exports": [
      {
        "name": "NaviVfsOverlayServiceError",
        "kind": "class",
        "signature": "class NaviVfsOverlayServiceError extends Error",
        "summary": ""
      },
      {
        "name": "NaviVfsOverlayService",
        "kind": "class",
        "signature": "class NaviVfsOverlayService",
        "summary": ""
      },
      {
        "name": "NAVI_VFS_OVERLAY_FORMAT",
        "kind": "constant",
        "signature": "NAVI_VFS_OVERLAY_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_VFS_OVERLAY_STORAGE_RECEIPT_FORMAT",
        "kind": "constant",
        "signature": "NAVI_VFS_OVERLAY_STORAGE_RECEIPT_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_VFS_OVERLAY_METADATA_ROOT",
        "kind": "constant",
        "signature": "NAVI_VFS_OVERLAY_METADATA_ROOT",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/navi/NaviWorkspaceOutputIndex",
    "path": "webgpu-os/reference/kernel/navi/NaviWorkspaceOutputIndex.md",
    "source": "webgpu-os/kernel/navi/NaviWorkspaceOutputIndex.js",
    "import": "/webgpu-os/kernel/navi/NaviWorkspaceOutputIndex.js",
    "sourceHash": "ebd9950896dc746ffb90161a49d4a09761ba39bda382b6f535f5e284d42fee37",
    "summary": "Rebuildable, non-authoritative references to canonical workspace outputs. The index owns no file content. Every entry is derived from an exact VFS observation and points back to the app-owned canonical path. Deleting the index loses no user data because the same projection can be rebuilt.",
    "exports": [
      {
        "name": "NaviWorkspaceOutputIndex",
        "kind": "class",
        "signature": "class NaviWorkspaceOutputIndex",
        "summary": ""
      },
      {
        "name": "WORKSPACE_OUTPUT_CONTRACT_FORMAT",
        "kind": "constant",
        "signature": "WORKSPACE_OUTPUT_CONTRACT_FORMAT",
        "summary": ""
      },
      {
        "name": "WORKSPACE_OUTPUT_REBUILD_FORMAT",
        "kind": "constant",
        "signature": "WORKSPACE_OUTPUT_REBUILD_FORMAT",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/navi/SurfaceTemporalVerifier",
    "path": "webgpu-os/reference/kernel/navi/SurfaceTemporalVerifier.md",
    "source": "webgpu-os/kernel/navi/SurfaceTemporalVerifier.js",
    "import": "/webgpu-os/kernel/navi/SurfaceTemporalVerifier.js",
    "sourceHash": "1742dee5eb3385aed24ab44440e2c094bb794bcd11e823ede749ce0195aa272a",
    "summary": "SurfaceTemporalVerifier compares two retained semantic captures. It is deliberately read-only. Visual comparison accepts contract evidence that was captured earlier and compares content hashes only; it never reads a payload.",
    "exports": [
      {
        "name": "SurfaceTemporalVerifier",
        "kind": "class",
        "signature": "class SurfaceTemporalVerifier",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/navi/adapters/ConstructManifestationAdapter",
    "path": "webgpu-os/reference/kernel/navi/adapters/ConstructManifestationAdapter.md",
    "source": "webgpu-os/kernel/navi/adapters/ConstructManifestationAdapter.js",
    "import": "/webgpu-os/kernel/navi/adapters/ConstructManifestationAdapter.js",
    "sourceHash": "a75817ff4f1a5e6842e52c0fc34be6d892b6342bd0ef5b5ed37386a2a17b8fae",
    "summary": "Narrow Construct manifestation boundary. The adapter deliberately captures only bound ActiveBody-style functions and explicit observation readers supplied by trusted kernel wiring. It never exposes the engine object, treats a body as identity, or derives authority from scene, presence, spatial, model, avatar, or body data.",
    "exports": [
      {
        "name": "NaviConstructManifestationAdapterError",
        "kind": "class",
        "signature": "class NaviConstructManifestationAdapterError extends Error",
        "summary": ""
      },
      {
        "name": "createConstructManifestationAdapter",
        "kind": "function",
        "signature": "createConstructManifestationAdapter({ bodyId, bodyRuntime, manifestationId = NAVI_CONSTRUCT_PRIMARY_MANIFESTATION_ID, spawnPosition = [0, 0, 0], bodyOptions = {}, readActiveScene, readSelectedEntity, readVerifiedRealmPresence, readSpatialLocality, playAnimation, requestRealmAuthority, maxObservationBytes = DEFAULT_MAX_OBSERVATION_BYTES, clock = ()",
        "summary": "Create the trusted Construct runtime attached by NaviManifestationAdapterRegistry. bodyRuntime is expected to be an ActiveBodySystem-compatible object. Readers are narrow kernel wrappers; each receives a frozen exact-scope request."
      },
      {
        "name": "NAVI_CONSTRUCT_ADAPTER_FORMAT",
        "kind": "constant",
        "signature": "NAVI_CONSTRUCT_ADAPTER_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_CONSTRUCT_ACTIVATION_FORMAT",
        "kind": "constant",
        "signature": "NAVI_CONSTRUCT_ACTIVATION_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_CONSTRUCT_OBSERVATION_FORMAT",
        "kind": "constant",
        "signature": "NAVI_CONSTRUCT_OBSERVATION_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_CONSTRUCT_ACTUATION_FORMAT",
        "kind": "constant",
        "signature": "NAVI_CONSTRUCT_ACTUATION_FORMAT",
        "summary": ""
      },
      {
        "name": "NAVI_CONSTRUCT_PRIMARY_MANIFESTATION_ID",
        "kind": "constant",
        "signature": "NAVI_CONSTRUCT_PRIMARY_MANIFESTATION_ID",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/navi/builtins/ArtifactStudioFaculty",
    "path": "webgpu-os/reference/kernel/navi/builtins/ArtifactStudioFaculty.md",
    "source": "webgpu-os/kernel/navi/builtins/ArtifactStudioFaculty.js",
    "import": "/webgpu-os/kernel/navi/builtins/ArtifactStudioFaculty.js",
    "sourceHash": "52333cd6de6a2cf824d9255085440b076cff65ac41ea46715d61162d5a1bb6ab",
    "summary": "ArtifactStudioFaculty.js Canonical contract factory and worker source for AI Echo's built-in Artifact Studio adapter. The worker is deliberately tiny: it can request exactly one declared Artifact tool and receives no storage, credential, network, DOM, or raw-JavaScript authority of its own.",
    "exports": [
      {
        "name": "createArtifactStudioNaviFaculty",
        "kind": "function",
        "signature": "createArtifactStudioNaviFaculty({ descriptorHashes = {}, provenance = null, tests = [], signatures = null, version = ARTIFACT_STUDIO_FACULTY_VERSION, publisherId = ARTIFACT_STUDIO_PUBLISHER_ID, } = {})",
        "summary": ""
      },
      {
        "name": "createArtifactStudioFacultyPackageBinding",
        "kind": "function",
        "signature": "async createArtifactStudioFacultyPackageBinding(manifest, { resourceHash = null } = {})",
        "summary": ""
      },
      {
        "name": "assertArtifactStudioManifest",
        "kind": "function",
        "signature": "assertArtifactStudioManifest(value)",
        "summary": ""
      },
      {
        "name": "artifactStudioPackageEvidence",
        "kind": "function",
        "signature": "artifactStudioPackageEvidence()",
        "summary": "Return the complete package evidence shape consumed by NaviFacultyPackagePolicy. The release preamble wins when present; raw browser development uses the checked-in public fallback package. No private signing material is present in either record."
      },
      {
        "name": "artifactStudioSignedManifest",
        "kind": "function",
        "signature": "artifactStudioSignedManifest()",
        "summary": ""
      },
      {
        "name": "ARTIFACT_STUDIO_FACULTY_ID",
        "kind": "constant",
        "signature": "ARTIFACT_STUDIO_FACULTY_ID",
        "summary": ""
      },
      {
        "name": "ARTIFACT_STUDIO_FACULTY_VERSION_BASE",
        "kind": "constant",
        "signature": "ARTIFACT_STUDIO_FACULTY_VERSION_BASE",
        "summary": ""
      },
      {
        "name": "ARTIFACT_STUDIO_FACULTY_VERSION",
        "kind": "constant",
        "signature": "ARTIFACT_STUDIO_FACULTY_VERSION",
        "summary": ""
      },
      {
        "name": "ARTIFACT_STUDIO_PACKAGE_ID",
        "kind": "constant",
        "signature": "ARTIFACT_STUDIO_PACKAGE_ID",
        "summary": ""
      },
      {
        "name": "ARTIFACT_STUDIO_PUBLISHER_ID",
        "kind": "constant",
        "signature": "ARTIFACT_STUDIO_PUBLISHER_ID",
        "summary": ""
      },
      {
        "name": "ARTIFACT_STUDIO_SOURCE_PATH",
        "kind": "constant",
        "signature": "ARTIFACT_STUDIO_SOURCE_PATH",
        "summary": ""
      },
      {
        "name": "ARTIFACT_STUDIO_TOOL_NAMES",
        "kind": "constant",
        "signature": "ARTIFACT_STUDIO_TOOL_NAMES",
        "summary": ""
      },
      {
        "name": "ARTIFACT_STUDIO_FACULTY_SOURCE",
        "kind": "constant",
        "signature": "ARTIFACT_STUDIO_FACULTY_SOURCE",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/navi/builtins/BrowserSemanticFaculty",
    "path": "webgpu-os/reference/kernel/navi/builtins/BrowserSemanticFaculty.md",
    "source": "webgpu-os/kernel/navi/builtins/BrowserSemanticFaculty.js",
    "import": "/webgpu-os/kernel/navi/builtins/BrowserSemanticFaculty.js",
    "sourceHash": "01df2cbe28783b9f340c0451264fd9a6413da385c733ea51bcada020abf5ea3b",
    "summary": "Canonical signed boundary for extension-backed semantic browser automation. The package is installed inert: only an explicit operator action may enable its device and network authority for a Navi.",
    "exports": [
      {
        "name": "browserSemanticFacultyDefinitionAtVersion",
        "kind": "function",
        "signature": "browserSemanticFacultyDefinitionAtVersion(version)",
        "summary": ""
      },
      {
        "name": "createBrowserSemanticNaviFaculty",
        "kind": "function",
        "signature": "createBrowserSemanticNaviFaculty({ descriptorHashes = {}, provenance = null, tests = [], signatures = null, version = BROWSER_SEMANTIC_FACULTY_VERSION, publisherId = BROWSER_SEMANTIC_PUBLISHER_ID, maxCalls = 1, } = {})",
        "summary": ""
      },
      {
        "name": "createBrowserSemanticFacultyPackageBinding",
        "kind": "function",
        "signature": "async createBrowserSemanticFacultyPackageBinding(manifest, { resourceHash = null } = {})",
        "summary": ""
      },
      {
        "name": "assertBrowserSemanticManifest",
        "kind": "function",
        "signature": "assertBrowserSemanticManifest(value, definition = BROWSER_SEMANTIC_FACULTY_DEFINITION)",
        "summary": ""
      },
      {
        "name": "browserSemanticPackageEvidence",
        "kind": "function",
        "signature": "browserSemanticPackageEvidence()",
        "summary": ""
      },
      {
        "name": "browserSemanticSignedManifest",
        "kind": "function",
        "signature": "browserSemanticSignedManifest()",
        "summary": ""
      },
      {
        "name": "BROWSER_SEMANTIC_FACULTY_ID",
        "kind": "constant",
        "signature": "BROWSER_SEMANTIC_FACULTY_ID",
        "summary": ""
      },
      {
        "name": "BROWSER_SEMANTIC_FACULTY_VERSION_BASE",
        "kind": "constant",
        "signature": "BROWSER_SEMANTIC_FACULTY_VERSION_BASE",
        "summary": ""
      },
      {
        "name": "BROWSER_SEMANTIC_FACULTY_VERSION",
        "kind": "constant",
        "signature": "BROWSER_SEMANTIC_FACULTY_VERSION",
        "summary": ""
      },
      {
        "name": "BROWSER_SEMANTIC_PACKAGE_ID",
        "kind": "constant",
        "signature": "BROWSER_SEMANTIC_PACKAGE_ID",
        "summary": ""
      },
      {
        "name": "BROWSER_SEMANTIC_PUBLISHER_ID",
        "kind": "constant",
        "signature": "BROWSER_SEMANTIC_PUBLISHER_ID",
        "summary": ""
      },
      {
        "name": "BROWSER_SEMANTIC_SOURCE_PATH",
        "kind": "constant",
        "signature": "BROWSER_SEMANTIC_SOURCE_PATH",
        "summary": ""
      },
      {
        "name": "BROWSER_SEMANTIC_NETWORK_BYTES_PER_CALL",
        "kind": "constant",
        "signature": "BROWSER_SEMANTIC_NETWORK_BYTES_PER_CALL",
        "summary": ""
      },
      {
        "name": "BROWSER_SEMANTIC_TOOL_NAMES",
        "kind": "constant",
        "signature": "BROWSER_SEMANTIC_TOOL_NAMES",
        "summary": ""
      },
      {
        "name": "BROWSER_SEMANTIC_FACULTY_SOURCE",
        "kind": "constant",
        "signature": "BROWSER_SEMANTIC_FACULTY_SOURCE",
        "summary": ""
      },
      {
        "name": "BROWSER_SEMANTIC_FACULTY_DEFINITION",
        "kind": "constant",
        "signature": "BROWSER_SEMANTIC_FACULTY_DEFINITION",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/navi/builtins/BuiltInFacultyPackageEvidence",
    "path": "webgpu-os/reference/kernel/navi/builtins/BuiltInFacultyPackageEvidence.md",
    "source": "webgpu-os/kernel/navi/builtins/BuiltInFacultyPackageEvidence.js",
    "import": "/webgpu-os/kernel/navi/builtins/BuiltInFacultyPackageEvidence.js",
    "sourceHash": "4e5810b9d4d669e69627318b13f9ad2878fc52a3e631f485f7487e023187d238",
    "summary": "Shared fail-closed reader for OS-owned signed Faculty package evidence.",
    "exports": [
      {
        "name": "builtInFacultyPackageEvidence",
        "kind": "function",
        "signature": "builtInFacultyPackageEvidence({ label, packageId, version, publisherId, sourcePath, source, generatedPackage, assertManifest, })",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/navi/builtins/BuiltInToolFaculties",
    "path": "webgpu-os/reference/kernel/navi/builtins/BuiltInToolFaculties.md",
    "source": "webgpu-os/kernel/navi/builtins/BuiltInToolFaculties.js",
    "import": "/webgpu-os/kernel/navi/builtins/BuiltInToolFaculties.js",
    "sourceHash": "a307b383bd03ad1a404f11bc95229db511e7d035c4d98fe9f29bc1843636ff94",
    "summary": "Bind one catalog definition to the immutable version carried by its signed package.",
    "exports": [
      {
        "name": "builtInToolFacultyDefinition",
        "kind": "function",
        "signature": "builtInToolFacultyDefinition(facultyId)",
        "summary": ""
      },
      {
        "name": "builtInToolFacultyDefinitionAtVersion",
        "kind": "function",
        "signature": "builtInToolFacultyDefinitionAtVersion(definitionOrId, version)",
        "summary": "Bind one catalog definition to the immutable version carried by its signed package."
      },
      {
        "name": "assertBuiltInToolFacultyManifest",
        "kind": "function",
        "signature": "assertBuiltInToolFacultyManifest(value, definitionOrId)",
        "summary": ""
      },
      {
        "name": "builtInToolFacultyPackageEvidence",
        "kind": "function",
        "signature": "builtInToolFacultyPackageEvidence(definitionOrId)",
        "summary": ""
      },
      {
        "name": "builtInToolFacultySignedManifest",
        "kind": "function",
        "signature": "builtInToolFacultySignedManifest(definitionOrId)",
        "summary": ""
      },
      {
        "name": "BUILT_IN_TOOL_FACULTY_VERSION",
        "kind": "constant",
        "signature": "BUILT_IN_TOOL_FACULTY_VERSION",
        "summary": ""
      },
      {
        "name": "BUILT_IN_TOOL_FACULTY_PUBLISHER_ID",
        "kind": "constant",
        "signature": "BUILT_IN_TOOL_FACULTY_PUBLISHER_ID",
        "summary": ""
      },
      {
        "name": "BUILT_IN_TOOL_FACULTY_DEFINITIONS_JSON",
        "kind": "constant",
        "signature": "BUILT_IN_TOOL_FACULTY_DEFINITIONS_JSON",
        "summary": ""
      },
      {
        "name": "BUILT_IN_TOOL_FACULTY_EXCLUSIONS_JSON",
        "kind": "constant",
        "signature": "BUILT_IN_TOOL_FACULTY_EXCLUSIONS_JSON",
        "summary": ""
      },
      {
        "name": "BUILT_IN_TOOL_FACULTY_SOURCE",
        "kind": "constant",
        "signature": "BUILT_IN_TOOL_FACULTY_SOURCE",
        "summary": ""
      },
      {
        "name": "BUILT_IN_TOOL_FACULTIES",
        "kind": "constant",
        "signature": "BUILT_IN_TOOL_FACULTIES",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/navi/contracts/ContractCanonical",
    "path": "webgpu-os/reference/kernel/navi/contracts/ContractCanonical.md",
    "source": "webgpu-os/kernel/navi/contracts/ContractCanonical.js",
    "import": "/webgpu-os/kernel/navi/contracts/ContractCanonical.js",
    "sourceHash": "1eaa7addde0b20b6460b9706c5db67d2fb3e15894a981a013b6e331eb6440bea",
    "summary": "ContractCanonical.js — domain-separated signing bytes and secure identifiers.",
    "exports": [
      {
        "name": "naviSigningValue",
        "kind": "function",
        "signature": "naviSigningValue(contract)",
        "summary": "Return the JSON value covered by every top-level Navi contract signature. Signature envelopes are excluded to avoid circular signing input."
      },
      {
        "name": "canonicalNaviSigningText",
        "kind": "function",
        "signature": "canonicalNaviSigningText(contract)",
        "summary": "Return the deterministic, domain-separated signing text."
      },
      {
        "name": "canonicalNaviSigningBytes",
        "kind": "function",
        "signature": "canonicalNaviSigningBytes(contract)",
        "summary": "Return the exact UTF-8 bytes that P-256 signs or verifies."
      },
      {
        "name": "hashNaviSigningPayload",
        "kind": "function",
        "signature": "async hashNaviSigningPayload(contract)",
        "summary": "Return a tagged SHA-256 identifier for the signature-covered payload."
      },
      {
        "name": "hashNaviContractEnvelope",
        "kind": "function",
        "signature": "async hashNaviContractEnvelope(contract)",
        "summary": "Return a tagged SHA-256 identifier for the complete signed envelope."
      },
      {
        "name": "naviSigningPayloadEquals",
        "kind": "function",
        "signature": "naviSigningPayloadEquals(a, b)",
        "summary": "Compare contract payloads without relying on insertion order. Useful before signing, during recovery diffs, and when checking fixture determinism."
      },
      {
        "name": "NAVI_SIGNING_DOMAIN",
        "kind": "constant",
        "signature": "NAVI_SIGNING_DOMAIN",
        "summary": ""
      },
      {
        "name": "NAVI_SIGNING_SCOPE",
        "kind": "constant",
        "signature": "NAVI_SIGNING_SCOPE",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/navi/contracts/ContractRegistry",
    "path": "webgpu-os/reference/kernel/navi/contracts/ContractRegistry.md",
    "source": "webgpu-os/kernel/navi/contracts/ContractRegistry.js",
    "import": "/webgpu-os/kernel/navi/contracts/ContractRegistry.js",
    "sourceHash": "bdde5afffad876afec1ee87d0ded7aa742a26954b2c92355d3b848136329c21b",
    "summary": "ContractRegistry.js — isolated Navi v1 schema registry and semantic checks. This registry deliberately does not mutate the OS-wide singleton. Kernel bootstrap can integrate it after the Phase 0 gate passes without making an import of this module a side effect.",
    "exports": [
      {
        "name": "createNaviContractRegistry",
        "kind": "function",
        "signature": "createNaviContractRegistry()",
        "summary": ""
      },
      {
        "name": "isKnownNaviSchema",
        "kind": "function",
        "signature": "isKnownNaviSchema(schemaId)",
        "summary": ""
      },
      {
        "name": "validateNaviContract",
        "kind": "function",
        "signature": "validateNaviContract(data, expectedSchemaId = null, options = {})",
        "summary": ""
      },
      {
        "name": "assertNaviContract",
        "kind": "function",
        "signature": "assertNaviContract(data, expectedSchemaId = null, options = {})",
        "summary": ""
      },
      {
        "name": "naviContractRegistry",
        "kind": "constant",
        "signature": "naviContractRegistry",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/navi/contracts/ContractSchemas",
    "path": "webgpu-os/reference/kernel/navi/contracts/ContractSchemas.md",
    "source": "webgpu-os/kernel/navi/contracts/ContractSchemas.js",
    "import": "/webgpu-os/kernel/navi/contracts/ContractSchemas.js",
    "sourceHash": "b4ffc29bdf2c8589e1e10cd7ce5c23dc03b950005cdffce33f98c4080e4a35d0",
    "summary": "ContractSchemas.js — strict, versioned Navi v1 wire schemas. The OS schema validator intentionally supports a compact JSON Schema subset. Every declared object is closed with additionalProperties:false. Fields that intentionally contain application JSON are named `value` or `metadata` and are still checked by ContractRegistry's JSON-safety pass before acceptance.",
    "exports": [
      {
        "name": "NAVI_ARTIFACT_REFERENCE_PATTERN",
        "kind": "constant",
        "signature": "NAVI_ARTIFACT_REFERENCE_PATTERN",
        "summary": ""
      },
      {
        "name": "NAVI_CAPABILITY_PATH_OPERATIONS",
        "kind": "constant",
        "signature": "NAVI_CAPABILITY_PATH_OPERATIONS",
        "summary": ""
      },
      {
        "name": "NAVI_RESOURCE_KINDS",
        "kind": "constant",
        "signature": "NAVI_RESOURCE_KINDS",
        "summary": ""
      },
      {
        "name": "NAVI_RESOURCE_SELECTION_REJECTION_REASON_CODES",
        "kind": "constant",
        "signature": "NAVI_RESOURCE_SELECTION_REJECTION_REASON_CODES",
        "summary": ""
      },
      {
        "name": "NAVI_RESOURCE_SELECTION_REASON_CODES",
        "kind": "constant",
        "signature": "NAVI_RESOURCE_SELECTION_REASON_CODES",
        "summary": ""
      },
      {
        "name": "NAVI_SCHEMA_IDS",
        "kind": "constant",
        "signature": "NAVI_SCHEMA_IDS",
        "summary": ""
      },
      {
        "name": "NAVI_SCHEMA_ID_LIST",
        "kind": "constant",
        "signature": "NAVI_SCHEMA_ID_LIST",
        "summary": ""
      },
      {
        "name": "NAVI_COMMON_SCHEMA_NAMES",
        "kind": "constant",
        "signature": "NAVI_COMMON_SCHEMA_NAMES",
        "summary": ""
      },
      {
        "name": "NAVI_COMMON_SCHEMAS",
        "kind": "constant",
        "signature": "NAVI_COMMON_SCHEMAS",
        "summary": ""
      },
      {
        "name": "NAVI_CONTRACT_SCHEMAS",
        "kind": "constant",
        "signature": "NAVI_CONTRACT_SCHEMAS",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/navi/contracts/Vocabulary",
    "path": "webgpu-os/reference/kernel/navi/contracts/Vocabulary.md",
    "source": "webgpu-os/kernel/navi/contracts/Vocabulary.js",
    "import": "/webgpu-os/kernel/navi/contracts/Vocabulary.js",
    "sourceHash": "06ba46d6acdb4382a8df2df149c8c64801e889029f8dc3595e027296dc30c385",
    "summary": "Vocabulary.js — canonical Navi v1 terminology and closed policy vocabularies. These values are wire contracts. Additions require a new contract revision; renaming an entry would change signed meaning and is therefore forbidden.",
    "exports": [
      {
        "name": "NAVI_ARCHITECTURE_VERSION",
        "kind": "constant",
        "signature": "NAVI_ARCHITECTURE_VERSION",
        "summary": ""
      },
      {
        "name": "NAVI_SYSTEMS",
        "kind": "constant",
        "signature": "NAVI_SYSTEMS",
        "summary": ""
      },
      {
        "name": "NAVI_SYSTEM_BY_CODE",
        "kind": "constant",
        "signature": "NAVI_SYSTEM_BY_CODE",
        "summary": ""
      },
      {
        "name": "NAVI_DATA_CLASSIFICATIONS",
        "kind": "constant",
        "signature": "NAVI_DATA_CLASSIFICATIONS",
        "summary": ""
      },
      {
        "name": "NAVI_AUTHORITY_DOMAINS",
        "kind": "constant",
        "signature": "NAVI_AUTHORITY_DOMAINS",
        "summary": ""
      },
      {
        "name": "NAVI_MEMORY_CLASSES",
        "kind": "constant",
        "signature": "NAVI_MEMORY_CLASSES",
        "summary": ""
      },
      {
        "name": "NAVI_SECURITY_TIERS",
        "kind": "constant",
        "signature": "NAVI_SECURITY_TIERS",
        "summary": ""
      },
      {
        "name": "NAVI_SECURITY_TIER_IDS",
        "kind": "constant",
        "signature": "NAVI_SECURITY_TIER_IDS",
        "summary": ""
      },
      {
        "name": "NAVI_PRINCIPAL_KINDS",
        "kind": "constant",
        "signature": "NAVI_PRINCIPAL_KINDS",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/navi/contracts/index",
    "path": "webgpu-os/reference/kernel/navi/contracts/index.md",
    "source": "webgpu-os/kernel/navi/contracts/index.js",
    "import": "/webgpu-os/kernel/navi/contracts/index.js",
    "sourceHash": "a78e72a3e678531d25cd3f355fb524ae689c0679601ca92fa873e8c4ff1b242a",
    "summary": "",
    "exports": [
      {
        "name": "NAVI_ARCHITECTURE_VERSION",
        "kind": "re-export",
        "signature": "NAVI_ARCHITECTURE_VERSION",
        "summary": ""
      },
      {
        "name": "NAVI_ARTIFACT_REFERENCE_PATTERN",
        "kind": "re-export",
        "signature": "NAVI_ARTIFACT_REFERENCE_PATTERN",
        "summary": ""
      },
      {
        "name": "NAVI_AUTHORITY_DOMAINS",
        "kind": "re-export",
        "signature": "NAVI_AUTHORITY_DOMAINS",
        "summary": ""
      },
      {
        "name": "NAVI_CAPABILITY_PATH_OPERATIONS",
        "kind": "re-export",
        "signature": "NAVI_CAPABILITY_PATH_OPERATIONS",
        "summary": ""
      },
      {
        "name": "NAVI_COMMON_SCHEMAS",
        "kind": "re-export",
        "signature": "NAVI_COMMON_SCHEMAS",
        "summary": ""
      },
      {
        "name": "NAVI_COMMON_SCHEMA_NAMES",
        "kind": "re-export",
        "signature": "NAVI_COMMON_SCHEMA_NAMES",
        "summary": ""
      },
      {
        "name": "NAVI_CONTRACT_SCHEMAS",
        "kind": "re-export",
        "signature": "NAVI_CONTRACT_SCHEMAS",
        "summary": ""
      },
      {
        "name": "NAVI_DATA_CLASSIFICATIONS",
        "kind": "re-export",
        "signature": "NAVI_DATA_CLASSIFICATIONS",
        "summary": ""
      },
      {
        "name": "NAVI_MEMORY_CLASSES",
        "kind": "re-export",
        "signature": "NAVI_MEMORY_CLASSES",
        "summary": ""
      },
      {
        "name": "NAVI_PRINCIPAL_KINDS",
        "kind": "re-export",
        "signature": "NAVI_PRINCIPAL_KINDS",
        "summary": ""
      },
      {
        "name": "NAVI_SCHEMA_IDS",
        "kind": "re-export",
        "signature": "NAVI_SCHEMA_IDS",
        "summary": ""
      },
      {
        "name": "NAVI_SCHEMA_ID_LIST",
        "kind": "re-export",
        "signature": "NAVI_SCHEMA_ID_LIST",
        "summary": ""
      },
      {
        "name": "NAVI_SECURITY_TIERS",
        "kind": "re-export",
        "signature": "NAVI_SECURITY_TIERS",
        "summary": ""
      },
      {
        "name": "NAVI_SECURITY_TIER_IDS",
        "kind": "re-export",
        "signature": "NAVI_SECURITY_TIER_IDS",
        "summary": ""
      },
      {
        "name": "NAVI_SIGNING_DOMAIN",
        "kind": "re-export",
        "signature": "NAVI_SIGNING_DOMAIN",
        "summary": ""
      },
      {
        "name": "NAVI_SIGNING_SCOPE",
        "kind": "re-export",
        "signature": "NAVI_SIGNING_SCOPE",
        "summary": ""
      },
      {
        "name": "NAVI_SYSTEMS",
        "kind": "re-export",
        "signature": "NAVI_SYSTEMS",
        "summary": ""
      },
      {
        "name": "NAVI_SYSTEM_BY_CODE",
        "kind": "re-export",
        "signature": "NAVI_SYSTEM_BY_CODE",
        "summary": ""
      },
      {
        "name": "assertNaviContract",
        "kind": "re-export",
        "signature": "assertNaviContract",
        "summary": ""
      },
      {
        "name": "canonicalNaviSigningBytes",
        "kind": "re-export",
        "signature": "canonicalNaviSigningBytes",
        "summary": ""
      },
      {
        "name": "canonicalNaviSigningText",
        "kind": "re-export",
        "signature": "canonicalNaviSigningText",
        "summary": ""
      },
      {
        "name": "createNaviContractRegistry",
        "kind": "re-export",
        "signature": "createNaviContractRegistry",
        "summary": ""
      },
      {
        "name": "hashNaviContractEnvelope",
        "kind": "re-export",
        "signature": "hashNaviContractEnvelope",
        "summary": ""
      },
      {
        "name": "hashNaviSigningPayload",
        "kind": "re-export",
        "signature": "hashNaviSigningPayload",
        "summary": ""
      },
      {
        "name": "isKnownNaviSchema",
        "kind": "re-export",
        "signature": "isKnownNaviSchema",
        "summary": ""
      },
      {
        "name": "naviContractRegistry",
        "kind": "re-export",
        "signature": "naviContractRegistry",
        "summary": ""
      },
      {
        "name": "naviSigningPayloadEquals",
        "kind": "re-export",
        "signature": "naviSigningPayloadEquals",
        "summary": ""
      },
      {
        "name": "naviSigningValue",
        "kind": "re-export",
        "signature": "naviSigningValue",
        "summary": ""
      },
      {
        "name": "validateNaviContract",
        "kind": "re-export",
        "signature": "validateNaviContract",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/net-safety",
    "path": "webgpu-os/reference/kernel/net-safety.md",
    "source": "webgpu-os/kernel/net-safety.js",
    "import": "/webgpu-os/kernel/net-safety.js",
    "sourceHash": "5d23c99689985fbc4afc09c0616fa36030cf169295310451c40b9f97337b4f41",
    "summary": "net-safety.js — shared SSRF / private-host guards for OS-mediated fetches. Reused by the sandboxed-app network bridge, the package UpdateManager, and the package source-URL policy so the same allow/deny rules apply everywhere: - http(s) only (no file:, data:, blob:, chrome-extension:, etc.) - no embedded credentials in the URL - no loopback / link-local / RFC-1918 / CGNAT / multicast / .local hosts Public hostnames pass (still subject to the browser's CORS rules).",
    "exports": [
      {
        "name": "isPrivateHost",
        "kind": "function",
        "signature": "isPrivateHost(host)",
        "summary": "True if a hostname points at the local machine or a private network range."
      },
      {
        "name": "assertSafeFetchUrl",
        "kind": "function",
        "signature": "assertSafeFetchUrl(url, opts = {})",
        "summary": "Validate and normalise a URL for an OS-mediated fetch. Throws on policy violation; returns the normalised href on success."
      },
      {
        "name": "isLocalDevHost",
        "kind": "function",
        "signature": "isLocalDevHost(host)",
        "summary": "True when a host is localhost-like (used to relax https for local dev sources)."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/protocol/CapabilityNegotiator",
    "path": "webgpu-os/reference/kernel/protocol/CapabilityNegotiator.md",
    "source": "webgpu-os/kernel/protocol/CapabilityNegotiator.js",
    "import": "/webgpu-os/kernel/protocol/CapabilityNegotiator.js",
    "sourceHash": "a4fab05e75a26342adab9b1bf4a71f55a96d68a7760e0e2fea47d8e3453c243a",
    "summary": "CapabilityNegotiator.js — Particle Realms Protocol capability minting. Thin wrapper over engine/state's CapabilityRegistry + Capability.js (makeCapability/attenuate/authorizes) — no parallel capability logic. Used by the AI Hub's two-pass execution loop (Phase 9) to mint short-lived, narrowly-scoped capabilities for a single OS.ai() request's tool/resource access, on top of (not instead of) the RuleGraph/Permissions manifest gate.",
    "exports": [
      {
        "name": "CapabilityNegotiator",
        "kind": "class",
        "signature": "class CapabilityNegotiator",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/protocol/ElicitationManager",
    "path": "webgpu-os/reference/kernel/protocol/ElicitationManager.md",
    "source": "webgpu-os/kernel/protocol/ElicitationManager.js",
    "import": "/webgpu-os/kernel/protocol/ElicitationManager.js",
    "sourceHash": "7c9bc351a26037e6bf47b612e9fe693a9a139f44ee5d7abe8ed786a7b89beb67",
    "summary": "ElicitationManager.js — Particle Realms Protocol elicitation (MCP-inspired): lets a mid-task AI Hub request pause and ask the user a clarifying question instead of guessing. Phase 4 provides the data-layer queue; Phase 8's overlay (ElicitationCard.js) is the UI that calls respond()/decline().",
    "exports": [
      {
        "name": "ElicitationManager",
        "kind": "class",
        "signature": "class ElicitationManager",
        "summary": "ElicitationManager.js — Particle Realms Protocol elicitation (MCP-inspired): lets a mid-task AI Hub request pause and ask the user a clarifying question instead of guessing. Phase 4 provides the data-layer queue; Phase 8's overlay (ElicitationCard.js) is the UI that calls respond()/decline()."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/protocol/ParticleRealmsProtocol",
    "path": "webgpu-os/reference/kernel/protocol/ParticleRealmsProtocol.md",
    "source": "webgpu-os/kernel/protocol/ParticleRealmsProtocol.js",
    "import": "/webgpu-os/kernel/protocol/ParticleRealmsProtocol.js",
    "sourceHash": "5f0973814a18ec7d8e240d1b3e0998e688e94633aae2ab13f3c5378cc12e3010",
    "summary": "ParticleRealmsProtocol.js — the MCP-inspired protocol facade tying together this app's capability/tool/resource/prompt/root/elicitation/sampling registries. Exposed as kernel.protocol; wrapped by syscalls.protocol. An app calls declare(manifest) once (validated against os.AppAICapabilityManifest in OsSchemas.js) to register its tool/resource/ prompt/root metadata for AI discovery. Declaring metadata here is always advisory/self-descriptive — it never grants authority; actual tool execution still goes through ToolRouter's firewall (Phase 3) and actual resource reads still go through ResourceRegistry -> UntrustedBoundary.",
    "exports": [
      {
        "name": "ParticleRealmsProtocol",
        "kind": "class",
        "signature": "class ParticleRealmsProtocol",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/protocol/PromptRegistry",
    "path": "webgpu-os/reference/kernel/protocol/PromptRegistry.md",
    "source": "webgpu-os/kernel/protocol/PromptRegistry.js",
    "import": "/webgpu-os/kernel/protocol/PromptRegistry.js",
    "sourceHash": "e35dff6c75da568a49a0a66c9d44894d14e363fb2cceb74b0b2bcf3d1759827a",
    "summary": "PromptRegistry.js — Particle Realms Protocol named prompt-template catalog (MCP-inspired \"prompts\"). Apps register a render(args) function; the OS owns the final prompt text by always routing rendered output through PromptRegistry.sanitize() before it reaches the AI Hub — an app cannot smuggle raw control tokens or fake role delimiters into the final prompt.",
    "exports": [
      {
        "name": "PromptRegistry",
        "kind": "class",
        "signature": "class PromptRegistry",
        "summary": "PromptRegistry.js — Particle Realms Protocol named prompt-template catalog (MCP-inspired \"prompts\"). Apps register a render(args) function; the OS owns the final prompt text by always routing rendered output through PromptRegistry.sanitize() before it reaches the AI Hub — an app cannot smuggle raw control tokens or fake role delimiters into the final prompt."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/protocol/ResourceRegistry",
    "path": "webgpu-os/reference/kernel/protocol/ResourceRegistry.md",
    "source": "webgpu-os/kernel/protocol/ResourceRegistry.js",
    "import": "/webgpu-os/kernel/protocol/ResourceRegistry.js",
    "sourceHash": "33997e5fe13b23edb75bd56f93effa4ba37cd34a563684ff5697483a26b112fa",
    "summary": "ResourceRegistry.js — Particle Realms Protocol resource catalog. Apps expose readable data to the AI Hub under a `<appId>://...` URI scheme (MCP-inspired \"resources\"). Every read is routed through engine/state/worldmodel/UntrustedBoundary.js (Phase 3 reuse) before it's handed back — resource content is always an untrusted observation, never authority, regardless of how much the reading app trusts its own data.",
    "exports": [
      {
        "name": "ResourceRegistry",
        "kind": "class",
        "signature": "class ResourceRegistry",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/protocol/RootBoundaryManager",
    "path": "webgpu-os/reference/kernel/protocol/RootBoundaryManager.md",
    "source": "webgpu-os/kernel/protocol/RootBoundaryManager.js",
    "import": "/webgpu-os/kernel/protocol/RootBoundaryManager.js",
    "sourceHash": "880f1f0826c971c28c8f7d090a300a6dacd149e0e4835be9eac33644b0c7839a",
    "summary": "RootBoundaryManager.js — Particle Realms Protocol \"roots\" (MCP-inspired): the set of resource URI prefixes an app has declared as in-scope for a given AI request. Roots only ever NARROW what an OS.ai() request may touch — they are advisory scoping on top of (never a substitute for) the ResourceRegistry/RuleGraph capability checks.",
    "exports": [
      {
        "name": "RootBoundaryManager",
        "kind": "class",
        "signature": "class RootBoundaryManager",
        "summary": "RootBoundaryManager.js — Particle Realms Protocol \"roots\" (MCP-inspired): the set of resource URI prefixes an app has declared as in-scope for a given AI request. Roots only ever NARROW what an OS.ai() request may touch — they are advisory scoping on top of (never a substitute for) the ResourceRegistry/RuleGraph capability checks."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/protocol/SamplingBroker",
    "path": "webgpu-os/reference/kernel/protocol/SamplingBroker.md",
    "source": "webgpu-os/kernel/protocol/SamplingBroker.js",
    "import": "/webgpu-os/kernel/protocol/SamplingBroker.js",
    "sourceHash": "7b7990b60f293039cd0b707de5bc4192670e0d3f897d48a5215774636283bacf",
    "summary": "SamplingBroker.js — Particle Realms Protocol sampling (MCP-inspired): lets a TOOL handler request a nested LLM completion mid-execution (the inverse of a normal OS.ai() call). Every sample enters the full AI executor, which creates a model-neutral Navi task and applies Covenant disclosure, resource, tool-firewall, verification, and receipt policy. There is no raw AI Hub fallback. A hard recursion-depth guard prevents sampling loops.",
    "exports": [
      {
        "name": "SamplingBroker",
        "kind": "class",
        "signature": "class SamplingBroker",
        "summary": "SamplingBroker.js — Particle Realms Protocol sampling (MCP-inspired): lets a TOOL handler request a nested LLM completion mid-execution (the inverse of a normal OS.ai() call). Every sample enters the full AI executor, which creates a model-neutral Navi task and applies Covenant disclosure, resource, tool-firewall, verification, and receipt policy. There is no raw AI Hub fallback. A hard recursion-depth guard prevents sampling loops."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/protocol/ToolRegistry",
    "path": "webgpu-os/reference/kernel/protocol/ToolRegistry.md",
    "source": "webgpu-os/kernel/protocol/ToolRegistry.js",
    "import": "/webgpu-os/kernel/protocol/ToolRegistry.js",
    "sourceHash": "ac2c2da55b1318bf0136adba98ae6ac9e2e2188161b3a1816481b1eb3c5cff07",
    "summary": "ToolRegistry.js — Particle Realms Protocol tool catalog. Distinct from kernel.toolDriver (the low-level execute/history engine, see webgpu-os/kernel/ToolDriver.js) and kernel.toolRouter (the AI Tool Firewall, see webgpu-os/kernel/tools/ToolRouter.js): this is the per-app CATALOG that says \"this app opts this already-registered tool into AI discovery\", so the AI Hub's two-pass execution loop (Phase 9) knows which tools are legal for a given app's request. Declaring a tool here never bypasses ToolRouter's firewall — it only makes the tool visible/offered.",
    "exports": [
      {
        "name": "ToolRegistry",
        "kind": "class",
        "signature": "class ToolRegistry",
        "summary": "ToolRegistry.js — Particle Realms Protocol tool catalog. Distinct from kernel.toolDriver (the low-level execute/history engine, see webgpu-os/kernel/ToolDriver.js) and kernel.toolRouter (the AI Tool Firewall, see webgpu-os/kernel/tools/ToolRouter.js): this is the per-app CATALOG that says \"this app opts this already-registered tool into AI discovery\", so the AI Hub's two-pass execution loop (Phase 9) knows which tools are legal for a given app's request. Declaring a tool here never bypasses ToolRouter's firewall — it only makes the tool visible/offered."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/schema/BinaryPack",
    "path": "webgpu-os/reference/kernel/schema/BinaryPack.md",
    "source": "webgpu-os/kernel/schema/BinaryPack.js",
    "import": "/webgpu-os/kernel/schema/BinaryPack.js",
    "sourceHash": "4262b8e5307be8cfc125635795baa0c2ba62b440454e41658931d098b6583455",
    "summary": "BinaryPack.js — custom binary codec, zero external dependencies. Wire format: MessagePack specification (https://msgpack.org/index.html) Implemented from spec only — not copied from any library. API: pack(value)         → Uint8Array unpack(buf)         → value packToBase64(value) → string  (base64-encoded packed bytes) unpackBase64(str)   → value Supported types: null / undefined → nil boolean          → true / false integer (safe)   → positive/negative fixint, uint8-32, int8-32 float            → float64 string           → fixstr / str8 / str16 / str32 Uint8Array       → bin8 / bin16 / bin32 Array            → fixarray / array16 / array32 Object (plain)   → fixmap / map16 / map32 Byte layout (big-endian throughout, per spec): 0x00–0x7f  positive fixint 0x80–0x8f  fixmap   (N = low nibble) 0x90–0x9f  fixarray (N = low nibble) 0xa0–0xbf  fixstr   (N = low 5 bits) 0xc0       nil 0xc2       false 0xc3       true 0xc4–0xc6  bin8 / bin16 / bin32 0xca       float32   (encode uses float64 for precision) 0xcb       float64 0xcc–0xcf  uint8 / uint16 / uint32 / uint64* 0xd0–0xd3  int8  / int16  / int32  / int64* 0xd9–0xdb  str8  / str16  / str32 0xdc–0xdd  array16 / array32 0xde–0xdf  map16   / map32 0xe0–0xff  negative fixint * int64/uint64 are encoded as float64 when |v| > 2^32 (JS safe integer limit).",
    "exports": [
      {
        "name": "BinaryPackError",
        "kind": "class",
        "signature": "class BinaryPackError extends Error",
        "summary": ""
      },
      {
        "name": "pack",
        "kind": "function",
        "signature": "pack(value)",
        "summary": "Encode any JS value to a Uint8Array (MessagePack wire format)."
      },
      {
        "name": "unpack",
        "kind": "function",
        "signature": "unpack(buf)",
        "summary": "Decode a Uint8Array or ArrayBuffer from MessagePack wire format."
      },
      {
        "name": "packToBase64",
        "kind": "function",
        "signature": "packToBase64(value)",
        "summary": "Pack and base64-encode — useful for JSON embedding and localStorage."
      },
      {
        "name": "unpackBase64",
        "kind": "function",
        "signature": "unpackBase64(str)",
        "summary": "Decode a base64-encoded pack string."
      },
      {
        "name": "packedSize",
        "kind": "function",
        "signature": "packedSize(value)",
        "summary": "Return the packed byte-size of a value without keeping the buffer."
      },
      {
        "name": "packEqual",
        "kind": "function",
        "signature": "packEqual(a, b)",
        "summary": "Compare two values by structural equality using pack → byte comparison."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/schema/OsSchemas",
    "path": "webgpu-os/reference/kernel/schema/OsSchemas.md",
    "source": "webgpu-os/kernel/schema/OsSchemas.js",
    "import": "/webgpu-os/kernel/schema/OsSchemas.js",
    "sourceHash": "2f669ecae768910432dc1cdd7431018bbde6b2154b6326d94b508474b3242836",
    "summary": "OsSchemas.js — all OS-level schema definitions. Registers schemas into the shared SchemaRegistry singleton. Call initOsSchemas() once during KernelBootstrap. Registered names: os.AppManifest      — app discovery manifest (manifest.json) os.AppSetting       — one settings descriptor inside a manifest os.ModManifest      — mod discovery manifest os.ModHook          — one hook entry in a mod manifest os.IPCMessage       — IPC channel message envelope os.VFSNode          — virtual filesystem node metadata os.GPUSurface       — GPU surface descriptor os.VRAMEntry        — per-app VRAM usage report os.ProcessEntry     — process table entry os.PermissionCheck  — permission check result os.Particle         — particle struct for binary packing (6 × f32) os.ParticleBatch    — array of particles os.NetPeerMessage   — envelope sent between OS peers via NetDriver os.AppAICapabilityManifest — Particle Realms Protocol tool/resource/prompt/root declaration",
    "exports": [
      {
        "name": "initOsSchemas",
        "kind": "function",
        "signature": "initOsSchemas()",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/schema/SchemaRegistry",
    "path": "webgpu-os/reference/kernel/schema/SchemaRegistry.md",
    "source": "webgpu-os/kernel/schema/SchemaRegistry.js",
    "import": "/webgpu-os/kernel/schema/SchemaRegistry.js",
    "sourceHash": "58a417fe4294d929b3964f2145285f943ddf5e41e0f38763c6394645a196f0d7",
    "summary": "SchemaRegistry.js — named schema store with validation and binary packing. Acts as the central authority for all schema definitions in the OS. Schemas are registered by name and resolved by $ref. Features: - Named schema registration and lookup - validate(name, data)   → { valid, errors } - assert(name, data)     → throws SchemaValidationError if invalid - pack(name, data)       → Uint8Array (validates then binary-packs) - unpack(name, buf)      → value (binary-unpacks then validates) - packAny(data)          → Uint8Array (binary-packs without schema) - unpackAny(buf)         → value (binary-unpacks without validation) Usage: import { schemaRegistry as sr } from './SchemaRegistry.js'; sr.define('myapp.MyType', { type: 'object', required: ['id'], properties: { id: { type: 'string' } } }); sr.assert('myapp.MyType', { id: 'abc' }); const bytes = sr.pack('myapp.MyType', { id: 'abc' });",
    "exports": [
      {
        "name": "SchemaRegistry",
        "kind": "class",
        "signature": "class SchemaRegistry",
        "summary": ""
      },
      {
        "name": "schemaRegistry",
        "kind": "constant",
        "signature": "schemaRegistry",
        "summary": ""
      },
      {
        "name": "SchemaValidationError",
        "kind": "re-export",
        "signature": "SchemaValidationError",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/schema/SchemaValidator",
    "path": "webgpu-os/reference/kernel/schema/SchemaValidator.md",
    "source": "webgpu-os/kernel/schema/SchemaValidator.js",
    "import": "/webgpu-os/kernel/schema/SchemaValidator.js",
    "sourceHash": "a1d18ba37dbd527c95c55c3400311b73cfcbffef7e620b85666f9b1a8e38145f",
    "summary": "SchemaValidator.js — JSON Schema (subset) validator, zero dependencies. Supported keywords: type              string | number | integer | boolean | null | array | object | 'any' properties        { key: schema } required          string[] additionalProperties  boolean | schema (false = deny unknown keys) items             schema (all elements) or schema[] (positional) minLength / maxLength / pattern   (string) minimum / maximum / exclusiveMinimum / exclusiveMaximum / multipleOf  (number) minItems / maxItems   (array) minProperties / maxProperties     (object) const             exact value match enum              allowed values list oneOf / anyOf / allOf / not nullable          shorthand — wraps schema as oneOf:[schema,{type:'null'}] $ref              string — resolved via refResolver(name) Usage: const v = new SchemaValidator(refResolver); const { valid, errors } = v.validate(data, schema); v.assert(data, schema, 'MyContext'); // throws SchemaValidationError",
    "exports": [
      {
        "name": "SchemaValidationError",
        "kind": "class",
        "signature": "class SchemaValidationError extends Error",
        "summary": "SchemaValidator.js — JSON Schema (subset) validator, zero dependencies. Supported keywords: type              string | number | integer | boolean | null | array | object | 'any' properties        { key: schema } required          string[] additionalProperties  boolean | schema (false = deny unknown keys) items             schema (all elements) or schema[] (positional) minLength / maxLength / pattern   (string) minimum / maximum / exclusiveMinimum / exclusiveMaximum / multipleOf  (number) minItems / maxItems   (array) minProperties / maxProperties     (object) const             exact value match enum              allowed values list oneOf / anyOf / allOf / not nullable          shorthand — wraps schema as oneOf:[schema,{type:'null'}] $ref              string — resolved via refResolver(name) Usage: const v = new SchemaValidator(refResolver); const { valid, errors } = v.validate(data, schema); v.assert(data, schema, 'MyContext'); // throws SchemaValidationError"
      },
      {
        "name": "SchemaValidator",
        "kind": "class",
        "signature": "class SchemaValidator",
        "summary": ""
      },
      {
        "name": "t",
        "kind": "constant",
        "signature": "t",
        "summary": "Fluent schema type builders for ergonomic schema authoring. import { t } from './SchemaValidator.js'; const schema = t.obj({ name: t.str({ minLength: 1 }), age: t.int({ minimum: 0 }) }, ['name']);"
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/schema/ShellPreferenceRecords",
    "path": "webgpu-os/reference/kernel/schema/ShellPreferenceRecords.md",
    "source": "webgpu-os/kernel/schema/ShellPreferenceRecords.js",
    "import": "/webgpu-os/kernel/schema/ShellPreferenceRecords.js",
    "sourceHash": "b39ba60ac510d4b66aa7959d417b3413cbc1a797c831be5e6f2f5281cff73dd5",
    "summary": "Versioned, schema-specific localStorage records shared by the OS shell. Readers accept the one historical unversioned shape that each preference used before schema versioning. Writers always publish the current envelope and must successfully preflight the existing value before touching storage. Unsupported or corrupt records are therefore quarantined in place.",
    "exports": [
      {
        "name": "readVersionedStorageRecord",
        "kind": "function",
        "signature": "readVersionedStorageRecord(storage, contract, { normalizeLegacy, normalizeCurrent })",
        "summary": "Strictly read a versioned shell preference without ever rewriting it."
      },
      {
        "name": "writeVersionedStorageRecord",
        "kind": "function",
        "signature": "writeVersionedStorageRecord(storage, contract, value, normalizers)",
        "summary": "Preflight the old record, then atomically replace its one localStorage key."
      },
      {
        "name": "readNotificationPreferences",
        "kind": "function",
        "signature": "readNotificationPreferences(storage)",
        "summary": ""
      },
      {
        "name": "writeNotificationPreferences",
        "kind": "function",
        "signature": "writeNotificationPreferences(patch, storage)",
        "summary": ""
      },
      {
        "name": "readUiSoundPreferences",
        "kind": "function",
        "signature": "readUiSoundPreferences(storage)",
        "summary": ""
      },
      {
        "name": "writeUiSoundPreferences",
        "kind": "function",
        "signature": "writeUiSoundPreferences(value, storage)",
        "summary": ""
      },
      {
        "name": "readAudioPreferences",
        "kind": "function",
        "signature": "readAudioPreferences(storage)",
        "summary": ""
      },
      {
        "name": "writeAudioPreferences",
        "kind": "function",
        "signature": "writeAudioPreferences(value, storage)",
        "summary": ""
      },
      {
        "name": "readAmbientPreferences",
        "kind": "function",
        "signature": "readAmbientPreferences(storage)",
        "summary": ""
      },
      {
        "name": "writeAmbientPreferences",
        "kind": "function",
        "signature": "writeAmbientPreferences(config, storage)",
        "summary": ""
      },
      {
        "name": "readDeepLinkPreferences",
        "kind": "function",
        "signature": "readDeepLinkPreferences(storage)",
        "summary": ""
      },
      {
        "name": "writeDeepLinkPreferences",
        "kind": "function",
        "signature": "writeDeepLinkPreferences(value, storage)",
        "summary": ""
      },
      {
        "name": "readWindowStateCache",
        "kind": "function",
        "signature": "readWindowStateCache(storage)",
        "summary": ""
      },
      {
        "name": "writeWindowStateCache",
        "kind": "function",
        "signature": "writeWindowStateCache(states, storage)",
        "summary": ""
      },
      {
        "name": "readAiOverlayPosition",
        "kind": "function",
        "signature": "readAiOverlayPosition(storage)",
        "summary": ""
      },
      {
        "name": "writeAiOverlayPosition",
        "kind": "function",
        "signature": "writeAiOverlayPosition(position, storage)",
        "summary": ""
      },
      {
        "name": "readSyncRulePreferences",
        "kind": "function",
        "signature": "readSyncRulePreferences(storage)",
        "summary": ""
      },
      {
        "name": "writeSyncRulePreferences",
        "kind": "function",
        "signature": "writeSyncRulePreferences(rules, storage)",
        "summary": ""
      },
      {
        "name": "readStartMenuPreferences",
        "kind": "function",
        "signature": "readStartMenuPreferences(storage)",
        "summary": ""
      },
      {
        "name": "writeStartMenuPreferences",
        "kind": "function",
        "signature": "writeStartMenuPreferences(patch, storage)",
        "summary": ""
      },
      {
        "name": "SHELL_PREFERENCE_CONTRACTS",
        "kind": "constant",
        "signature": "SHELL_PREFERENCE_CONTRACTS",
        "summary": ""
      },
      {
        "name": "START_MENU_LEGACY_KEYS",
        "kind": "constant",
        "signature": "START_MENU_LEGACY_KEYS",
        "summary": ""
      },
      {
        "name": "START_MENU_DEFAULTS",
        "kind": "constant",
        "signature": "START_MENU_DEFAULTS",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/schema/index",
    "path": "webgpu-os/reference/kernel/schema/index.md",
    "source": "webgpu-os/kernel/schema/index.js",
    "import": "/webgpu-os/kernel/schema/index.js",
    "sourceHash": "9de38443bde477634031b838b981dec98f2234313e885c0b39b5601c4ab2a2fa",
    "summary": "kernel/schema/index.js — barrel export for the OS schema system. Usage (anywhere in the OS): import { schemaRegistry, t, pack, unpack } from '../schema/index.js';",
    "exports": [
      {
        "name": "BinaryPackError",
        "kind": "re-export",
        "signature": "BinaryPackError",
        "summary": ""
      },
      {
        "name": "SchemaRegistry",
        "kind": "re-export",
        "signature": "SchemaRegistry",
        "summary": ""
      },
      {
        "name": "SchemaValidationError",
        "kind": "re-export",
        "signature": "SchemaValidationError",
        "summary": ""
      },
      {
        "name": "SchemaValidator",
        "kind": "re-export",
        "signature": "SchemaValidator",
        "summary": ""
      },
      {
        "name": "initOsSchemas",
        "kind": "re-export",
        "signature": "initOsSchemas",
        "summary": ""
      },
      {
        "name": "pack",
        "kind": "re-export",
        "signature": "pack",
        "summary": ""
      },
      {
        "name": "packEqual",
        "kind": "re-export",
        "signature": "packEqual",
        "summary": ""
      },
      {
        "name": "packToBase64",
        "kind": "re-export",
        "signature": "packToBase64",
        "summary": ""
      },
      {
        "name": "packedSize",
        "kind": "re-export",
        "signature": "packedSize",
        "summary": ""
      },
      {
        "name": "schemaRegistry",
        "kind": "re-export",
        "signature": "schemaRegistry",
        "summary": ""
      },
      {
        "name": "t",
        "kind": "re-export",
        "signature": "t",
        "summary": ""
      },
      {
        "name": "unpack",
        "kind": "re-export",
        "signature": "unpack",
        "summary": ""
      },
      {
        "name": "unpackBase64",
        "kind": "re-export",
        "signature": "unpackBase64",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/state/AppStateChannelAdapter",
    "path": "webgpu-os/reference/kernel/state/AppStateChannelAdapter.md",
    "source": "webgpu-os/kernel/state/AppStateChannelAdapter.js",
    "import": "/webgpu-os/kernel/state/AppStateChannelAdapter.js",
    "sourceHash": "2e033f6c464e5253365625d2c8951f651655b96dfabc02d347d60295338ac22f",
    "summary": "CSE-backed State Channel authority for an app-owned AppStateEngine key. AppStateEngine remains the source of truth and its expectedVersion is the compare-and-swap fence for every accepted intent.",
    "exports": [
      {
        "name": "AppStateChannelAdapter",
        "kind": "class",
        "signature": "class AppStateChannelAdapter",
        "summary": "CSE-backed State Channel authority for an app-owned AppStateEngine key. AppStateEngine remains the source of truth and its expectedVersion is the compare-and-swap fence for every accepted intent."
      },
      {
        "name": "createAppStateChannelAdapter",
        "kind": "function",
        "signature": "createAppStateChannelAdapter(options)",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/state/AppStateEngine",
    "path": "webgpu-os/reference/kernel/state/AppStateEngine.md",
    "source": "webgpu-os/kernel/state/AppStateEngine.js",
    "import": "/webgpu-os/kernel/state/AppStateEngine.js",
    "sourceHash": "97de0c4a8d7abd4eaf928adecf72b28be77eee0aa7ba7a1e8536dba2147766d6",
    "summary": "AppStateEngine — app-scoped CSE state exposed through guarded syscalls. Logical values are immutable EntityRegistry versions. Every successful write is HLC-stamped and appended to a shared hash-chained EventLog. Apps never receive the registry or log directly; Syscalls injects the authenticated appId so a caller cannot address another app's state.",
    "exports": [
      {
        "name": "AppStateEngine",
        "kind": "class",
        "signature": "class AppStateEngine",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/storylets/AIStoryletFactory",
    "path": "webgpu-os/reference/kernel/storylets/AIStoryletFactory.md",
    "source": "webgpu-os/kernel/storylets/AIStoryletFactory.js",
    "import": "/webgpu-os/kernel/storylets/AIStoryletFactory.js",
    "sourceHash": "bd18259a7ee0cf884ffcd2accb82c07a46e2083877f669a40b7f0310be9d5af1",
    "summary": "AIStoryletFactory.js — defines the OS's AI-pipeline storylets via the existing createStorylet() from engine/gameplay/narrative/StoryGraph.js. Each storylet gates on the request worldState's `phase` and advances it; Phase 9's two-pass execution loop drives StoryletRuntime.tick() with these. Pipeline phases: received → classified → contextGathered → capabilitiesNegotiated → tierChosen → planned → executed → finalized  (+ 'malformed' → repair) Handlers are injected (not hardcoded) so the factory stays a pure catalog; every handler receives the worldState and returns a storylet result ({ phase, facts?, observations?, ... } — see StoryletEffectsApplier).",
    "exports": [
      {
        "name": "AIStoryletFactory",
        "kind": "class",
        "signature": "class AIStoryletFactory",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/storylets/AdversarialFixtures",
    "path": "webgpu-os/reference/kernel/storylets/AdversarialFixtures.md",
    "source": "webgpu-os/kernel/storylets/AdversarialFixtures.js",
    "import": "/webgpu-os/kernel/storylets/AdversarialFixtures.js",
    "sourceHash": "b28ecd0f4b486a8d81c036b7600a1005aaca2d6f46a8df4a642b3d15e76de29a",
    "summary": "AdversarialFixtures.js — the canned adversarial test list for the Phase 14 storylet harness. Two families: 1. DESCRIPTOR fixtures — malformed/poisoned storylet DEFINITIONS that must fail StoryletDescriptorSanitizer.scan (prompt injection, bad id, wrong handler types). 2. WORLDSTATE fixtures — hostile task states a well-formed storylet must handle safely: missing tools, poisoned resource/descriptor text, hidden params, a changed attestation hash, a bad mass ratio, an exploding joint. These are DATA only; the runner decides pass/fail. `expectSafe` means the storylet must NOT trigger (or must trigger and return a rejecting result) — never silently proceed as if the state were trustworthy.",
    "exports": [
      {
        "name": "DESCRIPTOR_FIXTURES",
        "kind": "constant",
        "signature": "DESCRIPTOR_FIXTURES",
        "summary": "Poisoned/malformed storylet definitions — must fail sanitization."
      },
      {
        "name": "WORLDSTATE_FIXTURES",
        "kind": "constant",
        "signature": "WORLDSTATE_FIXTURES",
        "summary": "Hostile task worldStates — a well-formed storylet must handle each safely."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/storylets/NaviTaskEpisodeRuntime",
    "path": "webgpu-os/reference/kernel/storylets/NaviTaskEpisodeRuntime.md",
    "source": "webgpu-os/kernel/storylets/NaviTaskEpisodeRuntime.js",
    "import": "/webgpu-os/kernel/storylets/NaviTaskEpisodeRuntime.js",
    "sourceHash": "3aeeae7fdb42b9fbe528ed87347dd548eebd750a23ba5188dc37a97e2e26ea3d",
    "summary": "NaviTaskEpisodeRuntime.js — deterministic, resumable task episodes for onboarding, approvals, recovery, provider failure, handoff, and long builds. Episode actions are data-only proposals. This runtime cannot execute tools, grant authority, force-fire Storylets, or choose a random transition.",
    "exports": [
      {
        "name": "NaviTaskEpisodeRuntime",
        "kind": "class",
        "signature": "class NaviTaskEpisodeRuntime",
        "summary": ""
      },
      {
        "name": "validateEpisodeSnapshot",
        "kind": "function",
        "signature": "async validateEpisodeSnapshot(snapshot)",
        "summary": ""
      },
      {
        "name": "NAVI_TASK_EPISODE_FORMATS",
        "kind": "constant",
        "signature": "NAVI_TASK_EPISODE_FORMATS",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/storylets/OSEventGraphAdapter",
    "path": "webgpu-os/reference/kernel/storylets/OSEventGraphAdapter.md",
    "source": "webgpu-os/kernel/storylets/OSEventGraphAdapter.js",
    "import": "/webgpu-os/kernel/storylets/OSEventGraphAdapter.js",
    "sourceHash": "45179b51a1dded1b7f79005ff521980391d5566e3b0d63db41582dec0a1c0deb",
    "summary": "OSEventGraphAdapter.js — minimal `{ emit(event) }` shim satisfying StoryGraph's expected EventGraph collaborator (engine/gameplay/core/ EventGraph.js doesn't exist yet). Fired storylet events are: 1. re-emitted on the kernel event bus as `storylet:<type>`, 2. kept in a bounded in-memory log, and 3. forwarded to the Task Ledger's event/observation log once Phase 8 attaches it via setLedger().",
    "exports": [
      {
        "name": "OSEventGraphAdapter",
        "kind": "class",
        "signature": "class OSEventGraphAdapter",
        "summary": "OSEventGraphAdapter.js — minimal `{ emit(event) }` shim satisfying StoryGraph's expected EventGraph collaborator (engine/gameplay/core/ EventGraph.js doesn't exist yet). Fired storylet events are: 1. re-emitted on the kernel event bus as `storylet:<type>`, 2. kept in a bounded in-memory log, and 3. forwarded to the Task Ledger's event/observation log once Phase 8 attaches it via setLedger()."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/storylets/StoryletDescriptorSanitizer",
    "path": "webgpu-os/reference/kernel/storylets/StoryletDescriptorSanitizer.md",
    "source": "webgpu-os/kernel/storylets/StoryletDescriptorSanitizer.js",
    "import": "/webgpu-os/kernel/storylets/StoryletDescriptorSanitizer.js",
    "sourceHash": "b85d05f979977f3d392e2ace75f73534dac103a2f746ee1aa68d766589d6fb42",
    "summary": "StoryletDescriptorSanitizer.js — validates a storylet definition before registration. Reuses Phase 5's DescriptorSanitizer for prompt-injection text scanning (no parallel scanner) and adds storylet-specific structural checks (id shape, handler types, sane numeric gates).",
    "exports": [
      {
        "name": "StoryletDescriptorSanitizer",
        "kind": "class",
        "signature": "class StoryletDescriptorSanitizer",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/storylets/StoryletEffectsApplier",
    "path": "webgpu-os/reference/kernel/storylets/StoryletEffectsApplier.md",
    "source": "webgpu-os/kernel/storylets/StoryletEffectsApplier.js",
    "import": "/webgpu-os/kernel/storylets/StoryletEffectsApplier.js",
    "sourceHash": "983dd1c0789a09a8669a4bf0bdd515be6a2650a91e017a07f94626e6a48bd0e8",
    "summary": "StoryletEffectsApplier.js — applies a storylet execute() result into the Task Ledger / Fact Store instead of game consequences/memories. Facts are monotonic canonical strings (engine/state/facts) — never deleted, only tombstoned — so an AI task's effect history stays audit-stable.",
    "exports": [
      {
        "name": "StoryletEffectsApplier",
        "kind": "class",
        "signature": "class StoryletEffectsApplier",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/storylets/StoryletEligibilityBridge",
    "path": "webgpu-os/reference/kernel/storylets/StoryletEligibilityBridge.md",
    "source": "webgpu-os/kernel/storylets/StoryletEligibilityBridge.js",
    "import": "/webgpu-os/kernel/storylets/StoryletEligibilityBridge.js",
    "sourceHash": "517940d540da9243857cb0f197655560f1ad2b75d43a71efc8daf644e5c5681a",
    "summary": "StoryletEligibilityBridge.js — layers doctrine preconditions on top of StoryGraph's built-in cooldown/maxFires gating by COMPOSING them into a storylet config's canTrigger — no duplicate eligibility engine. Doctrine gates only ever NARROW eligibility (canTrigger && doctrine), never widen it. Doctrine fields: preconditions:      [(worldState) => boolean]  — all must pass allowedTools:       [string]  — worldState.requestedTool must be listed (if set) allowedResources:   [string]  — worldState.requestedResource must match a prefix (if set) capabilityRequired: string    — checked via kernel.permissions (RuleGraph)",
    "exports": [
      {
        "name": "StoryletEligibilityBridge",
        "kind": "class",
        "signature": "class StoryletEligibilityBridge",
        "summary": "StoryletEligibilityBridge.js — layers doctrine preconditions on top of StoryGraph's built-in cooldown/maxFires gating by COMPOSING them into a storylet config's canTrigger — no duplicate eligibility engine. Doctrine gates only ever NARROW eligibility (canTrigger && doctrine), never widen it. Doctrine fields: preconditions:      [(worldState) => boolean]  — all must pass allowedTools:       [string]  — worldState.requestedTool must be listed (if set) allowedResources:   [string]  — worldState.requestedResource must match a prefix (if set) capabilityRequired: string    — checked via kernel.permissions (RuleGraph)"
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/storylets/StoryletFailureHandler",
    "path": "webgpu-os/reference/kernel/storylets/StoryletFailureHandler.md",
    "source": "webgpu-os/kernel/storylets/StoryletFailureHandler.js",
    "import": "/webgpu-os/kernel/storylets/StoryletFailureHandler.js",
    "sourceHash": "18e0e66abe64ffbda625fa3c6f451566beb7bdfd758db1fcb35bdc542cb3e43d",
    "summary": "StoryletFailureHandler.js — storylet-chain rollback: delegates to the generic time/RollbackEngine.js (the single Saga.js wrapper — forward + compensating actions, irreversible pivot) and adds storylet-specific logging + kernel eventing. If a step fails before the pivot, completed steps are compensated in reverse; past the pivot the failure is surfaced (FAILED_PIVOTED) for repair instead of silently undone.",
    "exports": [
      {
        "name": "StoryletFailureHandler",
        "kind": "class",
        "signature": "class StoryletFailureHandler",
        "summary": ""
      },
      {
        "name": "SAGA_STATUS",
        "kind": "re-export",
        "signature": "SAGA_STATUS",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/storylets/StoryletRuntime",
    "path": "webgpu-os/reference/kernel/storylets/StoryletRuntime.md",
    "source": "webgpu-os/kernel/storylets/StoryletRuntime.js",
    "import": "/webgpu-os/kernel/storylets/StoryletRuntime.js",
    "sourceHash": "42bd85e52ad5ffbdfa6d304b0f544f8de748f0d7a1cc28c557188f2832327673",
    "summary": "StoryletRuntime.js — thin facade constructing `new StoryGraph(adapter)` from engine/gameplay/narrative/StoryGraph.js; exposes register/registerAll/tick/ getAll. Forced execution is intentionally named as a trusted test/recovery operation so it is never advertised as a model-authored Storylet ability. Here \"worldState\" is AI task/goal state (an OS.ai() request's pipeline phase), not game state.",
    "exports": [
      {
        "name": "StoryletRuntime",
        "kind": "class",
        "signature": "class StoryletRuntime",
        "summary": ""
      },
      {
        "name": "createStorylet",
        "kind": "re-export",
        "signature": "createStorylet",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/storylets/StoryletTestRunner",
    "path": "webgpu-os/reference/kernel/storylets/StoryletTestRunner.md",
    "source": "webgpu-os/kernel/storylets/StoryletTestRunner.js",
    "import": "/webgpu-os/kernel/storylets/StoryletTestRunner.js",
    "sourceHash": "409a523f2a267c4ca5fa0e0c6e60653ce3b6d3090388a36ef7121761db0ccd25",
    "summary": "StoryletTestRunner.js — the Phase 14 storylet test harness. Runs a storylet definition against fixture worldStates on an ISOLATED StoryletRuntime (never the live kernel.storylets graph) and reports trigger/execute outcomes. Also runs the canned adversarial suite (AdversarialFixtures): poisoned descriptors must fail sanitization, and hostile worldStates must be handled safely (rejected or refused — never silently obeyed).",
    "exports": [
      {
        "name": "StoryletTestRunner",
        "kind": "class",
        "signature": "class StoryletTestRunner",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/storylets/StoryletVersionManager",
    "path": "webgpu-os/reference/kernel/storylets/StoryletVersionManager.md",
    "source": "webgpu-os/kernel/storylets/StoryletVersionManager.js",
    "import": "/webgpu-os/kernel/storylets/StoryletVersionManager.js",
    "sourceHash": "8f7d6fe3cb73dac35d71d25300844ab1be03a7ef64d2ee28091400698ef78ca2",
    "summary": "StoryletVersionManager.js — tracks versions of registered storylet definitions so a definition can be upgraded in place and rolled back if the new version misbehaves. Purely in-memory version history keyed by storylet id; the runtime re-registers whichever config version is current.",
    "exports": [
      {
        "name": "StoryletVersionManager",
        "kind": "class",
        "signature": "class StoryletVersionManager",
        "summary": "StoryletVersionManager.js — tracks versions of registered storylet definitions so a definition can be upgraded in place and rolled back if the new version misbehaves. Purely in-memory version history keyed by storylet id; the runtime re-registers whichever config version is current."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/terminal/TerminalCommandContract",
    "path": "webgpu-os/reference/kernel/terminal/TerminalCommandContract.md",
    "source": "webgpu-os/kernel/terminal/TerminalCommandContract.js",
    "import": "/webgpu-os/kernel/terminal/TerminalCommandContract.js",
    "sourceHash": "64dfde6e50b4767e5c00729bca2191413577868a46eead6e8c5589a6b3b7f352",
    "summary": "Canonical WebGPU OS terminal grammar shared by the interactive Terminal app and the read-only AI tool bridge. This is intentionally not a host shell.",
    "exports": [
      {
        "name": "parseWebGpuOsTerminalCommand",
        "kind": "function",
        "signature": "parseWebGpuOsTerminalCommand(raw, { surface = 'interactive' } = {})",
        "summary": ""
      },
      {
        "name": "formatWebGpuOsTerminalHelp",
        "kind": "function",
        "signature": "formatWebGpuOsTerminalHelp({ surface = 'interactive', json = false } = {})",
        "summary": ""
      },
      {
        "name": "terminalVfsPath",
        "kind": "function",
        "signature": "terminalVfsPath(value)",
        "summary": ""
      },
      {
        "name": "terminalCommandError",
        "kind": "function",
        "signature": "terminalCommandError(code, message, suggestion = '')",
        "summary": ""
      },
      {
        "name": "TERMINAL_MUTATION_COMMANDS",
        "kind": "constant",
        "signature": "TERMINAL_MUTATION_COMMANDS",
        "summary": ""
      },
      {
        "name": "TERMINAL_HOST_COMMANDS",
        "kind": "constant",
        "signature": "TERMINAL_HOST_COMMANDS",
        "summary": ""
      },
      {
        "name": "WEBGPU_OS_TERMINAL_COMMANDS",
        "kind": "constant",
        "signature": "WEBGPU_OS_TERMINAL_COMMANDS",
        "summary": ""
      },
      {
        "name": "WEBGPU_OS_TOOL_TERMINAL_HELP",
        "kind": "constant",
        "signature": "WEBGPU_OS_TOOL_TERMINAL_HELP",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/time/CausalClock",
    "path": "webgpu-os/reference/kernel/time/CausalClock.md",
    "source": "webgpu-os/kernel/time/CausalClock.js",
    "import": "/webgpu-os/kernel/time/CausalClock.js",
    "sourceHash": "d44364f6c3f10ba71c27110d8d2e350281bc582e5c9bd2d0a0fc9b31d3bde96c",
    "summary": "CausalClock.js — thin wrapper over engine/state/causal/HLC.js (Hybrid Logical Clock). Orders AI task events causally while staying readable as wall time. Per CSE rule 11: a timestamp NEVER establishes authority — the commit gate decides truth; this only orders.",
    "exports": [
      {
        "name": "CausalClock",
        "kind": "class",
        "signature": "class CausalClock",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/time/CheckpointManager",
    "path": "webgpu-os/reference/kernel/time/CheckpointManager.md",
    "source": "webgpu-os/kernel/time/CheckpointManager.js",
    "import": "/webgpu-os/kernel/time/CheckpointManager.js",
    "sourceHash": "561d41e5b70f1cd5b7a5033fa9053257289a14e94900ed9765f5fb6bbb469af0",
    "summary": "CheckpointManager.js — wraps engine/state/integrity/Checkpoint.js (makeCheckpoint/verifyCheckpoint) over the shared OS event log. Checkpoints summarize history without pretending it never existed: each links to its predecessor and pins the event-log head + state root at that point.",
    "exports": [
      {
        "name": "CheckpointManager",
        "kind": "class",
        "signature": "class CheckpointManager",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/time/CooldownManager",
    "path": "webgpu-os/reference/kernel/time/CooldownManager.md",
    "source": "webgpu-os/kernel/time/CooldownManager.js",
    "import": "/webgpu-os/kernel/time/CooldownManager.js",
    "sourceHash": "e5ff7fc85a92faef855cab3ab0b79b0db6d5763e2c99c42b03194b894ccebc24",
    "summary": "CooldownManager.js — wraps engine/state/consistency/Reservation.js (ReservationManager over a USORegistry + BoundedCounterEscrow). Cooldowns are reservations: reserving a scarce AI resource (model budget, tool slot) creates a single-use output that is consumed on commit or released on expiry — it can never be honored twice. Escrows divide a budget among holders for coordination-free local spending.",
    "exports": [
      {
        "name": "CooldownManager",
        "kind": "class",
        "signature": "class CooldownManager",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/time/DependencyScheduler",
    "path": "webgpu-os/reference/kernel/time/DependencyScheduler.md",
    "source": "webgpu-os/kernel/time/DependencyScheduler.js",
    "import": "/webgpu-os/kernel/time/DependencyScheduler.js",
    "sourceHash": "831af535b3b2ebfe00f1eaf79d112d6c55f8780b9876ceeac682fca06d02ec5a",
    "summary": "DependencyScheduler.js — dependency-ordered task readiness (Kahn-style). Tracks tasks with dependency edges and answers \"what can run now?\": a task is ready once every dependency has completed. Cycles are rejected at add time so a plan can never deadlock on itself.",
    "exports": [
      {
        "name": "DependencyScheduler",
        "kind": "class",
        "signature": "class DependencyScheduler",
        "summary": ""
      },
      {
        "name": "TASK_STATE",
        "kind": "re-export",
        "signature": "TASK_STATE",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/time/ExpirationManager",
    "path": "webgpu-os/reference/kernel/time/ExpirationManager.md",
    "source": "webgpu-os/kernel/time/ExpirationManager.js",
    "import": "/webgpu-os/kernel/time/ExpirationManager.js",
    "sourceHash": "71fb7d575bc29d00ef0a1e918edf1df56196b40f70f2831a8dce7183ecbbd435",
    "summary": "ExpirationManager.js — TTL tracking for short-lived AI artifacts (capabilities, elicitations, pending approvals). Sweep-based (no timers per item): callers invoke sweep() periodically or before authorization checks; expired items run their onExpire callback exactly once and are removed.",
    "exports": [
      {
        "name": "ExpirationManager",
        "kind": "class",
        "signature": "class ExpirationManager",
        "summary": "ExpirationManager.js — TTL tracking for short-lived AI artifacts (capabilities, elicitations, pending approvals). Sweep-based (no timers per item): callers invoke sweep() periodically or before authorization checks; expired items run their onExpire callback exactly once and are removed."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/time/FactConflictResolver",
    "path": "webgpu-os/reference/kernel/time/FactConflictResolver.md",
    "source": "webgpu-os/kernel/time/FactConflictResolver.js",
    "import": "/webgpu-os/kernel/time/FactConflictResolver.js",
    "sourceHash": "ae8abda64161f0214974f9751a9db4e834030bc38053bba3e1b38b31c82c167f",
    "summary": "FactConflictResolver.js — detects and resolves conflicting live facts on the monotonic FactStore. Detection reuses the CSE constraint helpers (engine/state/facts/Constraints.js: validateFacts/atMostOne/ mutuallyExclusive) — no parallel constraint engine. Resolution tombstones losers via a caller-supplied preference; a constraint never repairs on its own (CSE law), so resolution here is an explicit, logged act.",
    "exports": [
      {
        "name": "FactConflictResolver",
        "kind": "class",
        "signature": "class FactConflictResolver",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/time/FactInvalidationEngine",
    "path": "webgpu-os/reference/kernel/time/FactInvalidationEngine.md",
    "source": "webgpu-os/kernel/time/FactInvalidationEngine.js",
    "import": "/webgpu-os/kernel/time/FactInvalidationEngine.js",
    "sourceHash": "1b714bc3e897679d82144aabea538b625c61847b6532534c522c14a3f0bbc33d",
    "summary": "FactInvalidationEngine.js — namespaced `invalidatedBy` rules layered on the monotonic FactStore (engine/state/facts): adding a fact whose predicate has invalidation rules TOMBSTONES (never deletes) currently-live facts with the listed predicates. e.g. rule('planReady', ['planDraft']) — a new planReady fact revokes any live planDraft facts. History stays intact.",
    "exports": [
      {
        "name": "FactInvalidationEngine",
        "kind": "class",
        "signature": "class FactInvalidationEngine",
        "summary": "FactInvalidationEngine.js — namespaced `invalidatedBy` rules layered on the monotonic FactStore (engine/state/facts): adding a fact whose predicate has invalidation rules TOMBSTONES (never deletes) currently-live facts with the listed predicates. e.g. rule('planReady', ['planDraft']) — a new planReady fact revokes any live planDraft facts. History stays intact."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/time/IdempotencyManager",
    "path": "webgpu-os/reference/kernel/time/IdempotencyManager.md",
    "source": "webgpu-os/kernel/time/IdempotencyManager.js",
    "import": "/webgpu-os/kernel/time/IdempotencyManager.js",
    "sourceHash": "9fe1078567f6dd73e3a0f6a40a330287b1862e98a57c6cc5a200e2f73553e4ab",
    "summary": "IdempotencyManager.js — bounded process-local replay for settled tool and storylet results. Concurrent callers for one key share a single execution. Durable mutation replay safety is provided by the task-graph dispatch fence, not by this TTL/LRU cache.",
    "exports": [
      {
        "name": "IdempotencyCapacityError",
        "kind": "class",
        "signature": "class IdempotencyCapacityError extends Error",
        "summary": ""
      },
      {
        "name": "IdempotencyManager",
        "kind": "class",
        "signature": "class IdempotencyManager",
        "summary": ""
      },
      {
        "name": "IDEMPOTENCY_TOOL_REPLAY_MAX_ENTRIES",
        "kind": "constant",
        "signature": "IDEMPOTENCY_TOOL_REPLAY_MAX_ENTRIES",
        "summary": ""
      },
      {
        "name": "IDEMPOTENCY_TOOL_REPLAY_TTL_MS",
        "kind": "constant",
        "signature": "IDEMPOTENCY_TOOL_REPLAY_TTL_MS",
        "summary": ""
      },
      {
        "name": "IDEMPOTENCY_TOOL_REPLAY_MAX_BYTES",
        "kind": "constant",
        "signature": "IDEMPOTENCY_TOOL_REPLAY_MAX_BYTES",
        "summary": ""
      },
      {
        "name": "IDEMPOTENCY_MAX_IN_FLIGHT",
        "kind": "constant",
        "signature": "IDEMPOTENCY_MAX_IN_FLIGHT",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/time/ParallelTaskScheduler",
    "path": "webgpu-os/reference/kernel/time/ParallelTaskScheduler.md",
    "source": "webgpu-os/kernel/time/ParallelTaskScheduler.js",
    "import": "/webgpu-os/kernel/time/ParallelTaskScheduler.js",
    "sourceHash": "089d4cd50305415483fd75c027160c9230b8bf960581c872da2eddc0f09fc411",
    "summary": "ParallelTaskScheduler.js — executes async tasks respecting dependency order (via DependencyScheduler) with a bounded concurrency limit. A failed task marks its transitive dependents blocked rather than aborting unrelated branches.",
    "exports": [
      {
        "name": "ParallelTaskScheduler",
        "kind": "class",
        "signature": "class ParallelTaskScheduler",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/time/ReplayEngine",
    "path": "webgpu-os/reference/kernel/time/ReplayEngine.md",
    "source": "webgpu-os/kernel/time/ReplayEngine.js",
    "import": "/webgpu-os/kernel/time/ReplayEngine.js",
    "sourceHash": "346200991359ab800acca5cc0885dd15ba11651bce20a9403fdb3adc9c7cf642",
    "summary": "ReplayEngine.js — rebuild materialized state by folding the hash-chained EventLog through a reducer (event sourcing), optionally starting from a CheckpointManager checkpoint. The chain is verified BEFORE replay: tampered history refuses to replay rather than materializing a lie.",
    "exports": [
      {
        "name": "ReplayEngine",
        "kind": "class",
        "signature": "class ReplayEngine",
        "summary": "ReplayEngine.js — rebuild materialized state by folding the hash-chained EventLog through a reducer (event sourcing), optionally starting from a CheckpointManager checkpoint. The chain is verified BEFORE replay: tampered history refuses to replay rather than materializing a lie."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/time/RetryManager",
    "path": "webgpu-os/reference/kernel/time/RetryManager.md",
    "source": "webgpu-os/kernel/time/RetryManager.js",
    "import": "/webgpu-os/kernel/time/RetryManager.js",
    "sourceHash": "61afadd91dfd4b73882e011b95b2e2154b8060cab66568401ee7ca1e875cb141",
    "summary": "RetryManager.js — bounded exponential-backoff retry with jitter for transient AI/tool failures. Retries are attempts, not new intents: pair with IdempotencyManager keys so a retried effect is never applied twice.",
    "exports": [
      {
        "name": "RetryManager",
        "kind": "class",
        "signature": "class RetryManager",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/time/RollbackEngine",
    "path": "webgpu-os/reference/kernel/time/RollbackEngine.md",
    "source": "webgpu-os/kernel/time/RollbackEngine.js",
    "import": "/webgpu-os/kernel/time/RollbackEngine.js",
    "sourceHash": "40a7c95928f0dcc540104ff1e8df304cc850fd2fe8b8a891cd56dc462c701c68",
    "summary": "RollbackEngine.js — the generic compensation runner: wraps engine/state/workflow/Saga.js (forward + compensating actions, irreversible pivot). Domain layers (e.g. storylets/StoryletFailureHandler.js) build on this rather than re-wrapping Saga themselves.",
    "exports": [
      {
        "name": "RollbackEngine",
        "kind": "class",
        "signature": "class RollbackEngine",
        "summary": ""
      },
      {
        "name": "SAGA_STATUS",
        "kind": "re-export",
        "signature": "SAGA_STATUS",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/time/TickClock",
    "path": "webgpu-os/reference/kernel/time/TickClock.md",
    "source": "webgpu-os/kernel/time/TickClock.js",
    "import": "/webgpu-os/kernel/time/TickClock.js",
    "sourceHash": "93b2c2f609d0192057c9fbcfd6bb591d7df617fd8053296f55798373ba581f51",
    "summary": "TickClock.js — thin wrapper over engine/state/time/TimeModel.js (TIME_MODES/createTimeSource). Manages NAMED time sources: an AI task only \"has time\" if it subscribes to a source, and each source advances per its mode (causal steps, oscillator dt, irreversible change, observation, …) — never a global `time++`.",
    "exports": [
      {
        "name": "TickClock",
        "kind": "class",
        "signature": "class TickClock",
        "summary": ""
      },
      {
        "name": "TIME_MODES",
        "kind": "re-export",
        "signature": "TIME_MODES",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/time/TimeAuthority",
    "path": "webgpu-os/reference/kernel/time/TimeAuthority.md",
    "source": "webgpu-os/kernel/time/TimeAuthority.js",
    "import": "/webgpu-os/kernel/time/TimeAuthority.js",
    "sourceHash": "c08909ec0301c6544f48dda72f1561ee04a8e6fffd66b8f1b5424d851b5ef752",
    "summary": "Disciplined civil-time authority. Network samples are transient observations. A consensus decision is accepted only after collapsing endpoints into independent operator groups, finding a majority interval, and combining the surviving offsets by uncertainty. The CSE records semantic transitions; it never treats timestamps as authority.",
    "exports": [
      {
        "name": "TimeAuthority",
        "kind": "class",
        "signature": "class TimeAuthority",
        "summary": ""
      },
      {
        "name": "timeSourceCatalog",
        "kind": "function",
        "signature": "timeSourceCatalog()",
        "summary": ""
      },
      {
        "name": "defaultSourceIds",
        "kind": "function",
        "signature": "defaultSourceIds(mode = TIME_AUTHORITY_MODES.UTC_CONSENSUS)",
        "summary": ""
      },
      {
        "name": "normalizeTimeAuthorityConfig",
        "kind": "function",
        "signature": "normalizeTimeAuthorityConfig(input = {})",
        "summary": ""
      },
      {
        "name": "selectTimeConsensus",
        "kind": "function",
        "signature": "selectTimeConsensus(samples, options = {})",
        "summary": "Select one robust time estimate from already-filtered source samples. Each operator gets at most one vote even when it exposes many hostnames."
      },
      {
        "name": "TIME_AUTHORITY_MODES",
        "kind": "constant",
        "signature": "TIME_AUTHORITY_MODES",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/time/TimeEngine",
    "path": "webgpu-os/reference/kernel/time/TimeEngine.md",
    "source": "webgpu-os/kernel/time/TimeEngine.js",
    "import": "/webgpu-os/kernel/time/TimeEngine.js",
    "sourceHash": "aecaa40887efa9c0b544c2598642b645ab0bd031b740d16a1a08b4a14cc94d80",
    "summary": "TimeEngine.js — Phase 7 facade (kernel.timeEngine) composing the Time Engine's CSE wrappers around ONE shared, hash-chained EventLog: authority   TimeAuthority (NTP consensus + slew) — disciplined physical time causal      CausalClock (HLC)                    — causal ordering ticks       TickClock (TimeModel sources)        — per-mode progression eventLog    engine/state EventLog                — the single OS AI log (Phase 9's AuditLog views the same log) timeline    TimelineExporter                     — tamper-evident export checkpoints CheckpointManager                    — compaction + restore replay      ReplayEngine                         — event-sourced rebuild idempotency IdempotencyManager                   — at-most-once effects cooldowns   CooldownManager                      — reservations + escrow rollback    RollbackEngine (Saga)                — compensation scheduler   Dependency/ParallelTaskScheduler     — ordered execution retry       RetryManager                         — bounded backoff expiry      ExpirationManager                    — TTL sweep facts       engine/state FactStore (direct reuse — no FactRegistry) invalidation/conflicts — rules layered on the monotonic FactStore",
    "exports": [
      {
        "name": "TimeEngine",
        "kind": "class",
        "signature": "class TimeEngine",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/time/TimelineExporter",
    "path": "webgpu-os/reference/kernel/time/TimelineExporter.md",
    "source": "webgpu-os/kernel/time/TimelineExporter.js",
    "import": "/webgpu-os/kernel/time/TimelineExporter.js",
    "sourceHash": "5cacb657222f1fa713e9cc6e3c17befc9caeb4b5b8adb27ef9e985f17dcfd596",
    "summary": "TimelineExporter.js — export view over engine/state/integrity/EventLog.js (append-only, hash-chained). Filters + serializes a range of the SHARED OS event log (the same log Phase 9's AuditLog views — one log, not two) with the chain verification result attached, so an exported timeline is tamper-evident.",
    "exports": [
      {
        "name": "TimelineExporter",
        "kind": "class",
        "signature": "class TimelineExporter",
        "summary": "TimelineExporter.js — export view over engine/state/integrity/EventLog.js (append-only, hash-chained). Filters + serializes a range of the SHARED OS event log (the same log Phase 9's AuditLog views — one log, not two) with the chain verification result attached, so an exported timeline is tamper-evident."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/tools/CapabilityAttenuator",
    "path": "webgpu-os/reference/kernel/tools/CapabilityAttenuator.md",
    "source": "webgpu-os/kernel/tools/CapabilityAttenuator.js",
    "import": "/webgpu-os/kernel/tools/CapabilityAttenuator.js",
    "sourceHash": "efdeb461e29eadad0ee28e0383487012d32ac335ade58bea80d2d8e79d29e74d",
    "summary": "CapabilityAttenuator.js — thin wrapper over engine/state Capability.attenuate() for narrowing a capability before handing it to a single tool call. Never widens a capability (attenuate() itself enforces this).",
    "exports": [
      {
        "name": "CapabilityAttenuator",
        "kind": "class",
        "signature": "class CapabilityAttenuator",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/tools/ContextTaintTracker",
    "path": "webgpu-os/reference/kernel/tools/ContextTaintTracker.md",
    "source": "webgpu-os/kernel/tools/ContextTaintTracker.js",
    "import": "/webgpu-os/kernel/tools/ContextTaintTracker.js",
    "sourceHash": "251bb2e48700fff5d027d2abd317a507c489807b8a0f75b98ab0c895fb946ec1",
    "summary": "ContextTaintTracker.js — tracks which OS.ai() request contexts have absorbed untrusted (tool/webpage/model) content, so prompt assembly can keep the CSE prompt-injection boundary visible downstream instead of silently blending untrusted text into \"instructions\".",
    "exports": [
      {
        "name": "ContextTaintTracker",
        "kind": "class",
        "signature": "class ContextTaintTracker",
        "summary": "ContextTaintTracker.js — tracks which OS.ai() request contexts have absorbed untrusted (tool/webpage/model) content, so prompt assembly can keep the CSE prompt-injection boundary visible downstream instead of silently blending untrusted text into \"instructions\"."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/tools/HiddenParameterDetector",
    "path": "webgpu-os/reference/kernel/tools/HiddenParameterDetector.md",
    "source": "webgpu-os/kernel/tools/HiddenParameterDetector.js",
    "import": "/webgpu-os/kernel/tools/HiddenParameterDetector.js",
    "sourceHash": "2f11f5f8d5e86ce58af5f170d374fd63fe1c6fa716470df22d1c6a054fa9ecd2",
    "summary": "HiddenParameterDetector.js — flags AI-supplied tool-call arguments that are NOT declared in the tool's schema (potential smuggled/hidden parameters) and prototype-pollution-shaped keys.",
    "exports": [
      {
        "name": "HiddenParameterDetector",
        "kind": "class",
        "signature": "class HiddenParameterDetector",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/tools/MetadataRugPullDetector",
    "path": "webgpu-os/reference/kernel/tools/MetadataRugPullDetector.md",
    "source": "webgpu-os/kernel/tools/MetadataRugPullDetector.js",
    "import": "/webgpu-os/kernel/tools/MetadataRugPullDetector.js",
    "sourceHash": "59c3a9b997b8c5e8646f996c71e2705286e1c27fdff3ba905abedb901d0ec70e",
    "summary": "",
    "exports": [
      {
        "name": "MetadataRugPullDetector",
        "kind": "class",
        "signature": "class MetadataRugPullDetector",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/tools/ToolCallSchemaValidator",
    "path": "webgpu-os/reference/kernel/tools/ToolCallSchemaValidator.md",
    "source": "webgpu-os/kernel/tools/ToolCallSchemaValidator.js",
    "import": "/webgpu-os/kernel/tools/ToolCallSchemaValidator.js",
    "sourceHash": "38024a4e38346db1230199a26b502702e0263ad825adda1b300750c93a27ce8d",
    "summary": "ToolCallSchemaValidator.js — validates AI-supplied tool call arguments against the tool's declared JSON schema, reusing the existing webgpu-os/kernel/schema/SchemaValidator.js (no parallel validator).",
    "exports": [
      {
        "name": "ToolCallSchemaValidator",
        "kind": "class",
        "signature": "class ToolCallSchemaValidator",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/tools/ToolPermissionChecker",
    "path": "webgpu-os/reference/kernel/tools/ToolPermissionChecker.md",
    "source": "webgpu-os/kernel/tools/ToolPermissionChecker.js",
    "import": "/webgpu-os/kernel/tools/ToolPermissionChecker.js",
    "sourceHash": "007f7651005864574c43d0e3ef9e089c0c3157980563e0ff6b4c7389f099b23d",
    "summary": "ToolPermissionChecker.js — gates AI-initiated tool calls through kernel.permissions (RuleGraph), on top of (not instead of) the per-tool AffordanceRegistry.capabilityRequired check done by ToolRouter.",
    "exports": [
      {
        "name": "ToolPermissionChecker",
        "kind": "class",
        "signature": "class ToolPermissionChecker",
        "summary": "ToolPermissionChecker.js — gates AI-initiated tool calls through kernel.permissions (RuleGraph), on top of (not instead of) the per-tool AffordanceRegistry.capabilityRequired check done by ToolRouter."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/tools/ToolResultIngestAdapter",
    "path": "webgpu-os/reference/kernel/tools/ToolResultIngestAdapter.md",
    "source": "webgpu-os/kernel/tools/ToolResultIngestAdapter.js",
    "import": "/webgpu-os/kernel/tools/ToolResultIngestAdapter.js",
    "sourceHash": "d2845f518d377381b0798b679e84654fe058ba3ce387ea94f690a51277c621c2",
    "summary": "ToolResultIngestAdapter.js — the single chokepoint every AI-invoked tool result passes through on its way into the world model. Delegates to engine/state/worldmodel/UntrustedBoundary.js (no parallel wrapper); a tool result is always trusted:false and can never mint authority.",
    "exports": [
      {
        "name": "ToolResultIngestAdapter",
        "kind": "class",
        "signature": "class ToolResultIngestAdapter",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "kernel/tools/ToolRouter",
    "path": "webgpu-os/reference/kernel/tools/ToolRouter.md",
    "source": "webgpu-os/kernel/tools/ToolRouter.js",
    "import": "/webgpu-os/kernel/tools/ToolRouter.js",
    "sourceHash": "a355df4f693b04069dc8820e2e54466884989888962c0b12901712027abaf734",
    "summary": "ToolRouter.js — AI Tool Firewall. The single entrypoint the AI Hub's tool-calling loop uses to run a registered tool on behalf of an app. Delegates actual tool registration/execution/history to the existing ToolDriver.js (kernel.toolDriver) — this class never duplicates that machinery, it wraps it with the checks an *AI-initiated* call needs before it's safe to run: permission check, rug-pull detection, hidden-parameter detection, schema validation, and affordance/capability gating. Every result is then ingested through the CSE prompt-injection boundary (ToolResultIngestAdapter → engine/state UntrustedBoundary) before it's handed back — a tool result is observation, never authority.",
    "exports": [
      {
        "name": "ToolRouter",
        "kind": "class",
        "signature": "class ToolRouter",
        "summary": ""
      },
      {
        "name": "boundedAIValue",
        "kind": "function",
        "signature": "boundedAIValue(value, output = '')",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "packages/AppCompiler",
    "path": "webgpu-os/reference/packages/AppCompiler.md",
    "source": "webgpu-os/packages/AppCompiler.js",
    "import": "/webgpu-os/packages/AppCompiler.js",
    "sourceHash": "cf3f2f41e7ebe5dd8f59410bf98c4f6393b65c8731be7b3d93f38cefe2641288",
    "summary": "AppCompiler.js — compile an ingested source bundle into a signed `.prpkg`. Two paths: 1. NATIVE — the folder already has a valid `manifest.json` + JS entry. Files are packaged as-is under `files/`. 2. AUTO   — any HTML/WebGPU app. We probe it (engine/compat), generate a compatibility profile, an embedded source module (`__compat_source.js`), and a bootloader entry (`index.js`) that calls `engine.compat.boot(...)` at mount time. A normal WebGPU app → an engine-native, signed OS app. Output uses PackageBuilder.buildV2 (signed + encrypted + merkle + cert). With a developer (self-signed) key the package verifies as the community/unofficial tier; a root-issued cert promotes it to trusted.",
    "exports": [
      {
        "name": "AppCompiler",
        "kind": "class",
        "signature": "class AppCompiler",
        "summary": ""
      },
      {
        "name": "CompatGuestApp",
        "kind": "class",
        "signature": "class CompatGuestApp",
        "summary": ""
      },
      {
        "name": "buildFilesMap",
        "kind": "function",
        "signature": "buildFilesMap()",
        "summary": ""
      },
      {
        "name": "entry",
        "kind": "constant",
        "signature": "entry",
        "summary": ""
      },
      {
        "name": "profile",
        "kind": "constant",
        "signature": "profile",
        "summary": ""
      },
      {
        "name": "html",
        "kind": "constant",
        "signature": "html",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "packages/CapabilityMap",
    "path": "webgpu-os/reference/packages/CapabilityMap.md",
    "source": "webgpu-os/packages/CapabilityMap.js",
    "import": "/webgpu-os/packages/CapabilityMap.js",
    "sourceHash": "8cccee3e9c847a9754a6a66f9fdd0a28aae0709cbfb21c704539caa99a56e63b",
    "summary": "CapabilityMap.js — OS-adaptive bridge between the compat static probe and the kernel's capability vocabulary. The kernel's RuleGraph is the single source of truth for what capabilities exist (`KNOWN_CAPABILITIES`) and how risky each one is (`CAPABILITY_LABELS`). This module classifies EVERY known capability into one disposition and, for the statically-detectable ones, maps a compat probe signal (`profile.uses` / `profile.gpu`) onto it. Dispositions: - 'free'    — universally allowed by the default rule graph; never emitted (the app already has it). - 'auto'    — detectable + low/medium risk → auto-added when the probe sees it. - 'suggest' — detectable + high risk → SURFACED for review, never silently added. - 'declare' — grantable but not statically inferable → author opts in. - 'system'  — privileged / system-trust → never auto-added under any path. - 'runtime' — kernel-mediated ephemeral consent token → never accepted from or emitted into an application manifest. Least-privilege is preserved: only 'auto' caps are granted without review; high-risk and privileged caps always require an explicit decision. IMPORTANT — this is a BUILD-TIME ADVISORY layer, not a security boundary. Static source scanning has unavoidable false negatives (minification, obfuscation, dynamically-constructed API calls, runtime behavior that differs from source). The authoritative gate is the kernel's runtime complete-mediation stack: `guardSyscalls` default-deny + per-call `Permissions.require` + the `PermissionPortal`. Auto-added caps only ever cover low/medium-risk APIs, so a missed or spoofed signal cannot silently escalate to a high-risk capability. A module-load guard logs any kernel capability that is missing a disposition, so the table can never silently drift behind a newly-added kernel cap; the Security Doctor surfaces the same check (`auditCapabilityMap`) at boot.",
    "exports": [
      {
        "name": "policyOf",
        "kind": "function",
        "signature": "policyOf(cap)",
        "summary": "Resolve a capability's disposition string ('free'|'auto'|'suggest'|'declare'|'system'|'runtime'|'unknown')."
      },
      {
        "name": "riskOf",
        "kind": "function",
        "signature": "riskOf(cap)",
        "summary": "Risk level for a cap, read from the kernel's CAPABILITY_LABELS (default 'medium')."
      },
      {
        "name": "detectCapabilities",
        "kind": "function",
        "signature": "detectCapabilities(signals)",
        "summary": "Run every detector against probe signals. Detectors are wrapped so a single malformed signal or detector bug can never throw during a build — a failing detector is treated as \"not detected\" and a one-time warning is logged. (Static detection is best-effort UX; the kernel's runtime guard remains the authoritative boundary — see module header.)"
      },
      {
        "name": "classifyPermissions",
        "kind": "function",
        "signature": "classifyPermissions({ signals, declared = [], granted = [] } = {})",
        "summary": "Classify a probe against what is already declared/granted and produce the final permission list + a reconciliation report."
      },
      {
        "name": "unclassifiedCapabilities",
        "kind": "function",
        "signature": "unclassifiedCapabilities()",
        "summary": "Kernel capabilities that have no disposition in this table (should be empty)."
      },
      {
        "name": "staleCapabilities",
        "kind": "function",
        "signature": "staleCapabilities()",
        "summary": "Capabilities classified here that no longer exist in the kernel vocabulary (stale entries)."
      },
      {
        "name": "auditCapabilityMap",
        "kind": "function",
        "signature": "auditCapabilityMap()",
        "summary": "Self-audit for the Security Doctor / boot self-test. Returns coverage counts and any drift (kernel caps with no disposition, or table entries that are no longer kernel caps). `ok` is true only when there is no drift in either direction."
      },
      {
        "name": "CAPABILITY_POLICY",
        "kind": "constant",
        "signature": "CAPABILITY_POLICY",
        "summary": "Disposition + (for detectable caps) a `detect(signals)` predicate, keyed by the exact capability string from KNOWN_CAPABILITIES. A bare string is shorthand for `{ policy: <string> }` (no detector)."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "packages/FolderIngestor",
    "path": "webgpu-os/reference/packages/FolderIngestor.md",
    "source": "webgpu-os/packages/FolderIngestor.js",
    "import": "/webgpu-os/packages/FolderIngestor.js",
    "sourceHash": "85da02867518747e49625f107d733a645229c34862c50c5ab4d41efc4757d7c8",
    "summary": "FolderIngestor.js — turn any developer source into a { files, entry } bundle that AppCompiler can package. Sources: • Directory picker (File System Access `showDirectoryPicker`) • <input type=\"file\" webkitdirectory> FileList • A single HTML File • A `.zip` (Uint8Array/ArrayBuffer/File) via Zip.parse • The OS VFS (a folder path or single file) via StorageManager • A remote URL (single-file HTML; CORS-aware) Output: { files: Map<string, string|Uint8Array>, entry: string, sourceType: string, name: string } Text files are decoded to strings; binary files stay as Uint8Array.",
    "exports": [
      {
        "name": "FolderIngestor",
        "kind": "class",
        "signature": "class FolderIngestor",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "packages/Gzip",
    "path": "webgpu-os/reference/packages/Gzip.md",
    "source": "webgpu-os/packages/Gzip.js",
    "import": "/webgpu-os/packages/Gzip.js",
    "sourceHash": "6e2501cde50fff65dba136d8274402465f5614ece287baaff32bd3274d2237d7",
    "summary": "Gzip.js — gzip compress/decompress via the browser-native Compression Streams API. This is the SAME approach `bundle_engine.py` uses for the runtime bundle (`*.min.js.gz`) and its `--encrypt` loader: gzip the payload, then (optionally) AES-GCM it, and decompress in-browser with `DecompressionStream('gzip')`. No custom container format — a `.prpkg` payload is just `gzip(JSON)`. gzip carries its own whole-stream CRC-32 (validated by DecompressionStream), and we layer per-file SHA-256 + a signed Merkle root on top, so integrity is covered.",
    "exports": [
      {
        "name": "gzip",
        "kind": "function",
        "signature": "async gzip(input)",
        "summary": "Gzip-compress a string or bytes."
      },
      {
        "name": "gunzip",
        "kind": "function",
        "signature": "async gunzip(input, opts = {})",
        "summary": "Gunzip to bytes, with a decompressed-size cap (zip-bomb guard)."
      },
      {
        "name": "gunzipText",
        "kind": "function",
        "signature": "async gunzipText(input, opts = {})",
        "summary": "Gunzip to a UTF-8 string."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "packages/PackageBuilder",
    "path": "webgpu-os/reference/packages/PackageBuilder.md",
    "source": "webgpu-os/packages/PackageBuilder.js",
    "import": "/webgpu-os/packages/PackageBuilder.js",
    "sourceHash": "7e72d47959c7fa24e8a6e178ba2e23c33215aa1633191c75085348c18e75bbcc",
    "summary": "PackageBuilder.js — build a signed .prpkg from a folder of files. Output format (JSON envelope — zip support planned): { format:    'prpkg-v1', manifest:  { ... },          // manifest.json with files hash map blockmap:  { files: {...} }, // sha256 per file signature: { pubKey, sig },  // ECDSA P-256 over blockmap JSON files:     { path: content } // all file contents as strings } Usage: const pkg = await PackageBuilder.build({ id: 'os.my-app', name: 'My App', version: '1.0.0', publisher: 'local', entry: 'files/app.html', permissions: ['gpu'], files: { 'files/app.html': '<html>...' } }, cryptoDriver);",
    "exports": [
      {
        "name": "PackageBuilder",
        "kind": "class",
        "signature": "class PackageBuilder",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "packages/PackageCrypto",
    "path": "webgpu-os/reference/packages/PackageCrypto.md",
    "source": "webgpu-os/packages/PackageCrypto.js",
    "import": "/webgpu-os/packages/PackageCrypto.js",
    "sourceHash": "41b4c1d6853dda35a68f880a02d5e9dd98ee809ad9473a6e985504f45e94c2ed",
    "summary": "PackageCrypto.js — AES-GCM payload encryption for .prpkg v2 containers. SECURITY NOTE (acknowledged in the plan): in a browser the decryption key must ship with the OS, so this encryption is OBFUSCATION / a licensing-and-guard hook — NOT true secrecy. Package *authenticity* comes from the ECDSA signature + the ring-0 trust chain (Phase 2), not from this encryption. Container binary layout (`.prpkg` v2): bytes 0..5   magic  \"PRPKG2\" byte  6      version (0x02) byte  7      flags  (bit0 = encrypted) bytes 8..19  AES-GCM IV (12 bytes)        [only if encrypted] bytes 20..   ciphertext (AES-GCM, tag appended)  | or plaintext gzip if not encrypted The inner plaintext is gzip(JSON{manifest, blockmap, files}) — the same gzip codec the bundler uses, decompressed in-browser via DecompressionStream('gzip'). ── Single-file layout (`.prpkg`, embeds the envelope) ────────────────────── A v2 package historically shipped as TWO files (the binary container + a `.prpkg.json` sidecar envelope). `embed()` fuses both into ONE self-describing `.prpkg`, so there is a single artifact to move around and verify: bytes 0..5    magic \"PRPKGS\" byte  6       version (0x01) byte  7       reserved (0x00) bytes 8..11   envelope length (uint32, little-endian) bytes 12..    envelope JSON (UTF-8) then          the full PRPKG2 container bytes (as produced by seal()) `split()` reverses it. The envelope is the PUBLIC, signed metadata; the embedded container is cross-verified against it by PackageVerifier.parseV2 (manifest + blockmap equality, signed blockmap.manifestHash, AES-GCM AAD = id@version, and the ECDSA signature) — so tampering with either half is detected.",
    "exports": [
      {
        "name": "PackageCrypto",
        "kind": "class",
        "signature": "class PackageCrypto",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "packages/PackageLoader",
    "path": "webgpu-os/reference/packages/PackageLoader.md",
    "source": "webgpu-os/packages/PackageLoader.js",
    "import": "/webgpu-os/packages/PackageLoader.js",
    "sourceHash": "49ba04cf89f47d088ffe9654dd2b5cbbef003395cedebaa35a38fcd79c70beea",
    "summary": "PackageLoader.js — load an installed .prpkg app's entry module from OPFS. Installed packages live at: /os/packages/installed/{appId}/{version}/files/{relPath} Loading strategy: 1. Gather every file under the package's files/ dir. 2. Apply enabled PatchManager overlays (file-overlay layer) on top of base files. 3. Build a blob-URL module graph: each JS module's *relative* import/export specifiers are rewritten to the blob URL of the corresponding packaged file, resolved in dependency order (best-effort for cycles). 4. import() the entry blob URL and return the module namespace. Why rewrite specifiers instead of an import map? Import maps must exist before the first module loads; we resolve packages at runtime, so we inline the graph by rewriting relative specifiers to blob URLs. Blob URLs are retained for the lifetime of the loaded app and revoked when the package is reloaded or removed.",
    "exports": [
      {
        "name": "PackageLoader",
        "kind": "class",
        "signature": "class PackageLoader",
        "summary": ""
      },
      {
        "name": "CompatGuestApp",
        "kind": "class",
        "signature": "class CompatGuestApp",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "packages/PackageManager",
    "path": "webgpu-os/reference/packages/PackageManager.md",
    "source": "webgpu-os/packages/PackageManager.js",
    "import": "/webgpu-os/packages/PackageManager.js",
    "sourceHash": "8f595d6e8af1599a70066994c17821fc7374e288d827f075168848d060188cf3",
    "summary": "PackageManager.js — install, remove, update, verify, repair, rollback .prpkg packages. Package lifecycle: download/pick → stage → verify → install → register → (update → rollback) Storage layout: /os/packages/installed/{appId}/{version}/   ← active package files /os/packages/staging/{appId}/{version}/     ← in-progress installs /os/packages/rollback/{appId}/{version}/    ← previous version for rollback /os/packages/locks/{appId}.lock.json        ← prevents concurrent installs /os/packages/chunks/sha256-{hash}           ← chunk cache (CacheDriver)",
    "exports": [
      {
        "name": "PackageManager",
        "kind": "class",
        "signature": "class PackageManager",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "packages/PackageRegistry",
    "path": "webgpu-os/reference/packages/PackageRegistry.md",
    "source": "webgpu-os/packages/PackageRegistry.js",
    "import": "/webgpu-os/packages/PackageRegistry.js",
    "sourceHash": "14891172f063d9b77c001735c8e5940970bcb5334724edd7a2bda4fc4c0821b2",
    "summary": "PackageRegistry.js — IndexedDB-backed registry of installed packages. Each record in the 'packages' store: { id:          'os.shader-lab', name:        'Shader Lab', version:     '1.0.0', activeRootHash: 'a1b2c3d4...', // content-addressed install directory rollbackRootHash: '...',        // previous activation root hash rollbackVersion: null, rollbackAvailable: false, publisher:   'local', installedAt: 1234567890, updatedAt:   1234567890, entryPath:   '/os/packages/installed/os.shader-lab/a1b2c3d4.../files/app.html', manifest:    { ...full manifest... }, format:      'prpkg-v1', trustVerdict: 'trusted', pinned:      false, pinnedVersion: null, sourceUrl:   null,           // URL to check for updates }",
    "exports": [
      {
        "name": "PackageRegistry",
        "kind": "class",
        "signature": "class PackageRegistry",
        "summary": "PackageRegistry.js — IndexedDB-backed registry of installed packages. Each record in the 'packages' store: { id:          'os.shader-lab', name:        'Shader Lab', version:     '1.0.0', activeRootHash: 'a1b2c3d4...', // content-addressed install directory rollbackRootHash: '...',        // previous activation root hash rollbackVersion: null, rollbackAvailable: false, publisher:   'local', installedAt: 1234567890, updatedAt:   1234567890, entryPath:   '/os/packages/installed/os.shader-lab/a1b2c3d4.../files/app.html', manifest:    { ...full manifest... }, format:      'prpkg-v1', trustVerdict: 'trusted', pinned:      false, pinnedVersion: null, sourceUrl:   null,           // URL to check for updates }"
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "packages/PackageScanner",
    "path": "webgpu-os/reference/packages/PackageScanner.md",
    "source": "webgpu-os/packages/PackageScanner.js",
    "import": "/webgpu-os/packages/PackageScanner.js",
    "sourceHash": "4f13f9ae60d2632244bdc0d3a0191c497ae31cd74b44965957661e093e800be2",
    "summary": "PackageScanner.js — heuristic static pre-scan of package contents. This is an EARLY-WARNING badge, not a guarantee: novel obfuscation will evade heuristics. The real containment is default-deny egress + sandboxed execution (see PermissionPortal / guardSyscalls). The scanner flags the patterns seen in real 2025–2026 supply-chain payloads: heavy obfuscation, base64 blobs, dynamic code execution, credential/secret access, network exfiltration, and payloads hidden inside non-code assets. scan(pkg) → { risk: 'low'|'medium'|'high', findings: [{ level, code, file, msg }] }",
    "exports": [
      {
        "name": "PackageScanner",
        "kind": "class",
        "signature": "class PackageScanner",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "packages/PackageVerifier",
    "path": "webgpu-os/reference/packages/PackageVerifier.md",
    "source": "webgpu-os/packages/PackageVerifier.js",
    "import": "/webgpu-os/packages/PackageVerifier.js",
    "sourceHash": "d6961e6a5e1b707ebcc22bd93b1d509ddd23c94516c84238f0663a86248c337b",
    "summary": "PackageVerifier.js — verifies .prpkg package integrity. Verification steps: 1. Validate manifest schema (format, required fields) 2. Verify each file's SHA-256 hash against blockmap 3. Verify ECDSA P-256 publisher signature over blockmap hash The publisher key fingerprint is stored in the manifest. Trusted publishers are managed by kernel.permissions.",
    "exports": [
      {
        "name": "PackageVerifier",
        "kind": "class",
        "signature": "class PackageVerifier",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "packages/PublisherKeyManager",
    "path": "webgpu-os/reference/packages/PublisherKeyManager.md",
    "source": "webgpu-os/packages/PublisherKeyManager.js",
    "import": "/webgpu-os/packages/PublisherKeyManager.js",
    "sourceHash": "d8decd95dd3d284e8f931e7d5f44ada4333007dcafd64b6606d39feece5c753e",
    "summary": "PublisherKeyManager.js — the developer's portable package-signing key. Distinct from `CryptoDriver` (the device identity), whose private key is NON-extractable and therefore cannot be backed up, moved between machines, or rotated with a lineage. A publisher who ships packages needs a key they can: - generate once and KEEP SAFE (encrypted export the dev stores offline), - re-import on another machine / after reinstall, - ROTATE while proving continuity (old key signs the new key — see kernel/SigningLineage.js), so app updates stay verifiable and isolated. The keypair is ECDSA P-256, **extractable**, stored locally (JWK in the IDB kv store) for day-to-day signing, plus an AES-256-GCM (PBKDF2-SHA256) encrypted backup the dev downloads and keeps. Signatures are raw IEEE-P1363 (WebCrypto default), the same format `CryptoDriver.verify` / CollabIdentity `verifyData` expects, and fingerprints are computed via `cryptoDriver.fingerprintOf` so the publisher fingerprint scheme matches the rest of the trust system.",
    "exports": [
      {
        "name": "PublisherKeyManager",
        "kind": "class",
        "signature": "class PublisherKeyManager",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "packages/UpdateManager",
    "path": "webgpu-os/reference/packages/UpdateManager.md",
    "source": "webgpu-os/packages/UpdateManager.js",
    "import": "/webgpu-os/packages/UpdateManager.js",
    "sourceHash": "a774a344769c49b09ae16fca2dc2600e74c7cbc416908d766839b784da06866d",
    "summary": "UpdateManager.js — block-level differential update engine (MSIX-style, web-native). Update flow: check(appId)   → fetch remote blockmap from sourceUrl, diff against installed blockmap, return UpdateJob with changed/removed file lists. apply(appId)   → download only changed chunks, verify each sha256, verify package ECDSA-P256 signature, atomic-swap installed dirs, save previous version to rollback slot, update registry. rollback(appId)→ delegate to PackageManager.rollback() checkAll()     → check all installed packages that have a sourceUrl setSource()    → delegate to PackageManager.setSource() Remote blockmap format (served at {sourceUrl}/blockmap.json): { \"appId\":          \"os.my-app\", \"version\":        \"1.2.0\", \"files\": [ { \"path\": \"index.js\",      \"sha256\": \"hex...\", \"size\": 8192 }, { \"path\": \"manifest.json\", \"sha256\": \"hex...\", \"size\":  512 } ], \"signature\":      \"base64-ecdsa-der...\",   // optional — over canonical payload \"signerPublicKey\": { \"kty\":\"EC\",\"crv\":\"P-256\", ... }  // optional JWK } Storage layout (under /os/packages/): .updates/{appId}/remote-blockmap.json  ← cached remote blockmap post-check .updates/{appId}/staged/               ← downloaded changed files installed/{appId}/{version}/           ← live package (PackageManager layout) rollback/{appId}/{version}/            ← previous version slot",
    "exports": [
      {
        "name": "UpdateManager",
        "kind": "class",
        "signature": "class UpdateManager",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "packages/Zip",
    "path": "webgpu-os/reference/packages/Zip.md",
    "source": "webgpu-os/packages/Zip.js",
    "import": "/webgpu-os/packages/Zip.js",
    "sourceHash": "444a297ce9c44e3a6f8cfaad2b824bb2a5105d8fe3ff7715857d1a7a010f1942",
    "summary": "",
    "exports": [
      {
        "name": "Zip",
        "kind": "class",
        "signature": "class Zip",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "shell/Desktop",
    "path": "webgpu-os/reference/shell/Desktop.md",
    "source": "webgpu-os/shell/Desktop.js",
    "import": "/webgpu-os/shell/Desktop.js",
    "sourceHash": "7572a6912353fade12348c11369b57da02ed8c375407c395574b942974d732a1",
    "summary": "Desktop.js — the OS shell compositor. Owns: - Plauna workspace (virtual desktops, panel chrome, window management). - Taskbar (bottom bar: start menu + running apps + status tray). - NotificationCenter (toast/banner delivery). - Routing of kernel 'ui:open-panel' events to WorkspaceManager. Phase 2 adds AppManifestLoader → dynamic app registration. Phase 3 adds GPU panel wiring (canvas surface allocation per app).",
    "exports": [
      {
        "name": "Desktop",
        "kind": "class",
        "signature": "class Desktop",
        "summary": "Desktop.js — the OS shell compositor. Owns: - Plauna workspace (virtual desktops, panel chrome, window management). - Taskbar (bottom bar: start menu + running apps + status tray). - NotificationCenter (toast/banner delivery). - Routing of kernel 'ui:open-panel' events to WorkspaceManager. Phase 2 adds AppManifestLoader → dynamic app registration. Phase 3 adds GPU panel wiring (canvas surface allocation per app)."
      },
      {
        "name": "createProvisionalMountHandoff",
        "kind": "function",
        "signature": "createProvisionalMountHandoff({ controller = new AbortController()",
        "summary": "Own teardown while an async app mount is still provisional. Cancellation calls an attached cleanup synchronously, so the app observes its AbortSignal before the panel is removed. Any cleanup promise continues in the background while a pending close returns immediately. Once the mount has settled, callers replace this handoff with the real app and retain the normal awaited-unmount contract."
      },
      {
        "name": "guardMountRegistrations",
        "kind": "function",
        "signature": "guardMountRegistrations(namespace, signal, methods = [], label = 'app capability')",
        "summary": ""
      },
      {
        "name": "resolveAppConstructor",
        "kind": "function",
        "signature": "resolveAppConstructor(mod)",
        "summary": ""
      },
      {
        "name": "desktopFrameRgbHash",
        "kind": "function",
        "signature": "desktopFrameRgbHash(data)",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "shell/DialogManager",
    "path": "webgpu-os/reference/shell/DialogManager.md",
    "source": "webgpu-os/shell/DialogManager.js",
    "import": "/webgpu-os/shell/DialogManager.js",
    "sourceHash": "7e33151453eb9683688350e98d912d8f684c778ca96206a1f293b43d962e3f35",
    "summary": "DialogManager.js — OS-level dialog system. Handles kernel `ui:modal` events and renders styled alert / confirm / prompt dialogs as a layered overlay above all panels. API (via kernel.events or syscalls.ui.*): ui:modal  { type, title, message, icon, buttons, defaultValue, resolve } Promise-returning syscalls (see Syscalls.js): syscalls.ui.alert(msg, opts)               → Promise<void> syscalls.ui.confirm(msg, opts)             → Promise<boolean> syscalls.ui.prompt(msg, default, opts)     → Promise<string|null>",
    "exports": [
      {
        "name": "DialogManager",
        "kind": "class",
        "signature": "class DialogManager",
        "summary": "DialogManager.js — OS-level dialog system. Handles kernel `ui:modal` events and renders styled alert / confirm / prompt dialogs as a layered overlay above all panels. API (via kernel.events or syscalls.ui.*): ui:modal  { type, title, message, icon, buttons, defaultValue, resolve } Promise-returning syscalls (see Syscalls.js): syscalls.ui.alert(msg, opts)               → Promise<void> syscalls.ui.confirm(msg, opts)             → Promise<boolean> syscalls.ui.prompt(msg, default, opts)     → Promise<string|null>"
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "shell/NotificationCenter",
    "path": "webgpu-os/reference/shell/NotificationCenter.md",
    "source": "webgpu-os/shell/NotificationCenter.js",
    "import": "/webgpu-os/shell/NotificationCenter.js",
    "sourceHash": "7ce55232d6394f3d9e7acbe4c5f0b82702e6511f5aec6a941eabb5ee025b2989",
    "summary": "NotificationCenter.js — routes kernel ui:notify events to Plauna's ToastManager. Uses Plauna ToastManager directly (the same underlying system NotificationSystem uses). Falls back to a minimal DOM toast only if Plauna has not mounted yet.",
    "exports": [
      {
        "name": "NotificationCenter",
        "kind": "class",
        "signature": "class NotificationCenter",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "shell/PackageHostRealm",
    "path": "webgpu-os/reference/shell/PackageHostRealm.md",
    "source": "webgpu-os/shell/PackageHostRealm.js",
    "import": "/webgpu-os/shell/PackageHostRealm.js",
    "sourceHash": "7bea7ddd3418de07411ce628a3e4ac3ca4f514704953cadf4fe661eb09643b88",
    "summary": "PackageHostRealm.js — run an installed NATIVE package app inside an opaque-origin sandboxed iframe, bridging the kernel syscalls over a nonce-bound postMessage RPC. WHY: `PackageLoader` imports a package's entry module straight into the OS origin (S2). Trusted/root packages may keep that fast shared realm, but pinned/untrusted packages must NOT touch `window`, the OS DOM, localStorage, the extension bridge, or any accidental globals. This realm gives them an `allow-scripts` (NO `allow-same-origin`) iframe — a true origin boundary — and proxies the syscall surface back to the host's GUARDED syscalls for that app. BRIDGE SCOPE (honest limits): - Async, structured-cloneable syscalls (fs.*, storage.*, ui.notify/alert/ confirm/prompt, log.*, sandbox.*, net send/fetch, pkg reads, etc.) work: each call round-trips to the host, which invokes the real guarded method. - Subscriptions / callbacks (`.on`, `.onChange`, `.onEvent`, …) CANNOT cross the boundary; the in-iframe proxy returns a no-op unsubscribe so apps that register listeners do not crash (they simply receive no host events yet). - Raw `GPUDevice` / GPU surfaces cannot cross an opaque-origin boundary, so GPU-panel apps are NOT isolated here (the launcher keeps them shared). SECURITY: the host only ever services RPC bearing the exact per-instance nonce from the iframe it created, and only invokes `this._syscalls` (already guarded + capability-checked for THIS appId). Unknown namespaces/methods are refused.",
    "exports": [
      {
        "name": "PackageHostRealm",
        "kind": "class",
        "signature": "class PackageHostRealm",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "shell/StartMenu",
    "path": "webgpu-os/reference/shell/StartMenu.md",
    "source": "webgpu-os/shell/StartMenu.js",
    "import": "/webgpu-os/shell/StartMenu.js",
    "sourceHash": "12ece44999f60ce5026d3e39bf2ad0d0b4a550f53c61644fc93d503f7bba4545",
    "summary": "",
    "exports": [
      {
        "name": "StartMenu",
        "kind": "class",
        "signature": "class StartMenu",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "shell/StatusTray",
    "path": "webgpu-os/reference/shell/StatusTray.md",
    "source": "webgpu-os/shell/StatusTray.js",
    "import": "/webgpu-os/shell/StatusTray.js",
    "sourceHash": "eb8398160bd0a6d1801dbd06768c58221537f8c657bbb4397c3a6ee197f134cc",
    "summary": "StatusTray.js — rightmost section of the taskbar. A thin orchestrator: it composes stateless tray widgets (see ./tray/ tray-widgets.js) and owns the per-frame update loop. It does NOT render the calendar — clicking the clock requests the Calendar app's flyout surface. Layout (left → right): GPU stat | FPS stat | 🔍 | ⚡ | Clock | 🔔",
    "exports": [
      {
        "name": "StatusTray",
        "kind": "class",
        "signature": "class StatusTray",
        "summary": "StatusTray.js — rightmost section of the taskbar. A thin orchestrator: it composes stateless tray widgets (see ./tray/ tray-widgets.js) and owns the per-frame update loop. It does NOT render the calendar — clicking the clock requests the Calendar app's flyout surface. Layout (left → right): GPU stat | FPS stat | 🔍 | ⚡ | Clock | 🔔"
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "shell/Taskbar",
    "path": "webgpu-os/reference/shell/Taskbar.md",
    "source": "webgpu-os/shell/Taskbar.js",
    "import": "/webgpu-os/shell/Taskbar.js",
    "sourceHash": "af0dcf40d67ab69fd019c53011c1efdd9c156616283b70ee315074ba5882146a",
    "summary": "Taskbar.js - bottom shell coordinator. Rendering and behavior live in shell/taskbar modules so the taskbar can grow without becoming another monolithic desktop controller.",
    "exports": [
      {
        "name": "Taskbar",
        "kind": "class",
        "signature": "class Taskbar",
        "summary": "Taskbar.js - bottom shell coordinator. Rendering and behavior live in shell/taskbar modules so the taskbar can grow without becoming another monolithic desktop controller."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "shell/WindowSizer",
    "path": "webgpu-os/reference/shell/WindowSizer.md",
    "source": "webgpu-os/shell/WindowSizer.js",
    "import": "/webgpu-os/shell/WindowSizer.js",
    "sourceHash": "9a78a78b47dee396436a9dcb056570e34f336c112ed1d207a60cace139478c29",
    "summary": "WindowSizer.js — Viewport-aware window sizing and placement. Computes default window dimensions and screen position based on: 1. The LIVE available desktop area (viewport minus taskbar) — not device type. 2. The app manifest's `category` (and optional `sizingHint`) to pick a sizing profile. 3. The manifest's `defaultWidth/defaultHeight` treated as design-time values at a 1440px reference viewport, then scaled proportionally to the actual viewport. Windows are centered in the available desktop area, with a configurable cascade offset for stacking multiple windows. ── Viewport contexts (based on available desktop width) ────────────────── compact   < 640px   — very constrained (browser in half-screen, etc.) medium    640–1024  — tablet / laptop / small desktop window wide      1024–1440 — typical desktop ultrawide > 1440    — large monitor / maximized on 4K ── Sizing profiles (per manifest category / sizingHint) ────────────────── compact   → small, fixed-size utility (calculator, clock) utility   → small utility panel tools     → medium tool (settings, pkg-manager) system    → medium-large system panel (sysmon, task-manager, terminal, files) debug     → narrow + tall (devconsole, log-viewer) creative  → large workspace (paint, notepad) webgpu    → large with canvas (fractal, particles, gpu-manager) games     → large, prefers square-ish (minesweeper, snake, solitaire) workspace → near-full (browser, heavy editors)  [sizingHint override] full      → fills entire desktop area            [sizingHint override]",
    "exports": [
      {
        "name": "availableDesktop",
        "kind": "function",
        "signature": "availableDesktop()",
        "summary": "Returns the current available desktop dimensions (px)."
      },
      {
        "name": "computeWindow",
        "kind": "function",
        "signature": "computeWindow(manifest, cascadeIndex = 0)",
        "summary": "Compute the optimal window { width, height, x, y } for a given manifest."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "shell/WindowStateStore",
    "path": "webgpu-os/reference/shell/WindowStateStore.md",
    "source": "webgpu-os/shell/WindowStateStore.js",
    "import": "/webgpu-os/shell/WindowStateStore.js",
    "sourceHash": "1a279ceb82bdc923369c5aaee7c68a793448c6ef4c21ccd9d7342efda82d167a",
    "summary": "WindowStateStore.js — Persist and restore per-app window position/size. Stored in localStorage under 'os.windowStates' as a versioned envelope whose `states` field maps appId → state. The historical bare map remains readable. Validates a restored state against the current viewport before using it; if the position is out of bounds or the size is unreasonable the saved state is silently ignored and the app opens at its computed default.",
    "exports": [
      {
        "name": "validateState",
        "kind": "function",
        "signature": "validateState(state)",
        "summary": "Validate a saved state for corruption only (finite, positive size). Position reachability is no longer a reject reason — clampToViewport() moves an off-screen window back into view instead of discarding the saved state."
      },
      {
        "name": "clampToViewport",
        "kind": "function",
        "signature": "clampToViewport(state)",
        "summary": "Reposition a state so a reachable strip of its titlebar stays inside the work area. Handles smaller screens / resolution changes / disconnected monitors — the window is pulled back on-screen rather than left unclickable."
      },
      {
        "name": "clampStateSize",
        "kind": "function",
        "signature": "clampStateSize(state)",
        "summary": "Clamp a state's width and height so neither falls below 15% nor exceeds 100% of the available desktop area.  Position is preserved as-is."
      },
      {
        "name": "loadState",
        "kind": "function",
        "signature": "loadState(appId)",
        "summary": "Load the saved window state for an app. Returns null when nothing is stored yet."
      },
      {
        "name": "saveState",
        "kind": "function",
        "signature": "saveState(appId, { x, y, width, height, maximized = false })",
        "summary": "Persist the current window state for an app."
      },
      {
        "name": "clearState",
        "kind": "function",
        "signature": "clearState(appId)",
        "summary": "Remove the saved window state for an app (e.g. after a reset)."
      },
      {
        "name": "clearAllStates",
        "kind": "function",
        "signature": "clearAllStates()",
        "summary": "Remove every persisted window geometry record."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "shell/app-icon",
    "path": "webgpu-os/reference/shell/app-icon.md",
    "source": "webgpu-os/shell/app-icon.js",
    "import": "/webgpu-os/shell/app-icon.js",
    "sourceHash": "475e024270e296f1e5a7a55745f8660d872a84b72af7f85451b1f616c4e33d78",
    "summary": "app-icon.js — custom app icons: emoji/glyph OR an uploaded/online image, animated GIF/WebP, or a short video. A manifest `icon` value may be ANY of: • an emoji / short glyph     — \"🧩\"  (default; what the shell drew before) • a still image data/URL     — data:image/… or https://…/x.png • an ANIMATED image          — animated GIF / WebP (plays via <img>) • a short video              — data:video/… or https://…/x.webm (muted loop) renderAppIcon() paints the right element into a container — drop-in for the old `el.textContent = manifest.icon`. Media icons size to the container's font-size (1em square), so each call site keeps its existing sizing. fileToIcon()/urlToIcon() turn a chosen file or remote URL into a compact, self-contained data URL (downscaled + size-capped; animation preserved when it fits) suitable for embedding in a manifest at compile time.",
    "exports": [
      {
        "name": "isImageIcon",
        "kind": "function",
        "signature": "isImageIcon(v)",
        "summary": ""
      },
      {
        "name": "isVideoIcon",
        "kind": "function",
        "signature": "isVideoIcon(v)",
        "summary": ""
      },
      {
        "name": "isMediaIcon",
        "kind": "function",
        "signature": "isMediaIcon(v)",
        "summary": ""
      },
      {
        "name": "renderAppIcon",
        "kind": "function",
        "signature": "renderAppIcon(container, icon, { fallback = '▪' } = {})",
        "summary": "Render `icon` into `container` (cleared first). Emoji/glyph → text (so the caller's font-size applies); image/video → a 1em-square media element."
      },
      {
        "name": "fileToIcon",
        "kind": "function",
        "signature": "async fileToIcon(file)",
        "summary": "Turn a chosen File into a compact icon data URL. • video      → kept as-is if ≤ VIDEO_CAP (muted loop). • animated   → kept as-is if ≤ FULL_CAP (preserves animation); else flattened. • SVG        → kept as-is if small; else rasterised. • other img  → center-cropped + downscaled to a 128² WebP."
      },
      {
        "name": "bytesToIcon",
        "kind": "function",
        "signature": "async bytesToIcon(bytes, filename = 'icon')",
        "summary": "Build an icon data URL from raw bundled file bytes (Uint8Array/ArrayBuffer) or a string (SVG/text), inferring the MIME type from the filename. Used to auto-detect an icon from an app's own files at ingest time."
      },
      {
        "name": "urlToIcon",
        "kind": "function",
        "signature": "async urlToIcon(url, { fetchImpl = null } = {})",
        "summary": "Fetch a remote image/video URL and embed it as a compact data URL (so the icon is self-contained — no live remote dependency, no privacy leak at render time). Cross-origin hosts that block CORS will reject; the caller should suggest downloading + uploading instead."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "shell/desktop/WindowLayoutEngine",
    "path": "webgpu-os/reference/shell/desktop/WindowLayoutEngine.md",
    "source": "webgpu-os/shell/desktop/WindowLayoutEngine.js",
    "import": "/webgpu-os/shell/desktop/WindowLayoutEngine.js",
    "sourceHash": "adf7b0a642521498c30807e5765f6df7bf9f7ad6f40a75d9dd63438ea741d1ec",
    "summary": "Pure window-layout geometry shared by the desktop shell and Theme Manager.",
    "exports": [
      {
        "name": "normalizeWorkArea",
        "kind": "function",
        "signature": "normalizeWorkArea(area = {})",
        "summary": ""
      },
      {
        "name": "computeLayoutRect",
        "kind": "function",
        "signature": "computeLayoutRect(layout, inputArea, inputGap = 8)",
        "summary": "Compute a pixel rect for a named layout. Gaps are applied at outer and inner edges."
      },
      {
        "name": "detectEdgeLayout",
        "kind": "function",
        "signature": "detectEdgeLayout(pointer, inputArea, threshold = 34)",
        "summary": "Resolve an edge/corner pointer position into a snap layout."
      },
      {
        "name": "SNAP_LAYOUTS",
        "kind": "constant",
        "signature": "SNAP_LAYOUTS",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "shell/desktop/shellEnhancements",
    "path": "webgpu-os/reference/shell/desktop/shellEnhancements.md",
    "source": "webgpu-os/shell/desktop/shellEnhancements.js",
    "import": "/webgpu-os/shell/desktop/shellEnhancements.js",
    "sourceHash": "3e14685cf5760114b05b4e7165df66ae11297510dab1ee00aedf2f5344fdf83a",
    "summary": "",
    "exports": [
      {
        "name": "installShellEnhancements",
        "kind": "function",
        "signature": "installShellEnhancements(desktop)",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "shell/desktop/windowActions",
    "path": "webgpu-os/reference/shell/desktop/windowActions.md",
    "source": "webgpu-os/shell/desktop/windowActions.js",
    "import": "/webgpu-os/shell/desktop/windowActions.js",
    "sourceHash": "ff92d70212935451f682e9abf1f0fbcc6e104a77e36344f2958b003732f07859",
    "summary": "",
    "exports": [
      {
        "name": "bindViewportReclamp",
        "kind": "function",
        "signature": "bindViewportReclamp(desktop)",
        "summary": ""
      },
      {
        "name": "unbindViewportReclamp",
        "kind": "function",
        "signature": "unbindViewportReclamp(desktop)",
        "summary": ""
      },
      {
        "name": "minimizePanel",
        "kind": "function",
        "signature": "minimizePanel(desktop, appId)",
        "summary": ""
      },
      {
        "name": "restorePanel",
        "kind": "function",
        "signature": "restorePanel(desktop, appId)",
        "summary": ""
      },
      {
        "name": "focusPanel",
        "kind": "function",
        "signature": "focusPanel(desktop, appId)",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "shell/gpu-ui/GPUTextRenderer",
    "path": "webgpu-os/reference/shell/gpu-ui/GPUTextRenderer.md",
    "source": "webgpu-os/shell/gpu-ui/GPUTextRenderer.js",
    "import": "/webgpu-os/shell/gpu-ui/GPUTextRenderer.js",
    "sourceHash": "c6ddd7ab2ecd267a78812eaa857bcc8f7f37488b116bfb55dd81ee1c00a9490c",
    "summary": "GPUTextRenderer.js — Level-4 GPU-native text. The browser gives us no GPU text primitive, so we rasterize each glyph ONCE with Canvas2D (white on transparent) and pack it into the engine's VGPUTextureAtlas. Drawing a string then becomes a run of tinted textured quads sampled from that atlas — fully GPU-composited, no DOM. Glyphs are cached per (sizePx, weight, char). Whitespace stores advance-only (no atlas region). Coordinates are CSS pixels, top-left origin, matching the compositor's quad space.",
    "exports": [
      {
        "name": "GPUTextRenderer",
        "kind": "class",
        "signature": "class GPUTextRenderer",
        "summary": "GPUTextRenderer.js — Level-4 GPU-native text. The browser gives us no GPU text primitive, so we rasterize each glyph ONCE with Canvas2D (white on transparent) and pack it into the engine's VGPUTextureAtlas. Drawing a string then becomes a run of tinted textured quads sampled from that atlas — fully GPU-composited, no DOM. Glyphs are cached per (sizePx, weight, char). Whitespace stores advance-only (no atlas region). Coordinates are CSS pixels, top-left origin, matching the compositor's quad space."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "shell/gpu-ui/GPUUICompositor",
    "path": "webgpu-os/reference/shell/gpu-ui/GPUUICompositor.md",
    "source": "webgpu-os/shell/gpu-ui/GPUUICompositor.js",
    "import": "/webgpu-os/shell/gpu-ui/GPUUICompositor.js",
    "sourceHash": "bb60cd3846e42dcd05d518e91164150eb159306f69676d029e25b7399b271d48",
    "summary": "GPUUICompositor.js — Level-4 GPU-native UI compositor (3D by default). Renders the desktop's windows as tinted textured quads in a real perspective scene on a full-screen WebGPU canvas. There is NO DOM in this path: text is rasterized into a glyph atlas (GPUTextRenderer) and everything — window surfaces, titlebars, glyphs — is one unified quad primitive. Camera: a perspective camera placed on +Z at d = (vpH/2)/tan(fov/2) so the z=0 plane maps 1:1 to CSS pixels. A window at z=0 with no tilt is therefore pixel-perfect and fully usable, yet it's a genuine 3D quad — depth (z) and tilt are first-class, focused windows come forward, and a subtle pointer parallax sells the 3D space. Coordinate spaces: - window-local px: origin top-left, +x right, +y down (what widgets author) - world units == CSS px, origin = viewport center, +Y up, desktop on z=0 - per-window model matrix maps local px → world (bakes centering + Y-flip) Transparency uses painter's order (windows sorted far→near, widgets in emit order) so there is no depth buffer and no coplanar z-fighting. Engine tech reused (no duplication): VirtualGPU (isolated instance), VGPUTextureAtlas (glyph/solid atlas), engine/core/math (camera + unproject).",
    "exports": [
      {
        "name": "GPUUICompositor",
        "kind": "class",
        "signature": "class GPUUICompositor",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "shell/gpu-ui/GPUWindow",
    "path": "webgpu-os/reference/shell/gpu-ui/GPUWindow.md",
    "source": "webgpu-os/shell/gpu-ui/GPUWindow.js",
    "import": "/webgpu-os/shell/gpu-ui/GPUWindow.js",
    "sourceHash": "36c81fe141caae9f4992279385f2c9beb8c70987f95dc19c7a764de7528a167c",
    "summary": "GPUWindow.js — a GPU-native window for the Level-4 3D UI. The window is authored entirely in LOCAL pixel space (origin = top-left, +x right, +y down) and emits tinted atlas quads through the compositor's sink. It knows nothing about the camera: the compositor builds a per-window model matrix from this window's desktop-space rect + 3D placement (z/tilt) and applies the shared viewProj. This keeps widgets camera-agnostic so the same window is pixel-perfect head-on (z=0) or tilted in the immersive spread. Hit-testing is done in local space (compositor unprojects the pointer ray onto the window plane, then asks the window what was hit).",
    "exports": [
      {
        "name": "GPUWindow",
        "kind": "class",
        "signature": "class GPUWindow",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "shell/gpu-ui/GPUWindowCapture",
    "path": "webgpu-os/reference/shell/gpu-ui/GPUWindowCapture.md",
    "source": "webgpu-os/shell/gpu-ui/GPUWindowCapture.js",
    "import": "/webgpu-os/shell/gpu-ui/GPUWindowCapture.js",
    "sourceHash": "5625f7d4aaf3b332597674425fc4d9398784a135d0e306ec818524dd068121e7",
    "summary": "GPUWindowCapture.js — live per-window content via the Element Capture API. Chrome 132+ lets us restrict a getDisplayMedia track to a single DOM element (RestrictionTarget + track.restrictTo), yielding a live MediaStream of just that element's rendered subtree (no occlusion / \"hall of mirrors\"). We take ONE getDisplayMedia('this tab') stream, clone its track per window, restrict each clone to that app's panel element, and feed a hidden <video>. The GPU compositor then copyExternalImageToTexture()s each video frame into the window's content-atlas region every frame → fully live GPU windows. Requirements (per spec) on each captured element: it must form a stacking context (isolation:isolate) and be flattened (transform-style:flat) with an opaque background. Desktop applies these before attaching. Gracefully unsupported on non-Chromium / older builds (supported=false) so callers fall back to extension snapshot, then native chrome.",
    "exports": [
      {
        "name": "GPUWindowCapture",
        "kind": "class",
        "signature": "class GPUWindowCapture",
        "summary": "GPUWindowCapture.js — live per-window content via the Element Capture API. Chrome 132+ lets us restrict a getDisplayMedia track to a single DOM element (RestrictionTarget + track.restrictTo), yielding a live MediaStream of just that element's rendered subtree (no occlusion / \"hall of mirrors\"). We take ONE getDisplayMedia('this tab') stream, clone its track per window, restrict each clone to that app's panel element, and feed a hidden <video>. The GPU compositor then copyExternalImageToTexture()s each video frame into the window's content-atlas region every frame → fully live GPU windows. Requirements (per spec) on each captured element: it must form a stacking context (isolation:isolate) and be flattened (transform-style:flat) with an opaque background. Desktop applies these before attaching. Gracefully unsupported on non-Chromium / older builds (supported=false) so callers fall back to extension snapshot, then native chrome."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "shell/immersive/Immersive3DCompositor",
    "path": "webgpu-os/reference/shell/immersive/Immersive3DCompositor.md",
    "source": "webgpu-os/shell/immersive/Immersive3DCompositor.js",
    "import": "/webgpu-os/shell/immersive/Immersive3DCompositor.js",
    "sourceHash": "99e02390496926758ed81f97da9676df92e42a1ff4c0ed95a7c1eef442a86717",
    "summary": "Immersive3DCompositor.js — Level-3 GPU compositor (Exposé-style 3D desktop). Captures every live DOM panel to a GPU texture (via PanelCapture), then renders each as a textured quad in a perspective 3D scene on a full-screen WebGPU overlay canvas. ALL matrix/camera math comes from the engine's direct-named shader-math library (engine/core/math) — we only add the WebGPU plumbing and the DOM→bitmap bridge the browser doesn't provide. Coordinate system (pixel-perfect at immersion=0): - World units == CSS pixels. Origin at viewport center, +Y up, desktop on z=0. - Camera sits on +Z at distance d = (vpH/2)/tan(fov/2) so the z=0 plane fills the viewport exactly. A panel quad at z=0 therefore maps 1:1 to its DOM rect. - immersion ∈ [0,1] pushes panels apart in Z by stacking order and adds a gentle mouse-driven camera yaw/pitch for parallax — the \"3D world\" feel. Lifecycle: const c = new Immersive3DCompositor({ device, getPanels }); c.mount();                 // create overlay canvas + pipeline await c.enter();           // capture panels, hide DOM, animate in await c.exit(panelId?);    // animate out, restore DOM (focus panelId if given) c.unmount();               // full teardown Engine math used: mat4Identity, mat4Translate, mat4Scale, mat4Multiply, mat4LookAt, mat4PerspectiveDegWebGPU.",
    "exports": [
      {
        "name": "Immersive3DCompositor",
        "kind": "class",
        "signature": "class Immersive3DCompositor",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "shell/immersive/PanelCapture",
    "path": "webgpu-os/reference/shell/immersive/PanelCapture.md",
    "source": "webgpu-os/shell/immersive/PanelCapture.js",
    "import": "/webgpu-os/shell/immersive/PanelCapture.js",
    "sourceHash": "cc2375642716792ee169ce22d73849d6ca225b814efcb65d53bfd4e0b9e296ba",
    "summary": "⚠️ SUPERSEDED for GPU use. The bitmaps this produces are PERMANENTLY cross-origin-tainted (SVG <foreignObject> rule) and are REJECTED by `copyExternalImageToTexture`. The immersive compositor now captures the viewport via the extension bridge (chrome.tabs.captureVisibleTab → Desktop._captureViewport), which yields untainted, GPU-uploadable pixels. This file is kept only for display-only canvas uses (which tolerate taint). PanelCapture.js — live DOM element → ImageBitmap via SVG foreignObject. Everything else in the immersive compositor (3D quads, perspective camera, texture upload) is done with the engine's shader-math + WebGPU stack. But the browser provides no API to turn an arbitrary <div> (text + Plauna widgets) into pixels — `createImageBitmap` only accepts <img>/<canvas>/<video>/Blob. The zero-dependency route is SVG <foreignObject>: clone the element, inline its computed styles (a standalone SVG blob has no access to the page's stylesheets), serialize to XHTML, wrap in an SVG, rasterize through an <img>, then `createImageBitmap`. The resulting bitmap is uploaded by the engine's TextureManager (`copyExternalImageToTexture`). Known limitations (inherent to foreignObject, documented for callers): - <canvas>/<video> children don't serialize (their live pixels are lost). - Cross-origin images taint and are skipped by the browser. - `backdrop-filter` is not honored inside foreignObject. - Custom web fonts must already be loaded (we don't embed font files). Usage: const cap = new PanelCapture(); const bitmap = await cap.capture(panel.element, { scale: devicePixelRatio }); // → upload bitmap via engine TextureManager._uploadBitmap(bitmap, label) bitmap.close();",
    "exports": [
      {
        "name": "PanelCapture",
        "kind": "class",
        "signature": "class PanelCapture",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "shell/overlay/AIOverlay",
    "path": "webgpu-os/reference/shell/overlay/AIOverlay.md",
    "source": "webgpu-os/shell/overlay/AIOverlay.js",
    "import": "/webgpu-os/shell/overlay/AIOverlay.js",
    "sourceHash": "dfc863e6be9d029e4a62d0bf693ff499060c7178d3107999ad57d7d2efdbe818",
    "summary": "AIOverlay.js — shell-owned approval and elicitation popup. The surface is hidden unless the shared ElicitationManager has a pending request. It deliberately has no ambient bar, chat console, task browser, or timeline. Approval notes are bound to the exact request and elicitation and recorded before the resumed task can observe the decision promise.",
    "exports": [
      {
        "name": "AIOverlay",
        "kind": "class",
        "signature": "class AIOverlay",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "shell/overlay/AdaptationReviewPolicy",
    "path": "webgpu-os/reference/shell/overlay/AdaptationReviewPolicy.md",
    "source": "webgpu-os/shell/overlay/AdaptationReviewPolicy.js",
    "import": "/webgpu-os/shell/overlay/AdaptationReviewPolicy.js",
    "sourceHash": "0a759c8c7e538967f38292c92715ea4170c68268a370dd21f63e6a1b444c85e0",
    "summary": "The shell gives adaptation reviews distinct trusted UI only when the request is the exact AI Echo operation. Caller-controlled schema labels alone are never enough to obtain privileged wording or non-blocking decision behavior.",
    "exports": [
      {
        "name": "isTrustedAdaptationReview",
        "kind": "function",
        "signature": "isTrustedAdaptationReview(elicitation = {})",
        "summary": "The shell gives adaptation reviews distinct trusted UI only when the request is the exact AI Echo operation. Caller-controlled schema labels alone are never enough to obtain privileged wording or non-blocking decision behavior."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "shell/overlay/ApprovalCard",
    "path": "webgpu-os/reference/shell/overlay/ApprovalCard.md",
    "source": "webgpu-os/shell/overlay/ApprovalCard.js",
    "import": "/webgpu-os/shell/overlay/ApprovalCard.js",
    "sourceHash": "7655cf6b5d6884edff3083c89af8e3f3bc9a766273a0548a0571ff7534b72aab",
    "summary": "ApprovalCard.js — overlay card for a pending AI tool-call approval. Driven through the SAME ElicitationManager as questions (an approval is a boolean elicitation whose schema carries { kind:'approval', toolName, params, risk }) — no parallel approval queue. Parameters are shown through ParameterPreviewer (Phase 5) so secrets are masked before they ever hit the DOM.",
    "exports": [
      {
        "name": "createApprovalCard",
        "kind": "function",
        "signature": "createApprovalCard(elicitation, { onApprove, onDeny })",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "shell/overlay/ElicitationCard",
    "path": "webgpu-os/reference/shell/overlay/ElicitationCard.md",
    "source": "webgpu-os/shell/overlay/ElicitationCard.js",
    "import": "/webgpu-os/shell/overlay/ElicitationCard.js",
    "sourceHash": "a1160fee216370a10789fed1dceb4a720d4364078448965669ff4394080aa822",
    "summary": "ElicitationCard.js — overlay card for a mid-task AI question to the user (Phase 4 ElicitationManager). Renders a text input, or buttons when the schema declares an enum of options. Answer → respond(); dismiss → decline().",
    "exports": [
      {
        "name": "taskCheckpointChoices",
        "kind": "function",
        "signature": "taskCheckpointChoices(schema)",
        "summary": "Validate the kernel-owned checkpoint envelope before exposing choices. The UI does not infer choices or authority from prompts. It only renders the exact bounded values supplied by the active task elicitation."
      },
      {
        "name": "createElicitationCard",
        "kind": "function",
        "signature": "createElicitationCard(elicitation, { onRespond, onDecline })",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "shell/start-menu/actions",
    "path": "webgpu-os/reference/shell/start-menu/actions.md",
    "source": "webgpu-os/shell/start-menu/actions.js",
    "import": "/webgpu-os/shell/start-menu/actions.js",
    "sourceHash": "9ac38f01ef11e0056770f914cae4bbcb4720982ff22da5987c7ed20e3a01fb6d",
    "summary": "",
    "exports": [
      {
        "name": "makeDraggable",
        "kind": "function",
        "signature": "makeDraggable(menu, node, app)",
        "summary": ""
      },
      {
        "name": "launchApp",
        "kind": "function",
        "signature": "launchApp(menu, app)",
        "summary": ""
      },
      {
        "name": "addToDesktop",
        "kind": "function",
        "signature": "addToDesktop(menu, appId)",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "shell/start-menu/apps",
    "path": "webgpu-os/reference/shell/start-menu/apps.md",
    "source": "webgpu-os/shell/start-menu/apps.js",
    "import": "/webgpu-os/shell/start-menu/apps.js",
    "sourceHash": "8fe077a1ddea62f8145c5b94b96637446b0009f40645ffbf977ffe423ddcc42d",
    "summary": "",
    "exports": [
      {
        "name": "visibleApps",
        "kind": "function",
        "signature": "visibleApps()",
        "summary": ""
      },
      {
        "name": "searchApps",
        "kind": "function",
        "signature": "searchApps(query)",
        "summary": ""
      },
      {
        "name": "groupAppsByCategory",
        "kind": "function",
        "signature": "groupAppsByCategory(apps)",
        "summary": ""
      },
      {
        "name": "categoryLabel",
        "kind": "function",
        "signature": "categoryLabel(category)",
        "summary": ""
      },
      {
        "name": "categoryIcon",
        "kind": "function",
        "signature": "categoryIcon(category)",
        "summary": ""
      },
      {
        "name": "appMap",
        "kind": "function",
        "signature": "appMap(apps)",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "shell/start-menu/constants",
    "path": "webgpu-os/reference/shell/start-menu/constants.md",
    "source": "webgpu-os/shell/start-menu/constants.js",
    "import": "/webgpu-os/shell/start-menu/constants.js",
    "sourceHash": "6e2e924a8f0fd8022b1e0cad6eaa851e2c99613581d1f8502c9228002025f320",
    "summary": "",
    "exports": [
      {
        "name": "SYSTEM_CATEGORIES",
        "kind": "constant",
        "signature": "SYSTEM_CATEGORIES",
        "summary": ""
      },
      {
        "name": "LS_PINNED",
        "kind": "constant",
        "signature": "LS_PINNED",
        "summary": ""
      },
      {
        "name": "LS_RECENT",
        "kind": "constant",
        "signature": "LS_RECENT",
        "summary": ""
      },
      {
        "name": "LS_COLLAPSED",
        "kind": "constant",
        "signature": "LS_COLLAPSED",
        "summary": ""
      },
      {
        "name": "LS_STATE",
        "kind": "constant",
        "signature": "LS_STATE",
        "summary": ""
      },
      {
        "name": "MAX_RECENT",
        "kind": "constant",
        "signature": "MAX_RECENT",
        "summary": ""
      },
      {
        "name": "DEFAULT_PINNED",
        "kind": "constant",
        "signature": "DEFAULT_PINNED",
        "summary": ""
      },
      {
        "name": "CATEGORY_META",
        "kind": "constant",
        "signature": "CATEGORY_META",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "shell/start-menu/contextMenu",
    "path": "webgpu-os/reference/shell/start-menu/contextMenu.md",
    "source": "webgpu-os/shell/start-menu/contextMenu.js",
    "import": "/webgpu-os/shell/start-menu/contextMenu.js",
    "sourceHash": "b619d903c48448de9205eea81414106b9769fc31f166c9476ae2007843271678",
    "summary": "",
    "exports": [
      {
        "name": "showContextMenu",
        "kind": "function",
        "signature": "showContextMenu(menu, event, app)",
        "summary": ""
      },
      {
        "name": "dismissContextMenu",
        "kind": "function",
        "signature": "dismissContextMenu(menu)",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "shell/start-menu/dom",
    "path": "webgpu-os/reference/shell/start-menu/dom.md",
    "source": "webgpu-os/shell/start-menu/dom.js",
    "import": "/webgpu-os/shell/start-menu/dom.js",
    "sourceHash": "bbe2cc265d6c372df8dadc154ed45796541762e3759e16ff54dd8b44f5216780",
    "summary": "",
    "exports": [
      {
        "name": "el",
        "kind": "function",
        "signature": "el(tag, options = {}, children = [])",
        "summary": ""
      },
      {
        "name": "append",
        "kind": "function",
        "signature": "append(parent, children = [])",
        "summary": ""
      },
      {
        "name": "clear",
        "kind": "function",
        "signature": "clear(node)",
        "summary": ""
      },
      {
        "name": "sectionTitle",
        "kind": "function",
        "signature": "sectionTitle(label, action = null)",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "shell/start-menu/state",
    "path": "webgpu-os/reference/shell/start-menu/state.md",
    "source": "webgpu-os/shell/start-menu/state.js",
    "import": "/webgpu-os/shell/start-menu/state.js",
    "sourceHash": "cf41f9c77cb56645e091a40ba33fd871be529814ab70846e307c0fe5eacb7d5a",
    "summary": "",
    "exports": [
      {
        "name": "loadPinned",
        "kind": "function",
        "signature": "loadPinned()",
        "summary": ""
      },
      {
        "name": "savePinned",
        "kind": "function",
        "signature": "savePinned(pinned)",
        "summary": ""
      },
      {
        "name": "loadRecent",
        "kind": "function",
        "signature": "loadRecent()",
        "summary": ""
      },
      {
        "name": "saveRecent",
        "kind": "function",
        "signature": "saveRecent(recent)",
        "summary": ""
      },
      {
        "name": "loadCollapsed",
        "kind": "function",
        "signature": "loadCollapsed()",
        "summary": ""
      },
      {
        "name": "saveCollapsed",
        "kind": "function",
        "signature": "saveCollapsed(collapsed)",
        "summary": ""
      },
      {
        "name": "trackRecent",
        "kind": "function",
        "signature": "trackRecent(recent, appId)",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "shell/start-menu/vfsPins",
    "path": "webgpu-os/reference/shell/start-menu/vfsPins.md",
    "source": "webgpu-os/shell/start-menu/vfsPins.js",
    "import": "/webgpu-os/shell/start-menu/vfsPins.js",
    "sourceHash": "893570936613250079e791aad219976baa0312c18576f75b4bbf8d4a765cc656",
    "summary": "",
    "exports": [
      {
        "name": "writePinFile",
        "kind": "function",
        "signature": "writePinFile(menu, appId)",
        "summary": ""
      },
      {
        "name": "deletePinFile",
        "kind": "function",
        "signature": "deletePinFile(menu, appId)",
        "summary": ""
      },
      {
        "name": "initVFSPins",
        "kind": "function",
        "signature": "async initVFSPins(menu)",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "shell/start-menu/views",
    "path": "webgpu-os/reference/shell/start-menu/views.md",
    "source": "webgpu-os/shell/start-menu/views.js",
    "import": "/webgpu-os/shell/start-menu/views.js",
    "sourceHash": "559db81bee5b6bc48bb528afb076631f75a89f76ee51318ea572beb7626ea147",
    "summary": "",
    "exports": [
      {
        "name": "buildShell",
        "kind": "function",
        "signature": "buildShell(menu)",
        "summary": ""
      },
      {
        "name": "renderAll",
        "kind": "function",
        "signature": "renderAll(menu)",
        "summary": ""
      },
      {
        "name": "renderSearch",
        "kind": "function",
        "signature": "renderSearch(menu, query)",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "shell/taskbar/appButtons",
    "path": "webgpu-os/reference/shell/taskbar/appButtons.md",
    "source": "webgpu-os/shell/taskbar/appButtons.js",
    "import": "/webgpu-os/shell/taskbar/appButtons.js",
    "sourceHash": "beacc8e69e28926a2293c6b92d5d033851e0f4e93df5b5cc0c16f5a3cd160a89",
    "summary": "",
    "exports": [
      {
        "name": "mountAppsArea",
        "kind": "function",
        "signature": "mountAppsArea(taskbar)",
        "summary": ""
      },
      {
        "name": "bindProcessButtons",
        "kind": "function",
        "signature": "bindProcessButtons(taskbar)",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "shell/taskbar/devBadge",
    "path": "webgpu-os/reference/shell/taskbar/devBadge.md",
    "source": "webgpu-os/shell/taskbar/devBadge.js",
    "import": "/webgpu-os/shell/taskbar/devBadge.js",
    "sourceHash": "b22401d6d5428ab3b6c8cb2557e163ec196420d2ffb04a10d417897848397cc0",
    "summary": "",
    "exports": [
      {
        "name": "mountDevBadge",
        "kind": "function",
        "signature": "mountDevBadge(taskbar)",
        "summary": ""
      },
      {
        "name": "bindModeBadge",
        "kind": "function",
        "signature": "bindModeBadge(taskbar)",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "shell/taskbar/showDesktop",
    "path": "webgpu-os/reference/shell/taskbar/showDesktop.md",
    "source": "webgpu-os/shell/taskbar/showDesktop.js",
    "import": "/webgpu-os/shell/taskbar/showDesktop.js",
    "sourceHash": "c4e391bd0a7f320aa16d0ec3efc7d5df3ae52b1acf7ad2bd852429e05c21d0aa",
    "summary": "showDesktop.js — the far-right \"Show desktop\" sliver (Windows-style). Click once to minimize every open window; click again to restore the same set. Mirrors the Win+D peek/minimize-all corner button. We track which panels are currently minimized via the kernel's panel events so the toggle stays correct even as the user opens/closes/minimizes windows manually.",
    "exports": [
      {
        "name": "mountShowDesktop",
        "kind": "function",
        "signature": "mountShowDesktop(taskbar)",
        "summary": "showDesktop.js — the far-right \"Show desktop\" sliver (Windows-style). Click once to minimize every open window; click again to restore the same set. Mirrors the Win+D peek/minimize-all corner button. We track which panels are currently minimized via the kernel's panel events so the toggle stays correct even as the user opens/closes/minimizes windows manually."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "shell/taskbar/startButton",
    "path": "webgpu-os/reference/shell/taskbar/startButton.md",
    "source": "webgpu-os/shell/taskbar/startButton.js",
    "import": "/webgpu-os/shell/taskbar/startButton.js",
    "sourceHash": "52ef8b3e9536c365149508f9b1728e17638e0bd2565ed59e2bf240e7f56ace00",
    "summary": "",
    "exports": [
      {
        "name": "mountStartButton",
        "kind": "function",
        "signature": "mountStartButton(taskbar)",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "shell/tray/system-tray",
    "path": "webgpu-os/reference/shell/tray/system-tray.md",
    "source": "webgpu-os/shell/tray/system-tray.js",
    "import": "/webgpu-os/shell/tray/system-tray.js",
    "sourceHash": "2dcdde0cf1321cc55e777976b3aa71167ec5904804e3a731697c82a85f3c2e6b",
    "summary": "system-tray.js — the notification-area icon strip. Renders app-registered status icons (kernel.tray) inline, collapsing extras into an overflow popup (the \"^\" chevron) just like Windows' notification area. Left click runs the icon's onClick; right click opens its menu (if any). createSystemTray(kernel) -> { el, dispose }",
    "exports": [
      {
        "name": "createSystemTray",
        "kind": "function",
        "signature": "createSystemTray(kernel)",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "shell/tray/tray-widgets",
    "path": "webgpu-os/reference/shell/tray/tray-widgets.md",
    "source": "webgpu-os/shell/tray/tray-widgets.js",
    "import": "/webgpu-os/shell/tray/tray-widgets.js",
    "sourceHash": "eff19e1baa740084383017ff63a7e91f8ed911f5c49da0cdcc3317901d2b6562",
    "summary": "tray-widgets.js — stateless builders for the status-tray DOM widgets. Un-nested from StatusTray so the tray class stays a thin orchestrator. Each factory returns plain DOM (plus refs where the tray needs to update them); none of them hold tray state.",
    "exports": [
      {
        "name": "makeStatPill",
        "kind": "function",
        "signature": "makeStatPill(modClass = '')",
        "summary": "Stat pill with a status dot + text (used for GPU / FPS readouts)."
      },
      {
        "name": "makeIconButton",
        "kind": "function",
        "signature": "makeIconButton(icon, tooltip, onClick)",
        "summary": "Square icon button (search / quick-settings / bell)."
      },
      {
        "name": "makeBellButton",
        "kind": "function",
        "signature": "makeBellButton(onClick)",
        "summary": "Bell button with an unread badge. Returns { wrap, badge, setCount }."
      },
      {
        "name": "makeClockButton",
        "kind": "function",
        "signature": "makeClockButton(onClick)",
        "summary": "Clock button (time + date stacked). Returns { btn, tick, dispose }. `tick()` refreshes the displayed time; `dispose()` clears its interval."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "storage/AppDataReadbackService",
    "path": "webgpu-os/reference/storage/AppDataReadbackService.md",
    "source": "webgpu-os/storage/AppDataReadbackService.js",
    "import": "/webgpu-os/storage/AppDataReadbackService.js",
    "sourceHash": "2d6dd72e6b161e1a308c4fc9de95a08d01994b87974de6ca0d3b833fa11f60a4",
    "summary": "OS-wide catalog and encrypted readback coordinator for durable app data.",
    "exports": [
      {
        "name": "AppDataReadbackService",
        "kind": "class",
        "signature": "class AppDataReadbackService",
        "summary": ""
      },
      {
        "name": "APP_CANONICAL_DATA_PATHS",
        "kind": "re-export",
        "signature": "APP_CANONICAL_DATA_PATHS",
        "summary": ""
      },
      {
        "name": "APP_WORKSPACE_OUTPUT_CONTRACTS",
        "kind": "re-export",
        "signature": "APP_WORKSPACE_OUTPUT_CONTRACTS",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "storage/AppSandbox",
    "path": "webgpu-os/reference/storage/AppSandbox.md",
    "source": "webgpu-os/storage/AppSandbox.js",
    "import": "/webgpu-os/storage/AppSandbox.js",
    "sourceHash": "4e4d7905668caaef3eb9a06c2e578a1d3ea52a51cb296a8799b97faa19bcbdc5",
    "summary": "AppSandbox.js — Per-app isolated, AES-256-GCM encrypted IndexedDB storage. Each app runs in its own IndexedDB database:  os.sandbox.<appId> completely separate from the kernel database (os.kernel). ── Isolation guarantees ───────────────────────────────────────────────────── • Different IDB database per app  → app A can never query app B's IDB. • AES-256-GCM encryption at rest → even if raw IDB is accessed directly, values are unreadable without the derived key. • Key is PBKDF2-derived from: OS fingerprint (ECDSA public key hash) + appId → keys are device-bound AND app-bound; exporting the raw IDB to another OS instance or another appId produces only garbage. ── API ────────────────────────────────────────────────────────────────────── const sb = new AppSandbox('os.calculator', cryptoDriver); await sb.init(); await sb.set('lastResult', 42);       // encrypt + store const v = await sb.get('lastResult'); // decrypt + return (null if missing) const keys = await sb.list();         // returns key names (not values) await sb.delete('lastResult'); await sb.clear();                     // wipe all of this app's data const info = sb.info();               // { appId, dbName, encrypted: true } ── Syscall surface (apps see syscalls.sandbox.*) ──────────────────────────── Created by createSandboxSyscalls(sandbox) exported below. Apps never receive a reference to AppSandbox directly.",
    "exports": [
      {
        "name": "AppSandbox",
        "kind": "class",
        "signature": "class AppSandbox",
        "summary": ""
      },
      {
        "name": "createSandboxSyscalls",
        "kind": "function",
        "signature": "createSandboxSyscalls(sandbox)",
        "summary": "Wrap an AppSandbox as the `syscalls.sandbox` namespace for an app. Apps receive this — they never get a reference to the AppSandbox itself. Usage in app code: await syscalls.sandbox.set('prefs', { theme: 'dark' }); const p = await syscalls.sandbox.get('prefs'); const keys = await syscalls.sandbox.list(); await syscalls.sandbox.delete('prefs'); await syscalls.sandbox.clear(); const { appId, dbName, encrypted } = syscalls.sandbox.info();"
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "storage/AppSettingsFile",
    "path": "webgpu-os/reference/storage/AppSettingsFile.md",
    "source": "webgpu-os/storage/AppSettingsFile.js",
    "import": "/webgpu-os/storage/AppSettingsFile.js",
    "sourceHash": "9f3d261d05318f03a6f2d7b5e209bbe78c09402fa869d94ebfc5c077ca0faed2",
    "summary": "Shared, Files-visible settings document used by OS apps.",
    "exports": [
      {
        "name": "readAppSettings",
        "kind": "function",
        "signature": "async readAppSettings(syscalls, { migrate = true } = {})",
        "summary": ""
      },
      {
        "name": "writeAppSettings",
        "kind": "function",
        "signature": "async writeAppSettings(syscalls, value)",
        "summary": ""
      },
      {
        "name": "patchAppSetting",
        "kind": "function",
        "signature": "async patchAppSetting(syscalls, appId, value)",
        "summary": ""
      },
      {
        "name": "APP_SETTINGS_PATH",
        "kind": "constant",
        "signature": "APP_SETTINGS_PATH",
        "summary": ""
      },
      {
        "name": "LEGACY_APP_SETTINGS_PATH",
        "kind": "constant",
        "signature": "LEGACY_APP_SETTINGS_PATH",
        "summary": ""
      },
      {
        "name": "APP_SETTINGS_COMPAT_PATH",
        "kind": "constant",
        "signature": "APP_SETTINGS_COMPAT_PATH",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "storage/BoundedTraversal",
    "path": "webgpu-os/reference/storage/BoundedTraversal.md",
    "source": "webgpu-os/storage/BoundedTraversal.js",
    "import": "/webgpu-os/storage/BoundedTraversal.js",
    "sourceHash": "dded79dea8ee206a3eafb802e1263ecc6149372b2f4451b5954b65467cccfee8",
    "summary": "Breadth-first, paged traversal shared by OPFS and mounted folders.",
    "exports": [
      {
        "name": "StorageTraversalLimitError",
        "kind": "class",
        "signature": "class StorageTraversalLimitError extends Error",
        "summary": ""
      },
      {
        "name": "isIgnoredEntry",
        "kind": "function",
        "signature": "isIgnoredEntry(name, rules = [], path = '')",
        "summary": ""
      },
      {
        "name": "walkPaged",
        "kind": "function",
        "signature": "async walkPaged(rootPath, listPage, options = {}, defaultIgnore = [])",
        "summary": "Breadth-first, paged traversal shared by OPFS and mounted folders."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "storage/CacheDriver",
    "path": "webgpu-os/reference/storage/CacheDriver.md",
    "source": "webgpu-os/storage/CacheDriver.js",
    "import": "/webgpu-os/storage/CacheDriver.js",
    "sourceHash": "68ffe67fdd6d04ac92141207ebd5b34c108825787fa7c9a714ea3ee3f70c3331",
    "summary": "CacheDriver.js — Cache API wrapper for rebuildable assets. Used for content that can always be re-downloaded/rebuilt: - CDN assets and web dependencies - Downloaded package chunks (sha256-keyed) - App bundles and compiled shaders - Prefetched update manifests Keys are URLs or opaque cache keys like \"chunk:sha256-abc123\". All methods are async.",
    "exports": [
      {
        "name": "CacheDriver",
        "kind": "class",
        "signature": "class CacheDriver",
        "summary": ""
      },
      {
        "name": "cacheDriver",
        "kind": "constant",
        "signature": "cacheDriver",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "storage/IndexedDBDriver",
    "path": "webgpu-os/reference/storage/IndexedDBDriver.md",
    "source": "webgpu-os/storage/IndexedDBDriver.js",
    "import": "/webgpu-os/storage/IndexedDBDriver.js",
    "sourceHash": "0ca093c65d4c81f9fe4c3600157cba325c1ef237e8f4a2a11dbd3a04100dbfb3",
    "summary": "IndexedDBDriver.js — IndexedDB-backed metadata store. The driver waits for transaction completion, closes connections when another tab upgrades the database, and refuses to reuse such stale connections. Store owners may opt into per-record schema metadata and synchronous migrations; unregistered stores retain their original record shape.",
    "exports": [
      {
        "name": "IndexedDBDriverError",
        "kind": "class",
        "signature": "class IndexedDBDriverError extends Error",
        "summary": ""
      },
      {
        "name": "IndexedDBBlockedError",
        "kind": "class",
        "signature": "class IndexedDBBlockedError extends IndexedDBDriverError",
        "summary": ""
      },
      {
        "name": "IndexedDBStaleConnectionError",
        "kind": "class",
        "signature": "class IndexedDBStaleConnectionError extends IndexedDBDriverError",
        "summary": ""
      },
      {
        "name": "IndexedDBRecordVersionError",
        "kind": "class",
        "signature": "class IndexedDBRecordVersionError extends IndexedDBDriverError",
        "summary": ""
      },
      {
        "name": "IndexedDBDriver",
        "kind": "class",
        "signature": "class IndexedDBDriver",
        "summary": ""
      },
      {
        "name": "INDEXED_DB_RECORD_SCHEMA_KEY",
        "kind": "constant",
        "signature": "INDEXED_DB_RECORD_SCHEMA_KEY",
        "summary": "IndexedDBDriver.js — IndexedDB-backed metadata store. The driver waits for transaction completion, closes connections when another tab upgrades the database, and refuses to reuse such stale connections. Store owners may opt into per-record schema metadata and synchronous migrations; unregistered stores retain their original record shape."
      },
      {
        "name": "idbDriver",
        "kind": "constant",
        "signature": "idbDriver",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "storage/KernelMetadataReadback",
    "path": "webgpu-os/reference/storage/KernelMetadataReadback.md",
    "source": "webgpu-os/storage/KernelMetadataReadback.js",
    "import": "/webgpu-os/storage/KernelMetadataReadback.js",
    "sourceHash": "db96a1943c5714305f2639a353a55d46bf09b772b03958fc2e19d96ea6b21a4c",
    "summary": "Encrypted readback snapshot for the structured `webgpu-os` metadata DB. Non-extractable CryptoKeys and native directory handles are represented by safe descriptors; their browser security boundary is intentionally retained.",
    "exports": [
      {
        "name": "KernelMetadataReadback",
        "kind": "class",
        "signature": "class KernelMetadataReadback",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "storage/LegacyStorageReadback",
    "path": "webgpu-os/reference/storage/LegacyStorageReadback.md",
    "source": "webgpu-os/storage/LegacyStorageReadback.js",
    "import": "/webgpu-os/storage/LegacyStorageReadback.js",
    "sourceHash": "9e167203635999e02ae928cc86c39061bdcd6d8f99bd92d4cd915a2fef4227ca",
    "summary": "LegacyStorageReadback.js — encrypted VFS readback for durable localStorage. Older OS modules still use localStorage directly. Rewriting every caller at once would create migration risk, so this service mirrors the durable keys into an AppSandbox. AppSandbox then publishes one authenticated, device-bound ciphertext container under /user/app-data. Raw names and values never appear in Files. OPFS fallback records and rebuildable caches are deliberately excluded because their authoritative data already lives elsewhere.",
    "exports": [
      {
        "name": "LegacyStorageReadback",
        "kind": "class",
        "signature": "class LegacyStorageReadback",
        "summary": ""
      },
      {
        "name": "LEGACY_STORAGE_READBACK_APP_ID",
        "kind": "constant",
        "signature": "LEGACY_STORAGE_READBACK_APP_ID",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "storage/MountDriver",
    "path": "webgpu-os/reference/storage/MountDriver.md",
    "source": "webgpu-os/storage/MountDriver.js",
    "import": "/webgpu-os/storage/MountDriver.js",
    "sourceHash": "428ff86d6527ab52c2c3a817b4bfe8dee3a1da14bd7d083c8d9d3bba7669b19a",
    "summary": "MountDriver.js — File System Access API driver for user-mounted folders. Manages persistent directory handles for: /mnt/engine    — local engine source folder /mnt/assets    — local asset folder /mnt/projects  — local projects folder /mnt/apps      — local user app folder Directory handles are persisted via IndexedDB (idbDriver) so mounts survive page reloads without re-prompting the user (if permission granted). All read/write methods are async.",
    "exports": [
      {
        "name": "MountDriver",
        "kind": "class",
        "signature": "class MountDriver",
        "summary": ""
      },
      {
        "name": "mountDriver",
        "kind": "constant",
        "signature": "mountDriver",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "storage/MountGraph",
    "path": "webgpu-os/reference/storage/MountGraph.md",
    "source": "webgpu-os/storage/MountGraph.js",
    "import": "/webgpu-os/storage/MountGraph.js",
    "sourceHash": "a365c848a3d262218e4266fbd0046edb1cab047e7dba40be1295f77cc2b38969",
    "summary": "Ordered provider layers with GMod-style read fallthrough and one write layer.",
    "exports": [
      {
        "name": "MountGraph",
        "kind": "class",
        "signature": "class MountGraph",
        "summary": "Ordered provider layers with GMod-style read fallthrough and one write layer."
      },
      {
        "name": "normalizeMountNamespace",
        "kind": "re-export",
        "signature": "normalizeMountNamespace",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "storage/MountRegistry",
    "path": "webgpu-os/reference/storage/MountRegistry.md",
    "source": "webgpu-os/storage/MountRegistry.js",
    "import": "/webgpu-os/storage/MountRegistry.js",
    "sourceHash": "5d69c8ce6a4aeb396a269535ff582e4f2a5381bec346afccbd983cc05cdb26b5",
    "summary": "Case-insensitive registry for provider-neutral mount metadata.",
    "exports": [
      {
        "name": "MountAliasError",
        "kind": "class",
        "signature": "class MountAliasError extends Error",
        "summary": ""
      },
      {
        "name": "MountRegistry",
        "kind": "class",
        "signature": "class MountRegistry",
        "summary": "Case-insensitive registry for provider-neutral mount metadata."
      },
      {
        "name": "validateMountAlias",
        "kind": "function",
        "signature": "validateMountAlias(value)",
        "summary": "Return a portable, single-segment mount alias without changing its case."
      },
      {
        "name": "mountAliasKey",
        "kind": "function",
        "signature": "mountAliasKey(value)",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "storage/OPFSDriver",
    "path": "webgpu-os/reference/storage/OPFSDriver.md",
    "source": "webgpu-os/storage/OPFSDriver.js",
    "import": "/webgpu-os/storage/OPFSDriver.js",
    "sourceHash": "2fcd5ffed126177e1f6c194672322d9185599dce68fa412b1235f00ade871ada",
    "summary": "OPFSDriver.js — Origin-Private File System driver. Uses navigator.storage.getDirectory() to provide a private OS disk that: - survives page reloads and browser restarts - is not subject to the 5 MB localStorage quota - supports byte-level writes and sync access from workers - is not visible or accessible to other origins All methods are async. Paths are POSIX-style: /os/state/foo.json",
    "exports": [
      {
        "name": "OPFSDriver",
        "kind": "class",
        "signature": "class OPFSDriver",
        "summary": "OPFSDriver.js — Origin-Private File System driver. Uses navigator.storage.getDirectory() to provide a private OS disk that: - survives page reloads and browser restarts - is not subject to the 5 MB localStorage quota - supports byte-level writes and sync access from workers - is not visible or accessible to other origins All methods are async. Paths are POSIX-style: /os/state/foo.json"
      },
      {
        "name": "opfsDriver",
        "kind": "constant",
        "signature": "opfsDriver",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "storage/RealmContentStore",
    "path": "webgpu-os/reference/storage/RealmContentStore.md",
    "source": "webgpu-os/storage/RealmContentStore.js",
    "import": "/webgpu-os/storage/RealmContentStore.js",
    "sourceHash": "b629d63a0c467dee3d8fbec60427e2481dfbba70077d898d21b232537fdffd67",
    "summary": "",
    "exports": [
      {
        "name": "RealmContentStore",
        "kind": "class",
        "signature": "class RealmContentStore",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "storage/StorageCoordination",
    "path": "webgpu-os/reference/storage/StorageCoordination.md",
    "source": "webgpu-os/storage/StorageCoordination.js",
    "import": "/webgpu-os/storage/StorageCoordination.js",
    "sourceHash": "d36016ae23ca424c24089b26e306b2919029ee321a26b75eb58ff3f791eebb18",
    "summary": "Same-origin storage coordination shared by tabs and workers. BroadcastChannel keeps observers coherent; Web Locks serializes lifecycle mutations. Both degrade to an in-process queue when unavailable.",
    "exports": [
      {
        "name": "StorageCoordinationUnavailableError",
        "kind": "class",
        "signature": "class StorageCoordinationUnavailableError extends Error",
        "summary": ""
      },
      {
        "name": "StorageCoordination",
        "kind": "class",
        "signature": "class StorageCoordination",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "storage/StorageManager",
    "path": "webgpu-os/reference/storage/StorageManager.md",
    "source": "webgpu-os/storage/StorageManager.js",
    "import": "/webgpu-os/storage/StorageManager.js",
    "sourceHash": "7ed090db6776584e350ab8e0f709e32abdafc0e306d8c38b84df1c966a764351",
    "summary": "StorageManager.js — unified storage facade. Routes filesystem paths to the correct backend: /os/*        → OPFSDriver  (OS internal files, packages, patches, logs) /user/*      → OPFSDriver  (user documents, settings, projects) /run/*       → OPFSDriver  (ephemeral runtime state — cleared on boot) /mnt/*       → MountDriver (user-mounted native folders via FSAA) /cache/*     → CacheDriver (rebuildable assets, package chunks) (other)      → OPFSDriver  (fallback) IndexedDB (idbDriver) is NOT path-routed — it is accessed directly by structured subsystems (PackageManager, PermissionManager, etc.). This is the backend for kernel/VirtualFS.js (which keeps its sync-friendly public API and delegates here for persistence).",
    "exports": [
      {
        "name": "StorageAtomicConflictError",
        "kind": "class",
        "signature": "class StorageAtomicConflictError extends Error",
        "summary": ""
      },
      {
        "name": "StorageAtomicUnsupportedError",
        "kind": "class",
        "signature": "class StorageAtomicUnsupportedError extends Error",
        "summary": ""
      },
      {
        "name": "StorageAtomicOutcomeUnknownError",
        "kind": "class",
        "signature": "class StorageAtomicOutcomeUnknownError extends Error",
        "summary": ""
      },
      {
        "name": "StorageAtomicAbortError",
        "kind": "class",
        "signature": "class StorageAtomicAbortError extends Error",
        "summary": ""
      },
      {
        "name": "StorageQuotaError",
        "kind": "class",
        "signature": "class StorageQuotaError extends Error",
        "summary": ""
      },
      {
        "name": "RecycleBinSafetyError",
        "kind": "class",
        "signature": "class RecycleBinSafetyError extends Error",
        "summary": ""
      },
      {
        "name": "StorageContractError",
        "kind": "class",
        "signature": "class StorageContractError extends Error",
        "summary": ""
      },
      {
        "name": "StorageManager",
        "kind": "class",
        "signature": "class StorageManager",
        "summary": ""
      },
      {
        "name": "storageManager",
        "kind": "constant",
        "signature": "storageManager",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "storage/StorageSafety",
    "path": "webgpu-os/reference/storage/StorageSafety.md",
    "source": "webgpu-os/storage/StorageSafety.js",
    "import": "/webgpu-os/storage/StorageSafety.js",
    "sourceHash": "adfad3adec958fd80996f60d1c1fe2bdc6e0e66b155527534083fa0c7f5e8794",
    "summary": "Browser-file validation and secret detection. Files remain untrusted after validation.",
    "exports": [
      {
        "name": "StorageContentValidationError",
        "kind": "class",
        "signature": "class StorageContentValidationError extends Error",
        "summary": ""
      },
      {
        "name": "detectSecrets",
        "kind": "function",
        "signature": "detectSecrets(value)",
        "summary": ""
      },
      {
        "name": "assertNoSecrets",
        "kind": "function",
        "signature": "assertNoSecrets(value, { path = 'managed file' } = {})",
        "summary": ""
      },
      {
        "name": "validateImportedFile",
        "kind": "function",
        "signature": "async validateImportedFile(blob, name = '')",
        "summary": ""
      },
      {
        "name": "safePreviewBlob",
        "kind": "function",
        "signature": "async safePreviewBlob(blob, name = '')",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "storage/StorageWorker",
    "path": "webgpu-os/reference/storage/StorageWorker.md",
    "source": "webgpu-os/storage/StorageWorker.js",
    "import": "/webgpu-os/storage/StorageWorker.js",
    "sourceHash": "99e145e8981d4ca40e786ddb63749b0ca792b78defb887fab53aa94d6ca53874",
    "summary": "",
    "exports": []
  },
  {
    "schemaVersion": 1,
    "title": "storage/StorageWorkerClient",
    "path": "webgpu-os/reference/storage/StorageWorkerClient.md",
    "source": "webgpu-os/storage/StorageWorkerClient.js",
    "import": "/webgpu-os/storage/StorageWorkerClient.js",
    "sourceHash": "bacbf496de14c6e9b1406d1103c75b0edf4607e83ff9755106f7e1c29dabc38a",
    "summary": "",
    "exports": [
      {
        "name": "StorageWorkerUnavailableError",
        "kind": "class",
        "signature": "class StorageWorkerUnavailableError extends Error",
        "summary": ""
      },
      {
        "name": "StorageWorkerClient",
        "kind": "class",
        "signature": "class StorageWorkerClient",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "storage/SystemFS",
    "path": "webgpu-os/reference/storage/SystemFS.md",
    "source": "webgpu-os/storage/SystemFS.js",
    "import": "/webgpu-os/storage/SystemFS.js",
    "sourceHash": "a8b52ffd5bd486a0d76de497987dfe9137d35d5ed7a717a2218b9e36ad04b119",
    "summary": "SystemFS.js — read-only virtual filesystem for the compiled-in OS. The engine, Plauna shell, editor, AGI runtime and the built-in apps are packaged directly into the OS bundle (ES modules compiled into the runtime). They are NOT stored in OPFS or IndexedDB, so they can never be edited, moved, or deleted — they are part of the system image. This driver surfaces them as a browsable, read-only tree mounted at `/system` so the Files app can SHOW where they live and clearly mark them immutable, while user/installed content (OPFS + IndexedDB) stays fully writable. Every entry returned carries `{ system: true, readOnly: true }` so the UI and the StorageManager guards can treat it as immutable. All methods are async to match the other storage drivers.",
    "exports": [
      {
        "name": "SystemFS",
        "kind": "class",
        "signature": "class SystemFS",
        "summary": ""
      },
      {
        "name": "systemFS",
        "kind": "constant",
        "signature": "systemFS",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "storage/UserDataPaths",
    "path": "webgpu-os/reference/storage/UserDataPaths.md",
    "source": "webgpu-os/storage/UserDataPaths.js",
    "import": "/webgpu-os/storage/UserDataPaths.js",
    "sourceHash": "1d8f3b1f8c296915663bf6e187ea37cf2956c8b51bb14a712c1c6d4a793ac629",
    "summary": "Canonical user-owned locations shown and managed by the Files app.",
    "exports": [
      {
        "name": "appDataReadbackPath",
        "kind": "function",
        "signature": "appDataReadbackPath(appId)",
        "summary": "Device-bound encrypted readback container for an app-owned sandbox."
      },
      {
        "name": "cleanUserFileName",
        "kind": "function",
        "signature": "cleanUserFileName(value, fallback = 'untitled')",
        "summary": ""
      },
      {
        "name": "joinUserDataPath",
        "kind": "function",
        "signature": "joinUserDataPath(root, ...parts)",
        "summary": ""
      },
      {
        "name": "USER_DATA_PATHS",
        "kind": "constant",
        "signature": "USER_DATA_PATHS",
        "summary": "Canonical user-owned locations shown and managed by the Files app."
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "storage/WorkspaceOutputTerminology",
    "path": "webgpu-os/reference/storage/WorkspaceOutputTerminology.md",
    "source": "webgpu-os/storage/WorkspaceOutputTerminology.js",
    "import": "/webgpu-os/storage/WorkspaceOutputTerminology.js",
    "sourceHash": "62b9d21bf7018360dc46ddbad99f66992672088fe4a029b1181c94dfefd7e619",
    "summary": "Presentation-only terminology for canonical Workspace Output references.",
    "exports": [
      {
        "name": "workspaceOutputPresentation",
        "kind": "function",
        "signature": "workspaceOutputPresentation(entry, outputContracts = [])",
        "summary": "Classify an indexed output for human-facing UI without changing its signed identity or treating a derived index entry as a second copy of the file."
      },
      {
        "name": "workspaceOutputContractPresentation",
        "kind": "function",
        "signature": "workspaceOutputContractPresentation(contract)",
        "summary": "Human-facing catalog projection for settings and Files coverage views."
      },
      {
        "name": "WORKSPACE_OUTPUT_PRESENTATION_TYPE",
        "kind": "constant",
        "signature": "WORKSPACE_OUTPUT_PRESENTATION_TYPE",
        "summary": "Presentation-only terminology for canonical Workspace Output references."
      },
      {
        "name": "ARTIFACT_STUDIO_OUTPUT_PRESENTATION_TYPE",
        "kind": "constant",
        "signature": "ARTIFACT_STUDIO_OUTPUT_PRESENTATION_TYPE",
        "summary": ""
      },
      {
        "name": "WORKSPACE_OUTPUT_LABEL",
        "kind": "constant",
        "signature": "WORKSPACE_OUTPUT_LABEL",
        "summary": ""
      },
      {
        "name": "ARTIFACT_STUDIO_OUTPUT_LABEL",
        "kind": "constant",
        "signature": "ARTIFACT_STUDIO_OUTPUT_LABEL",
        "summary": ""
      }
    ]
  },
  {
    "schemaVersion": 1,
    "title": "storage/system-docs",
    "path": "webgpu-os/reference/storage/system-docs.md",
    "source": "webgpu-os/storage/system-docs.js",
    "import": "/webgpu-os/storage/system-docs.js",
    "sourceHash": "1b9162d3fce7774a9f69000c9a87b85b217e59cea45f0bb6bf0e8601e58ddda5",
    "summary": "system-docs.js — the \"examples database\" surfaced as the read-only /system tree. Goal: expose HOW to use each part of the compiled-in OS (engine, Plauna shell, editor, AGI runtime, built-in apps) WITHOUT shipping the proprietary source. Every leaf here is a usage/recipe document — it shows the public API and example calls a developer would write, not the implementation. Shape — a recursive node: { icon?:  string,                  // shown in the Files app files?: { '<name>': '<text>' },  // leaf docs (markdown / example text) dirs?:  { '<name>': <node> },    // sub-folders } Notes for authors: - Use 4-space-indented code blocks (NOT triple backticks) so content stays valid inside these template-literal strings. - Only document verified, public API surface (syscalls, app lifecycle, manifest schema, VFS). Keep deep internals conceptual. - This is a database: add files/dirs freely — SystemFS renders them as-is.",
    "exports": [
      {
        "name": "MyGpuApp",
        "kind": "class",
        "signature": "class MyGpuApp",
        "summary": ""
      },
      {
        "name": "HelloApp",
        "kind": "class",
        "signature": "class HelloApp",
        "summary": ""
      },
      {
        "name": "SYSTEM_DOCS",
        "kind": "constant",
        "signature": "SYSTEM_DOCS",
        "summary": ""
      }
    ]
  }
]