@exponential_app/engine 0.0.0-stage → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +54 -0
  3. package/README.md +35 -2
  4. package/dist/capabilities.js +29 -0
  5. package/dist/capabilities.js.map +9 -0
  6. package/dist/chunks/index-3nf9f7pv.js +315 -0
  7. package/dist/chunks/index-3nf9f7pv.js.map +10 -0
  8. package/dist/chunks/index-3rgr16n2.js +443 -0
  9. package/dist/chunks/index-3rgr16n2.js.map +9 -0
  10. package/dist/chunks/index-79swfbsm.js +366 -0
  11. package/dist/chunks/index-79swfbsm.js.map +10 -0
  12. package/dist/chunks/index-knntt4cb.js +259 -0
  13. package/dist/chunks/index-knntt4cb.js.map +10 -0
  14. package/dist/chunks/index-m2845dn6.js +72 -0
  15. package/dist/chunks/index-m2845dn6.js.map +10 -0
  16. package/dist/chunks/index-pqpnz4ns.js +2213 -0
  17. package/dist/chunks/index-pqpnz4ns.js.map +9 -0
  18. package/dist/chunks/index-q4zws02e.js +2301 -0
  19. package/dist/chunks/index-q4zws02e.js.map +10 -0
  20. package/dist/chunks/index-s3xjr701.js +170 -0
  21. package/dist/chunks/index-s3xjr701.js.map +10 -0
  22. package/dist/chunks/index-sk8b0dh4.js +126 -0
  23. package/dist/chunks/index-sk8b0dh4.js.map +10 -0
  24. package/dist/chunks/index-tvsykgcv.js +3015 -0
  25. package/dist/chunks/index-tvsykgcv.js.map +19 -0
  26. package/dist/chunks/index-v0m7r4y3.js +6869 -0
  27. package/dist/chunks/index-v0m7r4y3.js.map +13 -0
  28. package/dist/consent.js +24 -0
  29. package/dist/consent.js.map +9 -0
  30. package/dist/index.js +654 -0
  31. package/dist/index.js.map +12 -0
  32. package/dist/lifecycle.js +11 -0
  33. package/dist/lifecycle.js.map +9 -0
  34. package/dist/outbox.js +27 -0
  35. package/dist/outbox.js.map +9 -0
  36. package/dist/pdf.js +15 -0
  37. package/dist/pdf.js.map +9 -0
  38. package/dist/providers.js +26 -0
  39. package/dist/providers.js.map +9 -0
  40. package/dist/runner.js +24 -0
  41. package/dist/runner.js.map +9 -0
  42. package/dist/tools.js +38 -0
  43. package/dist/tools.js.map +9 -0
  44. package/dist/types/domain-contract/src/app-records.d.ts +3148 -0
  45. package/dist/types/domain-contract/src/app-share.d.ts +222 -0
  46. package/dist/types/domain-contract/src/apps.d.ts +612 -0
  47. package/dist/types/eengine/fixtures/providers.json +55 -0
  48. package/dist/types/eengine/src/broker.d.ts +80 -0
  49. package/dist/types/eengine/src/capabilities.d.ts +88 -0
  50. package/dist/types/eengine/src/consent.d.ts +50 -0
  51. package/dist/types/eengine/src/index.d.ts +12 -0
  52. package/dist/types/eengine/src/instance.d.ts +131 -0
  53. package/dist/types/eengine/src/lifecycle.d.ts +64 -0
  54. package/dist/types/eengine/src/outbox.d.ts +3 -0
  55. package/dist/types/eengine/src/pdf.d.ts +36 -0
  56. package/dist/types/eengine/src/providers.d.ts +38 -0
  57. package/dist/types/eengine/src/runner.d.ts +82 -0
  58. package/dist/types/eengine/src/stores.d.ts +125 -0
  59. package/dist/types/eengine/src/synced.d.ts +59 -0
  60. package/dist/types/eengine/src/tools.d.ts +79 -0
  61. package/dist/types/eengine/src/web/index.d.ts +20 -0
  62. package/dist/types/eengine/src/web/mcp.d.ts +27 -0
  63. package/dist/types/eengine/src/web/platform.d.ts +91 -0
  64. package/dist/types/eengine/src/web/stores.d.ts +125 -0
  65. package/dist/types/emcp/fixtures/automations.json +521 -0
  66. package/dist/types/emcp/fixtures/hub.json +498 -0
  67. package/dist/types/emcp/src/access.d.ts +55 -0
  68. package/dist/types/emcp/src/audit.d.ts +22 -0
  69. package/dist/types/emcp/src/automations.d.ts +111 -0
  70. package/dist/types/emcp/src/exposes.d.ts +242 -0
  71. package/dist/types/emcp/src/hub.d.ts +63 -0
  72. package/dist/types/emcp/src/index.d.ts +7 -0
  73. package/dist/types/emcp/src/pure.d.ts +11 -0
  74. package/dist/types/emcp/src/upstream.d.ts +288 -0
  75. package/dist/types/emcp/src/vault.d.ts +34 -0
  76. package/dist/web/index.js +791 -0
  77. package/dist/web/index.js.map +13 -0
  78. package/fixtures/bundle.json +1165 -0
  79. package/fixtures/capabilities.json +434 -0
  80. package/fixtures/consent.json +146 -0
  81. package/fixtures/lifecycle.json +125 -0
  82. package/fixtures/outbox.json +22 -0
  83. package/fixtures/providers.json +55 -0
  84. package/fixtures/runner.json +2167 -0
  85. package/package.json +92 -4
