@iota-uz/sdk 0.4.20 → 0.4.22
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.
- package/README.md +20 -0
- package/dist/applet/core.cjs +8 -4
- package/dist/applet/core.cjs.map +1 -1
- package/dist/applet/core.mjs +8 -4
- package/dist/applet/core.mjs.map +1 -1
- package/dist/applet/devtools.cjs +24 -8
- package/dist/applet/devtools.cjs.map +1 -1
- package/dist/applet/devtools.mjs +24 -8
- package/dist/applet/devtools.mjs.map +1 -1
- package/dist/applet/host.cjs +47 -16
- package/dist/applet/host.cjs.map +1 -1
- package/dist/applet/host.mjs +47 -16
- package/dist/applet/host.mjs.map +1 -1
- package/dist/applet/vite.cjs +12 -4
- package/dist/applet/vite.cjs.map +1 -1
- package/dist/applet/vite.mjs +12 -4
- package/dist/applet/vite.mjs.map +1 -1
- package/dist/applet-runtime/index.cjs.map +1 -1
- package/dist/applet-runtime/index.mjs.map +1 -1
- package/dist/bichat/index.cjs +6971 -2646
- package/dist/bichat/index.cjs.map +1 -1
- package/dist/bichat/index.css +11 -1
- package/dist/bichat/index.css.map +1 -1
- package/dist/bichat/index.d.cts +453 -157
- package/dist/bichat/index.d.ts +453 -157
- package/dist/bichat/index.mjs +6969 -2652
- package/dist/bichat/index.mjs.map +1 -1
- package/dist/bichat/styles.css +17 -4
- package/dist/bichat/tailwind.cjs.map +1 -1
- package/dist/bichat/tailwind.mjs.map +1 -1
- package/dist/index.cjs +73 -26
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +73 -26
- package/dist/index.mjs.map +1 -1
- package/package.json +10 -3
- package/tailwind/compiled.css +1 -1
- package/tailwind/create-config.cjs +50 -2
- package/tailwind/iota.css +6 -6
- package/tailwind/sdk-content.cjs +177 -0
- package/tailwind/sdk-theme.cjs +12 -0
package/dist/applet/vite.mjs
CHANGED
|
@@ -13,7 +13,9 @@ function getAppletAssetsBase(basePath) {
|
|
|
13
13
|
}
|
|
14
14
|
function getAppletVitePort(defaultPort = 5173) {
|
|
15
15
|
const p = process.env.APPLET_VITE_PORT;
|
|
16
|
-
if (p === void 0 || p === "")
|
|
16
|
+
if (p === void 0 || p === "") {
|
|
17
|
+
return defaultPort;
|
|
18
|
+
}
|
|
17
19
|
const n = Number(p);
|
|
18
20
|
return Number.isFinite(n) ? n : defaultPort;
|
|
19
21
|
}
|
|
@@ -54,7 +56,9 @@ function createAppletBackendProxy(opts) {
|
|
|
54
56
|
function createLocalSdkAliases(opts) {
|
|
55
57
|
const enabled = opts?.enabled ?? Boolean(opts?.sdkDistDir ?? process.env.IOTA_SDK_DIST);
|
|
56
58
|
const dir = opts?.sdkDistDir ?? process.env.IOTA_SDK_DIST;
|
|
57
|
-
if (!enabled || !dir)
|
|
59
|
+
if (!enabled || !dir) {
|
|
60
|
+
return [];
|
|
61
|
+
}
|
|
58
62
|
const sdkDist = path2.resolve(dir);
|
|
59
63
|
return [
|
|
60
64
|
{ find: /^@iota-uz\/sdk\/bichat$/, replacement: path2.join(sdkDist, "bichat/index.mjs") },
|
|
@@ -118,11 +122,15 @@ function createAppletStylesVirtualModulePlugin(options = {}) {
|
|
|
118
122
|
root = config.root;
|
|
119
123
|
},
|
|
120
124
|
resolveId(id) {
|
|
121
|
-
if (id === VIRTUAL_APPLET_STYLES_ID)
|
|
125
|
+
if (id === VIRTUAL_APPLET_STYLES_ID) {
|
|
126
|
+
return RESOLVED_ID;
|
|
127
|
+
}
|
|
122
128
|
return null;
|
|
123
129
|
},
|
|
124
130
|
load(id) {
|
|
125
|
-
if (id !== RESOLVED_ID)
|
|
131
|
+
if (id !== RESOLVED_ID) {
|
|
132
|
+
return null;
|
|
133
|
+
}
|
|
126
134
|
const parts = [];
|
|
127
135
|
for (const p of prependCss) {
|
|
128
136
|
const full = resolvePrependPath(p, root);
|
package/dist/applet/vite.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../ui/src/applet-vite/vite.ts","../../ui/src/applet-vite/styles-plugin.ts"],"names":["path"],"mappings":"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","file":"vite.mjs","sourcesContent":["/**\n * Applet Frontend Kit: Vite config helpers for applets running behind a base path\n * with dev proxy and optional local SDK aliasing.\n */\nimport type { UserConfig } from 'vite'\nimport path from 'node:path'\n\nexport type AppletViteOptions = {\n /** Applet base path (e.g. \"/admin/ali/chat\" or \"/bi-chat\"). */\n basePath: string\n /** Backend URL for proxy (e.g. \"http://localhost:3200\"). */\n backendUrl: string\n /** Enable Vite aliases to local SDK dist for HMR when iterating on SDK (default: from IOTA_SDK_DIST) */\n enableLocalSdkAliases?: boolean\n /** Override SDK dist directory when enableLocalSdkAliases is true (default: process.env.IOTA_SDK_DIST) */\n sdkDistDir?: string\n /** Merge additional Vite config */\n extend?: UserConfig\n}\n\nconst DEFAULT_DEDUPE = ['react', 'react-dom', 'react-router-dom', 'react-is']\n\n/**\n * Returns base URL for assets (with trailing slash). Uses APPLET_ASSETS_BASE env if set, otherwise derives from basePath.\n */\nexport function getAppletAssetsBase(basePath: string): string {\n const base = process.env.APPLET_ASSETS_BASE ?? basePath + '/assets/'\n return base.endsWith('/') ? base : base + '/'\n}\n\n/**\n * Returns dev server port from APPLET_VITE_PORT env, or the given default.\n */\nexport function getAppletVitePort(defaultPort = 5173): number {\n const p = process.env.APPLET_VITE_PORT\n if (p === undefined || p === '') return defaultPort\n const n = Number(p)\n return Number.isFinite(n) ? n : defaultPort\n}\n\n/**\n * Builds a full Vite config for an applet: base, port, dedupe, proxy, optional local SDK aliases.\n *\n * **Merge semantics for `extend`:** When you pass `extend`, it is merged with the base config as follows:\n * - **resolve.alias**: arrays are concatenated (base aliases first, then extend aliases).\n * - **plugins**: arrays are concatenated (base plugins first, then extend plugins).\n * - **server**, **base**, **resolve.dedupe** and other scalar/object fields: extend overrides base (Object.assign-style).\n * To fully override the base config, spread first: `defineConfig({ ...createAppletViteConfig(opts), ...yourOverrides })`.\n */\nexport function createAppletViteConfig(opts: AppletViteOptions): UserConfig {\n const base = getAppletAssetsBase(opts.basePath)\n const port = getAppletVitePort(5173)\n const config: UserConfig = {\n base,\n resolve: {\n dedupe: DEFAULT_DEDUPE,\n alias: createLocalSdkAliases({\n enabled: opts.enableLocalSdkAliases ?? Boolean(process.env.IOTA_SDK_DIST),\n sdkDistDir: opts.sdkDistDir ?? process.env.IOTA_SDK_DIST,\n }),\n },\n server: {\n port,\n strictPort: true,\n proxy: createAppletBackendProxy({\n basePath: opts.basePath,\n backendUrl: opts.backendUrl,\n }),\n },\n }\n if (opts.extend) {\n return mergeConfig(config, opts.extend)\n }\n return config\n}\n\n/**\n * Returns proxy entries for applet RPC and stream under basePath.\n * Use as server.proxy in Vite config.\n * Note: /stream is SSE; plain string targets do not set ws or changeOrigin. If WebSocket upgrade or SSE proxying issues arise, configure proxy with ws: true or a custom configure.\n */\nexport function createAppletBackendProxy(opts: {\n basePath: string\n backendUrl: string\n}): Record<string, string> {\n const base = opts.basePath.replace(/\\/+$/, '')\n const target = opts.backendUrl.replace(/\\/+$/, '')\n return {\n [base + '/rpc']: target,\n [base + '/stream']: target,\n }\n}\n\n/**\n * Returns resolve.alias entries to point @iota-uz/sdk and @iota-uz/sdk/bichat to a local dist.\n * Use when IOTA_SDK_DIST is set or sdkDistDir is passed, so the app uses the local SDK build with HMR.\n */\nexport function createLocalSdkAliases(opts?: {\n enabled?: boolean\n sdkDistDir?: string\n}): Array<{ find: string | RegExp; replacement: string }> {\n const enabled = opts?.enabled ?? Boolean(opts?.sdkDistDir ?? process.env.IOTA_SDK_DIST)\n const dir = opts?.sdkDistDir ?? process.env.IOTA_SDK_DIST\n if (!enabled || !dir) return []\n const sdkDist = path.resolve(dir)\n return [\n { find: /^@iota-uz\\/sdk\\/bichat$/, replacement: path.join(sdkDist, 'bichat/index.mjs') },\n { find: /^@iota-uz\\/sdk$/, replacement: path.join(sdkDist, 'index.mjs') },\n ]\n}\n\n/**\n * Merges base config with extend. Start with merged = { ...a, ...b } so no Vite fields from b are dropped.\n * We capture a.resolve, b.resolve, a.server, b.server, a.plugins, b.plugins before the spread so we never\n * read b's values as \"original\" a when merging. resolve.alias: only coerce to array when both sides are\n * actually arrays (concat); otherwise leave Record/object as-is and prefer b's value then a's.\n */\nfunction mergeConfig(a: UserConfig, b: UserConfig): UserConfig {\n const aResolve = a.resolve\n const bResolve = b.resolve\n const aServer = a.server\n const bServer = b.server\n const aPlugins = a.plugins\n const bPlugins = b.plugins\n\n const merged: UserConfig = { ...a, ...b }\n\n if (bResolve) {\n const aAlias = aResolve?.alias\n const bAlias = bResolve.alias\n const aIsArray = Array.isArray(aAlias)\n const bIsArray = Array.isArray(bAlias)\n const alias =\n aIsArray && bIsArray\n ? [...(aAlias as Array<{ find: string | RegExp; replacement: string }>), ...(bAlias as Array<{ find: string | RegExp; replacement: string }>)]\n : (bAlias !== undefined ? bAlias : aResolve?.alias)\n merged.resolve = {\n ...aResolve,\n ...bResolve,\n alias,\n dedupe: bResolve.dedupe ?? merged.resolve?.dedupe ?? aResolve?.dedupe,\n }\n }\n if (bServer) {\n merged.server = { ...aServer, ...bServer }\n }\n if (bPlugins) {\n merged.plugins = [...(aPlugins ?? []), ...bPlugins]\n }\n return merged\n}\n","/**\n * Vite plugin that provides a virtual module exporting the compiled applet CSS string\n * for Shadow DOM injection (defineReactAppletElement({ styles })).\n * Can compile CSS via Tailwind CLI in the plugin or fall back to reading a prebuilt file.\n */\nimport type { Plugin } from 'vite'\nimport { spawnSync } from 'node:child_process'\nimport crypto from 'node:crypto'\nimport fs from 'node:fs'\nimport { createRequire } from 'node:module'\nimport os from 'node:os'\nimport path from 'node:path'\n\nexport const VIRTUAL_APPLET_STYLES_ID = 'virtual:applet-styles'\nconst RESOLVED_ID = '\\0' + VIRTUAL_APPLET_STYLES_ID\n\nexport type AppletStylesVirtualModuleOptions = {\n /**\n * Input CSS for Tailwind (e.g. src/index.css). When set, the plugin tries to run Tailwind CLI to compile.\n * Default: \"src/index.css\"\n */\n inputCss?: string\n /**\n * Path to Tailwind config (optional). If not set, CLI uses its default lookup.\n */\n tailwindConfigPath?: string\n /**\n * Path to the compiled CSS file when not using Tailwind CLI (fallback), or when Tailwind is not available.\n * Default: \"dist/style.css\"\n */\n outputCssPath?: string\n /**\n * CSS to prepend: package specifiers (e.g. \"@iota-uz/sdk/bichat/styles.css\") or paths relative to project root.\n * Specifiers are resolved via Node resolution from the project root.\n * Default: []\n */\n prependCss?: string[]\n}\n\n/**\n * Resolves a prepend CSS entry: absolute paths returned as-is; non-relative, non-absolute\n * specifiers (e.g. @iota-uz/sdk/bichat/styles.css or some-lib/styles.css) are resolved via\n * Node module resolution first; relative paths are joined to root.\n */\nfunction resolvePrependPath(specifierOrPath: string, root: string): string | null {\n if (path.isAbsolute(specifierOrPath)) {\n return specifierOrPath\n }\n if (!specifierOrPath.startsWith('.') && !specifierOrPath.startsWith('/')) {\n try {\n const req = createRequire(path.join(root, 'package.json'))\n return req.resolve(specifierOrPath)\n } catch {\n return null\n }\n }\n return path.join(root, specifierOrPath)\n}\n\n/**\n * Creates a Vite plugin that registers virtual:applet-styles and exports the compiled CSS string.\n * When inputCss is set, tries to run Tailwind CLI to compile; if Tailwind is not available, falls back to reading outputCssPath.\n */\nexport function createAppletStylesVirtualModulePlugin(\n options: AppletStylesVirtualModuleOptions = {}\n): Plugin {\n const inputCss = options.inputCss ?? 'src/index.css'\n const outputCssPath = options.outputCssPath ?? 'dist/style.css'\n const tailwindConfigPath = options.tailwindConfigPath\n const prependCss = options.prependCss ?? []\n let root = process.cwd()\n\n return {\n name: 'applet-styles-virtual-module',\n configResolved(config) {\n root = config.root\n },\n resolveId(id: string) {\n if (id === VIRTUAL_APPLET_STYLES_ID) return RESOLVED_ID\n return null\n },\n load(id: string) {\n if (id !== RESOLVED_ID) return null\n\n const parts: string[] = []\n\n for (const p of prependCss) {\n const full = resolvePrependPath(p, root)\n if (full) {\n try {\n parts.push(fs.readFileSync(full, 'utf-8'))\n } catch {\n // Prepend file missing (e.g. optional SDK styles); skip\n }\n }\n }\n\n const inputPath = path.join(root, inputCss)\n let mainCss: string | null = null\n\n // Try Tailwind CLI if input file exists. spawnSync blocks the event loop; for parallel builds consider a random suffix (e.g. crypto.randomUUID()).\n if (fs.existsSync(inputPath)) {\n const tmpFile = path.join(os.tmpdir(), `applet-styles-${Date.now()}-${crypto.randomUUID()}.css`)\n const args = ['-i', inputPath, '-o', tmpFile]\n if (tailwindConfigPath) {\n const configPath = path.join(root, tailwindConfigPath)\n if (fs.existsSync(configPath)) {\n args.push('-c', configPath)\n }\n }\n // Use platform-specific executable and no shell so args (paths with spaces) are passed safely on Windows.\n const pnpmCmd = process.platform === 'win32' ? 'pnpm.cmd' : 'pnpm'\n const result = spawnSync(pnpmCmd, ['exec', 'tailwindcss', ...args], {\n cwd: root,\n stdio: 'pipe',\n })\n if (result.status === 0 && fs.existsSync(tmpFile)) {\n mainCss = fs.readFileSync(tmpFile, 'utf-8')\n try {\n fs.unlinkSync(tmpFile)\n } catch {\n /* ignore */\n }\n }\n }\n\n if (mainCss === null) {\n const fallbackPath = path.isAbsolute(outputCssPath) ? outputCssPath : path.join(root, outputCssPath)\n try {\n mainCss = fs.readFileSync(fallbackPath, 'utf-8')\n } catch {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(\n `[applet-styles] Could not compile via Tailwind CLI and ${fallbackPath} not found; export empty string. Install tailwindcss in the project or build CSS first.`\n )\n }\n mainCss = ''\n }\n }\n\n parts.push(mainCss)\n const css = parts.join('\\n')\n return `export default ${JSON.stringify(css)}`\n },\n }\n}\n\n/**\n * Convenience plugin for BiChat applets: compiles app CSS and prepends SDK BiChat styles.\n * Uses default input src/index.css and package specifier @iota-uz/sdk/bichat/styles.css.\n */\nexport function createBichatStylesPlugin(\n options: Omit<AppletStylesVirtualModuleOptions, 'prependCss'> = {}\n): Plugin {\n return createAppletStylesVirtualModulePlugin({\n ...options,\n inputCss: options.inputCss ?? 'src/index.css',\n outputCssPath: options.outputCssPath ?? 'dist/style.css',\n prependCss: ['@iota-uz/sdk/bichat/styles.css'],\n })\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../ui/src/applet-vite/vite.ts","../../ui/src/applet-vite/styles-plugin.ts"],"names":["path"],"mappings":"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","file":"vite.mjs","sourcesContent":["/**\n * Applet Frontend Kit: Vite config helpers for applets running behind a base path\n * with dev proxy and optional local SDK aliasing.\n */\nimport type { UserConfig } from 'vite';\nimport path from 'node:path';\n\nexport type AppletViteOptions = {\n /** Applet base path (e.g. \"/admin/ali/chat\" or \"/bi-chat\"). */\n basePath: string\n /** Backend URL for proxy (e.g. \"http://localhost:3200\"). */\n backendUrl: string\n /** Enable Vite aliases to local SDK dist for HMR when iterating on SDK (default: from IOTA_SDK_DIST) */\n enableLocalSdkAliases?: boolean\n /** Override SDK dist directory when enableLocalSdkAliases is true (default: process.env.IOTA_SDK_DIST) */\n sdkDistDir?: string\n /** Merge additional Vite config */\n extend?: UserConfig\n}\n\nconst DEFAULT_DEDUPE = ['react', 'react-dom', 'react-router-dom', 'react-is'];\n\n/**\n * Returns base URL for assets (with trailing slash). Uses APPLET_ASSETS_BASE env if set, otherwise derives from basePath.\n */\nexport function getAppletAssetsBase(basePath: string): string {\n const base = process.env.APPLET_ASSETS_BASE ?? basePath + '/assets/';\n return base.endsWith('/') ? base : base + '/';\n}\n\n/**\n * Returns dev server port from APPLET_VITE_PORT env, or the given default.\n */\nexport function getAppletVitePort(defaultPort = 5173): number {\n const p = process.env.APPLET_VITE_PORT;\n if (p === undefined || p === '') {return defaultPort;}\n const n = Number(p);\n return Number.isFinite(n) ? n : defaultPort;\n}\n\n/**\n * Builds a full Vite config for an applet: base, port, dedupe, proxy, optional local SDK aliases.\n *\n * **Merge semantics for `extend`:** When you pass `extend`, it is merged with the base config as follows:\n * - **resolve.alias**: arrays are concatenated (base aliases first, then extend aliases).\n * - **plugins**: arrays are concatenated (base plugins first, then extend plugins).\n * - **server**, **base**, **resolve.dedupe** and other scalar/object fields: extend overrides base (Object.assign-style).\n * To fully override the base config, spread first: `defineConfig({ ...createAppletViteConfig(opts), ...yourOverrides })`.\n */\nexport function createAppletViteConfig(opts: AppletViteOptions): UserConfig {\n const base = getAppletAssetsBase(opts.basePath);\n const port = getAppletVitePort(5173);\n const config: UserConfig = {\n base,\n resolve: {\n dedupe: DEFAULT_DEDUPE,\n alias: createLocalSdkAliases({\n enabled: opts.enableLocalSdkAliases ?? Boolean(process.env.IOTA_SDK_DIST),\n sdkDistDir: opts.sdkDistDir ?? process.env.IOTA_SDK_DIST,\n }),\n },\n server: {\n port,\n strictPort: true,\n proxy: createAppletBackendProxy({\n basePath: opts.basePath,\n backendUrl: opts.backendUrl,\n }),\n },\n };\n if (opts.extend) {\n return mergeConfig(config, opts.extend);\n }\n return config;\n}\n\n/**\n * Returns proxy entries for applet RPC and stream under basePath.\n * Use as server.proxy in Vite config.\n * Note: /stream is SSE; plain string targets do not set ws or changeOrigin. If WebSocket upgrade or SSE proxying issues arise, configure proxy with ws: true or a custom configure.\n */\nexport function createAppletBackendProxy(opts: {\n basePath: string\n backendUrl: string\n}): Record<string, string> {\n const base = opts.basePath.replace(/\\/+$/, '');\n const target = opts.backendUrl.replace(/\\/+$/, '');\n return {\n [base + '/rpc']: target,\n [base + '/stream']: target,\n };\n}\n\n/**\n * Returns resolve.alias entries to point @iota-uz/sdk and @iota-uz/sdk/bichat to a local dist.\n * Use when IOTA_SDK_DIST is set or sdkDistDir is passed, so the app uses the local SDK build with HMR.\n */\nexport function createLocalSdkAliases(opts?: {\n enabled?: boolean\n sdkDistDir?: string\n}): Array<{ find: string | RegExp; replacement: string }> {\n const enabled = opts?.enabled ?? Boolean(opts?.sdkDistDir ?? process.env.IOTA_SDK_DIST);\n const dir = opts?.sdkDistDir ?? process.env.IOTA_SDK_DIST;\n if (!enabled || !dir) {return [];}\n const sdkDist = path.resolve(dir);\n return [\n { find: /^@iota-uz\\/sdk\\/bichat$/, replacement: path.join(sdkDist, 'bichat/index.mjs') },\n { find: /^@iota-uz\\/sdk$/, replacement: path.join(sdkDist, 'index.mjs') },\n ];\n}\n\n/**\n * Merges base config with extend. Start with merged = { ...a, ...b } so no Vite fields from b are dropped.\n * We capture a.resolve, b.resolve, a.server, b.server, a.plugins, b.plugins before the spread so we never\n * read b's values as \"original\" a when merging. resolve.alias: only coerce to array when both sides are\n * actually arrays (concat); otherwise leave Record/object as-is and prefer b's value then a's.\n */\nfunction mergeConfig(a: UserConfig, b: UserConfig): UserConfig {\n const aResolve = a.resolve;\n const bResolve = b.resolve;\n const aServer = a.server;\n const bServer = b.server;\n const aPlugins = a.plugins;\n const bPlugins = b.plugins;\n\n const merged: UserConfig = { ...a, ...b };\n\n if (bResolve) {\n const aAlias = aResolve?.alias;\n const bAlias = bResolve.alias;\n const aIsArray = Array.isArray(aAlias);\n const bIsArray = Array.isArray(bAlias);\n const alias =\n aIsArray && bIsArray\n ? [...(aAlias as Array<{ find: string | RegExp; replacement: string }>), ...(bAlias as Array<{ find: string | RegExp; replacement: string }>)]\n : (bAlias !== undefined ? bAlias : aResolve?.alias);\n merged.resolve = {\n ...aResolve,\n ...bResolve,\n alias,\n dedupe: bResolve.dedupe ?? merged.resolve?.dedupe ?? aResolve?.dedupe,\n };\n }\n if (bServer) {\n merged.server = { ...aServer, ...bServer };\n }\n if (bPlugins) {\n merged.plugins = [...(aPlugins ?? []), ...bPlugins];\n }\n return merged;\n}\n","/**\n * Vite plugin that provides a virtual module exporting the compiled applet CSS string\n * for Shadow DOM injection (defineReactAppletElement({ styles })).\n * Can compile CSS via Tailwind CLI in the plugin or fall back to reading a prebuilt file.\n */\nimport type { Plugin } from 'vite';\nimport { spawnSync } from 'node:child_process';\nimport crypto from 'node:crypto';\nimport fs from 'node:fs';\nimport { createRequire } from 'node:module';\nimport os from 'node:os';\nimport path from 'node:path';\n\nexport const VIRTUAL_APPLET_STYLES_ID = 'virtual:applet-styles';\nconst RESOLVED_ID = '\\0' + VIRTUAL_APPLET_STYLES_ID;\n\nexport type AppletStylesVirtualModuleOptions = {\n /**\n * Input CSS for Tailwind (e.g. src/index.css). When set, the plugin tries to run Tailwind CLI to compile.\n * Default: \"src/index.css\"\n */\n inputCss?: string\n /**\n * Path to Tailwind config (optional). If not set, CLI uses its default lookup.\n */\n tailwindConfigPath?: string\n /**\n * Path to the compiled CSS file when not using Tailwind CLI (fallback), or when Tailwind is not available.\n * Default: \"dist/style.css\"\n */\n outputCssPath?: string\n /**\n * CSS to prepend: package specifiers (e.g. \"@iota-uz/sdk/bichat/styles.css\") or paths relative to project root.\n * Specifiers are resolved via Node resolution from the project root.\n * Default: []\n */\n prependCss?: string[]\n}\n\n/**\n * Resolves a prepend CSS entry: absolute paths returned as-is; non-relative, non-absolute\n * specifiers (e.g. @iota-uz/sdk/bichat/styles.css or some-lib/styles.css) are resolved via\n * Node module resolution first; relative paths are joined to root.\n */\nfunction resolvePrependPath(specifierOrPath: string, root: string): string | null {\n if (path.isAbsolute(specifierOrPath)) {\n return specifierOrPath;\n }\n if (!specifierOrPath.startsWith('.') && !specifierOrPath.startsWith('/')) {\n try {\n const req = createRequire(path.join(root, 'package.json'));\n return req.resolve(specifierOrPath);\n } catch {\n return null;\n }\n }\n return path.join(root, specifierOrPath);\n}\n\n/**\n * Creates a Vite plugin that registers virtual:applet-styles and exports the compiled CSS string.\n * When inputCss is set, tries to run Tailwind CLI to compile; if Tailwind is not available, falls back to reading outputCssPath.\n */\nexport function createAppletStylesVirtualModulePlugin(\n options: AppletStylesVirtualModuleOptions = {}\n): Plugin {\n const inputCss = options.inputCss ?? 'src/index.css';\n const outputCssPath = options.outputCssPath ?? 'dist/style.css';\n const tailwindConfigPath = options.tailwindConfigPath;\n const prependCss = options.prependCss ?? [];\n let root = process.cwd();\n\n return {\n name: 'applet-styles-virtual-module',\n configResolved(config) {\n root = config.root;\n },\n resolveId(id: string) {\n if (id === VIRTUAL_APPLET_STYLES_ID) {return RESOLVED_ID;}\n return null;\n },\n load(id: string) {\n if (id !== RESOLVED_ID) {return null;}\n\n const parts: string[] = [];\n\n for (const p of prependCss) {\n const full = resolvePrependPath(p, root);\n if (full) {\n try {\n parts.push(fs.readFileSync(full, 'utf-8'));\n } catch {\n // Prepend file missing (e.g. optional SDK styles); skip\n }\n }\n }\n\n const inputPath = path.join(root, inputCss);\n let mainCss: string | null = null;\n\n // Try Tailwind CLI if input file exists. spawnSync blocks the event loop; for parallel builds consider a random suffix (e.g. crypto.randomUUID()).\n if (fs.existsSync(inputPath)) {\n const tmpFile = path.join(os.tmpdir(), `applet-styles-${Date.now()}-${crypto.randomUUID()}.css`);\n const args = ['-i', inputPath, '-o', tmpFile];\n if (tailwindConfigPath) {\n const configPath = path.join(root, tailwindConfigPath);\n if (fs.existsSync(configPath)) {\n args.push('-c', configPath);\n }\n }\n // Use platform-specific executable and no shell so args (paths with spaces) are passed safely on Windows.\n const pnpmCmd = process.platform === 'win32' ? 'pnpm.cmd' : 'pnpm';\n const result = spawnSync(pnpmCmd, ['exec', 'tailwindcss', ...args], {\n cwd: root,\n stdio: 'pipe',\n });\n if (result.status === 0 && fs.existsSync(tmpFile)) {\n mainCss = fs.readFileSync(tmpFile, 'utf-8');\n try {\n fs.unlinkSync(tmpFile);\n } catch {\n /* ignore */\n }\n }\n }\n\n if (mainCss === null) {\n const fallbackPath = path.isAbsolute(outputCssPath) ? outputCssPath : path.join(root, outputCssPath);\n try {\n mainCss = fs.readFileSync(fallbackPath, 'utf-8');\n } catch {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(\n `[applet-styles] Could not compile via Tailwind CLI and ${fallbackPath} not found; export empty string. Install tailwindcss in the project or build CSS first.`\n );\n }\n mainCss = '';\n }\n }\n\n parts.push(mainCss);\n const css = parts.join('\\n');\n return `export default ${JSON.stringify(css)}`;\n },\n };\n}\n\n/**\n * Convenience plugin for BiChat applets: compiles app CSS and prepends SDK BiChat styles.\n * Uses default input src/index.css and package specifier @iota-uz/sdk/bichat/styles.css.\n */\nexport function createBichatStylesPlugin(\n options: Omit<AppletStylesVirtualModuleOptions, 'prependCss'> = {}\n): Plugin {\n return createAppletStylesVirtualModulePlugin({\n ...options,\n inputCss: options.inputCss ?? 'src/index.css',\n outputCssPath: options.outputCssPath ?? 'dist/style.css',\n prependCss: ['@iota-uz/sdk/bichat/styles.css'],\n });\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../ui/src/applet-runtime/context.ts","../../ui/src/applet-runtime/engine.ts","../../ui/src/applet-runtime/ws.ts","../../ui/src/applet-runtime/defineApplet.ts","../../ui/src/applet-runtime/auth.ts","../../ui/src/applet-runtime/kv.ts","../../ui/src/applet-runtime/db.ts","../../ui/src/applet-runtime/jobs.ts","../../ui/src/applet-runtime/secrets.ts","../../ui/src/applet-runtime/files.ts","../../ui/src/applet-runtime/schema.ts","../../ui/src/applet-runtime/test-context.ts"],"names":["AsyncLocalStorage","forwardedHeaders","id","appletMethod","readEnv","buildEngineURL","z","randomID","toBase64","db","engine"],"mappings":"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","file":"index.cjs","sourcesContent":["import { AsyncLocalStorage } from 'node:async_hooks'\n\ntype RequestContext = {\n request: Request\n}\n\nconst requestContextStore = new AsyncLocalStorage<RequestContext>()\n\nexport function withRequestContext<T>(request: Request, fn: () => T): T {\n return requestContextStore.run({ request }, fn)\n}\n\nexport function currentRequest(): Request {\n const ctx = requestContextStore.getStore()\n if (!ctx?.request) {\n throw new Error('No active applet request context. Use defineApplet({ fetch }) to establish request context.')\n }\n return ctx.request\n}\n\nexport function currentRequestOptional(): Request | undefined {\n return requestContextStore.getStore()?.request\n}\n","import { currentRequestOptional } from './context'\n\ntype EngineCallOptions = {\n timeoutMs?: number\n}\n\ntype JsonRpcRequest = {\n id: string\n method: string\n params: unknown\n}\n\ntype JsonRpcResponse = {\n id?: string\n result?: unknown\n error?: {\n code: string | number\n message: string\n details?: unknown\n }\n}\n\nconst defaultEnginePath = '/rpc'\n\nfunction readEnv(name: string): string {\n const value = process.env[name]\n if (!value || value.trim() === '') {\n throw new Error(`${name} is required`)\n }\n return value\n}\n\nfunction buildEngineURL(pathname: string): string {\n const socketPath = readEnv('IOTA_ENGINE_SOCKET')\n const path = pathname.startsWith('/') ? pathname : `/${pathname}`\n // Bun's fetch supports unix socket via the `unix` init option; URL host is ignored in that case.\n // We still keep a regular URL shape for portability in tests/mocks.\n return `http://localhost${path}?socket=${encodeURIComponent(socketPath)}`\n}\n\nfunction randomID(): string {\n const g = globalThis as unknown as { crypto?: { randomUUID?: () => string } }\n if (g.crypto?.randomUUID) {\n return g.crypto.randomUUID()\n }\n return `${Date.now()}-${Math.random().toString(16).slice(2)}`\n}\n\nasync function postJSON(pathname: string, body: unknown, timeoutMs?: number): Promise<JsonRpcResponse> {\n const socketPath = readEnv('IOTA_ENGINE_SOCKET')\n const request = currentRequestOptional()\n const forwardedHeaders: Record<string, string> = {\n 'content-type': 'application/json',\n }\n if (request) {\n const maybeForwardHeader = (headerName: string) => {\n const value = request.headers.get(headerName)\n if (value && value.trim() !== '') {\n forwardedHeaders[headerName] = value\n }\n }\n maybeForwardHeader('x-iota-tenant-id')\n maybeForwardHeader('x-iota-user-id')\n maybeForwardHeader('x-iota-permissions')\n maybeForwardHeader('x-iota-request-id')\n maybeForwardHeader('cookie')\n maybeForwardHeader('authorization')\n }\n\n const abortController = typeof timeoutMs === 'number' && timeoutMs > 0 ? new AbortController() : undefined\n let timer: ReturnType<typeof setTimeout> | undefined\n try {\n if (abortController && timeoutMs) {\n timer = setTimeout(() => abortController.abort(), timeoutMs)\n }\n\n const init: RequestInit & { unix?: string } = {\n method: 'POST',\n headers: forwardedHeaders,\n body: JSON.stringify(body),\n signal: abortController?.signal,\n unix: socketPath,\n }\n const response = await fetch(buildEngineURL(pathname), init)\n if (!response.ok) {\n throw new Error(`engine RPC HTTP ${response.status}`)\n }\n return (await response.json()) as JsonRpcResponse\n } finally {\n if (timer) {\n clearTimeout(timer)\n }\n }\n}\n\nexport const engine = {\n async call<TResult = unknown>(method: string, params: unknown, options?: EngineCallOptions): Promise<TResult> {\n const request: JsonRpcRequest = {\n id: randomID(),\n method,\n params,\n }\n const response = await postJSON(defaultEnginePath, request, options?.timeoutMs)\n if (response.error) {\n throw new Error(`${response.error.code}: ${response.error.message}`)\n }\n return response.result as TResult\n },\n}\n","import { engine } from './engine'\n\ntype ConnectionHandler = (connectionId: string) => void | Promise<void>\ntype MessageHandler = (connectionId: string, data: Uint8Array) => void | Promise<void>\ntype CloseHandler = (connectionId: string) => void | Promise<void>\n\ntype BridgeEventPayload = {\n connectionId: string\n event: 'open' | 'message' | 'close'\n dataBase64?: string\n}\n\nconst connectionHandlers = new Set<ConnectionHandler>()\nconst messageHandlers = new Set<MessageHandler>()\nconst closeHandlers = new Set<CloseHandler>()\n\nfunction appletMethod(op: string): string {\n const appletID = process.env.IOTA_APPLET_ID\n if (!appletID || appletID.trim() === '') {\n throw new Error('IOTA_APPLET_ID is required')\n }\n return `${appletID}.ws.${op}`\n}\n\nasync function runHandlers<T>(handlers: Set<(value: T) => void | Promise<void>>, value: T): Promise<void> {\n for (const handler of handlers) {\n await handler(value)\n }\n}\n\nasync function runMessageHandlers(connectionId: string, data: Uint8Array): Promise<void> {\n for (const handler of messageHandlers) {\n await handler(connectionId, data)\n }\n}\n\nexport async function dispatchBridgeEvent(payload: BridgeEventPayload): Promise<void> {\n if (payload.event === 'open') {\n await runHandlers(connectionHandlers, payload.connectionId)\n return\n }\n if (payload.event === 'close') {\n await runHandlers(closeHandlers, payload.connectionId)\n return\n }\n if (payload.event === 'message') {\n const decoded = Buffer.from(payload.dataBase64 ?? '', 'base64')\n await runMessageHandlers(payload.connectionId, new Uint8Array(decoded))\n }\n}\n\nexport const ws = {\n async send(connectionId: string, data: unknown): Promise<{ ok: boolean }> {\n return engine.call<{ ok: boolean }>(appletMethod('send'), { connectionId, data })\n },\n onConnection(handler: ConnectionHandler): () => void {\n connectionHandlers.add(handler)\n return () => connectionHandlers.delete(handler)\n },\n onMessage(handler: MessageHandler): () => void {\n messageHandlers.add(handler)\n return () => messageHandlers.delete(handler)\n },\n onClose(handler: CloseHandler): () => void {\n closeHandlers.add(handler)\n return () => closeHandlers.delete(handler)\n },\n}\n\n","import { withRequestContext } from './context'\nimport { dispatchBridgeEvent } from './ws'\n\nexport type AppletDefinition = {\n fetch: (request: Request) => Response | Promise<Response>\n}\n\ntype BunServeLike = {\n stop: (closeActiveConnections?: boolean) => void\n}\n\ntype BunGlobal = {\n serve: (options: {\n unix: string\n fetch: (request: Request) => Response | Promise<Response>\n }) => BunServeLike\n}\n\nfunction requireUnixSocketPath(): string {\n const path = process.env.IOTA_APPLET_SOCKET\n if (!path || path.trim() === '') {\n throw new Error('IOTA_APPLET_SOCKET is required')\n }\n return path\n}\n\nexport function defineApplet(definition: AppletDefinition): BunServeLike {\n const socketPath = requireUnixSocketPath()\n const bun = (globalThis as unknown as { Bun?: BunGlobal }).Bun\n if (!bun || typeof bun.serve !== 'function') {\n throw new Error('defineApplet requires Bun runtime')\n }\n return bun.serve({\n unix: socketPath,\n fetch: (request) =>\n withRequestContext(request, async () => {\n const url = new URL(request.url)\n if (request.method === 'POST' && url.pathname === '/__ws') {\n let payload: {\n connectionId: string\n event: 'open' | 'message' | 'close'\n dataBase64?: string\n }\n try {\n payload = (await request.json()) as {\n connectionId: string\n event: 'open' | 'message' | 'close'\n dataBase64?: string\n }\n } catch {\n return new Response(JSON.stringify({ error: 'invalid_json' }), {\n status: 400,\n headers: { 'content-type': 'application/json; charset=utf-8' },\n })\n }\n if (!payload?.connectionId || !payload?.event) {\n return new Response(JSON.stringify({ error: 'invalid_payload' }), {\n status: 400,\n headers: { 'content-type': 'application/json; charset=utf-8' },\n })\n }\n if (!['open', 'message', 'close'].includes(payload.event)) {\n return new Response(JSON.stringify({ error: 'invalid_payload' }), {\n status: 400,\n headers: { 'content-type': 'application/json; charset=utf-8' },\n })\n }\n await dispatchBridgeEvent(payload)\n return new Response(JSON.stringify({ ok: true }), {\n status: 202,\n headers: { 'content-type': 'application/json; charset=utf-8' },\n })\n }\n return definition.fetch(request)\n }),\n })\n}\n","import { currentRequest } from './context'\n\nexport type CurrentUser = {\n id: string\n tenantId: string\n permissions: string[]\n requestId?: string\n}\n\nfunction requiredHeader(headers: Headers, name: string): string {\n const value = headers.get(name)\n if (!value || value.trim() === '') {\n throw new Error(`${name} header is required`)\n }\n return value\n}\n\nexport const auth = {\n async currentUser(): Promise<CurrentUser> {\n const request = currentRequest()\n const headers = request.headers\n const id = requiredHeader(headers, 'x-iota-user-id')\n const tenantId = requiredHeader(headers, 'x-iota-tenant-id')\n const permissionsHeader = headers.get('x-iota-permissions') ?? ''\n const requestID = headers.get('x-iota-request-id') ?? undefined\n const permissions = permissionsHeader\n .split(',')\n .map((s) => s.trim())\n .filter((s) => s.length > 0)\n\n return {\n id,\n tenantId,\n permissions,\n requestId: requestID,\n }\n },\n}\n\n","import { engine } from './engine'\n\nfunction appletMethod(op: string): string {\n const appletID = process.env.IOTA_APPLET_ID\n if (!appletID || appletID.trim() === '') {\n throw new Error('IOTA_APPLET_ID is required')\n }\n return `${appletID}.kv.${op}`\n}\n\nexport const kv = {\n get<T = unknown>(key: string): Promise<T | null> {\n return engine.call<T | null>(appletMethod('get'), { key })\n },\n set(key: string, value: unknown, ttlSeconds?: number): Promise<void> {\n return engine.call<void>(appletMethod('set'), { key, value, ttlSeconds })\n },\n del(key: string): Promise<boolean> {\n return engine.call<boolean>(appletMethod('del'), { key })\n },\n mget<T = unknown>(keys: string[]): Promise<Array<T | null>> {\n return engine.call<Array<T | null>>(appletMethod('mget'), { keys })\n },\n}\n\n","import { engine } from './engine'\n\nexport type DBConstraint = {\n field: string\n op: 'eq'\n value: unknown\n}\n\nexport type DBIndexConstraint = DBConstraint & {\n name: string\n}\n\nexport type DBQueryOptions = {\n index?: DBIndexConstraint\n filters?: DBConstraint[]\n order?: 'asc' | 'desc'\n take?: number\n}\n\nexport type DBQueryIndex = {\n eq(field: string, value: unknown): DBQueryIndex\n}\n\nexport type DBQueryFilter = {\n eq(field: string, value: unknown): DBQueryFilter\n}\n\nexport type DBQueryBuilder<T> = {\n withIndex(name: string, build: (q: DBQueryIndex) => DBQueryIndex | void): DBQueryBuilder<T>\n filter(build: (q: DBQueryFilter) => DBQueryFilter | void): DBQueryBuilder<T>\n order(direction: 'asc' | 'desc'): DBQueryBuilder<T>\n take(limit: number): DBQueryBuilder<T>\n collect(): Promise<T[]>\n first(): Promise<T | null>\n}\n\ntype DBCaller = <T>(op: string, params: Record<string, unknown>) => Promise<T>\n\nexport type DBClient = {\n get<T = unknown>(id: string): Promise<T | null>\n query<T = unknown>(table: string): DBQueryBuilder<T>\n queryRaw<T = unknown>(table: string, query?: DBQueryOptions): Promise<T[]>\n insert<T = unknown>(table: string, value: unknown): Promise<T>\n patch<T = unknown>(id: string, value: unknown): Promise<T>\n replace<T = unknown>(id: string, value: unknown): Promise<T>\n delete(id: string): Promise<boolean>\n}\n\nexport function createDB(caller: DBCaller): DBClient {\n class QueryIndexBuilder implements DBQueryIndex {\n private constraint?: DBConstraint\n\n eq(field: string, value: unknown): QueryIndexBuilder {\n this.constraint = { field, op: 'eq', value }\n return this\n }\n\n build(name: string): DBIndexConstraint | undefined {\n if (!this.constraint) {\n return undefined\n }\n return { name, ...this.constraint }\n }\n }\n\n class QueryFilterBuilder implements DBQueryFilter {\n private constraints: DBConstraint[] = []\n\n eq(field: string, value: unknown): QueryFilterBuilder {\n this.constraints.push({ field, op: 'eq', value })\n return this\n }\n\n build(): DBConstraint[] {\n return this.constraints\n }\n }\n\n class RuntimeQueryBuilder<T> implements DBQueryBuilder<T> {\n constructor(\n private readonly table: string,\n private readonly options: DBQueryOptions = {},\n ) {}\n\n withIndex(name: string, build: (q: DBQueryIndex) => DBQueryIndex | void): RuntimeQueryBuilder<T> {\n const index = new QueryIndexBuilder()\n build(index)\n return new RuntimeQueryBuilder<T>(this.table, {\n ...this.options,\n index: index.build(name),\n })\n }\n\n filter(build: (q: DBQueryFilter) => DBQueryFilter | void): RuntimeQueryBuilder<T> {\n const filter = new QueryFilterBuilder()\n build(filter)\n return new RuntimeQueryBuilder<T>(this.table, {\n ...this.options,\n filters: [...(this.options.filters ?? []), ...filter.build()],\n })\n }\n\n order(direction: 'asc' | 'desc'): RuntimeQueryBuilder<T> {\n return new RuntimeQueryBuilder<T>(this.table, {\n ...this.options,\n order: direction,\n })\n }\n\n take(limit: number): RuntimeQueryBuilder<T> {\n return new RuntimeQueryBuilder<T>(this.table, {\n ...this.options,\n take: limit,\n })\n }\n\n collect(): Promise<T[]> {\n return caller<T[]>('query', { table: this.table, query: this.options })\n }\n\n async first(): Promise<T | null> {\n const rows = await this.take(1).collect()\n return rows[0] ?? null\n }\n }\n\n const client: DBClient = {\n get<T = unknown>(id: string): Promise<T | null> {\n return caller<T | null>('get', { id })\n },\n query<T = unknown>(table: string): RuntimeQueryBuilder<T> {\n return new RuntimeQueryBuilder<T>(table)\n },\n queryRaw<T = unknown>(table: string, query?: DBQueryOptions): Promise<T[]> {\n return caller<T[]>('query', { table, query: query ?? {} })\n },\n insert<T = unknown>(table: string, value: unknown): Promise<T> {\n return caller<T>('insert', { table, value })\n },\n patch<T = unknown>(id: string, value: unknown): Promise<T> {\n return caller<T>('patch', { id, value })\n },\n replace<T = unknown>(id: string, value: unknown): Promise<T> {\n return caller<T>('replace', { id, value })\n },\n delete(id: string): Promise<boolean> {\n return caller<boolean>('delete', { id })\n },\n }\n return client\n}\n\nexport const db = createDB((op, params) => engine.call(appletMethod(op), params))\n\nfunction appletMethod(op: string): string {\n const appletID = process.env.IOTA_APPLET_ID\n if (!appletID || appletID.trim() === '') {\n throw new Error('IOTA_APPLET_ID is required')\n }\n return `${appletID}.db.${op}`\n}\n","import { engine } from './engine'\n\nexport type ScheduledJob = {\n id: string\n type: string\n cron: string\n method: string\n params: unknown\n status: string\n nextRunAt?: string\n lastRunAt?: string\n lastStatus?: string\n lastError?: string\n createdAt?: string\n updatedAt?: string\n}\n\nfunction appletMethod(op: string): string {\n const appletID = process.env.IOTA_APPLET_ID\n if (!appletID || appletID.trim() === '') {\n throw new Error('IOTA_APPLET_ID is required')\n }\n return `${appletID}.jobs.${op}`\n}\n\nexport const jobs = {\n enqueue(method: string, params?: unknown): Promise<ScheduledJob> {\n return engine.call<ScheduledJob>(appletMethod('enqueue'), { method, params: params ?? {} })\n },\n schedule(cron: string, method: string, params?: unknown): Promise<ScheduledJob> {\n return engine.call<ScheduledJob>(appletMethod('schedule'), { cron, method, params: params ?? {} })\n },\n list(): Promise<ScheduledJob[]> {\n return engine.call<ScheduledJob[]>(appletMethod('list'), {})\n },\n cancel(id: string): Promise<{ ok: boolean }> {\n return engine.call<{ ok: boolean }>(appletMethod('cancel'), { id })\n },\n}\n","import { engine } from './engine'\n\nfunction appletMethod(op: string): string {\n const appletID = process.env.IOTA_APPLET_ID\n if (!appletID || appletID.trim() === '') {\n throw new Error('IOTA_APPLET_ID is required')\n }\n return `${appletID}.secrets.${op}`\n}\n\nexport const secrets = {\n async get(name: string): Promise<string> {\n const response = await engine.call<{ value: string }>(appletMethod('get'), { name })\n return response.value\n },\n}\n","import { currentRequestOptional } from './context'\nimport { engine } from './engine'\n\nexport type StoredFile = {\n id: string\n name: string\n contentType?: string\n size: number\n path: string\n createdAt: string\n}\n\nfunction readEnv(name: string): string {\n const value = process.env[name]\n if (!value || value.trim() === '') {\n throw new Error(`${name} is required`)\n }\n return value\n}\n\nfunction appletMethod(op: string): string {\n const appletID = process.env.IOTA_APPLET_ID\n if (!appletID || appletID.trim() === '') {\n throw new Error('IOTA_APPLET_ID is required')\n }\n return `${appletID}.files.${op}`\n}\n\nfunction buildEngineURL(pathname: string, socketPath: string): string {\n const path = pathname.startsWith('/') ? pathname : `/${pathname}`\n return `http://localhost${path}?socket=${encodeURIComponent(socketPath)}`\n}\n\nfunction forwardedHeaders(): Record<string, string> {\n const request = currentRequestOptional()\n const headers: Record<string, string> = {}\n if (!request) {\n return headers\n }\n const maybeForwardHeader = (headerName: string) => {\n const value = request.headers.get(headerName)\n if (value && value.trim() !== '') {\n headers[headerName] = value\n }\n }\n maybeForwardHeader('x-iota-tenant-id')\n maybeForwardHeader('x-iota-user-id')\n maybeForwardHeader('x-iota-request-id')\n return headers\n}\n\nasync function toBytes(data: Blob | ArrayBuffer | Uint8Array): Promise<Uint8Array> {\n if (data instanceof Blob) {\n const buffer = await data.arrayBuffer()\n return new Uint8Array(buffer)\n }\n if (data instanceof ArrayBuffer) {\n return new Uint8Array(data)\n }\n return data\n}\n\nasync function toBase64(data: Blob | ArrayBuffer | Uint8Array): Promise<string> {\n const bytes = await toBytes(data)\n return Buffer.from(bytes).toString('base64')\n}\n\nasync function requestFilesEndpoint<T>(\n path: string,\n options: RequestInit & { unix?: string; appletId: string },\n): Promise<T> {\n const socketPath = readEnv('IOTA_ENGINE_SOCKET')\n const headers = new Headers(options.headers)\n headers.set('X-Iota-Applet-Id', options.appletId)\n for (const [name, value] of Object.entries(forwardedHeaders())) {\n headers.set(name, value)\n }\n const response = await fetch(buildEngineURL(path, socketPath), {\n ...options,\n headers,\n unix: socketPath,\n } as any)\n if (!response.ok) {\n throw new Error(`files endpoint HTTP ${response.status}`)\n }\n return (await response.json()) as T\n}\n\nexport const files = {\n async store(input: {\n name: string\n contentType?: string\n data: Blob | ArrayBuffer | Uint8Array\n }): Promise<StoredFile> {\n const appletID = readEnv('IOTA_APPLET_ID')\n try {\n const bytes = await toBytes(input.data)\n const exactBuffer =\n bytes.buffer instanceof ArrayBuffer\n ? bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength)\n : Uint8Array.from(bytes).buffer\n return await requestFilesEndpoint<StoredFile>('/files/store', {\n appletId: appletID,\n method: 'POST',\n headers: {\n 'X-Iota-File-Name': input.name,\n 'X-Iota-Content-Type': input.contentType ?? '',\n 'Content-Type': input.contentType ?? 'application/octet-stream',\n },\n body: new Blob([exactBuffer], { type: input.contentType ?? 'application/octet-stream' }),\n })\n } catch (error) {\n if (error instanceof TypeError || error instanceof ReferenceError) {\n throw error\n }\n const dataBase64 = await toBase64(input.data)\n return engine.call<StoredFile>(appletMethod('store'), {\n name: input.name,\n contentType: input.contentType ?? '',\n dataBase64,\n })\n }\n },\n async get(id: string): Promise<StoredFile | null> {\n const appletID = readEnv('IOTA_APPLET_ID')\n try {\n return await requestFilesEndpoint<StoredFile | null>(`/files/get?id=${encodeURIComponent(id)}&applet=${encodeURIComponent(appletID)}`, {\n appletId: appletID,\n method: 'GET',\n })\n } catch (error) {\n if (error instanceof TypeError || error instanceof ReferenceError) {\n throw error\n }\n return engine.call<StoredFile | null>(appletMethod('get'), { id })\n }\n },\n async delete(id: string): Promise<boolean> {\n const appletID = readEnv('IOTA_APPLET_ID')\n try {\n const result = await requestFilesEndpoint<{ ok: boolean }>(`/files/delete?id=${encodeURIComponent(id)}&applet=${encodeURIComponent(appletID)}`, {\n appletId: appletID,\n method: 'DELETE',\n })\n return result.ok\n } catch (error) {\n if (error instanceof TypeError || error instanceof ReferenceError) {\n throw error\n }\n return engine.call<boolean>(appletMethod('delete'), { id })\n }\n },\n}\n","import { z, type ZodRawShape, type ZodString } from 'zod'\n\nexport type TableIndex = {\n name: string\n fields: string[]\n}\n\nexport type TableDefinition<T extends ZodRawShape> = {\n schema: z.ZodObject<T>\n indexes: TableIndex[]\n index(name: string, fields: string[]): TableDefinition<T>\n}\n\nexport type SchemaDefinition<Tables extends Record<string, TableDefinition<any>>> = {\n tables: Tables\n}\n\nclass RuntimeTableDefinition<T extends ZodRawShape> implements TableDefinition<T> {\n public readonly schema: z.ZodObject<T>\n public readonly indexes: TableIndex[]\n\n constructor(schema: z.ZodObject<T>, indexes: TableIndex[] = []) {\n this.schema = schema\n this.indexes = indexes\n }\n\n index(name: string, fields: string[]): RuntimeTableDefinition<T> {\n return new RuntimeTableDefinition(this.schema, [\n ...this.indexes,\n {\n name,\n fields: [...fields],\n },\n ])\n }\n}\n\nexport function defineTable<T extends ZodRawShape>(shape: T): TableDefinition<T> {\n return new RuntimeTableDefinition(z.object(shape))\n}\n\nexport function defineSchema<Tables extends Record<string, TableDefinition<any>>>(tables: Tables): SchemaDefinition<Tables> {\n return { tables }\n}\n\n// `id(\"users\")` mirrors Convex-style typed id helper while staying Zod-compatible.\nexport function id(_tableName: string): ZodString {\n return z.string().min(1)\n}\n\n","import { type CurrentUser } from './auth'\nimport { createDB, type DBConstraint, type DBQueryOptions } from './db'\nimport { type ScheduledJob } from './jobs'\nimport { type StoredFile } from './files'\n\ntype EngineHandler = (params: unknown) => unknown | Promise<unknown>\n\nexport type TestContextOptions = {\n appletId?: string\n user?: Partial<CurrentUser>\n secrets?: Record<string, string>\n engineHandlers?: Record<string, EngineHandler>\n}\n\ntype TestDocument = {\n id: string\n table: string\n value: unknown\n createdAt: number\n updatedAt: number\n}\n\ntype TestFileRecord = StoredFile & {\n dataBase64: string\n}\n\nconst defaultUser: CurrentUser = {\n id: 'test-user',\n tenantId: 'test-tenant',\n permissions: [],\n}\n\nfunction normalizeUser(user?: Partial<CurrentUser>): CurrentUser {\n return {\n ...defaultUser,\n ...(user ?? {}),\n permissions: user?.permissions ? [...user.permissions] : [],\n }\n}\n\nfunction randomID(prefix: string): string {\n return `${prefix}-${Date.now()}-${Math.random().toString(16).slice(2)}`\n}\n\nfunction toNumber(value: unknown): number {\n if (typeof value === 'number') {\n return value\n }\n return Number.NaN\n}\n\nfunction nestedValue(input: unknown, field: string): unknown {\n let current: unknown = input\n for (const segment of field.split('.')) {\n if (!current || typeof current !== 'object') {\n return undefined\n }\n current = (current as Record<string, unknown>)[segment]\n }\n return current\n}\n\nfunction matchesConstraint(value: unknown, constraint: DBConstraint): boolean {\n if (constraint.op !== 'eq') {\n return false\n }\n return String(nestedValue(value, constraint.field)) === String(constraint.value)\n}\n\nfunction filterDocuments(documents: TestDocument[], options: DBQueryOptions): TestDocument[] {\n let result = [...documents]\n if (options.index) {\n result = result.filter((doc) => matchesConstraint(doc.value, options.index!))\n }\n for (const filter of options.filters ?? []) {\n result = result.filter((doc) => matchesConstraint(doc.value, filter))\n }\n result.sort((a, b) => (options.order === 'asc' ? a.updatedAt - b.updatedAt : b.updatedAt - a.updatedAt))\n if (typeof options.take === 'number' && options.take > 0) {\n result = result.slice(0, options.take)\n }\n return result\n}\n\nfunction parseBase64Payload(data: unknown): string {\n if (typeof data !== 'string' || data.trim() === '') {\n throw new Error('dataBase64 is required')\n }\n return data\n}\n\nasync function toBase64(data: Blob | ArrayBuffer | Uint8Array): Promise<string> {\n if (data instanceof Blob) {\n const buffer = await data.arrayBuffer()\n return Buffer.from(buffer).toString('base64')\n }\n if (data instanceof ArrayBuffer) {\n return Buffer.from(data).toString('base64')\n }\n return Buffer.from(data).toString('base64')\n}\n\nexport function createTestContext(options: TestContextOptions = {}) {\n const appletId = options.appletId?.trim() || 'test'\n let currentUser = normalizeUser(options.user)\n const customHandlers = options.engineHandlers ?? {}\n const secretStore = new Map(Object.entries(options.secrets ?? {}))\n const kvStore = new Map<string, unknown>()\n const dbStore = new Map<string, TestDocument>()\n const jobsStore = new Map<string, ScheduledJob>()\n const filesStore = new Map<string, TestFileRecord>()\n\n function scopedKey(key: string): string {\n return `${currentUser.tenantId}::${appletId}::${key}`\n }\n\n async function dbCall<T>(op: string, params: Record<string, unknown>): Promise<T> {\n switch (op) {\n case 'get': {\n const id = String(params.id ?? '')\n const record = dbStore.get(id)\n return (record ? { _id: record.id, table: record.table, value: record.value } : null) as T\n }\n case 'query': {\n const table = String(params.table ?? '')\n const query = (params.query as DBQueryOptions | undefined) ?? {}\n const rows = filterDocuments(\n [...dbStore.values()].filter((doc) => doc.table === table),\n query,\n )\n return rows.map((doc) => ({ _id: doc.id, table: doc.table, value: doc.value })) as T\n }\n case 'insert': {\n const id = randomID('doc')\n const now = Date.now()\n const record: TestDocument = {\n id,\n table: String(params.table ?? ''),\n value: params.value,\n createdAt: now,\n updatedAt: now,\n }\n dbStore.set(id, record)\n return { _id: id, table: record.table, value: record.value } as T\n }\n case 'patch':\n {\n const id = String(params.id ?? '')\n const current = dbStore.get(id)\n if (!current) {\n return null as T\n }\n const currentValue = current.value\n const nextValue = params.value\n const next: TestDocument = {\n ...current,\n value:\n currentValue && typeof currentValue === 'object' && !Array.isArray(currentValue) &&\n nextValue && typeof nextValue === 'object' && !Array.isArray(nextValue)\n ? { ...(currentValue as Record<string, unknown>), ...(nextValue as Record<string, unknown>) }\n : nextValue,\n updatedAt: Date.now(),\n }\n dbStore.set(id, next)\n return { _id: id, table: next.table, value: next.value } as T\n }\n case 'replace': {\n const id = String(params.id ?? '')\n const current = dbStore.get(id)\n if (!current) {\n return null as T\n }\n const next: TestDocument = {\n ...current,\n value: params.value,\n updatedAt: Date.now(),\n }\n dbStore.set(id, next)\n return { _id: id, table: next.table, value: next.value } as T\n }\n case 'delete': {\n const id = String(params.id ?? '')\n return dbStore.delete(id) as T\n }\n default:\n throw new Error(`unknown db op: ${op}`)\n }\n }\n\n const db = createDB((op, params) => dbCall(op, params))\n\n const engine = {\n async call<T = unknown>(method: string, params: unknown): Promise<T> {\n if (customHandlers[method]) {\n return (await customHandlers[method](params)) as T\n }\n\n const chunks = method.split('.')\n if (chunks.length < 3 || chunks[0] !== appletId) {\n throw new Error(`unsupported method: ${method}`)\n }\n const namespace = chunks[1]\n const op = chunks.slice(2).join('.')\n const payload = (params as Record<string, unknown>) ?? {}\n\n if (namespace === 'kv') {\n const key = String(payload.key ?? '')\n const storageKey = scopedKey(key)\n if (op === 'get') {\n return (kvStore.get(storageKey) ?? null) as T\n }\n if (op === 'set') {\n kvStore.set(storageKey, payload.value)\n return undefined as T\n }\n if (op === 'del') {\n return kvStore.delete(storageKey) as T\n }\n if (op === 'mget') {\n const keys = Array.isArray(payload.keys) ? payload.keys.map((v) => String(v)) : []\n return keys.map((k) => kvStore.get(scopedKey(k)) ?? null) as T\n }\n }\n\n if (namespace === 'db') {\n return dbCall(op, payload) as Promise<T>\n }\n\n if (namespace === 'jobs') {\n if (op === 'enqueue') {\n const id = randomID('job')\n const record: ScheduledJob = {\n id,\n type: 'one_off',\n cron: '',\n method: String(payload.method ?? ''),\n params: payload.params ?? {},\n status: 'queued',\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n }\n jobsStore.set(id, record)\n return record as T\n }\n if (op === 'schedule') {\n const id = randomID('job')\n const record: ScheduledJob = {\n id,\n type: 'scheduled',\n cron: String(payload.cron ?? ''),\n method: String(payload.method ?? ''),\n params: payload.params ?? {},\n status: 'scheduled',\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n }\n jobsStore.set(id, record)\n return record as T\n }\n if (op === 'list') {\n return [...jobsStore.values()] as T\n }\n if (op === 'cancel') {\n const id = String(payload.id ?? '')\n return { ok: jobsStore.delete(id) } as T\n }\n }\n\n if (namespace === 'secrets' && op === 'get') {\n const name = String(payload.name ?? '')\n const value = secretStore.get(name)\n if (value === undefined) {\n throw new Error(`secret not found: ${name}`)\n }\n return { value } as T\n }\n\n if (namespace === 'files') {\n if (op === 'store') {\n const id = randomID('file')\n const name = String(payload.name ?? 'file.bin')\n const dataBase64 = parseBase64Payload(payload.dataBase64)\n const contentType = String(payload.contentType ?? '')\n const size = Buffer.from(dataBase64, 'base64').byteLength\n const record: TestFileRecord = {\n id,\n name,\n contentType,\n size,\n path: `/test/${currentUser.tenantId}/${appletId}/${id}-${name}`,\n createdAt: new Date().toISOString(),\n dataBase64,\n }\n filesStore.set(id, record)\n return record as T\n }\n if (op === 'get') {\n const id = String(payload.id ?? '')\n const record = filesStore.get(id)\n if (!record) {\n return null as T\n }\n const { dataBase64: _, ...rest } = record\n return rest as T\n }\n if (op === 'delete') {\n const id = String(payload.id ?? '')\n return filesStore.delete(id) as T\n }\n }\n\n throw new Error(`unsupported method: ${method}`)\n },\n }\n\n return {\n auth: {\n async currentUser(): Promise<CurrentUser> {\n return currentUser\n },\n },\n engine,\n kv: {\n async get<T = unknown>(key: string): Promise<T | null> {\n return (kvStore.get(scopedKey(key)) ?? null) as T | null\n },\n async set(key: string, value: unknown, ttlSeconds?: number): Promise<void> {\n if (!Number.isNaN(toNumber(ttlSeconds)) && (ttlSeconds as number) <= 0) {\n kvStore.delete(scopedKey(key))\n return\n }\n // Test KV store intentionally ignores positive TTL values; callers can still verify scopedKey+kvStore behavior.\n kvStore.set(scopedKey(key), value)\n },\n async del(key: string): Promise<boolean> {\n return kvStore.delete(scopedKey(key))\n },\n async mget<T = unknown>(keys: string[]): Promise<Array<T | null>> {\n return keys.map((key) => (kvStore.get(scopedKey(key)) ?? null) as T | null)\n },\n },\n db,\n jobs: {\n enqueue(method: string, params?: unknown): Promise<ScheduledJob> {\n return engine.call(`${appletId}.jobs.enqueue`, { method, params: params ?? {} })\n },\n schedule(cron: string, method: string, params?: unknown): Promise<ScheduledJob> {\n return engine.call(`${appletId}.jobs.schedule`, { cron, method, params: params ?? {} })\n },\n list(): Promise<ScheduledJob[]> {\n return engine.call(`${appletId}.jobs.list`, {})\n },\n cancel(id: string): Promise<{ ok: boolean }> {\n return engine.call(`${appletId}.jobs.cancel`, { id })\n },\n },\n secrets: {\n async get(name: string): Promise<string> {\n const result = await engine.call<{ value: string }>(`${appletId}.secrets.get`, { name })\n return result.value\n },\n },\n files: {\n async store(input: { name: string; contentType?: string; data: Blob | ArrayBuffer | Uint8Array }): Promise<StoredFile> {\n const dataBase64 = await toBase64(input.data)\n return engine.call<StoredFile>(`${appletId}.files.store`, {\n name: input.name,\n contentType: input.contentType ?? '',\n dataBase64,\n })\n },\n get(id: string): Promise<StoredFile | null> {\n return engine.call(`${appletId}.files.get`, { id })\n },\n delete(id: string): Promise<boolean> {\n return engine.call(`${appletId}.files.delete`, { id })\n },\n },\n setCurrentUser(nextUser: Partial<CurrentUser>) {\n currentUser = normalizeUser(nextUser)\n },\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../ui/src/applet-runtime/context.ts","../../ui/src/applet-runtime/engine.ts","../../ui/src/applet-runtime/ws.ts","../../ui/src/applet-runtime/defineApplet.ts","../../ui/src/applet-runtime/auth.ts","../../ui/src/applet-runtime/kv.ts","../../ui/src/applet-runtime/db.ts","../../ui/src/applet-runtime/jobs.ts","../../ui/src/applet-runtime/secrets.ts","../../ui/src/applet-runtime/files.ts","../../ui/src/applet-runtime/schema.ts","../../ui/src/applet-runtime/test-context.ts"],"names":["AsyncLocalStorage","forwardedHeaders","id","appletMethod","readEnv","buildEngineURL","z","randomID","toBase64","db","engine"],"mappings":";;;;;;AAMA,IAAM,mBAAA,GAAsB,IAAIA,6BAAA,EAAkC;AAE3D,SAAS,kBAAA,CAAsB,SAAkB,EAAA,EAAgB;AACtE,EAAA,OAAO,mBAAA,CAAoB,GAAA,CAAI,EAAE,OAAA,IAAW,EAAE,CAAA;AAChD;AAEO,SAAS,cAAA,GAA0B;AACxC,EAAA,MAAM,GAAA,GAAM,oBAAoB,QAAA,EAAS;AACzC,EAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,IAAA,MAAM,IAAI,MAAM,6FAA6F,CAAA;AAAA,EAC/G;AACA,EAAA,OAAO,GAAA,CAAI,OAAA;AACb;AAEO,SAAS,sBAAA,GAA8C;AAC5D,EAAA,OAAO,mBAAA,CAAoB,UAAS,EAAG,OAAA;AACzC;;;ACAA,IAAM,iBAAA,GAAoB,MAAA;AAE1B,SAAS,QAAQ,IAAA,EAAsB;AACrC,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AAC9B,EAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,IAAA,OAAW,EAAA,EAAI;AACjC,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA,YAAA,CAAc,CAAA;AAAA,EACvC;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,eAAe,QAAA,EAA0B;AAChD,EAAA,MAAM,UAAA,GAAa,QAAQ,oBAAoB,CAAA;AAC/C,EAAA,MAAM,OAAO,QAAA,CAAS,UAAA,CAAW,GAAG,CAAA,GAAI,QAAA,GAAW,IAAI,QAAQ,CAAA,CAAA;AAG/D,EAAA,OAAO,CAAA,gBAAA,EAAmB,IAAI,CAAA,QAAA,EAAW,kBAAA,CAAmB,UAAU,CAAC,CAAA,CAAA;AACzE;AAEA,SAAS,QAAA,GAAmB;AAC1B,EAAA,MAAM,CAAA,GAAI,UAAA;AACV,EAAA,IAAI,CAAA,CAAE,QAAQ,UAAA,EAAY;AACxB,IAAA,OAAO,CAAA,CAAE,OAAO,UAAA,EAAW;AAAA,EAC7B;AACA,EAAA,OAAO,CAAA,EAAG,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAC7D;AAEA,eAAe,QAAA,CAAS,QAAA,EAAkB,IAAA,EAAe,SAAA,EAA8C;AACrG,EAAA,MAAM,UAAA,GAAa,QAAQ,oBAAoB,CAAA;AAC/C,EAAA,MAAM,UAAU,sBAAA,EAAuB;AACvC,EAAA,MAAMC,iBAAAA,GAA2C;AAAA,IAC/C,cAAA,EAAgB;AAAA,GAClB;AACA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,MAAM,kBAAA,GAAqB,CAAC,UAAA,KAAuB;AACjD,MAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,UAAU,CAAA;AAC5C,MAAA,IAAI,KAAA,IAAS,KAAA,CAAM,IAAA,EAAK,KAAM,EAAA,EAAI;AAChC,QAAAA,iBAAAA,CAAiB,UAAU,CAAA,GAAI,KAAA;AAAA,MACjC;AAAA,IACF,CAAA;AACA,IAAA,kBAAA,CAAmB,kBAAkB,CAAA;AACrC,IAAA,kBAAA,CAAmB,gBAAgB,CAAA;AACnC,IAAA,kBAAA,CAAmB,oBAAoB,CAAA;AACvC,IAAA,kBAAA,CAAmB,mBAAmB,CAAA;AACtC,IAAA,kBAAA,CAAmB,QAAQ,CAAA;AAC3B,IAAA,kBAAA,CAAmB,eAAe,CAAA;AAAA,EACpC;AAEA,EAAA,MAAM,eAAA,GAAkB,OAAO,SAAA,KAAc,QAAA,IAAY,YAAY,CAAA,GAAI,IAAI,iBAAgB,GAAI,MAAA;AACjG,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI;AACF,IAAA,IAAI,mBAAmB,SAAA,EAAW;AAChC,MAAA,KAAA,GAAQ,UAAA,CAAW,MAAM,eAAA,CAAgB,KAAA,IAAS,SAAS,CAAA;AAAA,IAC7D;AAEA,IAAA,MAAM,IAAA,GAAwC;AAAA,MAC5C,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAASA,iBAAAA;AAAA,MACT,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAAA,MACzB,QAAQ,eAAA,EAAiB,MAAA;AAAA,MACzB,IAAA,EAAM;AAAA,KACR;AACA,IAAA,MAAM,WAAW,MAAM,KAAA,CAAM,cAAA,CAAe,QAAQ,GAAG,IAAI,CAAA;AAC3D,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,IACtD;AACA,IAAA,OAAQ,MAAM,SAAS,IAAA,EAAK;AAAA,EAC9B,CAAA,SAAE;AACA,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF;AACF;AAEO,IAAM,MAAA,GAAS;AAAA,EACpB,MAAM,IAAA,CAAwB,MAAA,EAAgB,MAAA,EAAiB,OAAA,EAA+C;AAC5G,IAAA,MAAM,OAAA,GAA0B;AAAA,MAC9B,IAAI,QAAA,EAAS;AAAA,MACb,MAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,MAAM,WAAW,MAAM,QAAA,CAAS,iBAAA,EAAmB,OAAA,EAAS,SAAS,SAAS,CAAA;AAC9E,IAAA,IAAI,SAAS,KAAA,EAAO;AAClB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA,EAAA,EAAK,QAAA,CAAS,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,IACrE;AACA,IAAA,OAAO,QAAA,CAAS,MAAA;AAAA,EAClB;AACF;;;AChGA,IAAM,kBAAA,uBAAyB,GAAA,EAAuB;AACtD,IAAM,eAAA,uBAAsB,GAAA,EAAoB;AAChD,IAAM,aAAA,uBAAoB,GAAA,EAAkB;AAE5C,SAAS,aAAa,EAAA,EAAoB;AACxC,EAAA,MAAM,QAAA,GAAW,QAAQ,GAAA,CAAI,cAAA;AAC7B,EAAA,IAAI,CAAC,QAAA,IAAY,QAAA,CAAS,IAAA,OAAW,EAAA,EAAI;AACvC,IAAA,MAAM,IAAI,MAAM,4BAA4B,CAAA;AAAA,EAC9C;AACA,EAAA,OAAO,CAAA,EAAG,QAAQ,CAAA,IAAA,EAAO,EAAE,CAAA,CAAA;AAC7B;AAEA,eAAe,WAAA,CAAe,UAAmD,KAAA,EAAyB;AACxG,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,MAAM,QAAQ,KAAK,CAAA;AAAA,EACrB;AACF;AAEA,eAAe,kBAAA,CAAmB,cAAsB,IAAA,EAAiC;AACvF,EAAA,KAAA,MAAW,WAAW,eAAA,EAAiB;AACrC,IAAA,MAAM,OAAA,CAAQ,cAAc,IAAI,CAAA;AAAA,EAClC;AACF;AAEA,eAAsB,oBAAoB,OAAA,EAA4C;AACpF,EAAA,IAAI,OAAA,CAAQ,UAAU,MAAA,EAAQ;AAC5B,IAAA,MAAM,WAAA,CAAY,kBAAA,EAAoB,OAAA,CAAQ,YAAY,CAAA;AAC1D,IAAA;AAAA,EACF;AACA,EAAA,IAAI,OAAA,CAAQ,UAAU,OAAA,EAAS;AAC7B,IAAA,MAAM,WAAA,CAAY,aAAA,EAAe,OAAA,CAAQ,YAAY,CAAA;AACrD,IAAA;AAAA,EACF;AACA,EAAA,IAAI,OAAA,CAAQ,UAAU,SAAA,EAAW;AAC/B,IAAA,MAAM,UAAU,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,UAAA,IAAc,IAAI,QAAQ,CAAA;AAC9D,IAAA,MAAM,mBAAmB,OAAA,CAAQ,YAAA,EAAc,IAAI,UAAA,CAAW,OAAO,CAAC,CAAA;AAAA,EACxE;AACF;AAEO,IAAM,EAAA,GAAK;AAAA,EAChB,MAAM,IAAA,CAAK,YAAA,EAAsB,IAAA,EAAyC;AACxE,IAAA,OAAO,MAAA,CAAO,KAAsB,YAAA,CAAa,MAAM,GAAG,EAAE,YAAA,EAAc,MAAM,CAAA;AAAA,EAClF,CAAA;AAAA,EACA,aAAa,OAAA,EAAwC;AACnD,IAAA,kBAAA,CAAmB,IAAI,OAAO,CAAA;AAC9B,IAAA,OAAO,MAAM,kBAAA,CAAmB,MAAA,CAAO,OAAO,CAAA;AAAA,EAChD,CAAA;AAAA,EACA,UAAU,OAAA,EAAqC;AAC7C,IAAA,eAAA,CAAgB,IAAI,OAAO,CAAA;AAC3B,IAAA,OAAO,MAAM,eAAA,CAAgB,MAAA,CAAO,OAAO,CAAA;AAAA,EAC7C,CAAA;AAAA,EACA,QAAQ,OAAA,EAAmC;AACzC,IAAA,aAAA,CAAc,IAAI,OAAO,CAAA;AACzB,IAAA,OAAO,MAAM,aAAA,CAAc,MAAA,CAAO,OAAO,CAAA;AAAA,EAC3C;AACF;;;ACjDA,SAAS,qBAAA,GAAgC;AACvC,EAAA,MAAM,IAAA,GAAO,QAAQ,GAAA,CAAI,kBAAA;AACzB,EAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,IAAA,OAAW,EAAA,EAAI;AAC/B,IAAA,MAAM,IAAI,MAAM,gCAAgC,CAAA;AAAA,EAClD;AACA,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,aAAa,UAAA,EAA4C;AACvE,EAAA,MAAM,aAAa,qBAAA,EAAsB;AACzC,EAAA,MAAM,MAAO,UAAA,CAA8C,GAAA;AAC3D,EAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,CAAI,UAAU,UAAA,EAAY;AAC3C,IAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,EACrD;AACA,EAAA,OAAO,IAAI,KAAA,CAAM;AAAA,IACf,IAAA,EAAM,UAAA;AAAA,IACN,KAAA,EAAO,CAAC,OAAA,KACN,kBAAA,CAAmB,SAAS,YAAY;AACtC,MAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,OAAA,CAAQ,GAAG,CAAA;AAC/B,MAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,MAAA,IAAU,GAAA,CAAI,aAAa,OAAA,EAAS;AACzD,QAAA,IAAI,OAAA;AAKJ,QAAA,IAAI;AACF,UAAA,OAAA,GAAW,MAAM,QAAQ,IAAA,EAAK;AAAA,QAKhC,CAAA,CAAA,MAAQ;AACN,UAAA,OAAO,IAAI,SAAS,IAAA,CAAK,SAAA,CAAU,EAAE,KAAA,EAAO,cAAA,EAAgB,CAAA,EAAG;AAAA,YAC7D,MAAA,EAAQ,GAAA;AAAA,YACR,OAAA,EAAS,EAAE,cAAA,EAAgB,iCAAA;AAAkC,WAC9D,CAAA;AAAA,QACH;AACA,QAAA,IAAI,CAAC,OAAA,EAAS,YAAA,IAAgB,CAAC,SAAS,KAAA,EAAO;AAC7C,UAAA,OAAO,IAAI,SAAS,IAAA,CAAK,SAAA,CAAU,EAAE,KAAA,EAAO,iBAAA,EAAmB,CAAA,EAAG;AAAA,YAChE,MAAA,EAAQ,GAAA;AAAA,YACR,OAAA,EAAS,EAAE,cAAA,EAAgB,iCAAA;AAAkC,WAC9D,CAAA;AAAA,QACH;AACA,QAAA,IAAI,CAAC,CAAC,MAAA,EAAQ,SAAA,EAAW,OAAO,CAAA,CAAE,QAAA,CAAS,OAAA,CAAQ,KAAK,CAAA,EAAG;AACzD,UAAA,OAAO,IAAI,SAAS,IAAA,CAAK,SAAA,CAAU,EAAE,KAAA,EAAO,iBAAA,EAAmB,CAAA,EAAG;AAAA,YAChE,MAAA,EAAQ,GAAA;AAAA,YACR,OAAA,EAAS,EAAE,cAAA,EAAgB,iCAAA;AAAkC,WAC9D,CAAA;AAAA,QACH;AACA,QAAA,MAAM,oBAAoB,OAAO,CAAA;AACjC,QAAA,OAAO,IAAI,SAAS,IAAA,CAAK,SAAA,CAAU,EAAE,EAAA,EAAI,IAAA,EAAM,CAAA,EAAG;AAAA,UAChD,MAAA,EAAQ,GAAA;AAAA,UACR,OAAA,EAAS,EAAE,cAAA,EAAgB,iCAAA;AAAkC,SAC9D,CAAA;AAAA,MACH;AACA,MAAA,OAAO,UAAA,CAAW,MAAM,OAAO,CAAA;AAAA,IACjC,CAAC;AAAA,GACJ,CAAA;AACH;;;ACnEA,SAAS,cAAA,CAAe,SAAkB,IAAA,EAAsB;AAC9D,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AAC9B,EAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,IAAA,OAAW,EAAA,EAAI;AACjC,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA,mBAAA,CAAqB,CAAA;AAAA,EAC9C;AACA,EAAA,OAAO,KAAA;AACT;AAEO,IAAM,IAAA,GAAO;AAAA,EAClB,MAAM,WAAA,GAAoC;AACxC,IAAA,MAAM,UAAU,cAAA,EAAe;AAC/B,IAAA,MAAM,UAAU,OAAA,CAAQ,OAAA;AACxB,IAAA,MAAMC,GAAAA,GAAK,cAAA,CAAe,OAAA,EAAS,gBAAgB,CAAA;AACnD,IAAA,MAAM,QAAA,GAAW,cAAA,CAAe,OAAA,EAAS,kBAAkB,CAAA;AAC3D,IAAA,MAAM,iBAAA,GAAoB,OAAA,CAAQ,GAAA,CAAI,oBAAoB,CAAA,IAAK,EAAA;AAC/D,IAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,GAAA,CAAI,mBAAmB,CAAA,IAAK,MAAA;AACtD,IAAA,MAAM,cAAc,iBAAA,CACjB,KAAA,CAAM,GAAG,CAAA,CACT,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA,CACnB,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,CAAC,CAAA;AAE7B,IAAA,OAAO;AAAA,MACL,EAAA,EAAAA,GAAAA;AAAA,MACA,QAAA;AAAA,MACA,WAAA;AAAA,MACA,SAAA,EAAW;AAAA,KACb;AAAA,EACF;AACF;;;ACnCA,SAASC,cAAa,EAAA,EAAoB;AACxC,EAAA,MAAM,QAAA,GAAW,QAAQ,GAAA,CAAI,cAAA;AAC7B,EAAA,IAAI,CAAC,QAAA,IAAY,QAAA,CAAS,IAAA,OAAW,EAAA,EAAI;AACvC,IAAA,MAAM,IAAI,MAAM,4BAA4B,CAAA;AAAA,EAC9C;AACA,EAAA,OAAO,CAAA,EAAG,QAAQ,CAAA,IAAA,EAAO,EAAE,CAAA,CAAA;AAC7B;AAEO,IAAM,EAAA,GAAK;AAAA,EAChB,IAAiB,GAAA,EAAgC;AAC/C,IAAA,OAAO,OAAO,IAAA,CAAeA,aAAAA,CAAa,KAAK,CAAA,EAAG,EAAE,KAAK,CAAA;AAAA,EAC3D,CAAA;AAAA,EACA,GAAA,CAAI,GAAA,EAAa,KAAA,EAAgB,UAAA,EAAoC;AACnE,IAAA,OAAO,MAAA,CAAO,KAAWA,aAAAA,CAAa,KAAK,GAAG,EAAE,GAAA,EAAK,KAAA,EAAO,UAAA,EAAY,CAAA;AAAA,EAC1E,CAAA;AAAA,EACA,IAAI,GAAA,EAA+B;AACjC,IAAA,OAAO,OAAO,IAAA,CAAcA,aAAAA,CAAa,KAAK,CAAA,EAAG,EAAE,KAAK,CAAA;AAAA,EAC1D,CAAA;AAAA,EACA,KAAkB,IAAA,EAA0C;AAC1D,IAAA,OAAO,OAAO,IAAA,CAAsBA,aAAAA,CAAa,MAAM,CAAA,EAAG,EAAE,MAAM,CAAA;AAAA,EACpE;AACF;;;ACyBO,SAAS,SAAS,MAAA,EAA4B;AAAA,EACnD,MAAM,iBAAA,CAA0C;AAAA,IAG9C,EAAA,CAAG,OAAe,KAAA,EAAmC;AACnD,MAAA,IAAA,CAAK,UAAA,GAAa,EAAE,KAAA,EAAO,EAAA,EAAI,MAAM,KAAA,EAAM;AAC3C,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,IAEA,MAAM,IAAA,EAA6C;AACjD,MAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AACpB,QAAA,OAAO,MAAA;AAAA,MACT;AACA,MAAA,OAAO,EAAE,IAAA,EAAM,GAAG,IAAA,CAAK,UAAA,EAAW;AAAA,IACpC;AAAA;AACF,EAEA,MAAM,kBAAA,CAA4C;AAAA,IAAlD,WAAA,GAAA;AACE,MAAA,IAAA,CAAQ,cAA8B,EAAC;AAAA,IAAA;AAAA,IAEvC,EAAA,CAAG,OAAe,KAAA,EAAoC;AACpD,MAAA,IAAA,CAAK,YAAY,IAAA,CAAK,EAAE,OAAO,EAAA,EAAI,IAAA,EAAM,OAAO,CAAA;AAChD,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,IAEA,KAAA,GAAwB;AACtB,MAAA,OAAO,IAAA,CAAK,WAAA;AAAA,IACd;AAAA;AACF,EAEA,MAAM,mBAAA,CAAoD;AAAA,IACxD,WAAA,CACmB,KAAA,EACA,OAAA,GAA0B,EAAC,EAC5C;AAFiB,MAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACA,MAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA,IAChB;AAAA,IAEH,SAAA,CAAU,MAAc,KAAA,EAAyE;AAC/F,MAAA,MAAM,KAAA,GAAQ,IAAI,iBAAA,EAAkB;AACpC,MAAA,KAAA,CAAM,KAAK,CAAA;AACX,MAAA,OAAO,IAAI,mBAAA,CAAuB,IAAA,CAAK,KAAA,EAAO;AAAA,QAC5C,GAAG,IAAA,CAAK,OAAA;AAAA,QACR,KAAA,EAAO,KAAA,CAAM,KAAA,CAAM,IAAI;AAAA,OACxB,CAAA;AAAA,IACH;AAAA,IAEA,OAAO,KAAA,EAA2E;AAChF,MAAA,MAAM,MAAA,GAAS,IAAI,kBAAA,EAAmB;AACtC,MAAA,KAAA,CAAM,MAAM,CAAA;AACZ,MAAA,OAAO,IAAI,mBAAA,CAAuB,IAAA,CAAK,KAAA,EAAO;AAAA,QAC5C,GAAG,IAAA,CAAK,OAAA;AAAA,QACR,OAAA,EAAS,CAAC,GAAI,IAAA,CAAK,OAAA,CAAQ,OAAA,IAAW,EAAC,EAAI,GAAG,MAAA,CAAO,KAAA,EAAO;AAAA,OAC7D,CAAA;AAAA,IACH;AAAA,IAEA,MAAM,SAAA,EAAmD;AACvD,MAAA,OAAO,IAAI,mBAAA,CAAuB,IAAA,CAAK,KAAA,EAAO;AAAA,QAC5C,GAAG,IAAA,CAAK,OAAA;AAAA,QACR,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,IACH;AAAA,IAEA,KAAK,KAAA,EAAuC;AAC1C,MAAA,OAAO,IAAI,mBAAA,CAAuB,IAAA,CAAK,KAAA,EAAO;AAAA,QAC5C,GAAG,IAAA,CAAK,OAAA;AAAA,QACR,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IACH;AAAA,IAEA,OAAA,GAAwB;AACtB,MAAA,OAAO,MAAA,CAAY,SAAS,EAAE,KAAA,EAAO,KAAK,KAAA,EAAO,KAAA,EAAO,IAAA,CAAK,OAAA,EAAS,CAAA;AAAA,IACxE;AAAA,IAEA,MAAM,KAAA,GAA2B;AAC/B,MAAA,MAAM,OAAO,MAAM,IAAA,CAAK,IAAA,CAAK,CAAC,EAAE,OAAA,EAAQ;AACxC,MAAA,OAAO,IAAA,CAAK,CAAC,CAAA,IAAK,IAAA;AAAA,IACpB;AAAA;AAGF,EAAA,MAAM,MAAA,GAAmB;AAAA,IACvB,IAAiBD,GAAAA,EAA+B;AAC9C,MAAA,OAAO,MAAA,CAAiB,KAAA,EAAO,EAAE,EAAA,EAAAA,KAAI,CAAA;AAAA,IACvC,CAAA;AAAA,IACA,MAAmB,KAAA,EAAuC;AACxD,MAAA,OAAO,IAAI,oBAAuB,KAAK,CAAA;AAAA,IACzC,CAAA;AAAA,IACA,QAAA,CAAsB,OAAe,KAAA,EAAsC;AACzE,MAAA,OAAO,MAAA,CAAY,SAAS,EAAE,KAAA,EAAO,OAAO,KAAA,IAAS,IAAI,CAAA;AAAA,IAC3D,CAAA;AAAA,IACA,MAAA,CAAoB,OAAe,KAAA,EAA4B;AAC7D,MAAA,OAAO,MAAA,CAAU,QAAA,EAAU,EAAE,KAAA,EAAO,OAAO,CAAA;AAAA,IAC7C,CAAA;AAAA,IACA,KAAA,CAAmBA,KAAY,KAAA,EAA4B;AACzD,MAAA,OAAO,OAAU,OAAA,EAAS,EAAE,EAAA,EAAAA,GAAAA,EAAI,OAAO,CAAA;AAAA,IACzC,CAAA;AAAA,IACA,OAAA,CAAqBA,KAAY,KAAA,EAA4B;AAC3D,MAAA,OAAO,OAAU,SAAA,EAAW,EAAE,EAAA,EAAAA,GAAAA,EAAI,OAAO,CAAA;AAAA,IAC3C,CAAA;AAAA,IACA,OAAOA,GAAAA,EAA8B;AACnC,MAAA,OAAO,MAAA,CAAgB,QAAA,EAAU,EAAE,EAAA,EAAAA,KAAI,CAAA;AAAA,IACzC;AAAA,GACF;AACA,EAAA,OAAO,MAAA;AACT;AAEO,IAAM,EAAA,GAAK,QAAA,CAAS,CAAC,EAAA,EAAI,MAAA,KAAW,MAAA,CAAO,IAAA,CAAKC,aAAAA,CAAa,EAAE,CAAA,EAAG,MAAM,CAAC;AAEhF,SAASA,cAAa,EAAA,EAAoB;AACxC,EAAA,MAAM,QAAA,GAAW,QAAQ,GAAA,CAAI,cAAA;AAC7B,EAAA,IAAI,CAAC,QAAA,IAAY,QAAA,CAAS,IAAA,OAAW,EAAA,EAAI;AACvC,IAAA,MAAM,IAAI,MAAM,4BAA4B,CAAA;AAAA,EAC9C;AACA,EAAA,OAAO,CAAA,EAAG,QAAQ,CAAA,IAAA,EAAO,EAAE,CAAA,CAAA;AAC7B;;;AC/IA,SAASA,cAAa,EAAA,EAAoB;AACxC,EAAA,MAAM,QAAA,GAAW,QAAQ,GAAA,CAAI,cAAA;AAC7B,EAAA,IAAI,CAAC,QAAA,IAAY,QAAA,CAAS,IAAA,OAAW,EAAA,EAAI;AACvC,IAAA,MAAM,IAAI,MAAM,4BAA4B,CAAA;AAAA,EAC9C;AACA,EAAA,OAAO,CAAA,EAAG,QAAQ,CAAA,MAAA,EAAS,EAAE,CAAA,CAAA;AAC/B;AAEO,IAAM,IAAA,GAAO;AAAA,EAClB,OAAA,CAAQ,QAAgB,MAAA,EAAyC;AAC/D,IAAA,OAAO,MAAA,CAAO,IAAA,CAAmBA,aAAAA,CAAa,SAAS,CAAA,EAAG,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAA,IAAU,EAAC,EAAG,CAAA;AAAA,EAC5F,CAAA;AAAA,EACA,QAAA,CAAS,IAAA,EAAc,MAAA,EAAgB,MAAA,EAAyC;AAC9E,IAAA,OAAO,MAAA,CAAO,IAAA,CAAmBA,aAAAA,CAAa,UAAU,CAAA,EAAG,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAQ,MAAA,IAAU,EAAC,EAAG,CAAA;AAAA,EACnG,CAAA;AAAA,EACA,IAAA,GAAgC;AAC9B,IAAA,OAAO,OAAO,IAAA,CAAqBA,aAAAA,CAAa,MAAM,CAAA,EAAG,EAAE,CAAA;AAAA,EAC7D,CAAA;AAAA,EACA,OAAOD,GAAAA,EAAsC;AAC3C,IAAA,OAAO,MAAA,CAAO,KAAsBC,aAAAA,CAAa,QAAQ,GAAG,EAAE,EAAA,EAAAD,KAAI,CAAA;AAAA,EACpE;AACF;;;ACpCA,SAASC,cAAa,EAAA,EAAoB;AACxC,EAAA,MAAM,QAAA,GAAW,QAAQ,GAAA,CAAI,cAAA;AAC7B,EAAA,IAAI,CAAC,QAAA,IAAY,QAAA,CAAS,IAAA,OAAW,EAAA,EAAI;AACvC,IAAA,MAAM,IAAI,MAAM,4BAA4B,CAAA;AAAA,EAC9C;AACA,EAAA,OAAO,CAAA,EAAG,QAAQ,CAAA,SAAA,EAAY,EAAE,CAAA,CAAA;AAClC;AAEO,IAAM,OAAA,GAAU;AAAA,EACrB,MAAM,IAAI,IAAA,EAA+B;AACvC,IAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,IAAA,CAAwBA,cAAa,KAAK,CAAA,EAAG,EAAE,IAAA,EAAM,CAAA;AACnF,IAAA,OAAO,QAAA,CAAS,KAAA;AAAA,EAClB;AACF;;;ACHA,SAASC,SAAQ,IAAA,EAAsB;AACrC,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AAC9B,EAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,IAAA,OAAW,EAAA,EAAI;AACjC,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA,YAAA,CAAc,CAAA;AAAA,EACvC;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAASD,cAAa,EAAA,EAAoB;AACxC,EAAA,MAAM,QAAA,GAAW,QAAQ,GAAA,CAAI,cAAA;AAC7B,EAAA,IAAI,CAAC,QAAA,IAAY,QAAA,CAAS,IAAA,OAAW,EAAA,EAAI;AACvC,IAAA,MAAM,IAAI,MAAM,4BAA4B,CAAA;AAAA,EAC9C;AACA,EAAA,OAAO,CAAA,EAAG,QAAQ,CAAA,OAAA,EAAU,EAAE,CAAA,CAAA;AAChC;AAEA,SAASE,eAAAA,CAAe,UAAkB,UAAA,EAA4B;AACpE,EAAA,MAAM,OAAO,QAAA,CAAS,UAAA,CAAW,GAAG,CAAA,GAAI,QAAA,GAAW,IAAI,QAAQ,CAAA,CAAA;AAC/D,EAAA,OAAO,CAAA,gBAAA,EAAmB,IAAI,CAAA,QAAA,EAAW,kBAAA,CAAmB,UAAU,CAAC,CAAA,CAAA;AACzE;AAEA,SAAS,gBAAA,GAA2C;AAClD,EAAA,MAAM,UAAU,sBAAA,EAAuB;AACvC,EAAA,MAAM,UAAkC,EAAC;AACzC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,OAAA;AAAA,EACT;AACA,EAAA,MAAM,kBAAA,GAAqB,CAAC,UAAA,KAAuB;AACjD,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,UAAU,CAAA;AAC5C,IAAA,IAAI,KAAA,IAAS,KAAA,CAAM,IAAA,EAAK,KAAM,EAAA,EAAI;AAChC,MAAA,OAAA,CAAQ,UAAU,CAAA,GAAI,KAAA;AAAA,IACxB;AAAA,EACF,CAAA;AACA,EAAA,kBAAA,CAAmB,kBAAkB,CAAA;AACrC,EAAA,kBAAA,CAAmB,gBAAgB,CAAA;AACnC,EAAA,kBAAA,CAAmB,mBAAmB,CAAA;AACtC,EAAA,OAAO,OAAA;AACT;AAEA,eAAe,QAAQ,IAAA,EAA4D;AACjF,EAAA,IAAI,gBAAgB,IAAA,EAAM;AACxB,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,WAAA,EAAY;AACtC,IAAA,OAAO,IAAI,WAAW,MAAM,CAAA;AAAA,EAC9B;AACA,EAAA,IAAI,gBAAgB,WAAA,EAAa;AAC/B,IAAA,OAAO,IAAI,WAAW,IAAI,CAAA;AAAA,EAC5B;AACA,EAAA,OAAO,IAAA;AACT;AAEA,eAAe,SAAS,IAAA,EAAwD;AAC9E,EAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,CAAQ,IAAI,CAAA;AAChC,EAAA,OAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,SAAS,QAAQ,CAAA;AAC7C;AAEA,eAAe,oBAAA,CACb,MACA,OAAA,EACY;AACZ,EAAA,MAAM,UAAA,GAAaD,SAAQ,oBAAoB,CAAA;AAC/C,EAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAQ,OAAA,CAAQ,OAAO,CAAA;AAC3C,EAAA,OAAA,CAAQ,GAAA,CAAI,kBAAA,EAAoB,OAAA,CAAQ,QAAQ,CAAA;AAChD,EAAA,KAAA,MAAW,CAAC,MAAM,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,gBAAA,EAAkB,CAAA,EAAG;AAC9D,IAAA,OAAA,CAAQ,GAAA,CAAI,MAAM,KAAK,CAAA;AAAA,EACzB;AACA,EAAA,MAAM,WAAW,MAAM,KAAA,CAAMC,eAAAA,CAAe,IAAA,EAAM,UAAU,CAAA,EAAG;AAAA,IAC7D,GAAG,OAAA;AAAA,IACH,OAAA;AAAA,IACA,IAAA,EAAM;AAAA,GACA,CAAA;AACR,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,EAC1D;AACA,EAAA,OAAQ,MAAM,SAAS,IAAA,EAAK;AAC9B;AAEO,IAAM,KAAA,GAAQ;AAAA,EACnB,MAAM,MAAM,KAAA,EAIY;AACtB,IAAA,MAAM,QAAA,GAAWD,SAAQ,gBAAgB,CAAA;AACzC,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA;AACtC,MAAA,MAAM,cACJ,KAAA,CAAM,MAAA,YAAkB,WAAA,GACpB,KAAA,CAAM,OAAO,KAAA,CAAM,KAAA,CAAM,UAAA,EAAY,KAAA,CAAM,aAAa,KAAA,CAAM,UAAU,IACxE,UAAA,CAAW,IAAA,CAAK,KAAK,CAAA,CAAE,MAAA;AAC7B,MAAA,OAAO,MAAM,qBAAiC,cAAA,EAAgB;AAAA,QAC5D,QAAA,EAAU,QAAA;AAAA,QACV,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,oBAAoB,KAAA,CAAM,IAAA;AAAA,UAC1B,qBAAA,EAAuB,MAAM,WAAA,IAAe,EAAA;AAAA,UAC5C,cAAA,EAAgB,MAAM,WAAA,IAAe;AAAA,SACvC;AAAA,QACA,IAAA,EAAM,IAAI,IAAA,CAAK,CAAC,WAAW,CAAA,EAAG,EAAE,IAAA,EAAM,KAAA,CAAM,WAAA,IAAe,0BAAA,EAA4B;AAAA,OACxF,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,KAAA,YAAiB,SAAA,IAAa,KAAA,YAAiB,cAAA,EAAgB;AACjE,QAAA,MAAM,KAAA;AAAA,MACR;AACA,MAAA,MAAM,UAAA,GAAa,MAAM,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA;AAC5C,MAAA,OAAO,MAAA,CAAO,IAAA,CAAiBD,aAAAA,CAAa,OAAO,CAAA,EAAG;AAAA,QACpD,MAAM,KAAA,CAAM,IAAA;AAAA,QACZ,WAAA,EAAa,MAAM,WAAA,IAAe,EAAA;AAAA,QAClC;AAAA,OACD,CAAA;AAAA,IACH;AAAA,EACF,CAAA;AAAA,EACA,MAAM,IAAID,GAAAA,EAAwC;AAChD,IAAA,MAAM,QAAA,GAAWE,SAAQ,gBAAgB,CAAA;AACzC,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,oBAAA,CAAwC,CAAA,cAAA,EAAiB,kBAAA,CAAmBF,GAAE,CAAC,CAAA,QAAA,EAAW,kBAAA,CAAmB,QAAQ,CAAC,CAAA,CAAA,EAAI;AAAA,QACrI,QAAA,EAAU,QAAA;AAAA,QACV,MAAA,EAAQ;AAAA,OACT,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,KAAA,YAAiB,SAAA,IAAa,KAAA,YAAiB,cAAA,EAAgB;AACjE,QAAA,MAAM,KAAA;AAAA,MACR;AACA,MAAA,OAAO,MAAA,CAAO,KAAwBC,aAAAA,CAAa,KAAK,GAAG,EAAE,EAAA,EAAAD,KAAI,CAAA;AAAA,IACnE;AAAA,EACF,CAAA;AAAA,EACA,MAAM,OAAOA,GAAAA,EAA8B;AACzC,IAAA,MAAM,QAAA,GAAWE,SAAQ,gBAAgB,CAAA;AACzC,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,oBAAA,CAAsC,CAAA,iBAAA,EAAoB,kBAAA,CAAmBF,GAAE,CAAC,CAAA,QAAA,EAAW,kBAAA,CAAmB,QAAQ,CAAC,CAAA,CAAA,EAAI;AAAA,QAC9I,QAAA,EAAU,QAAA;AAAA,QACV,MAAA,EAAQ;AAAA,OACT,CAAA;AACD,MAAA,OAAO,MAAA,CAAO,EAAA;AAAA,IAChB,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,KAAA,YAAiB,SAAA,IAAa,KAAA,YAAiB,cAAA,EAAgB;AACjE,QAAA,MAAM,KAAA;AAAA,MACR;AACA,MAAA,OAAO,MAAA,CAAO,KAAcC,aAAAA,CAAa,QAAQ,GAAG,EAAE,EAAA,EAAAD,KAAI,CAAA;AAAA,IAC5D;AAAA,EACF;AACF;ACvIA,IAAM,sBAAA,GAAN,MAAM,uBAAA,CAA4E;AAAA,EAIhF,WAAA,CAAY,MAAA,EAAwB,OAAA,GAAwB,EAAC,EAAG;AAC9D,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,EACjB;AAAA,EAEA,KAAA,CAAM,MAAc,MAAA,EAA6C;AAC/D,IAAA,OAAO,IAAI,uBAAA,CAAuB,IAAA,CAAK,MAAA,EAAQ;AAAA,MAC7C,GAAG,IAAA,CAAK,OAAA;AAAA,MACR;AAAA,QACE,IAAA;AAAA,QACA,MAAA,EAAQ,CAAC,GAAG,MAAM;AAAA;AACpB,KACD,CAAA;AAAA,EACH;AACF,CAAA;AAEO,SAAS,YAAmC,KAAA,EAA8B;AAC/E,EAAA,OAAO,IAAI,sBAAA,CAAuBI,KAAA,CAAE,MAAA,CAAO,KAAK,CAAC,CAAA;AACnD;AAEO,SAAS,aAAkE,MAAA,EAA0C;AAC1H,EAAA,OAAO,EAAE,MAAA,EAAO;AAClB;AAGO,SAAS,GAAG,UAAA,EAA+B;AAChD,EAAA,OAAOA,KAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,CAAC,CAAA;AACzB;;;ACtBA,IAAM,WAAA,GAA2B;AAAA,EAC/B,EAAA,EAAI,WAAA;AAAA,EACJ,QAAA,EAAU,aAAA;AAAA,EACV,aAAa;AACf,CAAA;AAEA,SAAS,cAAc,IAAA,EAA0C;AAC/D,EAAA,OAAO;AAAA,IACL,GAAG,WAAA;AAAA,IACH,GAAI,QAAQ,EAAC;AAAA,IACb,WAAA,EAAa,MAAM,WAAA,GAAc,CAAC,GAAG,IAAA,CAAK,WAAW,IAAI;AAAC,GAC5D;AACF;AAEA,SAASC,UAAS,MAAA,EAAwB;AACxC,EAAA,OAAO,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,IAAA,CAAK,KAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,GAAS,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACvE;AAEA,SAAS,SAAS,KAAA,EAAwB;AACxC,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAO,MAAA,CAAO,GAAA;AAChB;AAEA,SAAS,WAAA,CAAY,OAAgB,KAAA,EAAwB;AAC3D,EAAA,IAAI,OAAA,GAAmB,KAAA;AACvB,EAAA,KAAA,MAAW,OAAA,IAAW,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA,EAAG;AACtC,IAAA,IAAI,CAAC,OAAA,IAAW,OAAO,OAAA,KAAY,QAAA,EAAU;AAC3C,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,OAAA,GAAW,QAAoC,OAAO,CAAA;AAAA,EACxD;AACA,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,iBAAA,CAAkB,OAAgB,UAAA,EAAmC;AAC5E,EAAA,IAAI,UAAA,CAAW,OAAO,IAAA,EAAM;AAC1B,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAO,MAAA,CAAO,YAAY,KAAA,EAAO,UAAA,CAAW,KAAK,CAAC,CAAA,KAAM,MAAA,CAAO,UAAA,CAAW,KAAK,CAAA;AACjF;AAEA,SAAS,eAAA,CAAgB,WAA2B,OAAA,EAAyC;AAC3F,EAAA,IAAI,MAAA,GAAS,CAAC,GAAG,SAAS,CAAA;AAC1B,EAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,IAAA,MAAA,GAAS,MAAA,CAAO,OAAO,CAAC,GAAA,KAAQ,kBAAkB,GAAA,CAAI,KAAA,EAAO,OAAA,CAAQ,KAAM,CAAC,CAAA;AAAA,EAC9E;AACA,EAAA,KAAA,MAAW,MAAA,IAAU,OAAA,CAAQ,OAAA,IAAW,EAAC,EAAG;AAC1C,IAAA,MAAA,GAAS,MAAA,CAAO,OAAO,CAAC,GAAA,KAAQ,kBAAkB,GAAA,CAAI,KAAA,EAAO,MAAM,CAAC,CAAA;AAAA,EACtE;AACA,EAAA,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAO,QAAQ,KAAA,KAAU,KAAA,GAAQ,CAAA,CAAE,SAAA,GAAY,CAAA,CAAE,SAAA,GAAY,CAAA,CAAE,SAAA,GAAY,EAAE,SAAU,CAAA;AACvG,EAAA,IAAI,OAAO,OAAA,CAAQ,IAAA,KAAS,QAAA,IAAY,OAAA,CAAQ,OAAO,CAAA,EAAG;AACxD,IAAA,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,OAAA,CAAQ,IAAI,CAAA;AAAA,EACvC;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,mBAAmB,IAAA,EAAuB;AACjD,EAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,CAAK,IAAA,OAAW,EAAA,EAAI;AAClD,IAAA,MAAM,IAAI,MAAM,wBAAwB,CAAA;AAAA,EAC1C;AACA,EAAA,OAAO,IAAA;AACT;AAEA,eAAeC,UAAS,IAAA,EAAwD;AAC9E,EAAA,IAAI,gBAAgB,IAAA,EAAM;AACxB,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,WAAA,EAAY;AACtC,IAAA,OAAO,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAAE,SAAS,QAAQ,CAAA;AAAA,EAC9C;AACA,EAAA,IAAI,gBAAgB,WAAA,EAAa;AAC/B,IAAA,OAAO,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,CAAE,SAAS,QAAQ,CAAA;AAAA,EAC5C;AACA,EAAA,OAAO,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,CAAE,SAAS,QAAQ,CAAA;AAC5C;AAEO,SAAS,iBAAA,CAAkB,OAAA,GAA8B,EAAC,EAAG;AAClE,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,QAAA,EAAU,IAAA,EAAK,IAAK,MAAA;AAC7C,EAAA,IAAI,WAAA,GAAc,aAAA,CAAc,OAAA,CAAQ,IAAI,CAAA;AAC5C,EAAA,MAAM,cAAA,GAAiB,OAAA,CAAQ,cAAA,IAAkB,EAAC;AAClD,EAAA,MAAM,WAAA,GAAc,IAAI,GAAA,CAAI,MAAA,CAAO,QAAQ,OAAA,CAAQ,OAAA,IAAW,EAAE,CAAC,CAAA;AACjE,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAqB;AACzC,EAAA,MAAM,OAAA,uBAAc,GAAA,EAA0B;AAC9C,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAA0B;AAChD,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAA4B;AAEnD,EAAA,SAAS,UAAU,GAAA,EAAqB;AACtC,IAAA,OAAO,GAAG,WAAA,CAAY,QAAQ,CAAA,EAAA,EAAK,QAAQ,KAAK,GAAG,CAAA,CAAA;AAAA,EACrD;AAEA,EAAA,eAAe,MAAA,CAAU,IAAY,MAAA,EAA6C;AAChF,IAAA,QAAQ,EAAA;AAAI,MACV,KAAK,KAAA,EAAO;AACV,QAAA,MAAMN,GAAAA,GAAK,MAAA,CAAO,MAAA,CAAO,EAAA,IAAM,EAAE,CAAA;AACjC,QAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,GAAA,CAAIA,GAAE,CAAA;AAC7B,QAAA,OAAQ,MAAA,GAAS,EAAE,GAAA,EAAK,MAAA,CAAO,EAAA,EAAI,KAAA,EAAO,MAAA,CAAO,KAAA,EAAO,KAAA,EAAO,MAAA,CAAO,KAAA,EAAM,GAAI,IAAA;AAAA,MAClF;AAAA,MACA,KAAK,OAAA,EAAS;AACZ,QAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,MAAA,CAAO,KAAA,IAAS,EAAE,CAAA;AACvC,QAAA,MAAM,KAAA,GAAS,MAAA,CAAO,KAAA,IAAwC,EAAC;AAC/D,QAAA,MAAM,IAAA,GAAO,eAAA;AAAA,UACX,CAAC,GAAG,OAAA,CAAQ,MAAA,EAAQ,CAAA,CAAE,MAAA,CAAO,CAAC,GAAA,KAAQ,GAAA,CAAI,KAAA,KAAU,KAAK,CAAA;AAAA,UACzD;AAAA,SACF;AACA,QAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,MAAS,EAAE,GAAA,EAAK,GAAA,CAAI,EAAA,EAAI,KAAA,EAAO,GAAA,CAAI,KAAA,EAAO,KAAA,EAAO,GAAA,CAAI,OAAM,CAAE,CAAA;AAAA,MAChF;AAAA,MACA,KAAK,QAAA,EAAU;AACb,QAAA,MAAMA,GAAAA,GAAKK,UAAS,KAAK,CAAA;AACzB,QAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,QAAA,MAAM,MAAA,GAAuB;AAAA,UAC3B,EAAA,EAAAL,GAAAA;AAAA,UACA,KAAA,EAAO,MAAA,CAAO,MAAA,CAAO,KAAA,IAAS,EAAE,CAAA;AAAA,UAChC,OAAO,MAAA,CAAO,KAAA;AAAA,UACd,SAAA,EAAW,GAAA;AAAA,UACX,SAAA,EAAW;AAAA,SACb;AACA,QAAA,OAAA,CAAQ,GAAA,CAAIA,KAAI,MAAM,CAAA;AACtB,QAAA,OAAO,EAAE,KAAKA,GAAAA,EAAI,KAAA,EAAO,OAAO,KAAA,EAAO,KAAA,EAAO,OAAO,KAAA,EAAM;AAAA,MAC7D;AAAA,MACA,KAAK,OAAA,EACL;AACE,QAAA,MAAMA,GAAAA,GAAK,MAAA,CAAO,MAAA,CAAO,EAAA,IAAM,EAAE,CAAA;AACjC,QAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,GAAA,CAAIA,GAAE,CAAA;AAC9B,QAAA,IAAI,CAAC,OAAA,EAAS;AACZ,UAAA,OAAO,IAAA;AAAA,QACT;AACA,QAAA,MAAM,eAAe,OAAA,CAAQ,KAAA;AAC7B,QAAA,MAAM,YAAY,MAAA,CAAO,KAAA;AACzB,QAAA,MAAM,IAAA,GAAqB;AAAA,UACzB,GAAG,OAAA;AAAA,UACH,KAAA,EACE,YAAA,IAAgB,OAAO,YAAA,KAAiB,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,YAAY,CAAA,IAC/E,SAAA,IAAa,OAAO,cAAc,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA,GAClE,EAAE,GAAI,YAAA,EAA0C,GAAI,SAAA,EAAsC,GAC1F,SAAA;AAAA,UACN,SAAA,EAAW,KAAK,GAAA;AAAI,SACtB;AACA,QAAA,OAAA,CAAQ,GAAA,CAAIA,KAAI,IAAI,CAAA;AACpB,QAAA,OAAO,EAAE,KAAKA,GAAAA,EAAI,KAAA,EAAO,KAAK,KAAA,EAAO,KAAA,EAAO,KAAK,KAAA,EAAM;AAAA,MACzD;AAAA,MACA,KAAK,SAAA,EAAW;AACd,QAAA,MAAMA,GAAAA,GAAK,MAAA,CAAO,MAAA,CAAO,EAAA,IAAM,EAAE,CAAA;AACjC,QAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,GAAA,CAAIA,GAAE,CAAA;AAC9B,QAAA,IAAI,CAAC,OAAA,EAAS;AACZ,UAAA,OAAO,IAAA;AAAA,QACT;AACA,QAAA,MAAM,IAAA,GAAqB;AAAA,UACzB,GAAG,OAAA;AAAA,UACH,OAAO,MAAA,CAAO,KAAA;AAAA,UACd,SAAA,EAAW,KAAK,GAAA;AAAI,SACtB;AACA,QAAA,OAAA,CAAQ,GAAA,CAAIA,KAAI,IAAI,CAAA;AACpB,QAAA,OAAO,EAAE,KAAKA,GAAAA,EAAI,KAAA,EAAO,KAAK,KAAA,EAAO,KAAA,EAAO,KAAK,KAAA,EAAM;AAAA,MACzD;AAAA,MACA,KAAK,QAAA,EAAU;AACb,QAAA,MAAMA,GAAAA,GAAK,MAAA,CAAO,MAAA,CAAO,EAAA,IAAM,EAAE,CAAA;AACjC,QAAA,OAAO,OAAA,CAAQ,OAAOA,GAAE,CAAA;AAAA,MAC1B;AAAA,MACA;AACE,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,eAAA,EAAkB,EAAE,CAAA,CAAE,CAAA;AAAA;AAC1C,EACF;AAEA,EAAA,MAAMO,GAAAA,GAAK,SAAS,CAAC,EAAA,EAAI,WAAW,MAAA,CAAO,EAAA,EAAI,MAAM,CAAC,CAAA;AAEtD,EAAA,MAAMC,OAAAA,GAAS;AAAA,IACb,MAAM,IAAA,CAAkB,MAAA,EAAgB,MAAA,EAA6B;AACnE,MAAA,IAAI,cAAA,CAAe,MAAM,CAAA,EAAG;AAC1B,QAAA,OAAQ,MAAM,cAAA,CAAe,MAAM,CAAA,CAAE,MAAM,CAAA;AAAA,MAC7C;AAEA,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA;AAC/B,MAAA,IAAI,OAAO,MAAA,GAAS,CAAA,IAAK,MAAA,CAAO,CAAC,MAAM,QAAA,EAAU;AAC/C,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,MAAM,CAAA,CAAE,CAAA;AAAA,MACjD;AACA,MAAA,MAAM,SAAA,GAAY,OAAO,CAAC,CAAA;AAC1B,MAAA,MAAM,KAAK,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA,CAAE,KAAK,GAAG,CAAA;AACnC,MAAA,MAAM,OAAA,GAAW,UAAsC,EAAC;AAExD,MAAA,IAAI,cAAc,IAAA,EAAM;AACtB,QAAA,MAAM,GAAA,GAAM,MAAA,CAAO,OAAA,CAAQ,GAAA,IAAO,EAAE,CAAA;AACpC,QAAA,MAAM,UAAA,GAAa,UAAU,GAAG,CAAA;AAChC,QAAA,IAAI,OAAO,KAAA,EAAO;AAChB,UAAA,OAAQ,OAAA,CAAQ,GAAA,CAAI,UAAU,CAAA,IAAK,IAAA;AAAA,QACrC;AACA,QAAA,IAAI,OAAO,KAAA,EAAO;AAChB,UAAA,OAAA,CAAQ,GAAA,CAAI,UAAA,EAAY,OAAA,CAAQ,KAAK,CAAA;AACrC,UAAA,OAAO,MAAA;AAAA,QACT;AACA,QAAA,IAAI,OAAO,KAAA,EAAO;AAChB,UAAA,OAAO,OAAA,CAAQ,OAAO,UAAU,CAAA;AAAA,QAClC;AACA,QAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,UAAA,MAAM,IAAA,GAAO,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,IAAI,CAAA,GAAI,OAAA,CAAQ,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,MAAA,CAAO,CAAC,CAAC,IAAI,EAAC;AACjF,UAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,OAAA,CAAQ,IAAI,SAAA,CAAU,CAAC,CAAC,CAAA,IAAK,IAAI,CAAA;AAAA,QAC1D;AAAA,MACF;AAEA,MAAA,IAAI,cAAc,IAAA,EAAM;AACtB,QAAA,OAAO,MAAA,CAAO,IAAI,OAAO,CAAA;AAAA,MAC3B;AAEA,MAAA,IAAI,cAAc,MAAA,EAAQ;AACxB,QAAA,IAAI,OAAO,SAAA,EAAW;AACpB,UAAA,MAAMR,GAAAA,GAAKK,UAAS,KAAK,CAAA;AACzB,UAAA,MAAM,MAAA,GAAuB;AAAA,YAC3B,EAAA,EAAAL,GAAAA;AAAA,YACA,IAAA,EAAM,SAAA;AAAA,YACN,IAAA,EAAM,EAAA;AAAA,YACN,MAAA,EAAQ,MAAA,CAAO,OAAA,CAAQ,MAAA,IAAU,EAAE,CAAA;AAAA,YACnC,MAAA,EAAQ,OAAA,CAAQ,MAAA,IAAU,EAAC;AAAA,YAC3B,MAAA,EAAQ,QAAA;AAAA,YACR,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,YAClC,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,WACpC;AACA,UAAA,SAAA,CAAU,GAAA,CAAIA,KAAI,MAAM,CAAA;AACxB,UAAA,OAAO,MAAA;AAAA,QACT;AACA,QAAA,IAAI,OAAO,UAAA,EAAY;AACrB,UAAA,MAAMA,GAAAA,GAAKK,UAAS,KAAK,CAAA;AACzB,UAAA,MAAM,MAAA,GAAuB;AAAA,YAC3B,EAAA,EAAAL,GAAAA;AAAA,YACA,IAAA,EAAM,WAAA;AAAA,YACN,IAAA,EAAM,MAAA,CAAO,OAAA,CAAQ,IAAA,IAAQ,EAAE,CAAA;AAAA,YAC/B,MAAA,EAAQ,MAAA,CAAO,OAAA,CAAQ,MAAA,IAAU,EAAE,CAAA;AAAA,YACnC,MAAA,EAAQ,OAAA,CAAQ,MAAA,IAAU,EAAC;AAAA,YAC3B,MAAA,EAAQ,WAAA;AAAA,YACR,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,YAClC,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,WACpC;AACA,UAAA,SAAA,CAAU,GAAA,CAAIA,KAAI,MAAM,CAAA;AACxB,UAAA,OAAO,MAAA;AAAA,QACT;AACA,QAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,UAAA,OAAO,CAAC,GAAG,SAAA,CAAU,MAAA,EAAQ,CAAA;AAAA,QAC/B;AACA,QAAA,IAAI,OAAO,QAAA,EAAU;AACnB,UAAA,MAAMA,GAAAA,GAAK,MAAA,CAAO,OAAA,CAAQ,EAAA,IAAM,EAAE,CAAA;AAClC,UAAA,OAAO,EAAE,EAAA,EAAI,SAAA,CAAU,MAAA,CAAOA,GAAE,CAAA,EAAE;AAAA,QACpC;AAAA,MACF;AAEA,MAAA,IAAI,SAAA,KAAc,SAAA,IAAa,EAAA,KAAO,KAAA,EAAO;AAC3C,QAAA,MAAM,IAAA,GAAO,MAAA,CAAO,OAAA,CAAQ,IAAA,IAAQ,EAAE,CAAA;AACtC,QAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,GAAA,CAAI,IAAI,CAAA;AAClC,QAAA,IAAI,UAAU,MAAA,EAAW;AACvB,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAqB,IAAI,CAAA,CAAE,CAAA;AAAA,QAC7C;AACA,QAAA,OAAO,EAAE,KAAA,EAAM;AAAA,MACjB;AAEA,MAAA,IAAI,cAAc,OAAA,EAAS;AACzB,QAAA,IAAI,OAAO,OAAA,EAAS;AAClB,UAAA,MAAMA,GAAAA,GAAKK,UAAS,MAAM,CAAA;AAC1B,UAAA,MAAM,IAAA,GAAO,MAAA,CAAO,OAAA,CAAQ,IAAA,IAAQ,UAAU,CAAA;AAC9C,UAAA,MAAM,UAAA,GAAa,kBAAA,CAAmB,OAAA,CAAQ,UAAU,CAAA;AACxD,UAAA,MAAM,WAAA,GAAc,MAAA,CAAO,OAAA,CAAQ,WAAA,IAAe,EAAE,CAAA;AACpD,UAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,UAAA,EAAY,QAAQ,CAAA,CAAE,UAAA;AAC/C,UAAA,MAAM,MAAA,GAAyB;AAAA,YAC7B,EAAA,EAAAL,GAAAA;AAAA,YACA,IAAA;AAAA,YACA,WAAA;AAAA,YACA,IAAA;AAAA,YACA,IAAA,EAAM,SAAS,WAAA,CAAY,QAAQ,IAAI,QAAQ,CAAA,CAAA,EAAIA,GAAE,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AAAA,YAC7D,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,YAClC;AAAA,WACF;AACA,UAAA,UAAA,CAAW,GAAA,CAAIA,KAAI,MAAM,CAAA;AACzB,UAAA,OAAO,MAAA;AAAA,QACT;AACA,QAAA,IAAI,OAAO,KAAA,EAAO;AAChB,UAAA,MAAMA,GAAAA,GAAK,MAAA,CAAO,OAAA,CAAQ,EAAA,IAAM,EAAE,CAAA;AAClC,UAAA,MAAM,MAAA,GAAS,UAAA,CAAW,GAAA,CAAIA,GAAE,CAAA;AAChC,UAAA,IAAI,CAAC,MAAA,EAAQ;AACX,YAAA,OAAO,IAAA;AAAA,UACT;AACA,UAAA,MAAM,EAAE,UAAA,EAAY,CAAA,EAAG,GAAG,MAAK,GAAI,MAAA;AACnC,UAAA,OAAO,IAAA;AAAA,QACT;AACA,QAAA,IAAI,OAAO,QAAA,EAAU;AACnB,UAAA,MAAMA,GAAAA,GAAK,MAAA,CAAO,OAAA,CAAQ,EAAA,IAAM,EAAE,CAAA;AAClC,UAAA,OAAO,UAAA,CAAW,OAAOA,GAAE,CAAA;AAAA,QAC7B;AAAA,MACF;AAEA,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,MAAM,CAAA,CAAE,CAAA;AAAA,IACjD;AAAA,GACF;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM;AAAA,MACJ,MAAM,WAAA,GAAoC;AACxC,QAAA,OAAO,WAAA;AAAA,MACT;AAAA,KACF;AAAA,IACA,MAAA,EAAAQ,OAAAA;AAAA,IACA,EAAA,EAAI;AAAA,MACF,MAAM,IAAiB,GAAA,EAAgC;AACrD,QAAA,OAAQ,OAAA,CAAQ,GAAA,CAAI,SAAA,CAAU,GAAG,CAAC,CAAA,IAAK,IAAA;AAAA,MACzC,CAAA;AAAA,MACA,MAAM,GAAA,CAAI,GAAA,EAAa,KAAA,EAAgB,UAAA,EAAoC;AACzE,QAAA,IAAI,CAAC,OAAO,KAAA,CAAM,QAAA,CAAS,UAAU,CAAC,CAAA,IAAM,cAAyB,CAAA,EAAG;AACtE,UAAA,OAAA,CAAQ,MAAA,CAAO,SAAA,CAAU,GAAG,CAAC,CAAA;AAC7B,UAAA;AAAA,QACF;AAEA,QAAA,OAAA,CAAQ,GAAA,CAAI,SAAA,CAAU,GAAG,CAAA,EAAG,KAAK,CAAA;AAAA,MACnC,CAAA;AAAA,MACA,MAAM,IAAI,GAAA,EAA+B;AACvC,QAAA,OAAO,OAAA,CAAQ,MAAA,CAAO,SAAA,CAAU,GAAG,CAAC,CAAA;AAAA,MACtC,CAAA;AAAA,MACA,MAAM,KAAkB,IAAA,EAA0C;AAChE,QAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAS,OAAA,CAAQ,IAAI,SAAA,CAAU,GAAG,CAAC,CAAA,IAAK,IAAiB,CAAA;AAAA,MAC5E;AAAA,KACF;AAAA,IACA,EAAA,EAAAD,GAAAA;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,OAAA,CAAQ,QAAgB,MAAA,EAAyC;AAC/D,QAAA,OAAOC,OAAAA,CAAO,IAAA,CAAK,CAAA,EAAG,QAAQ,CAAA,aAAA,CAAA,EAAiB,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAA,IAAU,EAAC,EAAG,CAAA;AAAA,MACjF,CAAA;AAAA,MACA,QAAA,CAAS,IAAA,EAAc,MAAA,EAAgB,MAAA,EAAyC;AAC9E,QAAA,OAAOA,OAAAA,CAAO,IAAA,CAAK,CAAA,EAAG,QAAQ,CAAA,cAAA,CAAA,EAAkB,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAQ,MAAA,IAAU,EAAC,EAAG,CAAA;AAAA,MACxF,CAAA;AAAA,MACA,IAAA,GAAgC;AAC9B,QAAA,OAAOA,QAAO,IAAA,CAAK,CAAA,EAAG,QAAQ,CAAA,UAAA,CAAA,EAAc,EAAE,CAAA;AAAA,MAChD,CAAA;AAAA,MACA,OAAOR,GAAAA,EAAsC;AAC3C,QAAA,OAAOQ,OAAAA,CAAO,KAAK,CAAA,EAAG,QAAQ,gBAAgB,EAAE,EAAA,EAAAR,KAAI,CAAA;AAAA,MACtD;AAAA,KACF;AAAA,IACA,OAAA,EAAS;AAAA,MACP,MAAM,IAAI,IAAA,EAA+B;AACvC,QAAA,MAAM,MAAA,GAAS,MAAMQ,OAAAA,CAAO,IAAA,CAAwB,GAAG,QAAQ,CAAA,YAAA,CAAA,EAAgB,EAAE,IAAA,EAAM,CAAA;AACvF,QAAA,OAAO,MAAA,CAAO,KAAA;AAAA,MAChB;AAAA,KACF;AAAA,IACA,KAAA,EAAO;AAAA,MACL,MAAM,MAAM,KAAA,EAA2G;AACrH,QAAA,MAAM,UAAA,GAAa,MAAMF,SAAAA,CAAS,KAAA,CAAM,IAAI,CAAA;AAC5C,QAAA,OAAOE,OAAAA,CAAO,IAAA,CAAiB,CAAA,EAAG,QAAQ,CAAA,YAAA,CAAA,EAAgB;AAAA,UACxD,MAAM,KAAA,CAAM,IAAA;AAAA,UACZ,WAAA,EAAa,MAAM,WAAA,IAAe,EAAA;AAAA,UAClC;AAAA,SACD,CAAA;AAAA,MACH,CAAA;AAAA,MACA,IAAIR,GAAAA,EAAwC;AAC1C,QAAA,OAAOQ,OAAAA,CAAO,KAAK,CAAA,EAAG,QAAQ,cAAc,EAAE,EAAA,EAAAR,KAAI,CAAA;AAAA,MACpD,CAAA;AAAA,MACA,OAAOA,GAAAA,EAA8B;AACnC,QAAA,OAAOQ,OAAAA,CAAO,KAAK,CAAA,EAAG,QAAQ,iBAAiB,EAAE,EAAA,EAAAR,KAAI,CAAA;AAAA,MACvD;AAAA,KACF;AAAA,IACA,eAAe,QAAA,EAAgC;AAC7C,MAAA,WAAA,GAAc,cAAc,QAAQ,CAAA;AAAA,IACtC;AAAA,GACF;AACF","file":"index.cjs","sourcesContent":["import { AsyncLocalStorage } from 'node:async_hooks';\n\ntype RequestContext = {\n request: Request\n}\n\nconst requestContextStore = new AsyncLocalStorage<RequestContext>();\n\nexport function withRequestContext<T>(request: Request, fn: () => T): T {\n return requestContextStore.run({ request }, fn);\n}\n\nexport function currentRequest(): Request {\n const ctx = requestContextStore.getStore();\n if (!ctx?.request) {\n throw new Error('No active applet request context. Use defineApplet({ fetch }) to establish request context.');\n }\n return ctx.request;\n}\n\nexport function currentRequestOptional(): Request | undefined {\n return requestContextStore.getStore()?.request;\n}\n","import { currentRequestOptional } from './context';\n\ntype EngineCallOptions = {\n timeoutMs?: number\n}\n\ntype JsonRpcRequest = {\n id: string\n method: string\n params: unknown\n}\n\ntype JsonRpcResponse = {\n id?: string\n result?: unknown\n error?: {\n code: string | number\n message: string\n details?: unknown\n }\n}\n\nconst defaultEnginePath = '/rpc';\n\nfunction readEnv(name: string): string {\n const value = process.env[name];\n if (!value || value.trim() === '') {\n throw new Error(`${name} is required`);\n }\n return value;\n}\n\nfunction buildEngineURL(pathname: string): string {\n const socketPath = readEnv('IOTA_ENGINE_SOCKET');\n const path = pathname.startsWith('/') ? pathname : `/${pathname}`;\n // Bun's fetch supports unix socket via the `unix` init option; URL host is ignored in that case.\n // We still keep a regular URL shape for portability in tests/mocks.\n return `http://localhost${path}?socket=${encodeURIComponent(socketPath)}`;\n}\n\nfunction randomID(): string {\n const g = globalThis as unknown as { crypto?: { randomUUID?: () => string } };\n if (g.crypto?.randomUUID) {\n return g.crypto.randomUUID();\n }\n return `${Date.now()}-${Math.random().toString(16).slice(2)}`;\n}\n\nasync function postJSON(pathname: string, body: unknown, timeoutMs?: number): Promise<JsonRpcResponse> {\n const socketPath = readEnv('IOTA_ENGINE_SOCKET');\n const request = currentRequestOptional();\n const forwardedHeaders: Record<string, string> = {\n 'content-type': 'application/json',\n };\n if (request) {\n const maybeForwardHeader = (headerName: string) => {\n const value = request.headers.get(headerName);\n if (value && value.trim() !== '') {\n forwardedHeaders[headerName] = value;\n }\n };\n maybeForwardHeader('x-iota-tenant-id');\n maybeForwardHeader('x-iota-user-id');\n maybeForwardHeader('x-iota-permissions');\n maybeForwardHeader('x-iota-request-id');\n maybeForwardHeader('cookie');\n maybeForwardHeader('authorization');\n }\n\n const abortController = typeof timeoutMs === 'number' && timeoutMs > 0 ? new AbortController() : undefined;\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n if (abortController && timeoutMs) {\n timer = setTimeout(() => abortController.abort(), timeoutMs);\n }\n\n const init: RequestInit & { unix?: string } = {\n method: 'POST',\n headers: forwardedHeaders,\n body: JSON.stringify(body),\n signal: abortController?.signal,\n unix: socketPath,\n };\n const response = await fetch(buildEngineURL(pathname), init);\n if (!response.ok) {\n throw new Error(`engine RPC HTTP ${response.status}`);\n }\n return (await response.json()) as JsonRpcResponse;\n } finally {\n if (timer) {\n clearTimeout(timer);\n }\n }\n}\n\nexport const engine = {\n async call<TResult = unknown>(method: string, params: unknown, options?: EngineCallOptions): Promise<TResult> {\n const request: JsonRpcRequest = {\n id: randomID(),\n method,\n params,\n };\n const response = await postJSON(defaultEnginePath, request, options?.timeoutMs);\n if (response.error) {\n throw new Error(`${response.error.code}: ${response.error.message}`);\n }\n return response.result as TResult;\n },\n};\n","import { engine } from './engine';\n\ntype ConnectionHandler = (connectionId: string) => void | Promise<void>\ntype MessageHandler = (connectionId: string, data: Uint8Array) => void | Promise<void>\ntype CloseHandler = (connectionId: string) => void | Promise<void>\n\ntype BridgeEventPayload = {\n connectionId: string\n event: 'open' | 'message' | 'close'\n dataBase64?: string\n}\n\nconst connectionHandlers = new Set<ConnectionHandler>();\nconst messageHandlers = new Set<MessageHandler>();\nconst closeHandlers = new Set<CloseHandler>();\n\nfunction appletMethod(op: string): string {\n const appletID = process.env.IOTA_APPLET_ID;\n if (!appletID || appletID.trim() === '') {\n throw new Error('IOTA_APPLET_ID is required');\n }\n return `${appletID}.ws.${op}`;\n}\n\nasync function runHandlers<T>(handlers: Set<(value: T) => void | Promise<void>>, value: T): Promise<void> {\n for (const handler of handlers) {\n await handler(value);\n }\n}\n\nasync function runMessageHandlers(connectionId: string, data: Uint8Array): Promise<void> {\n for (const handler of messageHandlers) {\n await handler(connectionId, data);\n }\n}\n\nexport async function dispatchBridgeEvent(payload: BridgeEventPayload): Promise<void> {\n if (payload.event === 'open') {\n await runHandlers(connectionHandlers, payload.connectionId);\n return;\n }\n if (payload.event === 'close') {\n await runHandlers(closeHandlers, payload.connectionId);\n return;\n }\n if (payload.event === 'message') {\n const decoded = Buffer.from(payload.dataBase64 ?? '', 'base64');\n await runMessageHandlers(payload.connectionId, new Uint8Array(decoded));\n }\n}\n\nexport const ws = {\n async send(connectionId: string, data: unknown): Promise<{ ok: boolean }> {\n return engine.call<{ ok: boolean }>(appletMethod('send'), { connectionId, data });\n },\n onConnection(handler: ConnectionHandler): () => void {\n connectionHandlers.add(handler);\n return () => connectionHandlers.delete(handler);\n },\n onMessage(handler: MessageHandler): () => void {\n messageHandlers.add(handler);\n return () => messageHandlers.delete(handler);\n },\n onClose(handler: CloseHandler): () => void {\n closeHandlers.add(handler);\n return () => closeHandlers.delete(handler);\n },\n};\n\n","import { withRequestContext } from './context';\nimport { dispatchBridgeEvent } from './ws';\n\nexport type AppletDefinition = {\n fetch: (request: Request) => Response | Promise<Response>\n}\n\ntype BunServeLike = {\n stop: (closeActiveConnections?: boolean) => void\n}\n\ntype BunGlobal = {\n serve: (options: {\n unix: string\n fetch: (request: Request) => Response | Promise<Response>\n }) => BunServeLike\n}\n\nfunction requireUnixSocketPath(): string {\n const path = process.env.IOTA_APPLET_SOCKET;\n if (!path || path.trim() === '') {\n throw new Error('IOTA_APPLET_SOCKET is required');\n }\n return path;\n}\n\nexport function defineApplet(definition: AppletDefinition): BunServeLike {\n const socketPath = requireUnixSocketPath();\n const bun = (globalThis as unknown as { Bun?: BunGlobal }).Bun;\n if (!bun || typeof bun.serve !== 'function') {\n throw new Error('defineApplet requires Bun runtime');\n }\n return bun.serve({\n unix: socketPath,\n fetch: (request) =>\n withRequestContext(request, async () => {\n const url = new URL(request.url);\n if (request.method === 'POST' && url.pathname === '/__ws') {\n let payload: {\n connectionId: string\n event: 'open' | 'message' | 'close'\n dataBase64?: string\n };\n try {\n payload = (await request.json()) as {\n connectionId: string\n event: 'open' | 'message' | 'close'\n dataBase64?: string\n };\n } catch {\n return new Response(JSON.stringify({ error: 'invalid_json' }), {\n status: 400,\n headers: { 'content-type': 'application/json; charset=utf-8' },\n });\n }\n if (!payload?.connectionId || !payload?.event) {\n return new Response(JSON.stringify({ error: 'invalid_payload' }), {\n status: 400,\n headers: { 'content-type': 'application/json; charset=utf-8' },\n });\n }\n if (!['open', 'message', 'close'].includes(payload.event)) {\n return new Response(JSON.stringify({ error: 'invalid_payload' }), {\n status: 400,\n headers: { 'content-type': 'application/json; charset=utf-8' },\n });\n }\n await dispatchBridgeEvent(payload);\n return new Response(JSON.stringify({ ok: true }), {\n status: 202,\n headers: { 'content-type': 'application/json; charset=utf-8' },\n });\n }\n return definition.fetch(request);\n }),\n });\n}\n","import { currentRequest } from './context';\n\nexport type CurrentUser = {\n id: string\n tenantId: string\n permissions: string[]\n requestId?: string\n}\n\nfunction requiredHeader(headers: Headers, name: string): string {\n const value = headers.get(name);\n if (!value || value.trim() === '') {\n throw new Error(`${name} header is required`);\n }\n return value;\n}\n\nexport const auth = {\n async currentUser(): Promise<CurrentUser> {\n const request = currentRequest();\n const headers = request.headers;\n const id = requiredHeader(headers, 'x-iota-user-id');\n const tenantId = requiredHeader(headers, 'x-iota-tenant-id');\n const permissionsHeader = headers.get('x-iota-permissions') ?? '';\n const requestID = headers.get('x-iota-request-id') ?? undefined;\n const permissions = permissionsHeader\n .split(',')\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n\n return {\n id,\n tenantId,\n permissions,\n requestId: requestID,\n };\n },\n};\n\n","import { engine } from './engine';\n\nfunction appletMethod(op: string): string {\n const appletID = process.env.IOTA_APPLET_ID;\n if (!appletID || appletID.trim() === '') {\n throw new Error('IOTA_APPLET_ID is required');\n }\n return `${appletID}.kv.${op}`;\n}\n\nexport const kv = {\n get<T = unknown>(key: string): Promise<T | null> {\n return engine.call<T | null>(appletMethod('get'), { key });\n },\n set(key: string, value: unknown, ttlSeconds?: number): Promise<void> {\n return engine.call<void>(appletMethod('set'), { key, value, ttlSeconds });\n },\n del(key: string): Promise<boolean> {\n return engine.call<boolean>(appletMethod('del'), { key });\n },\n mget<T = unknown>(keys: string[]): Promise<Array<T | null>> {\n return engine.call<Array<T | null>>(appletMethod('mget'), { keys });\n },\n};\n\n","import { engine } from './engine';\n\nexport type DBConstraint = {\n field: string\n op: 'eq'\n value: unknown\n}\n\nexport type DBIndexConstraint = DBConstraint & {\n name: string\n}\n\nexport type DBQueryOptions = {\n index?: DBIndexConstraint\n filters?: DBConstraint[]\n order?: 'asc' | 'desc'\n take?: number\n}\n\nexport type DBQueryIndex = {\n eq(field: string, value: unknown): DBQueryIndex\n}\n\nexport type DBQueryFilter = {\n eq(field: string, value: unknown): DBQueryFilter\n}\n\nexport type DBQueryBuilder<T> = {\n withIndex(name: string, build: (q: DBQueryIndex) => DBQueryIndex | void): DBQueryBuilder<T>\n filter(build: (q: DBQueryFilter) => DBQueryFilter | void): DBQueryBuilder<T>\n order(direction: 'asc' | 'desc'): DBQueryBuilder<T>\n take(limit: number): DBQueryBuilder<T>\n collect(): Promise<T[]>\n first(): Promise<T | null>\n}\n\ntype DBCaller = <T>(op: string, params: Record<string, unknown>) => Promise<T>\n\nexport type DBClient = {\n get<T = unknown>(id: string): Promise<T | null>\n query<T = unknown>(table: string): DBQueryBuilder<T>\n queryRaw<T = unknown>(table: string, query?: DBQueryOptions): Promise<T[]>\n insert<T = unknown>(table: string, value: unknown): Promise<T>\n patch<T = unknown>(id: string, value: unknown): Promise<T>\n replace<T = unknown>(id: string, value: unknown): Promise<T>\n delete(id: string): Promise<boolean>\n}\n\nexport function createDB(caller: DBCaller): DBClient {\n class QueryIndexBuilder implements DBQueryIndex {\n private constraint?: DBConstraint;\n\n eq(field: string, value: unknown): QueryIndexBuilder {\n this.constraint = { field, op: 'eq', value };\n return this;\n }\n\n build(name: string): DBIndexConstraint | undefined {\n if (!this.constraint) {\n return undefined;\n }\n return { name, ...this.constraint };\n }\n }\n\n class QueryFilterBuilder implements DBQueryFilter {\n private constraints: DBConstraint[] = [];\n\n eq(field: string, value: unknown): QueryFilterBuilder {\n this.constraints.push({ field, op: 'eq', value });\n return this;\n }\n\n build(): DBConstraint[] {\n return this.constraints;\n }\n }\n\n class RuntimeQueryBuilder<T> implements DBQueryBuilder<T> {\n constructor(\n private readonly table: string,\n private readonly options: DBQueryOptions = {},\n ) {}\n\n withIndex(name: string, build: (q: DBQueryIndex) => DBQueryIndex | void): RuntimeQueryBuilder<T> {\n const index = new QueryIndexBuilder();\n build(index);\n return new RuntimeQueryBuilder<T>(this.table, {\n ...this.options,\n index: index.build(name),\n });\n }\n\n filter(build: (q: DBQueryFilter) => DBQueryFilter | void): RuntimeQueryBuilder<T> {\n const filter = new QueryFilterBuilder();\n build(filter);\n return new RuntimeQueryBuilder<T>(this.table, {\n ...this.options,\n filters: [...(this.options.filters ?? []), ...filter.build()],\n });\n }\n\n order(direction: 'asc' | 'desc'): RuntimeQueryBuilder<T> {\n return new RuntimeQueryBuilder<T>(this.table, {\n ...this.options,\n order: direction,\n });\n }\n\n take(limit: number): RuntimeQueryBuilder<T> {\n return new RuntimeQueryBuilder<T>(this.table, {\n ...this.options,\n take: limit,\n });\n }\n\n collect(): Promise<T[]> {\n return caller<T[]>('query', { table: this.table, query: this.options });\n }\n\n async first(): Promise<T | null> {\n const rows = await this.take(1).collect();\n return rows[0] ?? null;\n }\n }\n\n const client: DBClient = {\n get<T = unknown>(id: string): Promise<T | null> {\n return caller<T | null>('get', { id });\n },\n query<T = unknown>(table: string): RuntimeQueryBuilder<T> {\n return new RuntimeQueryBuilder<T>(table);\n },\n queryRaw<T = unknown>(table: string, query?: DBQueryOptions): Promise<T[]> {\n return caller<T[]>('query', { table, query: query ?? {} });\n },\n insert<T = unknown>(table: string, value: unknown): Promise<T> {\n return caller<T>('insert', { table, value });\n },\n patch<T = unknown>(id: string, value: unknown): Promise<T> {\n return caller<T>('patch', { id, value });\n },\n replace<T = unknown>(id: string, value: unknown): Promise<T> {\n return caller<T>('replace', { id, value });\n },\n delete(id: string): Promise<boolean> {\n return caller<boolean>('delete', { id });\n },\n };\n return client;\n}\n\nexport const db = createDB((op, params) => engine.call(appletMethod(op), params));\n\nfunction appletMethod(op: string): string {\n const appletID = process.env.IOTA_APPLET_ID;\n if (!appletID || appletID.trim() === '') {\n throw new Error('IOTA_APPLET_ID is required');\n }\n return `${appletID}.db.${op}`;\n}\n","import { engine } from './engine';\n\nexport type ScheduledJob = {\n id: string\n type: string\n cron: string\n method: string\n params: unknown\n status: string\n nextRunAt?: string\n lastRunAt?: string\n lastStatus?: string\n lastError?: string\n createdAt?: string\n updatedAt?: string\n}\n\nfunction appletMethod(op: string): string {\n const appletID = process.env.IOTA_APPLET_ID;\n if (!appletID || appletID.trim() === '') {\n throw new Error('IOTA_APPLET_ID is required');\n }\n return `${appletID}.jobs.${op}`;\n}\n\nexport const jobs = {\n enqueue(method: string, params?: unknown): Promise<ScheduledJob> {\n return engine.call<ScheduledJob>(appletMethod('enqueue'), { method, params: params ?? {} });\n },\n schedule(cron: string, method: string, params?: unknown): Promise<ScheduledJob> {\n return engine.call<ScheduledJob>(appletMethod('schedule'), { cron, method, params: params ?? {} });\n },\n list(): Promise<ScheduledJob[]> {\n return engine.call<ScheduledJob[]>(appletMethod('list'), {});\n },\n cancel(id: string): Promise<{ ok: boolean }> {\n return engine.call<{ ok: boolean }>(appletMethod('cancel'), { id });\n },\n};\n","import { engine } from './engine';\n\nfunction appletMethod(op: string): string {\n const appletID = process.env.IOTA_APPLET_ID;\n if (!appletID || appletID.trim() === '') {\n throw new Error('IOTA_APPLET_ID is required');\n }\n return `${appletID}.secrets.${op}`;\n}\n\nexport const secrets = {\n async get(name: string): Promise<string> {\n const response = await engine.call<{ value: string }>(appletMethod('get'), { name });\n return response.value;\n },\n};\n","import { currentRequestOptional } from './context';\nimport { engine } from './engine';\n\nexport type StoredFile = {\n id: string\n name: string\n contentType?: string\n size: number\n path: string\n createdAt: string\n}\n\nfunction readEnv(name: string): string {\n const value = process.env[name];\n if (!value || value.trim() === '') {\n throw new Error(`${name} is required`);\n }\n return value;\n}\n\nfunction appletMethod(op: string): string {\n const appletID = process.env.IOTA_APPLET_ID;\n if (!appletID || appletID.trim() === '') {\n throw new Error('IOTA_APPLET_ID is required');\n }\n return `${appletID}.files.${op}`;\n}\n\nfunction buildEngineURL(pathname: string, socketPath: string): string {\n const path = pathname.startsWith('/') ? pathname : `/${pathname}`;\n return `http://localhost${path}?socket=${encodeURIComponent(socketPath)}`;\n}\n\nfunction forwardedHeaders(): Record<string, string> {\n const request = currentRequestOptional();\n const headers: Record<string, string> = {};\n if (!request) {\n return headers;\n }\n const maybeForwardHeader = (headerName: string) => {\n const value = request.headers.get(headerName);\n if (value && value.trim() !== '') {\n headers[headerName] = value;\n }\n };\n maybeForwardHeader('x-iota-tenant-id');\n maybeForwardHeader('x-iota-user-id');\n maybeForwardHeader('x-iota-request-id');\n return headers;\n}\n\nasync function toBytes(data: Blob | ArrayBuffer | Uint8Array): Promise<Uint8Array> {\n if (data instanceof Blob) {\n const buffer = await data.arrayBuffer();\n return new Uint8Array(buffer);\n }\n if (data instanceof ArrayBuffer) {\n return new Uint8Array(data);\n }\n return data;\n}\n\nasync function toBase64(data: Blob | ArrayBuffer | Uint8Array): Promise<string> {\n const bytes = await toBytes(data);\n return Buffer.from(bytes).toString('base64');\n}\n\nasync function requestFilesEndpoint<T>(\n path: string,\n options: RequestInit & { unix?: string; appletId: string },\n): Promise<T> {\n const socketPath = readEnv('IOTA_ENGINE_SOCKET');\n const headers = new Headers(options.headers);\n headers.set('X-Iota-Applet-Id', options.appletId);\n for (const [name, value] of Object.entries(forwardedHeaders())) {\n headers.set(name, value);\n }\n const response = await fetch(buildEngineURL(path, socketPath), {\n ...options,\n headers,\n unix: socketPath,\n } as any);\n if (!response.ok) {\n throw new Error(`files endpoint HTTP ${response.status}`);\n }\n return (await response.json()) as T;\n}\n\nexport const files = {\n async store(input: {\n name: string\n contentType?: string\n data: Blob | ArrayBuffer | Uint8Array\n }): Promise<StoredFile> {\n const appletID = readEnv('IOTA_APPLET_ID');\n try {\n const bytes = await toBytes(input.data);\n const exactBuffer =\n bytes.buffer instanceof ArrayBuffer\n ? bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength)\n : Uint8Array.from(bytes).buffer;\n return await requestFilesEndpoint<StoredFile>('/files/store', {\n appletId: appletID,\n method: 'POST',\n headers: {\n 'X-Iota-File-Name': input.name,\n 'X-Iota-Content-Type': input.contentType ?? '',\n 'Content-Type': input.contentType ?? 'application/octet-stream',\n },\n body: new Blob([exactBuffer], { type: input.contentType ?? 'application/octet-stream' }),\n });\n } catch (error) {\n if (error instanceof TypeError || error instanceof ReferenceError) {\n throw error;\n }\n const dataBase64 = await toBase64(input.data);\n return engine.call<StoredFile>(appletMethod('store'), {\n name: input.name,\n contentType: input.contentType ?? '',\n dataBase64,\n });\n }\n },\n async get(id: string): Promise<StoredFile | null> {\n const appletID = readEnv('IOTA_APPLET_ID');\n try {\n return await requestFilesEndpoint<StoredFile | null>(`/files/get?id=${encodeURIComponent(id)}&applet=${encodeURIComponent(appletID)}`, {\n appletId: appletID,\n method: 'GET',\n });\n } catch (error) {\n if (error instanceof TypeError || error instanceof ReferenceError) {\n throw error;\n }\n return engine.call<StoredFile | null>(appletMethod('get'), { id });\n }\n },\n async delete(id: string): Promise<boolean> {\n const appletID = readEnv('IOTA_APPLET_ID');\n try {\n const result = await requestFilesEndpoint<{ ok: boolean }>(`/files/delete?id=${encodeURIComponent(id)}&applet=${encodeURIComponent(appletID)}`, {\n appletId: appletID,\n method: 'DELETE',\n });\n return result.ok;\n } catch (error) {\n if (error instanceof TypeError || error instanceof ReferenceError) {\n throw error;\n }\n return engine.call<boolean>(appletMethod('delete'), { id });\n }\n },\n};\n","import { z, type ZodRawShape, type ZodString } from 'zod';\n\nexport type TableIndex = {\n name: string\n fields: string[]\n}\n\nexport type TableDefinition<T extends ZodRawShape> = {\n schema: z.ZodObject<T>\n indexes: TableIndex[]\n index(name: string, fields: string[]): TableDefinition<T>\n}\n\nexport type SchemaDefinition<Tables extends Record<string, TableDefinition<any>>> = {\n tables: Tables\n}\n\nclass RuntimeTableDefinition<T extends ZodRawShape> implements TableDefinition<T> {\n public readonly schema: z.ZodObject<T>;\n public readonly indexes: TableIndex[];\n\n constructor(schema: z.ZodObject<T>, indexes: TableIndex[] = []) {\n this.schema = schema;\n this.indexes = indexes;\n }\n\n index(name: string, fields: string[]): RuntimeTableDefinition<T> {\n return new RuntimeTableDefinition(this.schema, [\n ...this.indexes,\n {\n name,\n fields: [...fields],\n },\n ]);\n }\n}\n\nexport function defineTable<T extends ZodRawShape>(shape: T): TableDefinition<T> {\n return new RuntimeTableDefinition(z.object(shape));\n}\n\nexport function defineSchema<Tables extends Record<string, TableDefinition<any>>>(tables: Tables): SchemaDefinition<Tables> {\n return { tables };\n}\n\n// `id(\"users\")` mirrors Convex-style typed id helper while staying Zod-compatible.\nexport function id(_tableName: string): ZodString {\n return z.string().min(1);\n}\n\n","import { type CurrentUser } from './auth';\nimport { createDB, type DBConstraint, type DBQueryOptions } from './db';\nimport { type ScheduledJob } from './jobs';\nimport { type StoredFile } from './files';\n\ntype EngineHandler = (params: unknown) => unknown | Promise<unknown>\n\nexport type TestContextOptions = {\n appletId?: string\n user?: Partial<CurrentUser>\n secrets?: Record<string, string>\n engineHandlers?: Record<string, EngineHandler>\n}\n\ntype TestDocument = {\n id: string\n table: string\n value: unknown\n createdAt: number\n updatedAt: number\n}\n\ntype TestFileRecord = StoredFile & {\n dataBase64: string\n}\n\nconst defaultUser: CurrentUser = {\n id: 'test-user',\n tenantId: 'test-tenant',\n permissions: [],\n};\n\nfunction normalizeUser(user?: Partial<CurrentUser>): CurrentUser {\n return {\n ...defaultUser,\n ...(user ?? {}),\n permissions: user?.permissions ? [...user.permissions] : [],\n };\n}\n\nfunction randomID(prefix: string): string {\n return `${prefix}-${Date.now()}-${Math.random().toString(16).slice(2)}`;\n}\n\nfunction toNumber(value: unknown): number {\n if (typeof value === 'number') {\n return value;\n }\n return Number.NaN;\n}\n\nfunction nestedValue(input: unknown, field: string): unknown {\n let current: unknown = input;\n for (const segment of field.split('.')) {\n if (!current || typeof current !== 'object') {\n return undefined;\n }\n current = (current as Record<string, unknown>)[segment];\n }\n return current;\n}\n\nfunction matchesConstraint(value: unknown, constraint: DBConstraint): boolean {\n if (constraint.op !== 'eq') {\n return false;\n }\n return String(nestedValue(value, constraint.field)) === String(constraint.value);\n}\n\nfunction filterDocuments(documents: TestDocument[], options: DBQueryOptions): TestDocument[] {\n let result = [...documents];\n if (options.index) {\n result = result.filter((doc) => matchesConstraint(doc.value, options.index!));\n }\n for (const filter of options.filters ?? []) {\n result = result.filter((doc) => matchesConstraint(doc.value, filter));\n }\n result.sort((a, b) => (options.order === 'asc' ? a.updatedAt - b.updatedAt : b.updatedAt - a.updatedAt));\n if (typeof options.take === 'number' && options.take > 0) {\n result = result.slice(0, options.take);\n }\n return result;\n}\n\nfunction parseBase64Payload(data: unknown): string {\n if (typeof data !== 'string' || data.trim() === '') {\n throw new Error('dataBase64 is required');\n }\n return data;\n}\n\nasync function toBase64(data: Blob | ArrayBuffer | Uint8Array): Promise<string> {\n if (data instanceof Blob) {\n const buffer = await data.arrayBuffer();\n return Buffer.from(buffer).toString('base64');\n }\n if (data instanceof ArrayBuffer) {\n return Buffer.from(data).toString('base64');\n }\n return Buffer.from(data).toString('base64');\n}\n\nexport function createTestContext(options: TestContextOptions = {}) {\n const appletId = options.appletId?.trim() || 'test';\n let currentUser = normalizeUser(options.user);\n const customHandlers = options.engineHandlers ?? {};\n const secretStore = new Map(Object.entries(options.secrets ?? {}));\n const kvStore = new Map<string, unknown>();\n const dbStore = new Map<string, TestDocument>();\n const jobsStore = new Map<string, ScheduledJob>();\n const filesStore = new Map<string, TestFileRecord>();\n\n function scopedKey(key: string): string {\n return `${currentUser.tenantId}::${appletId}::${key}`;\n }\n\n async function dbCall<T>(op: string, params: Record<string, unknown>): Promise<T> {\n switch (op) {\n case 'get': {\n const id = String(params.id ?? '');\n const record = dbStore.get(id);\n return (record ? { _id: record.id, table: record.table, value: record.value } : null) as T;\n }\n case 'query': {\n const table = String(params.table ?? '');\n const query = (params.query as DBQueryOptions | undefined) ?? {};\n const rows = filterDocuments(\n [...dbStore.values()].filter((doc) => doc.table === table),\n query,\n );\n return rows.map((doc) => ({ _id: doc.id, table: doc.table, value: doc.value })) as T;\n }\n case 'insert': {\n const id = randomID('doc');\n const now = Date.now();\n const record: TestDocument = {\n id,\n table: String(params.table ?? ''),\n value: params.value,\n createdAt: now,\n updatedAt: now,\n };\n dbStore.set(id, record);\n return { _id: id, table: record.table, value: record.value } as T;\n }\n case 'patch':\n {\n const id = String(params.id ?? '');\n const current = dbStore.get(id);\n if (!current) {\n return null as T;\n }\n const currentValue = current.value;\n const nextValue = params.value;\n const next: TestDocument = {\n ...current,\n value:\n currentValue && typeof currentValue === 'object' && !Array.isArray(currentValue) &&\n nextValue && typeof nextValue === 'object' && !Array.isArray(nextValue)\n ? { ...(currentValue as Record<string, unknown>), ...(nextValue as Record<string, unknown>) }\n : nextValue,\n updatedAt: Date.now(),\n };\n dbStore.set(id, next);\n return { _id: id, table: next.table, value: next.value } as T;\n }\n case 'replace': {\n const id = String(params.id ?? '');\n const current = dbStore.get(id);\n if (!current) {\n return null as T;\n }\n const next: TestDocument = {\n ...current,\n value: params.value,\n updatedAt: Date.now(),\n };\n dbStore.set(id, next);\n return { _id: id, table: next.table, value: next.value } as T;\n }\n case 'delete': {\n const id = String(params.id ?? '');\n return dbStore.delete(id) as T;\n }\n default:\n throw new Error(`unknown db op: ${op}`);\n }\n }\n\n const db = createDB((op, params) => dbCall(op, params));\n\n const engine = {\n async call<T = unknown>(method: string, params: unknown): Promise<T> {\n if (customHandlers[method]) {\n return (await customHandlers[method](params)) as T;\n }\n\n const chunks = method.split('.');\n if (chunks.length < 3 || chunks[0] !== appletId) {\n throw new Error(`unsupported method: ${method}`);\n }\n const namespace = chunks[1];\n const op = chunks.slice(2).join('.');\n const payload = (params as Record<string, unknown>) ?? {};\n\n if (namespace === 'kv') {\n const key = String(payload.key ?? '');\n const storageKey = scopedKey(key);\n if (op === 'get') {\n return (kvStore.get(storageKey) ?? null) as T;\n }\n if (op === 'set') {\n kvStore.set(storageKey, payload.value);\n return undefined as T;\n }\n if (op === 'del') {\n return kvStore.delete(storageKey) as T;\n }\n if (op === 'mget') {\n const keys = Array.isArray(payload.keys) ? payload.keys.map((v) => String(v)) : [];\n return keys.map((k) => kvStore.get(scopedKey(k)) ?? null) as T;\n }\n }\n\n if (namespace === 'db') {\n return dbCall(op, payload) as Promise<T>;\n }\n\n if (namespace === 'jobs') {\n if (op === 'enqueue') {\n const id = randomID('job');\n const record: ScheduledJob = {\n id,\n type: 'one_off',\n cron: '',\n method: String(payload.method ?? ''),\n params: payload.params ?? {},\n status: 'queued',\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n jobsStore.set(id, record);\n return record as T;\n }\n if (op === 'schedule') {\n const id = randomID('job');\n const record: ScheduledJob = {\n id,\n type: 'scheduled',\n cron: String(payload.cron ?? ''),\n method: String(payload.method ?? ''),\n params: payload.params ?? {},\n status: 'scheduled',\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n jobsStore.set(id, record);\n return record as T;\n }\n if (op === 'list') {\n return [...jobsStore.values()] as T;\n }\n if (op === 'cancel') {\n const id = String(payload.id ?? '');\n return { ok: jobsStore.delete(id) } as T;\n }\n }\n\n if (namespace === 'secrets' && op === 'get') {\n const name = String(payload.name ?? '');\n const value = secretStore.get(name);\n if (value === undefined) {\n throw new Error(`secret not found: ${name}`);\n }\n return { value } as T;\n }\n\n if (namespace === 'files') {\n if (op === 'store') {\n const id = randomID('file');\n const name = String(payload.name ?? 'file.bin');\n const dataBase64 = parseBase64Payload(payload.dataBase64);\n const contentType = String(payload.contentType ?? '');\n const size = Buffer.from(dataBase64, 'base64').byteLength;\n const record: TestFileRecord = {\n id,\n name,\n contentType,\n size,\n path: `/test/${currentUser.tenantId}/${appletId}/${id}-${name}`,\n createdAt: new Date().toISOString(),\n dataBase64,\n };\n filesStore.set(id, record);\n return record as T;\n }\n if (op === 'get') {\n const id = String(payload.id ?? '');\n const record = filesStore.get(id);\n if (!record) {\n return null as T;\n }\n const { dataBase64: _, ...rest } = record;\n return rest as T;\n }\n if (op === 'delete') {\n const id = String(payload.id ?? '');\n return filesStore.delete(id) as T;\n }\n }\n\n throw new Error(`unsupported method: ${method}`);\n },\n };\n\n return {\n auth: {\n async currentUser(): Promise<CurrentUser> {\n return currentUser;\n },\n },\n engine,\n kv: {\n async get<T = unknown>(key: string): Promise<T | null> {\n return (kvStore.get(scopedKey(key)) ?? null) as T | null;\n },\n async set(key: string, value: unknown, ttlSeconds?: number): Promise<void> {\n if (!Number.isNaN(toNumber(ttlSeconds)) && (ttlSeconds as number) <= 0) {\n kvStore.delete(scopedKey(key));\n return;\n }\n // Test KV store intentionally ignores positive TTL values; callers can still verify scopedKey+kvStore behavior.\n kvStore.set(scopedKey(key), value);\n },\n async del(key: string): Promise<boolean> {\n return kvStore.delete(scopedKey(key));\n },\n async mget<T = unknown>(keys: string[]): Promise<Array<T | null>> {\n return keys.map((key) => (kvStore.get(scopedKey(key)) ?? null) as T | null);\n },\n },\n db,\n jobs: {\n enqueue(method: string, params?: unknown): Promise<ScheduledJob> {\n return engine.call(`${appletId}.jobs.enqueue`, { method, params: params ?? {} });\n },\n schedule(cron: string, method: string, params?: unknown): Promise<ScheduledJob> {\n return engine.call(`${appletId}.jobs.schedule`, { cron, method, params: params ?? {} });\n },\n list(): Promise<ScheduledJob[]> {\n return engine.call(`${appletId}.jobs.list`, {});\n },\n cancel(id: string): Promise<{ ok: boolean }> {\n return engine.call(`${appletId}.jobs.cancel`, { id });\n },\n },\n secrets: {\n async get(name: string): Promise<string> {\n const result = await engine.call<{ value: string }>(`${appletId}.secrets.get`, { name });\n return result.value;\n },\n },\n files: {\n async store(input: { name: string; contentType?: string; data: Blob | ArrayBuffer | Uint8Array }): Promise<StoredFile> {\n const dataBase64 = await toBase64(input.data);\n return engine.call<StoredFile>(`${appletId}.files.store`, {\n name: input.name,\n contentType: input.contentType ?? '',\n dataBase64,\n });\n },\n get(id: string): Promise<StoredFile | null> {\n return engine.call(`${appletId}.files.get`, { id });\n },\n delete(id: string): Promise<boolean> {\n return engine.call(`${appletId}.files.delete`, { id });\n },\n },\n setCurrentUser(nextUser: Partial<CurrentUser>) {\n currentUser = normalizeUser(nextUser);\n },\n };\n}\n"]}
|