@crossworks/app-build 0.230.43

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/LICENSE.md ADDED
@@ -0,0 +1,135 @@
1
+ # License
2
+
3
+ Mantle is **dual-licensed** by Cross Works Engineering (Pty) Ltd:
4
+
5
+ 1. **Public license — Functional Source License 1.1 (MIT Future), reproduced in
6
+ full below.** Free to use, self-host, modify, and run for any purpose that is
7
+ not a Competing Use (see the _Permitted Purpose_ clause). Two years after each
8
+ version is first published, that version automatically converts to the MIT
9
+ license.
10
+ 2. **Commercial license — see [`LICENSE-COMMERCIAL.md`](./LICENSE-COMMERCIAL.md).**
11
+ A paid agreement that lifts the FSL's _Competing Use_ restriction for partners
12
+ who want to embed Mantle in a commercial product or offer it as a service
13
+ during the two-year window. Contact **licensing@crossworks.engineering**.
14
+
15
+ For a plain-language explanation of how the two licenses fit together and what the
16
+ key terms mean, see [`LICENSING.md`](./LICENSING.md). Third-party open-source
17
+ components bundled with Mantle are attributed in
18
+ [`THIRD-PARTY-NOTICES.md`](./THIRD-PARTY-NOTICES.md).
19
+
20
+ The "Change Date" for each release is **two years after that release is first made
21
+ available** under this license; on the Change Date that release becomes available
22
+ under the MIT license (the _Grant of Future License_ below).
23
+
24
+ ---
25
+
26
+ # Functional Source License, Version 1.1, MIT Future License
27
+
28
+ ## Abbreviation
29
+
30
+ FSL-1.1-MIT
31
+
32
+ ## Notice
33
+
34
+ Copyright 2026 Cross Works Engineering (Pty) Ltd
35
+
36
+ ## Terms and Conditions
37
+
38
+ ### Licensor ("We")
39
+
40
+ The party offering the Software under these Terms and Conditions.
41
+
42
+ ### The Software
43
+
44
+ The "Software" is each version of the software that we make available under
45
+ these Terms and Conditions, as indicated by our inclusion of these Terms and
46
+ Conditions with the Software.
47
+
48
+ ### License Grant
49
+
50
+ Subject to your compliance with this License Grant and the Patents,
51
+ Redistribution and Trademark clauses below, we hereby grant you the right to
52
+ use, copy, modify, create derivative works, publicly perform, publicly display
53
+ and redistribute the Software for any Permitted Purpose identified below.
54
+
55
+ ### Permitted Purpose
56
+
57
+ A Permitted Purpose is any purpose other than a Competing Use. A Competing Use
58
+ means making the Software available to others in a commercial product or
59
+ service that:
60
+
61
+ 1. substitutes for the Software;
62
+
63
+ 2. substitutes for any other product or service we offer using the Software
64
+ that exists as of the date we make the Software available; or
65
+
66
+ 3. offers the same or substantially similar functionality as the Software.
67
+
68
+ Permitted Purposes specifically include using the Software:
69
+
70
+ 1. for your internal use and access;
71
+
72
+ 2. for non-commercial education;
73
+
74
+ 3. for non-commercial research; and
75
+
76
+ 4. in connection with professional services that you provide to a licensee
77
+ using the Software in accordance with these Terms and Conditions.
78
+
79
+ ### Patents
80
+
81
+ To the extent your use for a Permitted Purpose would necessarily infringe our
82
+ patents, the license grant above includes a license under our patents. If you
83
+ make a claim against any party that the Software infringes or contributes to
84
+ the infringement of any patent, then your patent license to the Software ends
85
+ immediately.
86
+
87
+ ### Redistribution
88
+
89
+ The Terms and Conditions apply to all copies, modifications and derivatives of
90
+ the Software.
91
+
92
+ If you redistribute any copies, modifications or derivatives of the Software,
93
+ you must include a copy of or a link to these Terms and Conditions and not
94
+ remove any copyright notices provided in or with the Software.
95
+
96
+ ### Disclaimer
97
+
98
+ THE SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTIES OF ANY KIND, EXPRESS OR
99
+ IMPLIED, INCLUDING WITHOUT LIMITATION WARRANTIES OF FITNESS FOR A PARTICULAR
100
+ PURPOSE, MERCHANTABILITY, TITLE OR NON-INFRINGEMENT.
101
+
102
+ IN NO EVENT WILL WE HAVE ANY LIABILITY TO YOU ARISING OUT OF OR RELATED TO THE
103
+ SOFTWARE, INCLUDING INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES,
104
+ EVEN IF WE HAVE BEEN INFORMED OF THEIR POSSIBILITY IN ADVANCE.
105
+
106
+ ### Trademarks
107
+
108
+ Except for displaying the License Details and identifying us as the origin of
109
+ the Software, you have no right under these Terms and Conditions to use our
110
+ trademarks, trade names, service marks or product names.
111
+
112
+ ## Grant of Future License
113
+
114
+ We hereby irrevocably grant you an additional license to use the Software under
115
+ the MIT license that is effective on the second anniversary of the date we make
116
+ the Software available. On or after that date, you may use the Software under
117
+ the MIT license, in which case the following will apply:
118
+
119
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
120
+ this software and associated documentation files (the "Software"), to deal in
121
+ the Software without restriction, including without limitation the rights to
122
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
123
+ of the Software, and to permit persons to whom the Software is furnished to do
124
+ so, subject to the following conditions:
125
+
126
+ The above copyright notice and this permission notice shall be included in all
127
+ copies or substantial portions of the Software.
128
+
129
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
130
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
131
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
132
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
133
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
134
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
135
+ SOFTWARE.
package/package.json ADDED
@@ -0,0 +1,32 @@
1
+ {
2
+ "name": "@crossworks/app-build",
3
+ "version": "0.230.43",
4
+ "type": "module",
5
+ "main": "./src/index.ts",
6
+ "types": "./src/index.ts",
7
+ "exports": {
8
+ ".": "./src/index.ts"
9
+ },
10
+ "dependencies": {
11
+ "esbuild": "^0.28.1",
12
+ "lucide-react": "^1.25.0",
13
+ "react": "^19.2.7",
14
+ "react-dom": "^19.2.7",
15
+ "@mantle/share-ui": "npm:@crossworks/share-ui@0.230.43"
16
+ },
17
+ "devDependencies": {
18
+ "@types/node": "^22.20.1",
19
+ "@types/react": "^19.2.17",
20
+ "@types/react-dom": "^19.0.0",
21
+ "typescript": "^5.7.2"
22
+ },
23
+ "license": "SEE LICENSE IN LICENSE.md",
24
+ "repository": {
25
+ "type": "git",
26
+ "url": "https://github.com/crossworks-engineering/mantle"
27
+ },
28
+ "scripts": {
29
+ "typecheck": "tsc --noEmit",
30
+ "build:runtime": "node scripts/build-runtime.ts"
31
+ }
32
+ }
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Emits the shared mini-app runtime into server/web/public/app-runtime/.
3
+ * Run with: `node packages/app-build/scripts/build-runtime.ts` (Node strips the
4
+ * TS types). Wired as `pnpm -C packages/app-build build:runtime` and invoked
5
+ * from server/web's prebuild so the runtime always exists before apps render.
6
+ */
7
+ import * as path from 'node:path';
8
+ import { fileURLToPath } from 'node:url';
9
+ import { buildRuntime } from '../src/build-runtime.ts';
10
+
11
+ const here = path.dirname(fileURLToPath(import.meta.url));
12
+ const repoRoot = path.resolve(here, '../../..');
13
+
14
+ /**
15
+ * Which app is asking. Each Next app serves its own copy — the ACAO:* runtime
16
+ * has to exist on every origin that renders sandboxes — so the caller names
17
+ * itself and this resolves the path from the repo root.
18
+ *
19
+ * An ARGUMENT rather than an environment variable, deliberately. The callers
20
+ * used to set `APP_RUNTIME_OUT="$PWD/…"` inline, which is POSIX shell syntax;
21
+ * pnpm runs package scripts through cmd.exe on Windows, where that is not a
22
+ * variable assignment but an unknown command. The desktop build failed on
23
+ * windows-latest for four consecutive releases with
24
+ * `'APP_RUNTIME_OUT' is not recognized`. An argv entry has no shell semantics
25
+ * to get wrong.
26
+ *
27
+ * `APP_RUNTIME_OUT` still works for a direct absolute-path invocation; the bare
28
+ * default remains the server app.
29
+ */
30
+ const appArg = process.argv[2]?.trim();
31
+ const outDir = appArg
32
+ ? path.resolve(repoRoot, appArg, 'public/app-runtime')
33
+ : process.env.APP_RUNTIME_OUT
34
+ ? path.resolve(process.env.APP_RUNTIME_OUT)
35
+ : path.resolve(repoRoot, 'server/web/public/app-runtime');
36
+
37
+ const manifest = await buildRuntime(outDir);
38
+ const n = Object.keys(manifest.imports).length;
39
+ console.log(`app-runtime: ${n} modules → ${outDir}`);
40
+ for (const [spec, url] of Object.entries(manifest.imports)) console.log(` ${spec} → ${url}`);
@@ -0,0 +1,174 @@
1
+ /**
2
+ * Builds the SHARED app runtime — the React/UI-kit/host-bridge modules that
3
+ * every mini app imports but that used to be re-bundled into each app's output.
4
+ *
5
+ * Instead of each app shipping its own ~40 KB React + kit, we build those once
6
+ * into a small set of content-hashed ESM files served from a stable, cacheable,
7
+ * CORS-enabled URL (`/app-runtime/*`). Apps then mark these specifiers external
8
+ * (see index.ts) and the sandbox iframe wires them up with an import map, so the
9
+ * browser fetches + parses ONE React across every app and every reload.
10
+ *
11
+ * `splitting: true` puts React (+ scheduler) in a shared chunk that every entry
12
+ * imports — guaranteeing a SINGLE React instance even though `react`,
13
+ * `react-dom/client`, the kit components, and the host bridge are separate
14
+ * entry points.
15
+ *
16
+ * Output: `<outDir>/<name>-<hash>.js` files + `manifest.json`, a map from the
17
+ * specifier as written in app source (`react`, `@/components/ui/button`, `@host`,
18
+ * …) to its hashed URL. The sandbox reads the manifest to build the import map.
19
+ */
20
+ import * as fs from 'node:fs';
21
+ import * as path from 'node:path';
22
+ import { createRequire } from 'node:module';
23
+ import { fileURLToPath } from 'node:url';
24
+ import esbuild from 'esbuild';
25
+ import { KIT } from './kit.ts';
26
+
27
+ const REAL_DIR = path.dirname(fileURLToPath(import.meta.url));
28
+ const ENTRY_NS = 'rt-entry';
29
+ const require = createRequire(import.meta.url);
30
+
31
+ /** Re-export EVERY public name a CJS package exposes as a static ESM named
32
+ * export. `export * from '<cjs>'` does NOT do this across the bundle boundary —
33
+ * the re-exports aren't statically visible to a SEPARATE build that imports the
34
+ * entry at runtime via the import map, so `import { createRoot }`/`{ useState }`
35
+ * come back undefined. We instead bind each name off the CJS default object,
36
+ * which esbuild's interop guarantees is the real module.exports. The name list
37
+ * comes from the actually-installed package, so it can't drift from the API. */
38
+ function reexportCjs(specifier: string, opts: { default?: boolean } = {}): string {
39
+ const mod = require(specifier) as Record<string, unknown>;
40
+ const names = Object.keys(mod).filter((k) => /^[A-Za-z_$][\w$]*$/.test(k));
41
+ const lines = [`import base from ${JSON.stringify(specifier)};`];
42
+ if (opts.default) lines.push('export default base;');
43
+ for (const n of names) lines.push(`export const ${n} = base[${JSON.stringify(n)}];`);
44
+ return lines.join('\n') + '\n';
45
+ }
46
+
47
+ /** Each shared module, by entry name → its source. The react* entries re-export
48
+ * the real packages; esbuild splitting collapses the actual React into one
49
+ * shared chunk. The kit + host sources are the SAME strings apps used to bundle
50
+ * (kit.ts), so there is no second source of truth. */
51
+ const ENTRY_SRC: Record<string, string> = {
52
+ react: reexportCjs('react', { default: true }),
53
+ 'react-dom': reexportCjs('react-dom', { default: true }),
54
+ 'react-dom-client': reexportCjs('react-dom/client'),
55
+ 'jsx-runtime': reexportCjs('react/jsx-runtime'),
56
+ utils: KIT['@/lib/utils']!,
57
+ button: KIT['@/components/ui/button']!,
58
+ card: KIT['@/components/ui/card']!,
59
+ input: KIT['@/components/ui/input']!,
60
+ label: KIT['@/components/ui/label']!,
61
+ badge: KIT['@/components/ui/badge']!,
62
+ separator: KIT['@/components/ui/separator']!,
63
+ host: KIT['@host']!,
64
+ };
65
+
66
+ /** Specifier as written in app source → entry name. This is the contract the
67
+ * bundler (external list) and the sandbox (import map) both derive from. */
68
+ export const RUNTIME_SPECIFIERS: Record<string, string> = {
69
+ react: 'react',
70
+ 'react-dom': 'react-dom',
71
+ 'react-dom/client': 'react-dom-client',
72
+ 'react/jsx-runtime': 'jsx-runtime',
73
+ '@/lib/utils': 'utils',
74
+ '@/components/ui/button': 'button',
75
+ '@/components/ui/card': 'card',
76
+ '@/components/ui/input': 'input',
77
+ '@/components/ui/label': 'label',
78
+ '@/components/ui/badge': 'badge',
79
+ '@/components/ui/separator': 'separator',
80
+ '@host': 'host',
81
+ };
82
+
83
+ /** esbuild plugin: serve the virtual entry sources + bind the kit's own
84
+ * `@/lib/utils` import to the same `utils` module (so `cn` isn't duplicated).
85
+ * Everything else (react, react-dom, scheduler) resolves from node_modules and
86
+ * is bundled — splitting dedupes React into a shared chunk. */
87
+ function runtimePlugin(): esbuild.Plugin {
88
+ return {
89
+ name: 'mantle-runtime',
90
+ setup(build) {
91
+ build.onResolve({ filter: /^entry:/ }, (args) => ({
92
+ path: args.path.slice('entry:'.length),
93
+ namespace: ENTRY_NS,
94
+ }));
95
+ build.onResolve({ filter: /^@\/lib\/utils$/ }, () => ({
96
+ path: 'utils',
97
+ namespace: ENTRY_NS,
98
+ }));
99
+ build.onLoad({ filter: /.*/, namespace: ENTRY_NS }, (args) => ({
100
+ contents: ENTRY_SRC[args.path] ?? '',
101
+ loader: 'tsx',
102
+ resolveDir: REAL_DIR,
103
+ }));
104
+ },
105
+ };
106
+ }
107
+
108
+ export type RuntimeManifest = {
109
+ /** specifier (as imported in app code) → hashed URL under `/app-runtime/`. */
110
+ imports: Record<string, string>;
111
+ builtAt: string;
112
+ esbuildVersion: string;
113
+ };
114
+
115
+ /**
116
+ * Build the shared runtime into `outDir` and return the manifest. The caller is
117
+ * responsible for where `outDir` lives (apps/web/public/app-runtime) and for the
118
+ * public URL prefix (`/app-runtime/`).
119
+ */
120
+ export async function buildRuntime(
121
+ outDir: string,
122
+ urlPrefix = '/app-runtime/',
123
+ ): Promise<RuntimeManifest> {
124
+ fs.rmSync(outDir, { recursive: true, force: true });
125
+ fs.mkdirSync(outDir, { recursive: true });
126
+
127
+ const result = await esbuild.build({
128
+ entryPoints: Object.keys(ENTRY_SRC).map((name) => ({ in: `entry:${name}`, out: name })),
129
+ bundle: true,
130
+ splitting: true,
131
+ format: 'esm',
132
+ platform: 'browser',
133
+ target: 'es2020',
134
+ jsx: 'automatic',
135
+ minify: true,
136
+ legalComments: 'none',
137
+ define: { 'process.env.NODE_ENV': '"production"' },
138
+ outdir: outDir,
139
+ entryNames: '[name]-[hash]',
140
+ chunkNames: 'chunk-[hash]',
141
+ write: true,
142
+ logLevel: 'silent',
143
+ plugins: [runtimePlugin()],
144
+ });
145
+ void result;
146
+
147
+ // Map each requested entry name → its hashed output file. esbuild names entry
148
+ // outputs `<out>-<hash>.js`; the hash is alnum (no dashes), so the file for an
149
+ // entry is the one whose basename is `<name>-<hash>.js` with no further dash —
150
+ // which keeps `react` from matching `react-dom-client-<hash>.js`.
151
+ const files = fs.readdirSync(outDir).filter((f) => f.endsWith('.js'));
152
+ const nameToFile: Record<string, string> = {};
153
+ for (const name of Object.keys(ENTRY_SRC)) {
154
+ const prefix = `${name}-`;
155
+ nameToFile[name] = files.find(
156
+ (f) => f.startsWith(prefix) && !f.slice(prefix.length, -'.js'.length).includes('-'),
157
+ )!;
158
+ }
159
+
160
+ const imports: Record<string, string> = {};
161
+ for (const [specifier, name] of Object.entries(RUNTIME_SPECIFIERS)) {
162
+ const file = nameToFile[name];
163
+ if (!file) throw new Error(`runtime build produced no output for entry '${name}'`);
164
+ imports[specifier] = urlPrefix + file;
165
+ }
166
+
167
+ const manifest: RuntimeManifest = {
168
+ imports,
169
+ builtAt: new Date().toISOString(),
170
+ esbuildVersion: esbuild.version,
171
+ };
172
+ fs.writeFileSync(path.join(outDir, 'manifest.json'), JSON.stringify(manifest, null, 2) + '\n');
173
+ return manifest;
174
+ }
@@ -0,0 +1,181 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { buildApp, type AppSource } from './index';
3
+
4
+ /** A minimal valid app: one entry file exporting a default component. */
5
+ function app(files: Record<string, string>, entry = 'App.tsx'): AppSource {
6
+ return { entry, files };
7
+ }
8
+
9
+ const TRIVIAL = 'export default function App() {\n return <div>hi</div>;\n}\n';
10
+
11
+ describe('buildApp — happy path', () => {
12
+ it('bundles a trivial app into self-mounting ESM', async () => {
13
+ const res = await buildApp(app({ 'App.tsx': TRIVIAL }));
14
+ expect(res.ok).toBe(true);
15
+ expect(typeof res.code).toBe('string');
16
+ expect(res.code!.length).toBeGreaterThan(0);
17
+ expect(res.errors).toEqual([]);
18
+ expect(res.esbuildVersion).toMatch(/^\d+\.\d+/);
19
+ });
20
+
21
+ it('externalizes React + @host (resolved via the shared runtime import map)', async () => {
22
+ const res = await buildApp(app({ 'App.tsx': TRIVIAL }));
23
+ expect(res.ok).toBe(true);
24
+ // React (here the automatic-JSX runtime) and the host bridge are NOT
25
+ // bundled — they remain bare imports the iframe's import map resolves to the
26
+ // one shared runtime. The app ships only its own code, so it stays tiny.
27
+ expect(res.code).toMatch(/["']react\/jsx-runtime["']/);
28
+ expect(res.code).toMatch(/["']@host["']/);
29
+ expect(res.code!.length).toBeLessThan(5000);
30
+ });
31
+
32
+ it('allows the curated runtime: react, lucide-react, the kit, and @host', async () => {
33
+ const src = app({
34
+ 'App.tsx':
35
+ "import { useState } from 'react';\n" +
36
+ "import { Home } from 'lucide-react';\n" +
37
+ "import { Button } from '@/components/ui/button';\n" +
38
+ "import { cn } from '@/lib/utils';\n" +
39
+ "import { host } from '@host';\n" +
40
+ 'export default function App() {\n' +
41
+ ' const [n] = useState(0);\n' +
42
+ ' void host; void cn; void Home;\n' +
43
+ ' return <Button>{n}</Button>;\n' +
44
+ '}\n',
45
+ });
46
+ const res = await buildApp(src);
47
+ expect(res.ok).toBe(true);
48
+ expect(res.errors).toEqual([]);
49
+ });
50
+
51
+ it('resolves relative imports, including index files', async () => {
52
+ const src = app({
53
+ 'App.tsx':
54
+ "import { greet } from './lib/util';\nexport default function App() { return <div>{greet()}</div>; }\n",
55
+ 'lib/util.ts': "export { greet } from './greet';\n",
56
+ 'lib/greet/index.ts': "export function greet() { return 'hi'; }\n",
57
+ });
58
+ const res = await buildApp(src);
59
+ expect(res.ok).toBe(true);
60
+ });
61
+ });
62
+
63
+ describe('buildApp — the import allowlist (security boundary)', () => {
64
+ it('rejects an arbitrary npm package with a clear message', async () => {
65
+ const src = app({
66
+ 'App.tsx':
67
+ "import _ from 'lodash';\nexport default function App() { return <div>{String(_)}</div>; }\n",
68
+ });
69
+ const res = await buildApp(src);
70
+ expect(res.ok).toBe(false);
71
+ expect(res.errors.some((e) => /not allowed in a mini app|lodash/i.test(e.text))).toBe(true);
72
+ });
73
+
74
+ it('rejects node builtins (no server reach from a mini app)', async () => {
75
+ const src = app({
76
+ 'App.tsx':
77
+ "import fs from 'node:fs';\nexport default function App() { return <div>{String(fs)}</div>; }\n",
78
+ });
79
+ const res = await buildApp(src);
80
+ expect(res.ok).toBe(false);
81
+ });
82
+
83
+ it('rejects an unknown @/ alias import', async () => {
84
+ const src = app({
85
+ 'App.tsx':
86
+ "import x from '@/components/ui/table';\nexport default function App() { return <div>{String(x)}</div>; }\n",
87
+ });
88
+ const res = await buildApp(src);
89
+ expect(res.ok).toBe(false);
90
+ expect(res.errors.some((e) => /Unknown import/i.test(e.text))).toBe(true);
91
+ });
92
+ });
93
+
94
+ describe('buildApp — error reporting', () => {
95
+ it('fails when the entry file is missing from the tree', async () => {
96
+ const res = await buildApp(app({ 'Other.tsx': TRIVIAL }, 'App.tsx'));
97
+ expect(res.ok).toBe(false);
98
+ expect(res.errors[0]?.text).toMatch(/not found/i);
99
+ });
100
+
101
+ it('reports a file/line location for an unresolvable relative import', async () => {
102
+ const src = app({
103
+ 'App.tsx':
104
+ "import { x } from './missing';\nexport default function App() { return <div>{x}</div>; }\n",
105
+ });
106
+ const res = await buildApp(src);
107
+ expect(res.ok).toBe(false);
108
+ expect(res.errors.some((e) => /Cannot resolve/i.test(e.text))).toBe(true);
109
+ });
110
+
111
+ it('reports a location for a syntax error', async () => {
112
+ const src = app({
113
+ 'App.tsx': 'export default function App() { return <div>oops</div> // missing brace\n',
114
+ });
115
+ const res = await buildApp(src);
116
+ expect(res.ok).toBe(false);
117
+ expect(res.errors.length).toBeGreaterThan(0);
118
+ expect(res.errors.some((e) => e.location !== null)).toBe(true);
119
+ });
120
+ });
121
+
122
+ describe('lintToolRefs — undeclared host.tools.call', () => {
123
+ it('warns (does not error) for a host.tools.call slug that is not declared', async () => {
124
+ const src = app({
125
+ 'App.tsx':
126
+ "import { host } from '@host';\n" +
127
+ 'export default function App() {\n' +
128
+ " const go = () => host.tools.call('openweather_geocode', { q: 'x' });\n" +
129
+ ' return <button onClick={go}>go</button>;\n' +
130
+ '}\n',
131
+ });
132
+ const res = await buildApp(src, { declaredToolSlugs: [] });
133
+ expect(res.ok).toBe(true); // warning-only: the build still succeeds
134
+ expect(res.warnings.some((w) => /openweather_geocode/.test(w.text))).toBe(true);
135
+ const w = res.warnings.find((w) => /openweather_geocode/.test(w.text));
136
+ expect(w?.location?.file).toBe('App.tsx');
137
+ expect(w?.location?.line).toBe(3);
138
+ });
139
+
140
+ it('does not warn when the slug is declared', async () => {
141
+ const src = app({
142
+ 'App.tsx':
143
+ "import { host } from '@host';\n" +
144
+ 'export default function App() {\n' +
145
+ " void (() => host.tools.call('weather_now', {}));\n" +
146
+ ' return <div>ok</div>;\n' +
147
+ '}\n',
148
+ });
149
+ const res = await buildApp(src, { declaredToolSlugs: ['weather_now'] });
150
+ expect(res.ok).toBe(true);
151
+ expect(res.warnings.some((w) => /weather_now/.test(w.text))).toBe(false);
152
+ });
153
+
154
+ it('skips the lint entirely when declaredToolSlugs is omitted (back-compat)', async () => {
155
+ const src = app({
156
+ 'App.tsx':
157
+ "import { host } from '@host';\n" +
158
+ 'export default function App() {\n' +
159
+ " void (() => host.tools.call('anything', {}));\n" +
160
+ ' return <div>ok</div>;\n' +
161
+ '}\n',
162
+ });
163
+ const res = await buildApp(src);
164
+ expect(res.warnings.some((w) => /isn't in the app's declared tools/.test(w.text))).toBe(false);
165
+ });
166
+
167
+ it('ignores dynamic (non-literal) slugs — no false positives', async () => {
168
+ const src = app({
169
+ 'App.tsx':
170
+ "import { host } from '@host';\n" +
171
+ 'export default function App() {\n' +
172
+ " const slug = 'x';\n" +
173
+ ' void (() => host.tools.call(slug, {}));\n' +
174
+ ' return <div>ok</div>;\n' +
175
+ '}\n',
176
+ });
177
+ const res = await buildApp(src, { declaredToolSlugs: [] });
178
+ expect(res.ok).toBe(true);
179
+ expect(res.warnings.length).toBe(0);
180
+ });
181
+ });
package/src/index.ts ADDED
@@ -0,0 +1,278 @@
1
+ /**
2
+ * The mini-app bundler. Takes an app's virtual source tree and produces a single
3
+ * self-mounting ESM bundle for the sandbox iframe. React, the curated UI kit and
4
+ * the host bridge are NOT bundled in — they're marked external and resolved at
5
+ * runtime by an import map (see build-runtime.ts + app-sandbox.tsx), so one
6
+ * shared React/kit is fetched + parsed ONCE across every app and reload instead
7
+ * of re-bundled (~40 KB+) into each app. The app's output is just its own code
8
+ * (+ any allowed npm like lucide-react, which tree-shakes small per app).
9
+ *
10
+ * Build inputs are agent-authored TSX; build errors are returned (not thrown)
11
+ * with file/line locations so Appsmith can read them and self-correct.
12
+ */
13
+ import * as path from 'node:path';
14
+ import { fileURLToPath } from 'node:url';
15
+ import esbuild, { type BuildOptions, type Message, type Plugin } from 'esbuild';
16
+ import { KIT } from './kit';
17
+
18
+ /** Specifiers provided by the shared runtime via the iframe import map — marked
19
+ * external so they stay as bare imports in the app bundle. The react family is
20
+ * externalized GLOBALLY (below) so even a bundled dep's React (e.g. lucide's)
21
+ * resolves to the one shared instance; the `@`-prefixed kit/host specifiers are
22
+ * externalized per-import by the plugin (with an allowlist check). Keep this in
23
+ * sync with build-runtime.ts RUNTIME_SPECIFIERS. */
24
+ const REACT_EXTERNALS = ['react', 'react/jsx-runtime', 'react-dom', 'react-dom/client'];
25
+
26
+ // A REAL directory inside this package, used as the esbuild resolveDir for the
27
+ // virtual entry + kit + app modules so bare imports (react, react-dom/client,
28
+ // react/jsx-runtime, lucide-react) resolve from this package's node_modules.
29
+ // The app/kit *sources* are still served from memory by the plugin; only bare
30
+ // package imports fall through to on-disk node_modules resolution.
31
+ const REAL_DIR = path.dirname(fileURLToPath(import.meta.url));
32
+
33
+ export type AppSource = { entry: string; files: Record<string, string> };
34
+
35
+ export type BuildMessage = {
36
+ text: string;
37
+ location: { file: string; line: number; column: number } | null;
38
+ };
39
+
40
+ export type BuildResult = {
41
+ ok: boolean;
42
+ /** Bundled ESM (present iff ok). */
43
+ code?: string;
44
+ errors: BuildMessage[];
45
+ warnings: BuildMessage[];
46
+ esbuildVersion: string;
47
+ };
48
+
49
+ export const ESBUILD_VERSION = esbuild.version;
50
+
51
+ const APP_NS = 'app';
52
+ const STDIN = '<stdin>';
53
+
54
+ /** Bare npm packages a mini app may import. Everything else is rejected. */
55
+ const BARE_ALLOW = /^(react($|\/)|react-dom($|\/)|lucide-react($|\/))/;
56
+
57
+ function loaderFor(p: string): 'tsx' | 'ts' | 'js' | 'jsx' | 'json' | 'css' {
58
+ if (p.endsWith('.ts')) return 'ts';
59
+ if (p.endsWith('.js')) return 'js';
60
+ if (p.endsWith('.jsx')) return 'jsx';
61
+ if (p.endsWith('.json')) return 'json';
62
+ if (p.endsWith('.css')) return 'css';
63
+ return 'tsx';
64
+ }
65
+
66
+ /** Normalize a key as it appears in `files` (posix, no leading ./). */
67
+ function normKey(k: string): string {
68
+ return path.posix.normalize(k.replace(/^\.\//, '')).replace(/^\/+/, '');
69
+ }
70
+
71
+ /** Resolve a relative import against the source tree, trying common extensions
72
+ * and index files — mirrors how a bundler resolves `./x`. */
73
+ function resolveInTree(
74
+ files: Record<string, string>,
75
+ fromKey: string,
76
+ importPath: string,
77
+ ): string | null {
78
+ const fromDir = fromKey === '<stdin>' ? '' : path.posix.dirname(fromKey);
79
+ const base = normKey(path.posix.join(fromDir, importPath));
80
+ const candidates = [
81
+ base,
82
+ `${base}.tsx`,
83
+ `${base}.ts`,
84
+ `${base}.jsx`,
85
+ `${base}.js`,
86
+ `${base}.json`,
87
+ `${base}/index.tsx`,
88
+ `${base}/index.ts`,
89
+ ];
90
+ for (const c of candidates) if (c in files) return c;
91
+ return null;
92
+ }
93
+
94
+ function virtualPlugin(source: AppSource): Plugin {
95
+ const files = source.files;
96
+ return {
97
+ name: 'mantle-app-virtual',
98
+ setup(build) {
99
+ // Kit + alias imports (@host, @/components/ui/*, @/lib/utils): marked
100
+ // external (allowlisted) so they resolve from the shared runtime import
101
+ // map at load time instead of being bundled into every app.
102
+ build.onResolve({ filter: /^@/ }, (args) => {
103
+ if (args.path in KIT) return { path: args.path, external: true };
104
+ return {
105
+ errors: [
106
+ {
107
+ text: `Unknown import '${args.path}'. Allowed: react, ${Object.keys(KIT).join(', ')}, lucide-react, and relative files.`,
108
+ },
109
+ ],
110
+ };
111
+ });
112
+
113
+ // Relative imports — resolve against the virtual source tree. The stdin
114
+ // entry's `import App from './<entry>'` also lands here (its importer is
115
+ // the resolved stdin path, e.g. '/.../app-build/src/<stdin>').
116
+ build.onResolve({ filter: /^\.\.?\// }, (args) => {
117
+ const isStdin = args.importer === STDIN || args.importer.endsWith(`/${STDIN}`);
118
+ if (args.namespace !== APP_NS && !isStdin) return null;
119
+ const fromKey = args.namespace === APP_NS ? args.importer : STDIN;
120
+ const key = resolveInTree(files, fromKey, args.path);
121
+ if (!key) {
122
+ return { errors: [{ text: `Cannot resolve '${args.path}' from '${fromKey}'` }] };
123
+ }
124
+ return { path: key, namespace: APP_NS };
125
+ });
126
+
127
+ // Bare package imports (not relative, not @-prefixed). Only the curated
128
+ // runtime packages are allowed; everything else (node:*, arbitrary npm)
129
+ // is rejected with a clear message so Appsmith self-corrects. The iframe
130
+ // sandbox + CSP is the real boundary, but failing the build is cleaner
131
+ // feedback than a silently dead import.
132
+ build.onResolve({ filter: /^[^.@]/ }, (args) => {
133
+ // Only gate imports written in USER/KIT source — let transitive
134
+ // node_modules imports (react-dom → scheduler, etc.) resolve freely.
135
+ const fromUserCode =
136
+ args.namespace === APP_NS ||
137
+ args.importer === STDIN ||
138
+ args.importer.endsWith(`/${STDIN}`);
139
+ if (!fromUserCode) return null;
140
+ if (BARE_ALLOW.test(args.path)) return null; // fall through to node_modules
141
+ return {
142
+ errors: [
143
+ {
144
+ text: `Import '${args.path}' is not allowed in a mini app. Allowed packages: react, react-dom, lucide-react. Use @/components/ui/*, @host, or relative files for everything else.`,
145
+ },
146
+ ],
147
+ };
148
+ });
149
+
150
+ build.onLoad({ filter: /.*/, namespace: APP_NS }, (args) => {
151
+ const contents = files[args.path];
152
+ if (contents === undefined) {
153
+ return { errors: [{ text: `Missing file '${args.path}'` }] };
154
+ }
155
+ return { contents, loader: loaderFor(args.path), resolveDir: REAL_DIR };
156
+ });
157
+ },
158
+ };
159
+ }
160
+
161
+ function toMsg(m: Message): BuildMessage {
162
+ return {
163
+ text: m.text,
164
+ location: m.location
165
+ ? { file: m.location.file, line: m.location.line, column: m.location.column }
166
+ : null,
167
+ };
168
+ }
169
+
170
+ // Matches a `host.tools.call('slug', …)` site with a *literal* slug. Dynamic
171
+ // slugs (a variable) are intentionally not matched — we can't statically know
172
+ // them, and flagging them would be a false positive.
173
+ const TOOL_CALL_RE = /host\s*\.\s*tools\s*\.\s*call\s*\(\s*(['"`])([^'"`]+)\1/g;
174
+
175
+ /**
176
+ * Static lint: find every `host.tools.call('<slug>')` whose slug isn't in the
177
+ * app's declared `toolSlugs`. The host broker refuses undeclared slugs at
178
+ * runtime (a 403 the user only sees when the call fires), so surfacing the
179
+ * mismatch at build time turns a silent runtime failure into feedback the
180
+ * agent (and the Build panel) sees immediately. Returns BuildMessages so the
181
+ * caller can fold them into the build's warnings/errors. Literal slugs only.
182
+ */
183
+ export function lintToolRefs(source: AppSource, declaredSlugs: string[]): BuildMessage[] {
184
+ const declared = new Set(declaredSlugs);
185
+ const out: BuildMessage[] = [];
186
+ for (const [file, text] of Object.entries(source.files)) {
187
+ TOOL_CALL_RE.lastIndex = 0;
188
+ let m: RegExpExecArray | null;
189
+ while ((m = TOOL_CALL_RE.exec(text)) !== null) {
190
+ const slug = m[2];
191
+ if (!slug || declared.has(slug)) continue;
192
+ const pre = text.slice(0, m.index);
193
+ const line = pre.length - pre.replace(/\n/g, '').length + 1; // 1-based
194
+ const column = m.index - (pre.lastIndexOf('\n') + 1); // 0-based within line
195
+ out.push({
196
+ text:
197
+ `This app calls tool '${slug}' via host.tools.call, but '${slug}' isn't in the app's declared tools — ` +
198
+ `the host will refuse it at runtime. Declare it with app_tools_set (build the tool via the toolsmith first if it doesn't exist), or remove the call.`,
199
+ location: { file, line, column },
200
+ });
201
+ }
202
+ }
203
+ return out;
204
+ }
205
+
206
+ /** Bundle an app's source tree into one self-mounting ESM module. When
207
+ * `declaredToolSlugs` is supplied, undeclared `host.tools.call` slugs are
208
+ * appended to the build's warnings (see lintToolRefs). */
209
+ export async function buildApp(
210
+ source: AppSource,
211
+ opts: { declaredToolSlugs?: string[] } = {},
212
+ ): Promise<BuildResult> {
213
+ const toolWarnings = opts.declaredToolSlugs ? lintToolRefs(source, opts.declaredToolSlugs) : [];
214
+ const withToolWarnings = (r: BuildResult): BuildResult =>
215
+ toolWarnings.length ? { ...r, warnings: [...r.warnings, ...toolWarnings] } : r;
216
+ return withToolWarnings(await buildAppInner(source));
217
+ }
218
+
219
+ async function buildAppInner(source: AppSource): Promise<BuildResult> {
220
+ const entry = normKey(source.entry || 'App.tsx');
221
+ if (!(entry in source.files)) {
222
+ return {
223
+ ok: false,
224
+ errors: [{ text: `Entry file '${entry}' not found in source`, location: null }],
225
+ warnings: [],
226
+ esbuildVersion: ESBUILD_VERSION,
227
+ };
228
+ }
229
+
230
+ const stdin = `import App from ${JSON.stringify('./' + entry)};\nimport { __mount } from '@host';\n__mount(App);\n`;
231
+
232
+ const options: BuildOptions = {
233
+ stdin: { contents: stdin, resolveDir: REAL_DIR, sourcefile: STDIN, loader: 'tsx' },
234
+ bundle: true,
235
+ format: 'esm',
236
+ platform: 'browser',
237
+ target: 'es2020',
238
+ jsx: 'automatic',
239
+ // React (incl. any bundled dep's React, e.g. lucide-react) resolves to the
240
+ // one shared runtime instance via the iframe import map — never re-bundled.
241
+ external: REACT_EXTERNALS,
242
+ write: false,
243
+ minify: true,
244
+ legalComments: 'none',
245
+ logLevel: 'silent',
246
+ define: { 'process.env.NODE_ENV': '"production"' },
247
+ plugins: [virtualPlugin(source)],
248
+ };
249
+
250
+ try {
251
+ const res = await esbuild.build(options);
252
+ const code = res.outputFiles?.[0]?.text;
253
+ return {
254
+ ok: !!code,
255
+ ...(code ? { code } : {}),
256
+ errors: res.errors.map(toMsg),
257
+ warnings: res.warnings.map(toMsg),
258
+ esbuildVersion: ESBUILD_VERSION,
259
+ };
260
+ } catch (err) {
261
+ // esbuild throws a BuildFailure carrying structured errors/warnings.
262
+ const bf = err as { errors?: Message[]; warnings?: Message[] };
263
+ if (bf && Array.isArray(bf.errors)) {
264
+ return {
265
+ ok: false,
266
+ errors: bf.errors.map(toMsg),
267
+ warnings: (bf.warnings ?? []).map(toMsg),
268
+ esbuildVersion: ESBUILD_VERSION,
269
+ };
270
+ }
271
+ return {
272
+ ok: false,
273
+ errors: [{ text: err instanceof Error ? err.message : String(err), location: null }],
274
+ warnings: [],
275
+ esbuildVersion: ESBUILD_VERSION,
276
+ };
277
+ }
278
+ }
@@ -0,0 +1,28 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { KIT } from './kit';
3
+
4
+ // The @host kit module is a string mirror of packages/web-ui/src/app-bridge/protocol.ts (formerly apps/web/lib/app-bridge)
5
+ // (the sandbox can't import host code, so the shapes are duplicated by design).
6
+ // These are drift tripwires: if a bridge kind is renamed or dropped on either
7
+ // side, the app-facing API silently stops matching what the host answers.
8
+ describe('@host kit ↔ bridge protocol mirror', () => {
9
+ const HOST = KIT['@host']!;
10
+
11
+ it('exposes the core bridge kinds', () => {
12
+ for (const kind of ['tool.call', 'db.query', 'db.exec']) {
13
+ expect(HOST).toContain(`kind: '${kind}'`);
14
+ }
15
+ });
16
+
17
+ it('exposes the team-hub namespace with the enumerated hub kinds', () => {
18
+ expect(HOST).toContain("kind: 'hub.get'");
19
+ // All nav intents post the SAME event kind with the target shapes the
20
+ // shell's isHubNavTarget guard accepts (chat / briefing / app).
21
+ expect(HOST).toContain("kind: 'hub.nav', target: 'chat'");
22
+ expect(HOST).toContain("kind: 'hub.nav', target: { briefing: String(token) }");
23
+ expect(HOST).toContain("kind: 'hub.nav', target: { app: String(token) }");
24
+ for (const api of ['hub:', 'get:', 'openChat:', 'openBriefing:', 'openApp:']) {
25
+ expect(HOST).toContain(api);
26
+ }
27
+ });
28
+ });
package/src/kit.ts ADDED
@@ -0,0 +1,273 @@
1
+ /**
2
+ * The bundled-in module kit every mini app builds against. esbuild resolves the
3
+ * app's `@/components/ui/*`, `@/lib/utils`, and `@host` imports to these sources
4
+ * (served from memory by kitPlugin), so generated apps look native (same theme
5
+ * tokens) and talk to the host over the bridge — with NO dependency on the
6
+ * apps/web source tree or its node_modules at build time. React is bundled into
7
+ * each app (each iframe is its own isolated document).
8
+ *
9
+ * These are SOURCE STRINGS (TSX/TS), not live modules. They are compiled ONCE
10
+ * into the shared `/app-runtime` (see build-runtime.ts) and resolved at load time
11
+ * via the iframe import map — apps mark `react`/`@host`/`@/components/ui/*`
12
+ * external rather than re-bundling them. Keep them dependency-light (only `react`
13
+ * + `react-dom/client` in @host) and theme-token-only (never hardcode colours),
14
+ * matching apps/web/CLAUDE.md.
15
+ */
16
+
17
+ /** `cn` — minimal class joiner (no clsx/tailwind-merge dep). Generated apps
18
+ * write clean class lists, so a plain truthy-join is enough. */
19
+ const UTILS = `
20
+ export function cn(...inputs) {
21
+ return inputs.flat(Infinity).filter(Boolean).join(' ');
22
+ }
23
+ `;
24
+
25
+ const BUTTON = `
26
+ import * as React from 'react';
27
+ import { cn } from '@/lib/utils';
28
+ const VARIANTS = {
29
+ default: 'bg-primary text-primary-foreground hover:bg-primary/90',
30
+ secondary: 'bg-secondary text-secondary-foreground hover:bg-secondary/80',
31
+ outline: 'border border-input bg-background hover:bg-accent hover:text-accent-foreground',
32
+ ghost: 'hover:bg-accent hover:text-accent-foreground',
33
+ destructive: 'bg-destructive text-destructive-foreground hover:bg-destructive/90',
34
+ link: 'text-primary underline-offset-4 hover:underline',
35
+ };
36
+ const SIZES = {
37
+ default: 'h-10 px-4 py-2',
38
+ sm: 'h-9 rounded-md px-3',
39
+ lg: 'h-11 rounded-md px-8',
40
+ icon: 'h-10 w-10',
41
+ };
42
+ export const Button = React.forwardRef(function Button(
43
+ { className, variant = 'default', size = 'default', ...props },
44
+ ref,
45
+ ) {
46
+ return (
47
+ <button
48
+ ref={ref}
49
+ className={cn(
50
+ 'inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50',
51
+ VARIANTS[variant] || VARIANTS.default,
52
+ SIZES[size] || SIZES.default,
53
+ className,
54
+ )}
55
+ {...props}
56
+ />
57
+ );
58
+ });
59
+ Button.displayName = 'Button';
60
+ `;
61
+
62
+ const CARD = `
63
+ import * as React from 'react';
64
+ import { cn } from '@/lib/utils';
65
+ export const Card = React.forwardRef(({ className, ...p }, ref) => (
66
+ <div ref={ref} className={cn('rounded-xl border border-border bg-card text-card-foreground shadow-sm', className)} {...p} />
67
+ ));
68
+ Card.displayName = 'Card';
69
+ export const CardHeader = React.forwardRef(({ className, ...p }, ref) => (
70
+ <div ref={ref} className={cn('flex flex-col space-y-1.5 p-6', className)} {...p} />
71
+ ));
72
+ CardHeader.displayName = 'CardHeader';
73
+ export const CardTitle = React.forwardRef(({ className, ...p }, ref) => (
74
+ <div ref={ref} className={cn('font-semibold leading-none tracking-tight', className)} {...p} />
75
+ ));
76
+ CardTitle.displayName = 'CardTitle';
77
+ export const CardDescription = React.forwardRef(({ className, ...p }, ref) => (
78
+ <div ref={ref} className={cn('text-sm text-muted-foreground', className)} {...p} />
79
+ ));
80
+ CardDescription.displayName = 'CardDescription';
81
+ export const CardContent = React.forwardRef(({ className, ...p }, ref) => (
82
+ <div ref={ref} className={cn('p-6 pt-0', className)} {...p} />
83
+ ));
84
+ CardContent.displayName = 'CardContent';
85
+ export const CardFooter = React.forwardRef(({ className, ...p }, ref) => (
86
+ <div ref={ref} className={cn('flex items-center p-6 pt-0', className)} {...p} />
87
+ ));
88
+ CardFooter.displayName = 'CardFooter';
89
+ `;
90
+
91
+ const INPUT = `
92
+ import * as React from 'react';
93
+ import { cn } from '@/lib/utils';
94
+ export const Input = React.forwardRef(({ className, type = 'text', ...p }, ref) => (
95
+ <input
96
+ ref={ref}
97
+ type={type}
98
+ className={cn(
99
+ 'flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50',
100
+ className,
101
+ )}
102
+ {...p}
103
+ />
104
+ ));
105
+ Input.displayName = 'Input';
106
+ `;
107
+
108
+ const LABEL = `
109
+ import * as React from 'react';
110
+ import { cn } from '@/lib/utils';
111
+ export const Label = React.forwardRef(({ className, ...p }, ref) => (
112
+ <label ref={ref} className={cn('text-sm font-medium leading-none', className)} {...p} />
113
+ ));
114
+ Label.displayName = 'Label';
115
+ `;
116
+
117
+ const BADGE = `
118
+ import * as React from 'react';
119
+ import { cn } from '@/lib/utils';
120
+ const V = {
121
+ default: 'border-transparent bg-primary text-primary-foreground',
122
+ secondary: 'border-transparent bg-secondary text-secondary-foreground',
123
+ destructive: 'border-transparent bg-destructive text-destructive-foreground',
124
+ outline: 'text-foreground',
125
+ };
126
+ export function Badge({ className, variant = 'default', ...p }) {
127
+ return <div className={cn('inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold', V[variant] || V.default, className)} {...p} />;
128
+ }
129
+ `;
130
+
131
+ const SEPARATOR = `
132
+ import * as React from 'react';
133
+ import { cn } from '@/lib/utils';
134
+ export function Separator({ className, orientation = 'horizontal', ...p }) {
135
+ return (
136
+ <div
137
+ role="separator"
138
+ className={cn('shrink-0 bg-border', orientation === 'horizontal' ? 'h-px w-full' : 'h-full w-px', className)}
139
+ {...p}
140
+ />
141
+ );
142
+ }
143
+ `;
144
+
145
+ /**
146
+ * The host bridge — the app's ONLY door to data + storage. Posts typed requests
147
+ * to the parent and awaits a correlated response. The app holds no secrets; the
148
+ * host resolves them server-side. `__mount` (used by the generated entry) wires
149
+ * the React root, an error boundary, the ready signal, and auto-resize.
150
+ *
151
+ * Mirrors apps/web/lib/app-bridge/protocol.ts — keep the message shapes in sync.
152
+ */
153
+ const HOST = `
154
+ import * as React from 'react';
155
+ import { createRoot } from 'react-dom/client';
156
+
157
+ const pending = new Map();
158
+ let seq = 0;
159
+ const rid = () => 'r' + (++seq) + '_' + Math.random().toString(36).slice(2);
160
+
161
+ function post(partial) {
162
+ return new Promise((resolve, reject) => {
163
+ const id = rid();
164
+ pending.set(id, { resolve, reject });
165
+ window.parent.postMessage({ v: 1, id, ...partial }, '*');
166
+ });
167
+ }
168
+
169
+ const annotateListeners = new Set();
170
+
171
+ window.addEventListener('message', (e) => {
172
+ if (e.source !== window.parent) return;
173
+ const m = e.data;
174
+ if (!m || m.v !== 1) return;
175
+ if (m.kind === 'annotate') {
176
+ for (const fn of annotateListeners) { try { fn(m.regions || []); } catch {} }
177
+ paintAnnotations(m.regions || []);
178
+ return;
179
+ }
180
+ if (typeof m.id === 'string' && pending.has(m.id)) {
181
+ const p = pending.get(m.id);
182
+ pending.delete(m.id);
183
+ if (m.ok) p.resolve(m.output);
184
+ else p.reject(new Error(m.error || 'bridge error'));
185
+ }
186
+ });
187
+
188
+ function paintAnnotations(regions) {
189
+ document.querySelectorAll('[data-app-annotated]').forEach((el) => {
190
+ el.removeAttribute('data-app-annotated');
191
+ el.style.outline = '';
192
+ el.style.outlineOffset = '';
193
+ });
194
+ for (const r of regions) {
195
+ const el = document.querySelector('[data-app-region="' + r.id + '"]');
196
+ if (!el) continue;
197
+ el.setAttribute('data-app-annotated', '1');
198
+ el.style.outline = '2px solid var(--ring)';
199
+ el.style.outlineOffset = '2px';
200
+ }
201
+ }
202
+
203
+ export const host = {
204
+ tools: {
205
+ call: (slug, input) => post({ kind: 'tool.call', slug, input: input ?? {} }),
206
+ },
207
+ db: {
208
+ query: (sql, params) => post({ kind: 'db.query', sql, params: params ?? [] }),
209
+ exec: (sql, params) => post({ kind: 'db.exec', sql, params: params ?? [] }),
210
+ },
211
+ ui: {
212
+ resize: (h) => window.parent.postMessage({ v: 1, kind: 'resize', height: h }, '*'),
213
+ notifyError: (msg) => window.parent.postMessage({ v: 1, kind: 'error', message: String(msg) }, '*'),
214
+ onAnnotate: (fn) => { annotateListeners.add(fn); return () => annotateListeners.delete(fn); },
215
+ },
216
+ // Team-hub surface only. get() rejects everywhere else (owner editor,
217
+ // ordinary shares) — hub apps catch that and render a local preview. The
218
+ // nav calls are intent-up: the /team SHELL owns chat + the briefing reader,
219
+ // the app can only ask to open them.
220
+ hub: {
221
+ get: () => post({ kind: 'hub.get' }),
222
+ openChat: () => window.parent.postMessage({ v: 1, kind: 'hub.nav', target: 'chat' }, '*'),
223
+ openBriefing: (token) =>
224
+ window.parent.postMessage({ v: 1, kind: 'hub.nav', target: { briefing: String(token) } }, '*'),
225
+ openApp: (token) =>
226
+ window.parent.postMessage({ v: 1, kind: 'hub.nav', target: { app: String(token) } }, '*'),
227
+ },
228
+ };
229
+
230
+ class ErrorBoundary extends React.Component {
231
+ constructor(p) { super(p); this.state = { err: null }; }
232
+ static getDerivedStateFromError(err) { return { err }; }
233
+ componentDidCatch(err) {
234
+ window.parent.postMessage({ v: 1, kind: 'error', message: String(err && err.message || err), stack: err && err.stack }, '*');
235
+ }
236
+ render() {
237
+ if (this.state.err) {
238
+ return React.createElement(
239
+ 'div',
240
+ { className: 'p-4 text-sm text-destructive' },
241
+ 'App crashed: ' + String(this.state.err.message || this.state.err),
242
+ );
243
+ }
244
+ return this.props.children;
245
+ }
246
+ }
247
+
248
+ export function __mount(App) {
249
+ const el = document.getElementById('root');
250
+ if (!el) return;
251
+ const root = createRoot(el);
252
+ root.render(React.createElement(ErrorBoundary, null, React.createElement(App)));
253
+ const send = () => host.ui.resize(Math.ceil(document.documentElement.scrollHeight));
254
+ window.parent.postMessage({ v: 1, kind: 'ready' }, '*');
255
+ requestAnimationFrame(send);
256
+ try { new ResizeObserver(send).observe(document.body); } catch {}
257
+ }
258
+ `;
259
+
260
+ /** path (as imported in app source) → source string. */
261
+ export const KIT: Record<string, string> = {
262
+ '@/lib/utils': UTILS,
263
+ '@/components/ui/button': BUTTON,
264
+ '@/components/ui/card': CARD,
265
+ '@/components/ui/input': INPUT,
266
+ '@/components/ui/label': LABEL,
267
+ '@/components/ui/badge': BADGE,
268
+ '@/components/ui/separator': SEPARATOR,
269
+ '@host': HOST,
270
+ };
271
+
272
+ /** The shadcn-style component import paths an app may use (for the skill doc). */
273
+ export const KIT_UI_IMPORTS = Object.keys(KIT).filter((k) => k.startsWith('@/components/ui/'));
package/tsconfig.json ADDED
@@ -0,0 +1,14 @@
1
+ {
2
+ "extends": "../../tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "rootDir": "src",
5
+ "outDir": "dist",
6
+ "types": ["node"],
7
+ // build-runtime.ts is executed directly by Node (the build:runtime script),
8
+ // which requires explicit `.ts` import specifiers. This package is only ever
9
+ // typechecked (--noEmit) or transpiled by Next, never emitted by tsc — so
10
+ // allowing the extension keeps the Node-run and tsc paths in agreement.
11
+ "allowImportingTsExtensions": true
12
+ },
13
+ "include": ["src/**/*.ts"]
14
+ }
@@ -0,0 +1 @@
1
+ {"fileNames":["../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.dom.iterable.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.promise.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.string.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.array.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.error.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.object.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.string.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../node_modules/.pnpm/esbuild@0.28.1/node_modules/esbuild/lib/main.d.ts","./src/kit.ts","./src/build-runtime.ts","../../node_modules/.pnpm/@vitest+pretty-format@4.1.10/node_modules/@vitest/pretty-format/dist/index.d.ts","../../node_modules/.pnpm/@vitest+utils@4.1.10/node_modules/@vitest/utils/dist/display.d.ts","../../node_modules/.pnpm/@vitest+utils@4.1.10/node_modules/@vitest/utils/dist/types.d.ts","../../node_modules/.pnpm/@vitest+utils@4.1.10/node_modules/@vitest/utils/dist/helpers.d.ts","../../node_modules/.pnpm/@vitest+utils@4.1.10/node_modules/@vitest/utils/dist/timers.d.ts","../../node_modules/.pnpm/@vitest+utils@4.1.10/node_modules/@vitest/utils/dist/index.d.ts","../../node_modules/.pnpm/@vitest+utils@4.1.10/node_modules/@vitest/utils/dist/types.d-bcelap-c.d.ts","../../node_modules/.pnpm/@vitest+utils@4.1.10/node_modules/@vitest/utils/dist/diff.d.ts","../../node_modules/.pnpm/@vitest+runner@4.1.10/node_modules/@vitest/runner/dist/tasks.d-deyaimiu.d.ts","../../node_modules/.pnpm/@vitest+runner@4.1.10/node_modules/@vitest/runner/dist/index.d.ts","../../node_modules/.pnpm/vitest@4.1.10_@types+node@25.9.5_vite@8.1.5_@types+node@25.9.5_esbuild@0.28.1_jiti@2.7.0_tsx@4.23.1_yaml@2.9.0_/node_modules/vitest/dist/chunks/traces.d.d2t_r8rx.d.ts","../../node_modules/.pnpm/vite@8.1.5_@types+node@25.9.5_esbuild@0.28.1_jiti@2.7.0_tsx@4.23.1_yaml@2.9.0/node_modules/vite/types/hmrpayload.d.ts","../../node_modules/.pnpm/vite@8.1.5_@types+node@25.9.5_esbuild@0.28.1_jiti@2.7.0_tsx@4.23.1_yaml@2.9.0/node_modules/vite/dist/node/chunks/modulerunnertransport.d.ts","../../node_modules/.pnpm/vite@8.1.5_@types+node@25.9.5_esbuild@0.28.1_jiti@2.7.0_tsx@4.23.1_yaml@2.9.0/node_modules/vite/types/customevent.d.ts","../../node_modules/.pnpm/vite@8.1.5_@types+node@25.9.5_esbuild@0.28.1_jiti@2.7.0_tsx@4.23.1_yaml@2.9.0/node_modules/vite/types/hot.d.ts","../../node_modules/.pnpm/vite@8.1.5_@types+node@25.9.5_esbuild@0.28.1_jiti@2.7.0_tsx@4.23.1_yaml@2.9.0/node_modules/vite/dist/node/module-runner.d.ts","../../node_modules/.pnpm/@vitest+snapshot@4.1.10/node_modules/@vitest/snapshot/dist/environment.d-dojxxzv9.d.ts","../../node_modules/.pnpm/@vitest+snapshot@4.1.10/node_modules/@vitest/snapshot/dist/rawsnapshot.d-d_x3-62x.d.ts","../../node_modules/.pnpm/@vitest+snapshot@4.1.10/node_modules/@vitest/snapshot/dist/index.d.ts","../../node_modules/.pnpm/vitest@4.1.10_@types+node@25.9.5_vite@8.1.5_@types+node@25.9.5_esbuild@0.28.1_jiti@2.7.0_tsx@4.23.1_yaml@2.9.0_/node_modules/vitest/dist/chunks/config.d.a1h_y6jt.d.ts","../../node_modules/.pnpm/vitest@4.1.10_@types+node@25.9.5_vite@8.1.5_@types+node@25.9.5_esbuild@0.28.1_jiti@2.7.0_tsx@4.23.1_yaml@2.9.0_/node_modules/vitest/dist/chunks/environment.d.crsxczp1.d.ts","../../node_modules/.pnpm/vitest@4.1.10_@types+node@25.9.5_vite@8.1.5_@types+node@25.9.5_esbuild@0.28.1_jiti@2.7.0_tsx@4.23.1_yaml@2.9.0_/node_modules/vitest/dist/chunks/rpc.d.b_8spu0w.d.ts","../../node_modules/.pnpm/vitest@4.1.10_@types+node@25.9.5_vite@8.1.5_@types+node@25.9.5_esbuild@0.28.1_jiti@2.7.0_tsx@4.23.1_yaml@2.9.0_/node_modules/vitest/dist/chunks/worker.d.zphpo4yb.d.ts","../../node_modules/.pnpm/vitest@4.1.10_@types+node@25.9.5_vite@8.1.5_@types+node@25.9.5_esbuild@0.28.1_jiti@2.7.0_tsx@4.23.1_yaml@2.9.0_/node_modules/vitest/dist/chunks/browser.d.bcoexmfg.d.ts","../../node_modules/.pnpm/@vitest+spy@4.1.10/node_modules/@vitest/spy/optional-types.d.ts","../../node_modules/.pnpm/@vitest+spy@4.1.10/node_modules/@vitest/spy/dist/index.d.ts","../../node_modules/.pnpm/tinyrainbow@3.1.0/node_modules/tinyrainbow/dist/index.d.ts","../../node_modules/.pnpm/@standard-schema+spec@1.1.0/node_modules/@standard-schema/spec/dist/index.d.ts","../../node_modules/.pnpm/@types+deep-eql@4.0.2/node_modules/@types/deep-eql/index.d.ts","../../node_modules/.pnpm/assertion-error@2.0.1/node_modules/assertion-error/index.d.ts","../../node_modules/.pnpm/@types+chai@5.2.3/node_modules/@types/chai/index.d.ts","../../node_modules/.pnpm/@vitest+expect@4.1.10/node_modules/@vitest/expect/dist/index.d.ts","../../node_modules/.pnpm/@vitest+runner@4.1.10/node_modules/@vitest/runner/dist/utils.d.ts","../../node_modules/.pnpm/tinybench@2.9.0/node_modules/tinybench/dist/index.d.ts","../../node_modules/.pnpm/vitest@4.1.10_@types+node@25.9.5_vite@8.1.5_@types+node@25.9.5_esbuild@0.28.1_jiti@2.7.0_tsx@4.23.1_yaml@2.9.0_/node_modules/vitest/dist/chunks/benchmark.d.daahlpsq.d.ts","../../node_modules/.pnpm/vitest@4.1.10_@types+node@25.9.5_vite@8.1.5_@types+node@25.9.5_esbuild@0.28.1_jiti@2.7.0_tsx@4.23.1_yaml@2.9.0_/node_modules/vitest/dist/chunks/global.d.dvssrdq5.d.ts","../../node_modules/.pnpm/vitest@4.1.10_@types+node@25.9.5_vite@8.1.5_@types+node@25.9.5_esbuild@0.28.1_jiti@2.7.0_tsx@4.23.1_yaml@2.9.0_/node_modules/vitest/optional-runtime-types.d.ts","../../node_modules/.pnpm/@vitest+mocker@4.1.10_vite@8.1.5_@types+node@25.9.5_esbuild@0.28.1_jiti@2.7.0_tsx@4.23.1_yaml@2.9.0_/node_modules/@vitest/mocker/dist/types.d-bji5eawu.d.ts","../../node_modules/.pnpm/@vitest+mocker@4.1.10_vite@8.1.5_@types+node@25.9.5_esbuild@0.28.1_jiti@2.7.0_tsx@4.23.1_yaml@2.9.0_/node_modules/@vitest/mocker/dist/index.d-b41z0auw.d.ts","../../node_modules/.pnpm/@vitest+mocker@4.1.10_vite@8.1.5_@types+node@25.9.5_esbuild@0.28.1_jiti@2.7.0_tsx@4.23.1_yaml@2.9.0_/node_modules/@vitest/mocker/dist/index.d.ts","../../node_modules/.pnpm/vitest@4.1.10_@types+node@25.9.5_vite@8.1.5_@types+node@25.9.5_esbuild@0.28.1_jiti@2.7.0_tsx@4.23.1_yaml@2.9.0_/node_modules/vitest/dist/chunks/suite.d.udjtyagw.d.ts","../../node_modules/.pnpm/vitest@4.1.10_@types+node@25.9.5_vite@8.1.5_@types+node@25.9.5_esbuild@0.28.1_jiti@2.7.0_tsx@4.23.1_yaml@2.9.0_/node_modules/vitest/dist/chunks/evaluatedmodules.d.bxj5omdx.d.ts","../../node_modules/.pnpm/vitest@4.1.10_@types+node@25.9.5_vite@8.1.5_@types+node@25.9.5_esbuild@0.28.1_jiti@2.7.0_tsx@4.23.1_yaml@2.9.0_/node_modules/vitest/dist/runners.d.ts","../../node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/utils.d.ts","../../node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/overloads.d.ts","../../node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/branding.d.ts","../../node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/messages.d.ts","../../node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/index.d.ts","../../node_modules/.pnpm/vitest@4.1.10_@types+node@25.9.5_vite@8.1.5_@types+node@25.9.5_esbuild@0.28.1_jiti@2.7.0_tsx@4.23.1_yaml@2.9.0_/node_modules/vitest/dist/index.d.ts","./src/index.ts","./src/build.test.ts","./src/kit.test.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/compatibility/disposable.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/compatibility/indexable.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/compatibility/index.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/globals.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/web-globals/abortcontroller.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/web-globals/domexception.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/web-globals/events.d.ts","../../node_modules/.pnpm/buffer@5.7.1/node_modules/buffer/index.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/header.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/readable.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/file.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/fetch.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/formdata.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/connector.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/client.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/errors.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/dispatcher.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/global-origin.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/pool-stats.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/pool.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/handlers.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/balanced-pool.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/agent.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-agent.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-client.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-pool.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-errors.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/proxy-agent.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/retry-handler.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/retry-agent.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/api.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/interceptors.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/util.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/cookies.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/patch.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/websocket.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/eventsource.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/filereader.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/content-type.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/cache.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/index.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/web-globals/fetch.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/web-globals/navigator.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/web-globals/storage.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/web-globals/streams.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/assert.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/assert/strict.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/async_hooks.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/buffer.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/child_process.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/cluster.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/console.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/constants.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/crypto.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/dgram.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/dns.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/dns/promises.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/domain.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/events.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/fs.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/fs/promises.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/http.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/http2.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/https.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/inspector.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/inspector.generated.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/module.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/net.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/os.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/path.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/perf_hooks.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/process.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/punycode.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/querystring.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/readline.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/readline/promises.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/repl.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/sea.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/sqlite.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/stream.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/stream/promises.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/stream/consumers.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/stream/web.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/string_decoder.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/test.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/timers.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/timers/promises.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/tls.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/trace_events.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/tty.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/url.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/util.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/v8.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/vm.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/wasi.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/worker_threads.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/zlib.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/index.d.ts"],"fileIdsList":[[120,170,187,188],[91,92,120,170,187,188],[120,167,168,170,187,188],[120,169,170,187,188],[170,187,188],[120,170,175,187,188,205],[120,170,171,176,181,187,188,190,202,213],[120,170,171,172,181,187,188,190],[115,116,117,120,170,187,188],[120,170,173,187,188,214],[120,170,174,175,182,187,188,191],[120,170,175,187,188,202,210],[120,170,176,178,181,187,188,190],[120,169,170,177,187,188],[120,170,178,179,187,188],[120,170,180,181,187,188],[120,169,170,181,187,188],[120,170,181,182,183,187,188,202,213],[120,170,181,182,183,187,188,197,202,205],[120,162,170,178,181,184,187,188,190,202,213],[120,170,181,182,184,185,187,188,190,202,210,213],[120,170,184,186,187,188,202,210,213],[118,119,120,121,122,123,124,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219],[120,170,181,187,188],[120,170,187,188,189,213],[120,170,178,181,187,188,190,202],[120,170,187,188,191],[120,170,187,188,192],[120,169,170,187,188,193],[120,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219],[120,170,187,188,195],[120,170,187,188,196],[120,170,181,187,188,197,198],[120,170,187,188,197,199,214,216],[120,170,182,187,188],[120,170,181,187,188,202,203,205],[120,170,187,188,204,205],[120,170,187,188,202,203],[120,170,187,188,205],[120,170,187,188,206],[120,167,170,187,188,202,207,213],[120,170,181,187,188,208,209],[120,170,187,188,208,209],[120,170,175,187,188,190,202,210],[120,170,187,188,211],[120,170,187,188,190,212],[120,170,184,187,188,196,213],[120,170,175,187,188,214],[120,170,187,188,202,215],[120,170,187,188,189,216],[120,170,187,188,217],[120,162,170,187,188],[120,162,170,181,183,187,188,193,202,205,213,215,216,218],[120,170,187,188,202,219],[64,70,88,89,90,93,120,170,187,188],[100,120,170,187,188],[100,101,120,170,187,188],[68,70,71,120,170,187,188],[68,70,120,170,187,188],[68,120,170,187,188],[63,68,79,80,120,170,187,188],[63,68,79,120,170,187,188],[87,120,170,187,188],[63,69,120,170,187,188],[63,120,170,187,188],[65,120,170,187,188],[63,64,65,66,67,120,170,187,188],[106,107,120,170,187,188],[106,107,108,109,120,170,187,188],[106,108,120,170,187,188],[106,120,170,187,188],[120,134,138,170,187,188,213],[120,134,170,187,188,202,213],[120,129,170,187,188],[120,131,134,170,187,188,210,213],[120,170,187,188,190,210],[120,170,187,188,220],[120,129,170,187,188,220],[120,131,134,170,187,188,190,213],[120,126,127,130,133,170,181,187,188,202,213],[120,134,141,170,187,188],[120,126,132,170,187,188],[120,134,155,156,170,187,188],[120,130,134,170,187,188,205,213,220],[120,155,170,187,188,220],[120,128,129,170,187,188,220],[120,134,170,187,188],[120,128,129,130,131,132,133,134,135,136,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,156,157,158,159,160,161,170,187,188],[120,134,149,170,187,188],[120,134,141,142,170,187,188],[120,132,134,142,143,170,187,188],[120,133,170,187,188],[120,126,129,134,170,187,188],[120,134,138,142,143,170,187,188],[120,138,170,187,188],[120,132,134,137,170,187,188,213],[120,126,131,134,141,170,187,188],[120,170,187,188,202],[120,129,134,155,170,187,188,218,220],[74,120,170,187,188],[74,75,76,77,120,170,187,188],[76,120,170,187,188],[72,95,96,98,120,170,187,188],[72,73,85,98,120,170,187,188],[63,70,72,73,81,98,120,170,187,188],[78,120,170,187,188],[63,72,73,81,94,97,98,120,170,187,188],[72,73,78,81,98,120,170,187,188],[72,95,96,97,98,120,170,187,188],[72,78,82,83,84,98,120,170,187,188],[63,68,70,72,73,78,81,82,83,84,85,86,88,94,95,96,97,98,99,102,103,104,105,110,120,170,187,188],[63,70,72,73,81,82,95,96,97,98,103,120,170,187,188],[60,61,120,170,182,187,188,189,192,213],[111,112,120,170,187,188],[60,61,120,170,187,188,192,213],[61,111,120,170,187,188]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2e80ee7a49e8ac312cc11b77f1475804bee36b3b2bc896bead8b6e1266befb43","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"161c8e0690c46021506e32fda85956d785b70f309ae97011fd27374c065cac9b","affectsGlobalScope":true,"impliedFormat":1},"c9f0a7fe85b69f0e093cf84d6d33651e2d6ae6bf88360fe77cffe92eb85a34db","ed3032d1b112879480ab6dd48bada9abdc50a3975f408473109b534000d0e9b9",{"version":"3a582c6e8906f5b094ccf0de6cc6f4f8a54b05a34f52517aba5c9c7f704f6b28","impliedFormat":99},{"version":"0528f6d21f7a02d4092895090d2dd86104bd5a3e79eced96d5a1a7dd90943d17","impliedFormat":99},{"version":"b5ce343886d23392be9c8280e9f24a87f1d7d3667f6672c2fe4aa61fa4ece7d4","impliedFormat":99},{"version":"72ce5b734c05da85c85a6f6dc05823b051d6aa41acaedeeb1d17c72f3b4efa72","impliedFormat":99},{"version":"b0857bb28fd5236ace84280f79a25093f919fd0eff13e47cc26ea03de60a7294","impliedFormat":99},{"version":"5e43e0824f10cd8c48e7a8c5c673638488925a12c31f0f9e0957965c290eb14c","impliedFormat":99},{"version":"ef13c73d6157a32933c612d476c1524dd674cf5b9a88571d7d6a0d147544d529","impliedFormat":99},{"version":"49ab4f1d153a252779958fc87b700743d32b5ffa42addd70ae23ad3f429daa5c","impliedFormat":99},{"version":"53cf4076f42b29b8d411259d168d51b3a0274c42c8814e5b44dfa8803a35d4fc","impliedFormat":99},{"version":"a39461ee1f27cf3e6cfd63d21045713d26d521da55ea4d8efccb705f689e6dbb","impliedFormat":99},{"version":"61bb64660ee150f3ab618340e15cca0a81664801bede7c966ca0eca3a952fe63","impliedFormat":99},{"version":"3b89216a7e38a454985ad17bb2ff85792837dc812f2a89fa5f60ad0a2e216fa7","impliedFormat":99},{"version":"c911b3bd083dade8fdb7775261aa25feae695d562a3b11209650b47be90043fc","impliedFormat":99},{"version":"de4a612aa8f1704af486f701e21993c786ba7d8cfed55fffa6684026aea2346e","impliedFormat":99},{"version":"4e003c868b0d8f8ad200b96cbc653e18e513fa23e1c19c4fe3cc25d4394efc47","impliedFormat":99},{"version":"d4ec151557b64ff001e06b5878e66eb98640961647b1581fe2a0a1af05f408fb","impliedFormat":99},{"version":"42a12f2faa483c9b48195ed794d22698162274e755f6e07219c2351c4f08d732","impliedFormat":99},{"version":"ec0c42bb0f465e4993f2bc68a6ce9df9a2dcbc7b83e21748f82f1b69561938e3","impliedFormat":99},{"version":"f50ff37a9cbbe74475f426474d9827083c7c2c138a954d28f1690df338f69291","impliedFormat":99},{"version":"61fd6c17235d530c40f543dd7c40afab091d91c1ef890baeed30db6d82b04b28","impliedFormat":99},{"version":"bcbd3becd08b4515225880abea0dbfbbf0d1181ce3af8f18f72f61edbe4febfb","impliedFormat":99},{"version":"091767bc841f937654ed597d49e023ed59850355e746ae1a6f20ab31076ee1fb","impliedFormat":99},{"version":"19c6d6135af59693698d384050b45a8a049493500add442f58e4bd7c8a255ab6","impliedFormat":99},{"version":"6a0dba12d55314638a8c51108b20fe2f68f1364a619d098918bda91c22dec154","impliedFormat":99},{"version":"c76c02846ba7d40b9b3488f0e8d75d02cbdee2f0bc5fcd55dd3bd2e1457646ea","impliedFormat":99},{"version":"4ead13a482c539b77394b2a97e3b877b809eac596390371cea490286f53b996a","impliedFormat":99},{"version":"06db2f8ba1d1dfacf04529cb731081ab23f133f29c7608ebdfbcab356996827c","impliedFormat":99},{"version":"bdd14f07b4eca0b4b5203b85b8dbc4d084c749fa590bee5ea613e1641dcd3b29","impliedFormat":99},{"version":"427fe2004642504828c1476d0af4270e6ad4db6de78c0b5da3e4c5ca95052a99","impliedFormat":1},{"version":"2eeffcee5c1661ddca53353929558037b8cf305ffb86a803512982f99bcab50d","impliedFormat":99},{"version":"9afb4cb864d297e4092a79ee2871b5d3143ea14153f62ef0bb04ede25f432030","affectsGlobalScope":true,"impliedFormat":99},{"version":"5c935b7fc4ddc1410ea1cd7cd4e35ed106a6e4920dd27a9480a40fd224359dc3","affectsGlobalScope":true,"impliedFormat":99},{"version":"2b39c6cf59088713babbfc3e20ee85f1375d40e66953156fa658346b8346f24f","impliedFormat":99},{"version":"69bf2422313487956e4dacf049f30cb91b34968912058d244cb19e4baa24da97","impliedFormat":99},{"version":"6987dfb4b0c4e02112cc4e548e7a77b3d9ddfeffa8c8a2db13ceac361a4567d9","impliedFormat":99},{"version":"4ffba3c5848b4fe62ee59b754fd5f256ad9656a0db6d37b9a2a8cb40dfc7ac21","impliedFormat":99},{"version":"c76c02846ba7d40b9b3488f0e8d75d02cbdee2f0bc5fcd55dd3bd2e1457646ea","impliedFormat":99},{"version":"5e2ba3d18d78aebbde1f34bde356e41e9c76eeaeaeee56a37036596a9eff4211","impliedFormat":99},{"version":"8280ae8ccc0493b32d1742d585357ab9f0a508ea050af25a5a20d64010d0a5cf","impliedFormat":99},{"version":"7adfd9f9056ecd4ae6c65fde2a98654960c662714c73f048478959d04c09e144","impliedFormat":99},{"version":"32b35cf0dc3a1b1a7118b61c34ce2ad1a29695851679f9ec34e0776f2ece2a69","impliedFormat":99},{"version":"b413fbc6658fe2774f8bf9a15cf4c53e586fc38a2d5256b3b9647da242c14389","impliedFormat":99},{"version":"59e5e964b84fdb2378e9455e4e59405030e4ed2b4c6f891ce395f17796af3cbb","impliedFormat":99},{"version":"c30a41267fc04c6518b17e55dcb2b810f267af4314b0b6d7df1c33a76ce1b330","impliedFormat":1},{"version":"72422d0bac4076912385d0c10911b82e4694fc106e2d70added091f88f0824ba","impliedFormat":1},{"version":"da251b82c25bee1d93f9fd80c5a61d945da4f708ca21285541d7aff83ecb8200","impliedFormat":1},{"version":"64db14db2bf37ac089766fdb3c7e1160fabc10e9929bc2deeede7237e4419fc8","impliedFormat":1},{"version":"98b94085c9f78eba36d3d2314affe973e8994f99864b8708122750788825c771","impliedFormat":1},{"version":"90ba95a763101bb61b8a799731a2ed60b5016b8135c1a2d5186862d4b534d4a1","impliedFormat":99},"a2266811503610a796365704939dd14ba5ed541b4bec9257b4a0560018bbd8f1","1457cf7c6c4cdfe3e3474838c2d1dc00d91c89bae2506421cc49908b2efdb344",{"version":"b3aee7252283cf61209103ca0dfbb6cf3b1dc563e7c4e461131de82840fea35f","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"6c7176368037af28cb72f2392010fa1cef295d6d6744bca8cfb54985f3a18c3e","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"437e20f2ba32abaeb7985e0afe0002de1917bc74e949ba585e49feba65da6ca1","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"98cffbf06d6bab333473c70a893770dbe990783904002c4f1a960447b4b53dca","affectsGlobalScope":true,"impliedFormat":1},{"version":"3af97acf03cc97de58a3a4bc91f8f616408099bc4233f6d0852e72a8ffb91ac9","affectsGlobalScope":true,"impliedFormat":1},{"version":"808069bba06b6768b62fd22429b53362e7af342da4a236ed2d2e1c89fcca3b4a","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"b52476feb4a0cbcb25e5931b930fc73cb6643fb1a5060bf8a3dda0eeae5b4b68","affectsGlobalScope":true,"impliedFormat":1},{"version":"f9501cc13ce624c72b61f12b3963e84fad210fbdf0ffbc4590e08460a3f04eba","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d97fb21da858fb18b8ae72c314e9743fd52f73ebe2764e12af1db32fc03f853f","affectsGlobalScope":true,"impliedFormat":1},{"version":"0fa06ada475b910e2106c98c68b10483dc8811d0c14a8a8dd36efb2672485b29","impliedFormat":1},{"version":"33e5e9aba62c3193d10d1d33ae1fa75c46a1171cf76fef750777377d53b0303f","impliedFormat":1},{"version":"2b06b93fd01bcd49d1a6bd1f9b65ddcae6480b9a86e9061634d6f8e354c1468f","impliedFormat":1},{"version":"6a0cd27e5dc2cfbe039e731cf879d12b0e2dded06d1b1dedad07f7712de0d7f4","affectsGlobalScope":true,"impliedFormat":1},{"version":"13f5c844119c43e51ce777c509267f14d6aaf31eafb2c2b002ca35584cd13b29","impliedFormat":1},{"version":"e60477649d6ad21542bd2dc7e3d9ff6853d0797ba9f689ba2f6653818999c264","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"4c829ab315f57c5442c6667b53769975acbf92003a66aef19bce151987675bd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"b2ade7657e2db96d18315694789eff2ddd3d8aea7215b181f8a0b303277cc579","impliedFormat":1},{"version":"78dbea00e90d2df8ea3dbef0cc379d95b8be9b71cd6bde4c28728f306811803b","impliedFormat":1},{"version":"4d631b81fa2f07a0e63a9a143d6a82c25c5f051298651a9b69176ba28930756d","impliedFormat":1},{"version":"836a356aae992ff3c28a0212e3eabcb76dd4b0cc06bcb9607aeef560661b860d","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"41670ee38943d9cbb4924e436f56fc19ee94232bc96108562de1a734af20dc2c","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e1e46d0a9837ee058c100501080c920fa98081ea3956af0374308ba6f22a33e","impliedFormat":1},{"version":"272ca407e0c9068bdc5152552d876e68037ceae3de62e529306403e973dec8e1","impliedFormat":1},{"version":"fa7834c715d5357e4540cee40ce96c3250ddb67a7b879a6b7fa0e86d6696f121","impliedFormat":1},{"version":"22dfb07a7ab15b66ac043829056fe70124844636ae719551812ac631ba04985b","impliedFormat":1},{"version":"a10f0e1854f3316d7ee437b79649e5a6ae3ae14ffe6322b02d4987071a95362e","impliedFormat":1},{"version":"e208f73ef6a980104304b0d2ca5f6bf1b85de6009d2c7e404028b875020fa8f2","impliedFormat":1},{"version":"d163b6bc2372b4f07260747cbc6c0a6405ab3fbcea3852305e98ac43ca59f5bc","impliedFormat":1},{"version":"e6fa9ad47c5f71ff733744a029d1dc472c618de53804eae08ffc243b936f87ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"a6f137d651076822d4fe884287e68fd61785a0d3d1fdb250a5059b691fa897db","impliedFormat":1},{"version":"24826ed94a78d5c64bd857570fdbd96229ad41b5cb654c08d75a9845e3ab7dde","impliedFormat":1},{"version":"8b479a130ccb62e98f11f136d3ac80f2984fdc07616516d29881f3061f2dd472","impliedFormat":1},{"version":"928af3d90454bf656a52a48679f199f64c1435247d6189d1caf4c68f2eaf921f","affectsGlobalScope":true,"impliedFormat":1},{"version":"bceb58df66ab8fb00170df20cd813978c5ab84be1d285710c4eb005d8e9d8efb","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"77fbe5eecb6fac4b6242bbf6eebfc43e98ce5ccba8fa44e0ef6a95c945ff4d98","impliedFormat":1},{"version":"4f9d8ca0c417b67b69eeb54c7ca1bedd7b56034bb9bfd27c5d4f3bc4692daca7","impliedFormat":1},{"version":"0cb167c371eaa8c869f8a7656a7296f2e4fae43b4d8b803a680236b24794e5f9","impliedFormat":1},{"version":"0a839dba0287cc0481ad4beedd48a1c64acf1e212ae865d1315f7007ca215161","impliedFormat":1},{"version":"38dc4655376cd1a4bd6bb3763d92949233e33d38d3dd3cbea7bbf218175a38ef","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee","impliedFormat":1},{"version":"d61e0a64cd175208ac0b83670151a9a6b5916f0d1ffcdc5c29c90b1cebfc5045","affectsGlobalScope":true,"impliedFormat":1},{"version":"18fd40412d102c5564136f29735e5d1c3b455b8a37f920da79561f1fde068208","impliedFormat":1},{"version":"48a679952eefe4cb776d5a0e1ccba2d3eb53b57448bbb7abc1fcebcbd5440188","impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"2d14da6ecb49bf828d83948765ec2d3a579d476bbb9645e749610baa6ec880ca","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"5b7aa3c4c1a5d81b411e8cb302b45507fea9358d3569196b27eb1a27ae3a90ef","affectsGlobalScope":true,"impliedFormat":1},{"version":"5987a903da92c7462e0b35704ce7da94d7fdc4b89a984871c0e2b87a8aae9e69","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea08a0345023ade2b47fbff5a76d0d0ed8bff10bc9d22b83f40858a8e941501c","impliedFormat":1},{"version":"0aef708fb4c7a6b915e8305cbfac40cd207b032dbaabe9a01889a5fff3254681","impliedFormat":1},{"version":"ae062ce7d9510060c5d7e7952ae379224fb3f8f2dd74e88959878af2057c143b","impliedFormat":1},{"version":"ad9bdafb4e7abf14cc53ce7970486a84c87831e62891e5dfe798ddcd55e84701","affectsGlobalScope":true,"impliedFormat":1},{"version":"358765d5ea8afd285d4fd1532e78b88273f18cb3f87403a9b16fef61ac9fdcfe","impliedFormat":1},{"version":"71d3ae6a5e73ca4130762560425e00984ebaff64d5353a3333d1bb7eb86ef336","impliedFormat":1}],"root":[61,62,[112,114]],"options":{"allowImportingTsExtensions":true,"declaration":true,"declarationMap":true,"esModuleInterop":true,"exactOptionalPropertyTypes":false,"module":99,"noImplicitOverride":true,"noUncheckedIndexedAccess":true,"outDir":"./dist","rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"target":9,"verbatimModuleSyntax":false},"referencedMap":[[90,1],[93,2],[91,1],[167,3],[168,3],[169,4],[120,5],[170,6],[171,7],[172,8],[115,1],[118,9],[116,1],[117,1],[173,10],[174,11],[175,12],[176,13],[177,14],[178,15],[179,15],[180,16],[181,17],[182,18],[183,19],[121,1],[119,1],[184,20],[185,21],[186,22],[220,23],[187,24],[188,1],[189,25],[190,26],[191,27],[192,28],[193,29],[194,30],[195,31],[196,32],[197,33],[198,33],[199,34],[200,1],[201,35],[202,36],[204,37],[203,38],[205,39],[206,40],[207,41],[208,42],[209,43],[210,44],[211,45],[212,46],[213,47],[214,48],[215,49],[216,50],[217,51],[122,1],[123,1],[124,1],[163,52],[164,1],[165,1],[166,39],[218,53],[219,54],[94,55],[101,56],[102,57],[100,1],[63,1],[72,58],[71,59],[95,58],[79,60],[81,61],[80,62],[88,63],[87,1],[70,64],[64,65],[66,66],[68,67],[67,1],[69,65],[65,1],[92,1],[125,1],[60,1],[108,68],[110,69],[109,70],[107,71],[106,1],[96,1],[89,1],[58,1],[59,1],[10,1],[11,1],[13,1],[12,1],[2,1],[14,1],[15,1],[16,1],[17,1],[18,1],[19,1],[20,1],[21,1],[3,1],[22,1],[23,1],[4,1],[24,1],[28,1],[25,1],[26,1],[27,1],[29,1],[30,1],[31,1],[5,1],[32,1],[33,1],[34,1],[35,1],[6,1],[39,1],[36,1],[37,1],[38,1],[40,1],[7,1],[41,1],[46,1],[47,1],[42,1],[43,1],[44,1],[45,1],[8,1],[51,1],[48,1],[49,1],[50,1],[52,1],[9,1],[53,1],[54,1],[55,1],[57,1],[56,1],[1,1],[141,72],[151,73],[140,72],[161,74],[132,75],[131,76],[160,77],[154,78],[159,79],[134,80],[148,81],[133,82],[157,83],[129,84],[128,77],[158,85],[130,86],[135,87],[136,1],[139,87],[126,1],[162,88],[152,89],[143,90],[144,91],[146,92],[142,93],[145,94],[155,77],[137,95],[138,96],[147,97],[127,98],[150,89],[149,87],[153,1],[156,99],[75,100],[78,101],[76,100],[74,1],[77,102],[97,103],[86,104],[82,105],[83,60],[104,106],[98,107],[84,108],[103,109],[73,1],[85,110],[111,111],[105,112],[99,1],[62,113],[113,114],[112,115],[114,116],[61,1]],"affectedFilesPendingEmit":[[62,51],[113,51],[112,51],[114,51],[61,51]],"version":"5.9.3"}