@amodalai/core 0.1.11 → 0.1.13
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/dist/src/admin/admin-agent.d.ts +34 -0
- package/dist/src/admin/admin-agent.js +160 -0
- package/dist/src/admin/admin-agent.js.map +1 -0
- package/dist/src/admin/admin-loader.d.ts +22 -0
- package/dist/src/admin/admin-loader.js +70 -0
- package/dist/src/admin/admin-loader.js.map +1 -0
- package/dist/src/admin/index.d.ts +8 -0
- package/dist/src/admin/index.js +8 -0
- package/dist/src/admin/index.js.map +1 -0
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.js +2 -0
- package/dist/src/index.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Amodal Labs, Inc.
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Get the global cache directory for the admin agent.
|
|
8
|
+
*/
|
|
9
|
+
export declare function getAdminCacheDir(): string;
|
|
10
|
+
/**
|
|
11
|
+
* Resolve the admin agent directory. Checks in order:
|
|
12
|
+
* 1. adminAgent path from amodal.json (explicit override)
|
|
13
|
+
* 2. Global cache at ~/.amodal/admin-agent/
|
|
14
|
+
*
|
|
15
|
+
* Returns null if not found (caller should fetch).
|
|
16
|
+
*/
|
|
17
|
+
export declare function resolveAdminAgent(repoPath?: string): Promise<string | null>;
|
|
18
|
+
/**
|
|
19
|
+
* Fetch the admin agent from the registry and cache it.
|
|
20
|
+
* Returns the cache directory path.
|
|
21
|
+
*/
|
|
22
|
+
export declare function fetchAdminAgent(registryUrl?: string): Promise<string>;
|
|
23
|
+
/**
|
|
24
|
+
* Update the cached admin agent to the latest version from the registry.
|
|
25
|
+
*/
|
|
26
|
+
export declare function updateAdminAgent(registryUrl?: string): Promise<string>;
|
|
27
|
+
/**
|
|
28
|
+
* Ensure the admin agent is available. Fetches from registry if not cached.
|
|
29
|
+
*/
|
|
30
|
+
export declare function ensureAdminAgent(repoPath?: string, registryUrl?: string): Promise<string>;
|
|
31
|
+
/**
|
|
32
|
+
* Get admin agent version from the cached copy.
|
|
33
|
+
*/
|
|
34
|
+
export declare function getAdminAgentVersion(agentDir: string): Promise<string | null>;
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Amodal Labs, Inc.
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*/
|
|
6
|
+
import { execFile } from 'node:child_process';
|
|
7
|
+
import { mkdir, readdir, readFile, rm, stat } from 'node:fs/promises';
|
|
8
|
+
import * as path from 'node:path';
|
|
9
|
+
import { homedir } from 'node:os';
|
|
10
|
+
import { promisify } from 'node:util';
|
|
11
|
+
const execFileAsync = promisify(execFile);
|
|
12
|
+
const ADMIN_AGENT_NPM = '@amodalai/agent-admin';
|
|
13
|
+
const DEFAULT_REGISTRY = 'https://registry.amodalai.com';
|
|
14
|
+
const CACHE_DIR_NAME = 'admin-agent';
|
|
15
|
+
const FETCH_TIMEOUT = 30_000;
|
|
16
|
+
/**
|
|
17
|
+
* Get the global cache directory for the admin agent.
|
|
18
|
+
*/
|
|
19
|
+
export function getAdminCacheDir() {
|
|
20
|
+
return path.join(homedir(), '.amodal', CACHE_DIR_NAME);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Resolve the admin agent directory. Checks in order:
|
|
24
|
+
* 1. adminAgent path from amodal.json (explicit override)
|
|
25
|
+
* 2. Global cache at ~/.amodal/admin-agent/
|
|
26
|
+
*
|
|
27
|
+
* Returns null if not found (caller should fetch).
|
|
28
|
+
*/
|
|
29
|
+
export async function resolveAdminAgent(repoPath) {
|
|
30
|
+
// 1. Check amodal.json override
|
|
31
|
+
if (repoPath) {
|
|
32
|
+
try {
|
|
33
|
+
const configPath = path.join(repoPath, 'amodal.json');
|
|
34
|
+
const configRaw = await readFile(configPath, 'utf-8');
|
|
35
|
+
const configParsed = JSON.parse(configRaw);
|
|
36
|
+
if (!configParsed || typeof configParsed !== 'object')
|
|
37
|
+
throw new Error('invalid');
|
|
38
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- guarded above
|
|
39
|
+
const adminPath = configParsed['adminAgent'];
|
|
40
|
+
if (typeof adminPath === 'string') {
|
|
41
|
+
const resolved = path.resolve(repoPath, adminPath);
|
|
42
|
+
if (await dirHasContent(resolved)) {
|
|
43
|
+
return resolved;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
// No config or no adminAgent field
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// 2. Check global cache
|
|
52
|
+
const cacheDir = getAdminCacheDir();
|
|
53
|
+
if (await dirHasContent(cacheDir)) {
|
|
54
|
+
return cacheDir;
|
|
55
|
+
}
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Fetch the admin agent from the registry and cache it.
|
|
60
|
+
* Returns the cache directory path.
|
|
61
|
+
*/
|
|
62
|
+
export async function fetchAdminAgent(registryUrl) {
|
|
63
|
+
const registry = registryUrl ?? process.env['AMODAL_REGISTRY'] ?? DEFAULT_REGISTRY;
|
|
64
|
+
const cacheDir = getAdminCacheDir();
|
|
65
|
+
// Create a temp directory for npm pack
|
|
66
|
+
const tmpDir = path.join(homedir(), '.amodal', '.tmp-admin-fetch');
|
|
67
|
+
await mkdir(tmpDir, { recursive: true });
|
|
68
|
+
try {
|
|
69
|
+
// Download the package tarball
|
|
70
|
+
const { stdout } = await execFileAsync('npm', ['pack', ADMIN_AGENT_NPM, '--registry', registry, '--pack-destination', tmpDir, '--json'], { cwd: tmpDir, timeout: FETCH_TIMEOUT });
|
|
71
|
+
// Parse the output to find the tarball filename
|
|
72
|
+
let tarballName;
|
|
73
|
+
try {
|
|
74
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- npm pack JSON output
|
|
75
|
+
const parsed = JSON.parse(stdout);
|
|
76
|
+
tarballName = parsed[0]?.filename ?? '';
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
// Fallback: find the .tgz file in the tmp dir
|
|
80
|
+
const files = await readdir(tmpDir);
|
|
81
|
+
tarballName = files.find((f) => f.endsWith('.tgz')) ?? '';
|
|
82
|
+
}
|
|
83
|
+
if (!tarballName) {
|
|
84
|
+
throw new Error('Failed to download admin agent package');
|
|
85
|
+
}
|
|
86
|
+
const tarballPath = path.join(tmpDir, tarballName);
|
|
87
|
+
// Clear existing cache
|
|
88
|
+
await rm(cacheDir, { recursive: true, force: true });
|
|
89
|
+
await mkdir(cacheDir, { recursive: true });
|
|
90
|
+
// Extract tarball: npm pack creates package/ prefix
|
|
91
|
+
await execFileAsync('tar', ['xzf', tarballPath, '-C', cacheDir, '--strip-components=1'], {
|
|
92
|
+
timeout: 10_000,
|
|
93
|
+
});
|
|
94
|
+
// Read version for logging
|
|
95
|
+
let version = 'unknown';
|
|
96
|
+
try {
|
|
97
|
+
const pkgJson = await readFile(path.join(cacheDir, 'package.json'), 'utf-8');
|
|
98
|
+
const pkgParsed = JSON.parse(pkgJson);
|
|
99
|
+
if (pkgParsed && typeof pkgParsed === 'object') {
|
|
100
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- guarded above
|
|
101
|
+
version = String(pkgParsed['version'] ?? 'unknown');
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
// Non-fatal
|
|
106
|
+
}
|
|
107
|
+
process.stderr.write(`[admin] Cached admin agent v${version} at ${cacheDir}\n`);
|
|
108
|
+
return cacheDir;
|
|
109
|
+
}
|
|
110
|
+
finally {
|
|
111
|
+
// Cleanup temp directory
|
|
112
|
+
await rm(tmpDir, { recursive: true, force: true }).catch(() => { });
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Update the cached admin agent to the latest version from the registry.
|
|
117
|
+
*/
|
|
118
|
+
export async function updateAdminAgent(registryUrl) {
|
|
119
|
+
return fetchAdminAgent(registryUrl);
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Ensure the admin agent is available. Fetches from registry if not cached.
|
|
123
|
+
*/
|
|
124
|
+
export async function ensureAdminAgent(repoPath, registryUrl) {
|
|
125
|
+
const existing = await resolveAdminAgent(repoPath);
|
|
126
|
+
if (existing)
|
|
127
|
+
return existing;
|
|
128
|
+
return fetchAdminAgent(registryUrl);
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Get admin agent version from the cached copy.
|
|
132
|
+
*/
|
|
133
|
+
export async function getAdminAgentVersion(agentDir) {
|
|
134
|
+
try {
|
|
135
|
+
const pkgJson = await readFile(path.join(agentDir, 'package.json'), 'utf-8');
|
|
136
|
+
const parsed = JSON.parse(pkgJson);
|
|
137
|
+
if (parsed && typeof parsed === 'object') {
|
|
138
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- guarded above
|
|
139
|
+
return String(parsed['version'] ?? null);
|
|
140
|
+
}
|
|
141
|
+
return null;
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
return null;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
// --- Helpers ---
|
|
148
|
+
async function dirHasContent(dirPath) {
|
|
149
|
+
try {
|
|
150
|
+
const s = await stat(dirPath);
|
|
151
|
+
if (!s.isDirectory())
|
|
152
|
+
return false;
|
|
153
|
+
const entries = await readdir(dirPath);
|
|
154
|
+
return entries.length > 0;
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
return false;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=admin-agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-agent.js","sourceRoot":"","sources":["../../../src/admin/admin-agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Amodal Labs, Inc.
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*/
|
|
6
|
+
import type { LoadedKnowledge, LoadedSkill } from '../repo/repo-types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Content loaded from the admin agent directory.
|
|
9
|
+
*/
|
|
10
|
+
export interface AdminAgentContent {
|
|
11
|
+
/** Agent personality override (agents/main.md) */
|
|
12
|
+
agentPrompt: string | null;
|
|
13
|
+
/** Admin skills (add-connection, write-skill, etc.) */
|
|
14
|
+
skills: LoadedSkill[];
|
|
15
|
+
/** Admin knowledge (schemas, patterns, common mistakes) */
|
|
16
|
+
knowledge: LoadedKnowledge[];
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Load the admin agent content from a directory.
|
|
20
|
+
* The directory should contain agents/, skills/, and knowledge/ subdirs.
|
|
21
|
+
*/
|
|
22
|
+
export declare function loadAdminAgent(agentDir: string): Promise<AdminAgentContent>;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Amodal Labs, Inc.
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*/
|
|
6
|
+
import { readFile, readdir } from 'node:fs/promises';
|
|
7
|
+
import * as path from 'node:path';
|
|
8
|
+
import { parseSkill, parseKnowledge } from '../repo/parsers.js';
|
|
9
|
+
/**
|
|
10
|
+
* Load the admin agent content from a directory.
|
|
11
|
+
* The directory should contain agents/, skills/, and knowledge/ subdirs.
|
|
12
|
+
*/
|
|
13
|
+
export async function loadAdminAgent(agentDir) {
|
|
14
|
+
const skills = [];
|
|
15
|
+
const knowledge = [];
|
|
16
|
+
// Load agent prompt
|
|
17
|
+
let agentPrompt = null;
|
|
18
|
+
try {
|
|
19
|
+
agentPrompt = await readFile(path.join(agentDir, 'agents', 'main.md'), 'utf-8');
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
// No agent override
|
|
23
|
+
}
|
|
24
|
+
// Load skills
|
|
25
|
+
const skillsDir = path.join(agentDir, 'skills');
|
|
26
|
+
try {
|
|
27
|
+
const skillDirs = await readdir(skillsDir, { withFileTypes: true });
|
|
28
|
+
for (const entry of skillDirs) {
|
|
29
|
+
if (!entry.isDirectory())
|
|
30
|
+
continue;
|
|
31
|
+
const skillPath = path.join(skillsDir, entry.name, 'SKILL.md');
|
|
32
|
+
try {
|
|
33
|
+
const content = await readFile(skillPath, 'utf-8');
|
|
34
|
+
const skill = parseSkill(content, skillPath);
|
|
35
|
+
if (skill)
|
|
36
|
+
skills.push(skill);
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
// Skip invalid skills
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
// No skills directory
|
|
45
|
+
}
|
|
46
|
+
// Load knowledge
|
|
47
|
+
const kbDir = path.join(agentDir, 'knowledge');
|
|
48
|
+
try {
|
|
49
|
+
const kbFiles = await readdir(kbDir, { withFileTypes: true });
|
|
50
|
+
for (const entry of kbFiles) {
|
|
51
|
+
if (!entry.isFile() || !entry.name.endsWith('.md'))
|
|
52
|
+
continue;
|
|
53
|
+
const filePath = path.join(kbDir, entry.name);
|
|
54
|
+
try {
|
|
55
|
+
const content = await readFile(filePath, 'utf-8');
|
|
56
|
+
const name = entry.name.replace(/\.md$/, '');
|
|
57
|
+
const doc = parseKnowledge(content, name, filePath);
|
|
58
|
+
knowledge.push(doc);
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
// Skip invalid docs
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
// No knowledge directory
|
|
67
|
+
}
|
|
68
|
+
return { agentPrompt, skills, knowledge };
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=admin-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-loader.js","sourceRoot":"","sources":["../../../src/admin/admin-loader.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAC,QAAQ,EAAE,OAAO,EAAC,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAC,UAAU,EAAE,cAAc,EAAC,MAAM,oBAAoB,CAAC;AAe9D;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAgB;IACnD,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,MAAM,SAAS,GAAsB,EAAE,CAAC;IAExC,oBAAoB;IACpB,IAAI,WAAW,GAAkB,IAAI,CAAC;IACtC,IAAI,CAAC;QACH,WAAW,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC;IAClF,CAAC;IAAC,MAAM,CAAC;QACP,oBAAoB;IACtB,CAAC;IAED,cAAc;IACd,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAChD,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,SAAS,EAAE,EAAC,aAAa,EAAE,IAAI,EAAC,CAAC,CAAC;QAClE,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;YAC9B,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;gBAAE,SAAS;YACnC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;YAC/D,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;gBACnD,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;gBAC7C,IAAI,KAAK;oBAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAChC,CAAC;YAAC,MAAM,CAAC;gBACP,sBAAsB;YACxB,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,sBAAsB;IACxB,CAAC;IAED,iBAAiB;IACjB,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAC/C,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,KAAK,EAAE,EAAC,aAAa,EAAE,IAAI,EAAC,CAAC,CAAC;QAC5D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAAE,SAAS;YAC7D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAC9C,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAClD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;gBAC7C,MAAM,GAAG,GAAG,cAAc,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;gBACpD,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACtB,CAAC;YAAC,MAAM,CAAC;gBACP,oBAAoB;YACtB,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,yBAAyB;IAC3B,CAAC;IAED,OAAO,EAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAC,CAAC;AAC1C,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Amodal Labs, Inc.
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*/
|
|
6
|
+
export { resolveAdminAgent, fetchAdminAgent, updateAdminAgent, ensureAdminAgent, getAdminAgentVersion, getAdminCacheDir, } from './admin-agent.js';
|
|
7
|
+
export { loadAdminAgent } from './admin-loader.js';
|
|
8
|
+
export type { AdminAgentContent } from './admin-loader.js';
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Amodal Labs, Inc.
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*/
|
|
6
|
+
export { resolveAdminAgent, fetchAdminAgent, updateAdminAgent, ensureAdminAgent, getAdminAgentVersion, getAdminCacheDir, } from './admin-agent.js';
|
|
7
|
+
export { loadAdminAgent } from './admin-loader.js';
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/admin/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAC,cAAc,EAAC,MAAM,mBAAmB,CAAC"}
|
package/dist/src/index.d.ts
CHANGED
package/dist/src/index.js
CHANGED
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,uEAAuE;AACvE,cAAc,yBAAyB,CAAC;AAExC,qBAAqB;AACrB,OAAO,EACL,YAAY,GAGb,MAAM,oBAAoB,CAAC;AAG5B,oBAAoB;AACpB,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAE7D,oBAAoB;AACpB,OAAO,EACL,2BAA2B,EAC3B,wBAAwB,EACxB,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,8BAA8B,CAAC;AAEtC,0BAA0B;AAC1B,OAAO,EACL,6BAA6B,EAC7B,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,qCAAqC,CAAC;AAK7C,iBAAiB;AACjB,cAAc,sBAAsB,CAAC;AAErC,UAAU;AACV,cAAc,oBAAoB,CAAC;AAEnC,6BAA6B;AAC7B,cAAc,qBAAqB,CAAC;AAEpC,gBAAgB;AAChB,cAAc,kBAAkB,CAAC;AAEjC,wBAAwB;AACxB,cAAc,qBAAqB,CAAC;AAEpC,uCAAuC;AACvC,cAAc,sBAAsB,CAAC;AAErC,iCAAiC;AACjC,cAAc,kBAAkB,CAAC;AAEjC,gCAAgC;AAChC,cAAc,iBAAiB,CAAC;AAEhC,oBAAoB;AACpB,cAAc,mBAAmB,CAAC;AAElC,qBAAqB;AACrB,cAAc,qBAAqB,CAAC;AAEpC,0BAA0B;AAC1B,cAAc,qBAAqB,CAAC;AAEpC,mBAAmB;AACnB,cAAc,oBAAoB,CAAC;AAEnC,8BAA8B;AAC9B,cAAc,qBAAqB,CAAC;AAEpC,sBAAsB;AACtB,cAAc,iBAAiB,CAAC;AAEhC,+BAA+B;AAC/B,cAAc,8BAA8B,CAAC;AAE7C,0FAA0F;AAC1F,cAAc,wCAAwC,CAAC;AAEvD,wBAAwB;AACxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAEjE,cAAc;AACd,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAEpF,oBAAoB;AACpB,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,+BAA+B,CAAC;AAE9C,yBAAyB;AACzB,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAE1E,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD,qBAAqB;AACrB,cAAc,gBAAgB,CAAC;AAE/B,WAAW;AACX,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,uEAAuE;AACvE,cAAc,yBAAyB,CAAC;AAExC,qBAAqB;AACrB,OAAO,EACL,YAAY,GAGb,MAAM,oBAAoB,CAAC;AAG5B,oBAAoB;AACpB,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAE7D,oBAAoB;AACpB,OAAO,EACL,2BAA2B,EAC3B,wBAAwB,EACxB,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,8BAA8B,CAAC;AAEtC,0BAA0B;AAC1B,OAAO,EACL,6BAA6B,EAC7B,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,qCAAqC,CAAC;AAK7C,iBAAiB;AACjB,cAAc,sBAAsB,CAAC;AAErC,UAAU;AACV,cAAc,oBAAoB,CAAC;AAEnC,6BAA6B;AAC7B,cAAc,qBAAqB,CAAC;AAEpC,gBAAgB;AAChB,cAAc,kBAAkB,CAAC;AAEjC,wBAAwB;AACxB,cAAc,qBAAqB,CAAC;AAEpC,uCAAuC;AACvC,cAAc,sBAAsB,CAAC;AAErC,iCAAiC;AACjC,cAAc,kBAAkB,CAAC;AAEjC,gCAAgC;AAChC,cAAc,iBAAiB,CAAC;AAEhC,oBAAoB;AACpB,cAAc,mBAAmB,CAAC;AAElC,qBAAqB;AACrB,cAAc,qBAAqB,CAAC;AAEpC,0BAA0B;AAC1B,cAAc,qBAAqB,CAAC;AAEpC,mBAAmB;AACnB,cAAc,oBAAoB,CAAC;AAEnC,8BAA8B;AAC9B,cAAc,qBAAqB,CAAC;AAEpC,sBAAsB;AACtB,cAAc,iBAAiB,CAAC;AAEhC,+BAA+B;AAC/B,cAAc,8BAA8B,CAAC;AAE7C,0FAA0F;AAC1F,cAAc,wCAAwC,CAAC;AAEvD,wBAAwB;AACxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAEjE,cAAc;AACd,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAEpF,oBAAoB;AACpB,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,+BAA+B,CAAC;AAE9C,yBAAyB;AACzB,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAE1E,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD,qBAAqB;AACrB,cAAc,gBAAgB,CAAC;AAE/B,WAAW;AACX,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEpC,cAAc;AACd,cAAc,kBAAkB,CAAC"}
|