@@ -0,0 +1,13 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../packages/eengine/src/web/mcp.ts", "../../../packages/eengine/src/web/platform.ts", "../../../packages/eengine/src/web/stores.ts", "../../../packages/eengine/src/web/index.ts"],
4
+ "sourcesContent": [
5
+ "// MCP call results and strict base64 for the web capabilities (#VAPP-265).\n// No Buffer, no DOM: the same code runs in browsers and under bun:test.\n\n/** An MCP call result as a native capability answers it. */\nexport type McpResult =\n | { content: [{ type: `text`; text: string }]; structuredContent: Record<string, unknown> }\n | { content: [{ type: `text`; text: string }]; isError: true }\n\nexport const ok = (structuredContent: Record<string, unknown>): McpResult => ({\n content: [{ type: `text`, text: JSON.stringify(structuredContent) }],\n structuredContent,\n})\n\nexport const fail = (reason: string): McpResult => ({\n content: [{ type: `text`, text: reason }],\n isError: true,\n})\n\nexport const notFound = (): McpResult => fail(`notFound`)\nexport const unavailable = (): McpResult => fail(`unavailable`)\nexport const failed = (message: string): McpResult => fail(`failed: ${message}`)\n\n/** The message of anything thrown, short and on one line. */\nexport const errorMessage = (error: unknown): string => {\n const text = error instanceof Error ? error.message || error.name : String(error)\n const line = text.replace(/\\s+/g, ` `).trim()\n return line.length > 200 ? `${line.slice(0, 199)}…` : line || `error`\n}\n\n/** A DOMException-style abort (a cancelled picker or share sheet). */\nexport const isAbort = (error: unknown): boolean =>\n typeof error === `object` && error !== null && (error as { name?: unknown }).name === `AbortError`\n\nconst ALPHABET = `ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/`\nconst DECODE = new Int16Array(128).fill(-1)\nfor (let i = 0; i < ALPHABET.length; i++) DECODE[ALPHABET.charCodeAt(i)] = i\n\n/** Standard padded base64. */\nexport const encodeBase64 = (bytes: Uint8Array): string => {\n let out = ``\n let i = 0\n for (; i + 2 < bytes.length; i += 3) {\n const n = (bytes[i]! << 16) | (bytes[i + 1]! << 8) | bytes[i + 2]!\n out += ALPHABET[n >> 18]! + ALPHABET[(n >> 12) & 63]! + ALPHABET[(n >> 6) & 63]! + ALPHABET[n & 63]!\n }\n const rest = bytes.length - i\n if (rest === 1) {\n const n = bytes[i]! << 16\n out += `${ALPHABET[n >> 18]}${ALPHABET[(n >> 12) & 63]}==`\n } else if (rest === 2) {\n const n = (bytes[i]! << 16) | (bytes[i + 1]! << 8)\n out += `${ALPHABET[n >> 18]}${ALPHABET[(n >> 12) & 63]}${ALPHABET[(n >> 6) & 63]}=`\n }\n return out\n}\n\n/** Strict standard padded base64 (no whitespace, no URL alphabet, zero pad bits); null when malformed. */\nexport const decodeBase64 = (text: string): Uint8Array | null => {\n if (text.length % 4 !== 0) return null\n const pad = text.endsWith(`==`) ? 2 : text.endsWith(`=`) ? 1 : 0\n const out = new Uint8Array((text.length / 4) * 3 - pad)\n let o = 0\n for (let i = 0; i < text.length; i += 4) {\n const last = i + 4 === text.length\n const v = [0, 0, 0, 0]\n for (let j = 0; j < 4; j++) {\n const c = text.charCodeAt(i + j)\n if (c === 61 /* = */ && last && j >= 4 - pad) continue\n const d = c < 128 ? DECODE[c]! : -1\n if (d < 0) return null\n v[j] = d\n }\n const n = (v[0]! << 18) | (v[1]! << 12) | (v[2]! << 6) | v[3]!\n out[o++] = n >> 16\n if (o < out.length) out[o++] = (n >> 8) & 255\n if (o < out.length) out[o++] = n & 255\n if (last && pad === 2 && (v[1]! & 15) !== 0) return null\n if (last && pad === 1 && (v[2]! & 3) !== 0) return null\n }\n return out\n}\n",
6
+ "// The WebPlatform seam: every browser API the web capabilities touch (#VAPP-265).\n// `browserPlatform()` is the real one; tests hand `webCapabilities` fakes.\n// Optional members are the feature checks: an absent one = the browser lacks it.\n\n/** The parts of a `File` the capabilities read. */\nexport interface FileLike {\n readonly name: string\n readonly type: string\n readonly lastModified: number\n arrayBuffer(): Promise<ArrayBuffer>\n}\n\n/** File System Access / OPFS file handle (the parts used). */\nexport interface FileHandleLike {\n readonly kind: `file`\n readonly name: string\n getFile(): Promise<FileLike>\n createWritable(): Promise<WritableLike>\n}\n\nexport interface WritableLike {\n write(data: Blob | Uint8Array): Promise<void>\n close(): Promise<void>\n}\n\n/** An OPFS directory handle (the parts used). */\nexport interface DirectoryHandleLike {\n readonly kind: `directory`\n readonly name: string\n getDirectoryHandle(name: string, options?: { create?: boolean }): Promise<DirectoryHandleLike>\n getFileHandle(name: string, options?: { create?: boolean }): Promise<FileHandleLike>\n values(): AsyncIterable<FileHandleLike | DirectoryHandleLike>\n}\n\n/** `showOpenFilePicker` options (File System Access). */\nexport interface OpenPickerOptions {\n multiple: boolean\n types?: { description?: string; accept: Record<string, string[]> }[]\n excludeAcceptAllOption?: boolean\n}\n\nexport interface ShareDataLike {\n title?: string\n text?: string\n url?: string\n files?: File[]\n}\n\n/** A shown notification (the parts used). */\nexport interface NotificationLike {\n onclick: ((event: unknown) => void) | null\n onclose: ((event: unknown) => void) | null\n close(): void\n}\n\nexport interface NotificationsLike {\n permission(): `default` | `granted` | `denied`\n requestPermission(): Promise<`default` | `granted` | `denied`>\n show(title: string, options: { body?: string; tag: string }): NotificationLike\n}\n\nexport type TimerHandle = unknown\n\nexport interface WebPlatform {\n /** File System Access open picker; throws AbortError on cancel. */\n showOpenFilePicker?(options: OpenPickerOptions): Promise<FileHandleLike[]>\n /** File System Access save picker; throws AbortError on cancel. */\n showSaveFilePicker?(options: { suggestedName: string }): Promise<FileHandleLike>\n /** A hidden `<input type=file>`; resolves [] when the person cancels. */\n pickWithInput(options: { accept: string; multiple: boolean }): Promise<FileLike[]>\n /** A download through an `<a download>` blob URL. */\n download(name: string, blob: Blob): void\n /** `navigator.share` and `navigator.canShare`. */\n share?(data: ShareDataLike): Promise<void>\n canShare?(data: ShareDataLike): boolean\n /** A hidden iframe on a blob URL, `contentWindow.print()` once loaded, then removed. */\n print(blob: Blob): Promise<void>\n /** `navigator.storage.getDirectory()` (OPFS). */\n storageDirectory?(): Promise<DirectoryHandleLike>\n /** The Notification API. */\n notifications?: NotificationsLike\n now(): number\n setTimeout(fn: () => void, ms: number): TimerHandle\n clearTimeout(handle: TimerHandle): void\n /** window.focus(). */\n focus(): void\n}\n\n/** How long a blob URL (and a print iframe that never sees `afterprint`) lives. */\nconst BLOB_URL_TTL_MS = 60_000\n\n/** The real browser. Call it in a page (it reads `window`, `document` and `navigator`). */\nexport const browserPlatform = (): WebPlatform => {\n const w = globalThis as unknown as Window &\n typeof globalThis & {\n showOpenFilePicker?: (o: unknown) => Promise<FileHandleLike[]>\n showSaveFilePicker?: (o: unknown) => Promise<FileHandleLike>\n }\n const nav = w.navigator as Navigator | undefined\n const platform: WebPlatform = {\n pickWithInput: ({ accept, multiple }) =>\n new Promise((resolve, reject) => {\n // Without a gesture the click is ignored and neither change nor cancel fires: refuse instead of hanging.\n const activation = (nav as { userActivation?: { isActive: boolean } } | undefined)?.userActivation\n if (activation && !activation.isActive) {\n reject(new Error(`the picker needs a user gesture`))\n return\n }\n const input = w.document.createElement(`input`)\n input.type = `file`\n input.multiple = multiple\n if (accept) input.accept = accept\n input.style.display = `none`\n const done = (files: FileLike[]) => {\n input.remove()\n resolve(files)\n }\n input.addEventListener(`change`, () => done(Array.from(input.files ?? [])), { once: true })\n input.addEventListener(`cancel`, () => done([]), { once: true })\n w.document.body.append(input)\n input.click()\n }),\n download: (name, blob) => {\n const url = URL.createObjectURL(blob)\n const a = w.document.createElement(`a`)\n a.href = url\n a.download = name\n a.style.display = `none`\n w.document.body.append(a)\n a.click()\n a.remove()\n w.setTimeout(() => URL.revokeObjectURL(url), BLOB_URL_TTL_MS)\n },\n print: (blob) =>\n new Promise((resolve, reject) => {\n const url = URL.createObjectURL(blob)\n const frame = w.document.createElement(`iframe`)\n frame.style.cssText = `position:fixed;width:0;height:0;border:0;opacity:0;pointer-events:none`\n let removed = false\n const remove = () => {\n if (removed) return\n removed = true\n frame.remove()\n URL.revokeObjectURL(url)\n }\n frame.addEventListener(\n `load`,\n () => {\n const win = frame.contentWindow\n if (!win) {\n remove()\n reject(new Error(`no print frame`))\n return\n }\n win.addEventListener(`afterprint`, () => w.setTimeout(remove, 0), { once: true })\n w.setTimeout(remove, BLOB_URL_TTL_MS)\n try {\n win.focus()\n win.print()\n resolve()\n } catch (error) {\n remove()\n reject(error)\n }\n },\n { once: true },\n )\n frame.src = url\n w.document.body.append(frame)\n }),\n now: () => Date.now(),\n setTimeout: (fn, ms) => w.setTimeout(fn, ms),\n clearTimeout: (handle) => w.clearTimeout(handle as number),\n focus: () => w.focus(),\n }\n if (typeof w.showOpenFilePicker === `function`) {\n const pick = w.showOpenFilePicker.bind(w)\n platform.showOpenFilePicker = (options) => pick(options)\n }\n if (typeof w.showSaveFilePicker === `function`) {\n const pick = w.showSaveFilePicker.bind(w)\n platform.showSaveFilePicker = (options) => pick(options)\n }\n if (nav && typeof nav.share === `function`) {\n platform.share = (data) => nav.share(data)\n platform.canShare = (data) => (typeof nav.canShare === `function` ? nav.canShare(data) : false)\n }\n if (nav?.storage && typeof nav.storage.getDirectory === `function`) {\n platform.storageDirectory = () => nav.storage.getDirectory() as unknown as Promise<DirectoryHandleLike>\n }\n const N = (w as { Notification?: typeof Notification }).Notification\n if (typeof N === `function`) {\n platform.notifications = {\n permission: () => N.permission,\n requestPermission: () => N.requestPermission(),\n show: (title, options) => new N(title, options) as unknown as NotificationLike,\n }\n }\n return platform\n}\n",
7
+ "// VAPP-269 (E6d): the web runner's storage (runner.json `storage`). Records in\n// SQLite-WASM on OPFS (the same tables as the crate's `SqliteRecordStore`),\n// IndexedDB when OPFS's sync access handles are missing, files in OPFS, the\n// Vault in IndexedDB. The SQLite engine runs in a worker (OPFS sync access\n// handles exist only there): `serveSql` is the worker's half over any\n// synchronous database, `sqlClient` the page's; the runner app wires\n// `@sqlite.org/sqlite-wasm` in (the Engine never imports it).\n\nimport type { RecordRow } from \"@exponential_app/eui/host\"\n\nimport type { Vault } from \"../broker\"\nimport { LocalRecordStore, type RecordCommit, type RecordEvent, type RecordPersistence } from \"../stores\"\nimport type { BlobStore } from \"../tools\"\n\n// ---------------------------------------------------------------- SQLite\n\n/** The schema (idempotent): the crate's `sqlite::SCHEMA`, statement for statement. */\nexport const SQLITE_SCHEMA = [\n `CREATE TABLE IF NOT EXISTS app_records (app_id TEXT NOT NULL, id TEXT NOT NULL, kind TEXT NOT NULL, data TEXT NOT NULL, created_by TEXT, author_id TEXT, created_at TEXT NOT NULL, updated_at TEXT NOT NULL, PRIMARY KEY (app_id, id))`,\n `CREATE INDEX IF NOT EXISTS app_records_kind ON app_records (app_id, kind)`,\n `CREATE TABLE IF NOT EXISTS app_record_events (seq INTEGER PRIMARY KEY AUTOINCREMENT, app_id TEXT NOT NULL, record_id TEXT NOT NULL, op TEXT NOT NULL, actor TEXT, write_id TEXT NOT NULL, patch TEXT NOT NULL, before TEXT NOT NULL, at TEXT NOT NULL)`,\n `CREATE INDEX IF NOT EXISTS app_record_events_record ON app_record_events (app_id, record_id)`,\n `CREATE TABLE IF NOT EXISTS app_record_writes (app_id TEXT NOT NULL, write_id TEXT NOT NULL, ids TEXT NOT NULL, PRIMARY KEY (app_id, write_id))`,\n]\n\nexport type SqlValue = string | number | null\nexport interface SqlStatement {\n sql: string\n bind?: SqlValue[]\n}\n\n/** A synchronous SQLite connection (sqlite-wasm's oo1 `DB`, `bun:sqlite` in tests). */\nexport interface SyncSqlDatabase {\n /** Rows as objects keyed by column name. */\n query(sql: string, bind: SqlValue[]): Record<string, SqlValue>[]\n run(sql: string, bind: SqlValue[]): void\n}\n\n/** The page's handle on the worker's database. */\nexport interface SqlDatabase {\n query(sql: string, bind?: SqlValue[]): Promise<Record<string, SqlValue>[]>\n /** The statements in ONE transaction: all or nothing. */\n transaction(statements: SqlStatement[]): Promise<void>\n}\n\ntype SqlRequest = { id: number; op: `query`; sql: string; bind: SqlValue[] } | { id: number; op: `transaction`; statements: SqlStatement[] }\ntype SqlResponse = { id: number; rows?: Record<string, SqlValue>[]; error?: string }\n\n/** The smallest MessagePort a worker and a page share. */\nexport interface PortLike {\n postMessage(message: unknown): void\n addEventListener(type: `message`, listener: (event: { data: unknown }) => void): void\n}\n\n/** Run one request against `db` (the worker's half, a transaction rolls back on any failure). */\nexport function answerSql(db: SyncSqlDatabase, request: SqlRequest): SqlResponse {\n try {\n if (request.op === `query`) return { id: request.id, rows: db.query(request.sql, request.bind) }\n db.run(`BEGIN IMMEDIATE`, [])\n try {\n for (const s of request.statements) db.run(s.sql, s.bind ?? [])\n db.run(`COMMIT`, [])\n } catch (error) {\n db.run(`ROLLBACK`, [])\n throw error\n }\n return { id: request.id }\n } catch (error) {\n return { id: request.id, error: error instanceof Error ? error.message : String(error) }\n }\n}\n\n/** Serve `db` over `port` (call it inside the worker once the database is open). */\nexport function serveSql(db: SyncSqlDatabase, port: PortLike): void {\n for (const s of SQLITE_SCHEMA) db.run(s, [])\n port.addEventListener(`message`, (event) => port.postMessage(answerSql(db, event.data as SqlRequest)))\n}\n\n/** The page's client of a worker's `serveSql`. */\nexport function sqlClient(port: PortLike): SqlDatabase {\n let next = 0\n const pending = new Map<number, { resolve: (r: SqlResponse) => void }>()\n port.addEventListener(`message`, (event) => {\n const r = event.data as SqlResponse\n pending.get(r.id)?.resolve(r)\n pending.delete(r.id)\n })\n const send = (request: SqlRequest): Promise<SqlResponse> =>\n new Promise((resolve, reject) => {\n pending.set(request.id, {\n resolve: (r) => (r.error === undefined ? resolve(r) : reject(new Error(r.error))),\n })\n port.postMessage(request)\n })\n return {\n query: async (sql, bind = []) => (await send({ id: ++next, op: `query`, sql, bind })).rows ?? [],\n transaction: async (statements) => void (await send({ id: ++next, op: `transaction`, statements })),\n }\n}\n\nconst json = (v: unknown): string => JSON.stringify(v ?? null)\nconst parsed = (v: SqlValue): unknown => {\n try {\n return typeof v === `string` ? JSON.parse(v) : null\n } catch {\n return null\n }\n}\nconst text = (v: SqlValue | undefined): string | null => (typeof v === `string` ? v : null)\n\n/** The crate's `SqliteRecordStore` tables over a `SqlDatabase`. */\nexport class SqlitePersistence implements RecordPersistence {\n constructor(private readonly db: SqlDatabase) {}\n\n async load(app: string): Promise<RecordRow[]> {\n const rows = await this.db.query(`SELECT id, kind, data, created_by, author_id, created_at, updated_at FROM app_records WHERE app_id = ? ORDER BY created_at, id`, [app])\n return rows.map((r) => ({\n id: String(r.id),\n kind: String(r.kind),\n data: (parsed(r.data) as Record<string, unknown> | null) ?? {},\n createdBy: text(r.created_by),\n authorId: text(r.author_id),\n createdAt: String(r.created_at),\n updatedAt: String(r.updated_at),\n }))\n }\n\n async ack(app: string, writeId: string): Promise<string[] | null> {\n const [row] = await this.db.query(`SELECT ids FROM app_record_writes WHERE app_id = ? AND write_id = ?`, [app, writeId])\n return row ? ((parsed(row.ids) as string[] | null) ?? []) : null\n }\n\n async commit(app: string, c: RecordCommit): Promise<void> {\n const statements: SqlStatement[] = []\n for (const id of c.deletes) statements.push({ sql: `DELETE FROM app_records WHERE app_id = ? AND id = ?`, bind: [app, id] })\n for (const r of c.upserts)\n statements.push({\n sql: `INSERT INTO app_records (app_id, id, kind, data, created_by, author_id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?) ON CONFLICT (app_id, id) DO UPDATE SET data = excluded.data, updated_at = excluded.updated_at`,\n bind: [app, r.id, r.kind, json(r.data), r.createdBy, r.authorId ?? null, r.createdAt, r.updatedAt],\n })\n for (const e of c.events)\n statements.push({\n sql: `INSERT INTO app_record_events (app_id, record_id, op, actor, write_id, patch, before, at) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,\n bind: [app, e.recordId, e.op, e.actor, e.writeId, json(e.patch), json(e.before), e.at],\n })\n statements.push({ sql: `INSERT INTO app_record_writes (app_id, write_id, ids) VALUES (?, ?, ?)`, bind: [app, c.writeId, json(c.ids)] })\n await this.db.transaction(statements)\n }\n\n async history(app: string, id: string): Promise<RecordEvent[]> {\n const rows = await this.db.query(`SELECT record_id, op, actor, write_id, patch, before, at FROM app_record_events WHERE app_id = ? AND record_id = ? ORDER BY seq`, [app, id])\n return rows.map((r) => ({ recordId: String(r.record_id), op: r.op as RecordEvent[`op`], actor: text(r.actor), writeId: String(r.write_id), patch: parsed(r.patch), before: parsed(r.before), at: String(r.at) }))\n }\n}\n\n// ---------------------------------------------------------------- IndexedDB\n\nconst RECORDS = `records`\nconst WRITES = `writes`\nconst EVENTS = `events`\nconst VAULT = `vault`\n\nconst done = <T>(request: IDBRequest<T>): Promise<T> =>\n new Promise((resolve, reject) => {\n request.onsuccess = () => resolve(request.result)\n request.onerror = () => reject(request.error)\n })\n\nconst committed = (tx: IDBTransaction): Promise<void> =>\n new Promise((resolve, reject) => {\n tx.oncomplete = () => resolve()\n tx.onerror = () => reject(tx.error)\n tx.onabort = () => reject(tx.error ?? new Error(`aborted`))\n })\n\n/** Open (and create) the runner's IndexedDB database: records, writes, events and the vault. */\nexport function openRunnerIdb(factory: IDBFactory, name: string): Promise<IDBDatabase> {\n const request = factory.open(name, 1)\n request.onupgradeneeded = () => {\n const db = request.result\n db.createObjectStore(RECORDS, { keyPath: [`appId`, `id`] }).createIndex(`app`, `appId`)\n db.createObjectStore(WRITES, { keyPath: [`appId`, `writeId`] })\n db.createObjectStore(EVENTS, { autoIncrement: true }).createIndex(`record`, [`appId`, `recordId`])\n db.createObjectStore(VAULT)\n }\n return done(request)\n}\n\n/** The records' fallback when OPFS has no sync access handles: one IndexedDB transaction per batch. */\nexport class IndexedDbPersistence implements RecordPersistence {\n constructor(private readonly db: IDBDatabase) {}\n\n async load(app: string): Promise<RecordRow[]> {\n const all = await done(this.db.transaction(RECORDS).objectStore(RECORDS).index(`app`).getAll(app))\n return (all as (RecordRow & { appId: string })[]).map(({ appId: _, ...row }) => row).sort((a, b) => (a.createdAt < b.createdAt ? -1 : a.createdAt > b.createdAt ? 1 : a.id < b.id ? -1 : 1))\n }\n\n async ack(app: string, writeId: string): Promise<string[] | null> {\n const row = (await done(this.db.transaction(WRITES).objectStore(WRITES).get([app, writeId]))) as { ids: string[] } | undefined\n return row ? row.ids : null\n }\n\n async commit(app: string, c: RecordCommit): Promise<void> {\n const tx = this.db.transaction([RECORDS, WRITES, EVENTS], `readwrite`)\n const records = tx.objectStore(RECORDS)\n for (const id of c.deletes) records.delete([app, id])\n for (const r of c.upserts) records.put({ ...r, appId: app })\n for (const e of c.events) tx.objectStore(EVENTS).add({ ...e, appId: app })\n tx.objectStore(WRITES).put({ appId: app, writeId: c.writeId, ids: c.ids })\n await committed(tx)\n }\n\n async history(app: string, id: string): Promise<RecordEvent[]> {\n const all = await done(this.db.transaction(EVENTS).objectStore(EVENTS).index(`record`).getAll([app, id]))\n return (all as (RecordEvent & { appId: string })[]).map(({ appId: _, ...e }) => e)\n }\n}\n\n/** The Vault in IndexedDB (runner.json `storage`: the web's keystore). */\nexport class IndexedDbVault implements Vault {\n constructor(private readonly db: IDBDatabase) {}\n\n async read(key: string): Promise<string | null> {\n const v = await done(this.db.transaction(VAULT).objectStore(VAULT).get(key))\n return typeof v === `string` ? v : null\n }\n\n async write(key: string, value: string): Promise<void> {\n const tx = this.db.transaction(VAULT, `readwrite`)\n tx.objectStore(VAULT).put(value, key)\n await committed(tx)\n }\n\n async delete(key: string): Promise<void> {\n const tx = this.db.transaction(VAULT, `readwrite`)\n tx.objectStore(VAULT).delete(key)\n await committed(tx)\n }\n}\n\n// ---------------------------------------------------------------- OPFS files\n\n/** An OPFS directory (the parts the BlobStore uses). */\nexport interface OpfsDirectory {\n getDirectoryHandle(name: string, options?: { create?: boolean }): Promise<OpfsDirectory>\n getFileHandle(name: string, options?: { create?: boolean }): Promise<{ getFile(): Promise<{ arrayBuffer(): Promise<ArrayBuffer> }>; createWritable(): Promise<{ write(data: Uint8Array | string): Promise<void>; close(): Promise<void> }> }>\n removeEntry(name: string): Promise<void>\n}\n\nconst UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i\nconst notFound = (e: unknown) => e instanceof Error && (e.name === `NotFoundError` || e.name === `TypeMismatchError`)\n\n/** Record files in OPFS: `<root>/<app>/<id>` (+ `<id>.json` with name and mime), the crate's `FsBlobStore` layout. */\nexport class OpfsBlobStore implements BlobStore {\n constructor(private readonly root: () => Promise<OpfsDirectory>) {}\n\n private async dir(app: string, create: boolean): Promise<OpfsDirectory> {\n if (!app || /[/\\\\]/.test(app) || app.startsWith(`.`)) throw new Error(`not an app id`)\n return (await this.root()).getDirectoryHandle(app, { create })\n }\n\n private async writeFile(dir: OpfsDirectory, name: string, data: Uint8Array | string): Promise<void> {\n const writable = await (await dir.getFileHandle(name, { create: true })).createWritable()\n await writable.write(data)\n await writable.close()\n }\n\n async put(app: string, name: string, mimeType: string, bytes: Uint8Array): Promise<string> {\n const dir = await this.dir(app, true)\n const id = crypto.randomUUID()\n await this.writeFile(dir, id, bytes)\n await this.writeFile(dir, `${id}.json`, JSON.stringify({ name, mime: mimeType }))\n return id\n }\n\n async get(app: string, id: string): Promise<Uint8Array | null> {\n if (!UUID.test(id)) return null\n try {\n const file = await (await (await this.dir(app, false)).getFileHandle(id)).getFile()\n return new Uint8Array(await file.arrayBuffer())\n } catch (e) {\n if (notFound(e)) return null\n throw e\n }\n }\n\n async delete(app: string, id: string): Promise<void> {\n if (!UUID.test(id)) return\n let dir: OpfsDirectory\n try {\n dir = await this.dir(app, false)\n } catch (e) {\n if (notFound(e)) return\n throw e\n }\n for (const name of [id, `${id}.json`]) await dir.removeEntry(name).catch((e) => (notFound(e) ? undefined : Promise.reject(e)))\n }\n}\n\n// ---------------------------------------------------------------- choosing\n\nexport interface WebStorage {\n records: LocalRecordStore\n /** Which records backend opened: `sqlite` (OPFS) or the `indexeddb` fallback. */\n backend: `sqlite` | `indexeddb`\n vault: Vault\n blobs: BlobStore\n}\n\n/** The runner's stores: SQLite on OPFS when `openSqlite` opens, else IndexedDB. */\nexport async function openWebStorage(options: {\n indexedDB: IDBFactory\n /** The IndexedDB database name (per app id). */\n idbName: string\n /** Opens the worker's SQLite on OPFS; rejects when OPFS's sync access handles are missing. */\n openSqlite?: () => Promise<SqlDatabase>\n /** The OPFS directory `storage.files` lives in. */\n files: () => Promise<OpfsDirectory>\n}): Promise<WebStorage> {\n const idb = await openRunnerIdb(options.indexedDB, options.idbName)\n const vault = new IndexedDbVault(idb)\n const blobs = new OpfsBlobStore(options.files)\n if (options.openSqlite) {\n try {\n const db = await options.openSqlite()\n return { records: new LocalRecordStore(new SqlitePersistence(db)), backend: `sqlite`, vault, blobs }\n } catch {\n // No OPFS sync access handles (an older Safari, a private window): IndexedDB.\n }\n }\n return { records: new LocalRecordStore(new IndexedDbPersistence(idb)), backend: `indexeddb`, vault, blobs }\n}\n",
8
+ "// The web's native capabilities (#VAPP-265, E5): the host side of the Engine's\n// TS twin in a browser. One provider per capability (photos, files, share,\n// print, notifications), each answering its native tools with an MCP call\n// result whose structuredContent matches `capabilities.json` `nativeOutputSchema`.\n// The bridge (validation, fileIds, the BlobStore) is the Engine's; this file\n// only sees native arguments (bytes as base64 `data`).\n//\n// USER ACTIVATION: browsers open pickers, the share sheet and the print dialog\n// only within a user gesture. App UI must call through the broker inside the\n// click's task (no awaited network round trip before the call); a picker opened\n// without one answers `failed: …` (never hangs).\n\nimport {\n decodeBase64,\n encodeBase64,\n errorMessage,\n failed,\n isAbort,\n type McpResult,\n notFound,\n ok,\n unavailable,\n} from \"./mcp\"\nimport type { DirectoryHandleLike, FileLike, NotificationLike, OpenPickerOptions, WebPlatform } from \"./platform\"\nimport { browserPlatform } from \"./platform\"\n\nexport * from \"./mcp\"\nexport * from \"./platform\"\nexport * from \"./stores\"\n\nimport type { NativeCapability } from \"../tools\"\n\nexport type { NativeCapability }\n\nexport interface WebCapabilityOptions {\n /** A notification was tapped: `tap` = the lifecycle event posted with it, verbatim. */\n onTap?(tap: unknown): void\n}\n\n/** The OPFS directory that is the app's photo library. */\nexport const PHOTOS_DIR = `photos`\n\nconst MIME_BY_EXTENSION: Record<string, string> = {\n avif: `image/avif`,\n bmp: `image/bmp`,\n csv: `text/csv`,\n gif: `image/gif`,\n heic: `image/heic`,\n heif: `image/heif`,\n html: `text/html`,\n jpeg: `image/jpeg`,\n jpg: `image/jpeg`,\n json: `application/json`,\n md: `text/markdown`,\n pdf: `application/pdf`,\n png: `image/png`,\n svg: `image/svg+xml`,\n tif: `image/tiff`,\n tiff: `image/tiff`,\n txt: `text/plain`,\n webp: `image/webp`,\n zip: `application/zip`,\n}\n\nconst OCTET = `application/octet-stream`\n/** setTimeout's ceiling; later times chain. */\nconst MAX_DELAY_MS = 2_147_483_647\n\nconst extensionMime = (name: string): string | undefined => {\n const dot = name.lastIndexOf(`.`)\n return dot < 0 ? undefined : MIME_BY_EXTENSION[name.slice(dot + 1).toLowerCase()]\n}\n\nconst codePoints = (text: string, max: number): string => {\n const chars = Array.from(text)\n return chars.length > max ? chars.slice(0, max).join(``) : text\n}\n\nconst fileName = (name: string): string => codePoints(name || `file`, 255)\n\nconst fileMime = (file: { name: string; type: string }): string => {\n const type = file.type && file.type.length <= 100 ? file.type : undefined\n return type ?? extensionMime(file.name) ?? OCTET\n}\n\nconst str = (args: Record<string, unknown>, key: string): string | undefined =>\n typeof args[key] === `string` ? (args[key] as string) : undefined\n\nconst bytesOf = async (file: FileLike): Promise<Uint8Array> => new Uint8Array(await file.arrayBuffer())\n\nconst blobOf = (bytes: Uint8Array, type: string): Blob => new Blob([bytes as Uint8Array<ArrayBuffer>], { type })\n\n/** `accept` (MIME types or `.ext`) as `showOpenFilePicker` types. */\nexport const pickerTypes = (accept: string[]): OpenPickerOptions[`types`] => {\n const map: Record<string, string[]> = {}\n for (const raw of accept) {\n const entry = raw.trim()\n if (entry.includes(`/`)) {\n map[entry] ??= []\n } else {\n const ext = entry.startsWith(`.`) ? entry : `.${entry}`\n const mime = extensionMime(ext) ?? OCTET\n ;(map[mime] ??= []).push(ext)\n }\n }\n return [{ description: `Files`, accept: map }]\n}\n\n/** The shared picker: File System Access when present (TypeError on `accept` = the input), else a hidden input. */\nconst pickFiles = async (\n platform: WebPlatform,\n accept: string[],\n multiple: boolean,\n): Promise<FileLike[]> => {\n if (platform.showOpenFilePicker) {\n const options: OpenPickerOptions = { multiple }\n if (accept.length > 0) {\n options.types = pickerTypes(accept)\n options.excludeAcceptAllOption = true\n }\n try {\n const handles = await platform.showOpenFilePicker(options)\n return await Promise.all(handles.map((h) => h.getFile()))\n } catch (error) {\n if (isAbort(error)) return []\n if (!(error instanceof TypeError)) throw error\n }\n }\n return platform.pickWithInput({ accept: accept.join(`,`), multiple })\n}\n\nconst guard =\n (tools: Record<string, (args: Record<string, unknown>) => Promise<McpResult>>) =>\n async (tool: string, args: Record<string, unknown>): Promise<McpResult> => {\n const run = Object.hasOwn(tools, tool) ? tools[tool] : undefined\n if (!run) return unavailable()\n try {\n return await run(args ?? {})\n } catch (error) {\n return failed(errorMessage(error))\n }\n }\n\n// ---- files ----\n\nconst filesCapability = (platform: WebPlatform): NativeCapability => ({\n name: `files`,\n call: guard({\n open: async (args) => {\n const accept = Array.isArray(args.accept) ? (args.accept as string[]) : []\n const files = await pickFiles(platform, accept, args.multiple === true)\n const picked = (args.multiple === true ? files : files.slice(0, 1)).slice(0, 100)\n return ok({\n files: await Promise.all(\n picked.map(async (f) => ({ name: fileName(f.name), mimeType: fileMime(f), data: encodeBase64(await bytesOf(f)) })),\n ),\n })\n },\n save: async (args) => {\n const name = str(args, `name`) ?? `file`\n const bytes = decodeBase64(str(args, `data`) ?? ``)\n if (!bytes) return failed(`bad base64`)\n const blob = blobOf(bytes, str(args, `mimeType`) ?? OCTET)\n if (platform.showSaveFilePicker) {\n let handle\n try {\n handle = await platform.showSaveFilePicker({ suggestedName: name })\n } catch (error) {\n if (isAbort(error)) return ok({ saved: false })\n if (!(error instanceof TypeError)) throw error\n }\n if (handle) {\n const writable = await handle.createWritable()\n await writable.write(blob)\n await writable.close()\n return ok({ saved: true })\n }\n }\n platform.download(name, blob)\n return ok({ saved: true })\n },\n }),\n})\n\n// ---- photos ----\n\ninterface LibraryEntry {\n id: string\n name: string\n takenMs: number\n}\n\n/** `<timestamp>-<name>`: the timestamp = the picked file's lastModified (ms). */\nconst parsePhotoId = (id: string): LibraryEntry | null => {\n const m = /^(\\d{1,15})-(.+)$/.exec(id)\n if (!m) return null\n return { id, name: m[2]!, takenMs: Number(m[1]) }\n}\n\nconst takenAt = (ms: number): string | null => (ms > 0 && ms <= 8.64e15 ? new Date(ms).toISOString() : null)\n\nconst photoMeta = (entry: LibraryEntry, mime?: string) => ({\n id: entry.id,\n name: fileName(entry.name),\n mimeType: mime ?? extensionMime(entry.name) ?? OCTET,\n takenAt: takenAt(entry.takenMs),\n})\n\nconst safeName = (name: string): string => {\n const cleaned = codePoints(name.replace(/[/\\\\\\u0000]/g, `_`), 200)\n return cleaned === `` || cleaned === `.` || cleaned === `..` ? `photo` : cleaned\n}\n\nconst photosCapability = (platform: WebPlatform): NativeCapability => {\n const library = async (): Promise<DirectoryHandleLike | null> => {\n if (!platform.storageDirectory) return null\n const root = await platform.storageDirectory()\n return root.getDirectoryHandle(PHOTOS_DIR, { create: true })\n }\n const entries = async (dir: DirectoryHandleLike): Promise<LibraryEntry[]> => {\n const out: LibraryEntry[] = []\n for await (const handle of dir.values()) {\n if (handle.kind !== `file`) continue\n const entry = parsePhotoId(handle.name)\n if (entry) out.push(entry)\n }\n return out.sort((a, b) => b.takenMs - a.takenMs || (a.id < b.id ? 1 : a.id > b.id ? -1 : 0))\n }\n return {\n name: `photos`,\n call: guard({\n pick: async (args) => {\n const limit = typeof args.limit === `number` ? Math.max(1, Math.min(50, Math.floor(args.limit))) : 1\n const files = (await pickFiles(platform, [`image/*`], limit > 1)).slice(0, limit)\n const dir = files.length > 0 ? await library().catch(() => null) : null\n const photos = []\n for (const file of files) {\n const bytes = await bytesOf(file)\n const ms = Number.isSafeInteger(file.lastModified) && file.lastModified > 0 ? file.lastModified : 0\n const id = `${ms}-${safeName(file.name)}`\n if (dir) {\n try {\n const writable = await (await dir.getFileHandle(id, { create: true })).createWritable()\n await writable.write(bytes)\n await writable.close()\n } catch {\n // The pick still answers; `get` of this id answers notFound.\n }\n }\n const meta = photoMeta({ id, name: safeName(file.name), takenMs: ms }, fileMime(file))\n photos.push({ ...meta, data: encodeBase64(bytes) })\n }\n return ok({ photos })\n },\n list: async (args) => {\n const limit = typeof args.limit === `number` ? Math.max(1, Math.min(100, Math.floor(args.limit))) : 50\n const cursor = str(args, `cursor`)\n if (cursor !== undefined && !/^\\d{1,9}$/.test(cursor)) return failed(`bad cursor`)\n const dir = await library().catch(() => null)\n if (!dir) return ok({ photos: [], cursor: null })\n const all = await entries(dir)\n const offset = cursor === undefined ? 0 : Number(cursor)\n const page = all.slice(offset, offset + limit)\n const next = offset + limit < all.length ? String(offset + limit) : null\n return ok({ photos: page.map((e) => photoMeta(e)), cursor: next })\n },\n get: async (args) => {\n const entry = parsePhotoId(str(args, `id`) ?? ``)\n if (!entry) return notFound()\n const dir = await library().catch(() => null)\n if (!dir) return notFound()\n let file: FileLike\n try {\n file = await (await dir.getFileHandle(entry.id)).getFile()\n } catch {\n return notFound()\n }\n return ok({ photo: { ...photoMeta(entry), data: encodeBase64(await bytesOf(file)) } })\n },\n }),\n }\n}\n\n// ---- share ----\n\nconst shareCapability = (platform: WebPlatform): NativeCapability => ({\n name: `share`,\n call: guard({\n send: async (args) => {\n if (!platform.share) return unavailable()\n const data: { title?: string; text?: string; url?: string; files?: File[] } = {}\n for (const key of [`title`, `text`, `url`] as const) {\n const value = str(args, key)\n if (value !== undefined) data[key] = value\n }\n const file = args.file as { name?: string; mimeType?: string; data?: string } | undefined | null\n if (file && typeof file === `object`) {\n const bytes = decodeBase64(file.data ?? ``)\n if (!bytes) return failed(`bad base64`)\n const shared = new File([bytes as Uint8Array<ArrayBuffer>], file.name ?? `file`, { type: file.mimeType ?? OCTET })\n if (platform.canShare?.({ files: [shared] })) data.files = [shared]\n else if (data.text === undefined && data.url === undefined) return failed(`this browser cannot share files`)\n }\n try {\n await platform.share(data)\n } catch (error) {\n if (isAbort(error)) return ok({ shared: false })\n throw error\n }\n return ok({ shared: true })\n },\n }),\n})\n\n// ---- print ----\n\nconst printCapability = (platform: WebPlatform): NativeCapability => ({\n name: `print`,\n call: guard({\n // `printed` is always true: a browser never tells whether the person printed or cancelled.\n print: async (args) => {\n const bytes = decodeBase64(str(args, `data`) ?? ``)\n if (!bytes) return failed(`bad base64`)\n await platform.print(blobOf(bytes, str(args, `mimeType`) ?? `application/pdf`))\n return ok({ printed: true })\n },\n }),\n})\n\n// ---- notifications ----\n\ninterface Posted {\n timer?: unknown\n shown?: NotificationLike\n}\n\n/**\n * Notifications live only while the page is open: a scheduled one is a\n * setTimeout (no service worker), so it fires only if the page is still open\n * at `at`; one shown is withdrawn by `cancel` or a re-post of its id (`tag`).\n */\nconst notificationsCapability = (platform: WebPlatform, opts: WebCapabilityOptions): NativeCapability => {\n const api = platform.notifications!\n const posted = new Map<string, Posted>()\n\n const withdraw = (id: string): boolean => {\n const entry = posted.get(id)\n if (!entry) return false\n posted.delete(id)\n if (entry.timer !== undefined) platform.clearTimeout(entry.timer)\n if (entry.shown) {\n entry.shown.onclose = null\n entry.shown.close()\n }\n return true\n }\n\n const show = (id: string, entry: Posted, title: string, body: string | null, tap: unknown) => {\n entry.timer = undefined\n const n = api.show(title, body === null ? { tag: id } : { body, tag: id })\n entry.shown = n\n n.onclick = () => {\n platform.focus()\n if (tap !== null && tap !== undefined) opts.onTap?.(tap)\n withdraw(id)\n }\n n.onclose = () => {\n if (posted.get(id) === entry) posted.delete(id)\n }\n }\n\n const schedule = (id: string, entry: Posted, atMs: number, fire: () => void) => {\n const delay = atMs - platform.now()\n if (delay <= 0) return fire()\n entry.timer = platform.setTimeout(() => {\n if (posted.get(id) === entry) schedule(id, entry, atMs, fire)\n }, Math.min(delay, MAX_DELAY_MS))\n }\n\n return {\n name: `notifications`,\n call: guard({\n post: async (args) => {\n const id = str(args, `id`) ?? ``\n const title = str(args, `title`) ?? ``\n const body = str(args, `body`) ?? null\n const at = str(args, `at`)\n const atMs = at === undefined ? Number.NaN : Date.parse(at)\n if (at !== undefined && Number.isNaN(atMs)) return failed(`bad at`)\n let permission = api.permission()\n if (permission === `default`) permission = await api.requestPermission()\n if (permission !== `granted`) return failed(`notifications blocked`)\n withdraw(id)\n const entry: Posted = {}\n posted.set(id, entry)\n const tap = args.tap ?? null\n const fire = () => {\n if (posted.get(id) === entry) show(id, entry, title, body, tap)\n }\n if (Number.isNaN(atMs)) fire()\n else schedule(id, entry, atMs, fire)\n return ok({})\n },\n cancel: async (args) => ok({ cancelled: withdraw(str(args, `id`) ?? ``) }),\n }),\n }\n}\n\n/**\n * The web's native capabilities, leaving out what this browser lacks\n * (no `navigator.share` = no share, no Notification = no notifications).\n * photos, files and print are always there (photos without OPFS = an empty library).\n */\nexport const webCapabilities = (\n platform: WebPlatform = browserPlatform(),\n opts: WebCapabilityOptions = {},\n): NativeCapability[] => {\n const out = [photosCapability(platform), filesCapability(platform)]\n if (platform.share) out.push(shareCapability(platform))\n out.push(printCapability(platform))\n if (platform.notifications) out.push(notificationsCapability(platform, opts))\n return out\n}\n"
9
+ ],
10
+ "mappings": "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",
11
+ "debugId": "597992B2AF6EE6B164756E2164756E21",
12
+ "names": []
13
+ }