@agentled/cli 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +79 -0
- package/dist/client.d.ts +35 -0
- package/dist/client.js +107 -0
- package/dist/client.js.map +1 -0
- package/dist/commands/ai.d.ts +2 -0
- package/dist/commands/ai.js +34 -0
- package/dist/commands/ai.js.map +1 -0
- package/dist/commands/apps.d.ts +2 -0
- package/dist/commands/apps.js +53 -0
- package/dist/commands/apps.js.map +1 -0
- package/dist/commands/auth.d.ts +2 -0
- package/dist/commands/auth.js +247 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/chat.d.ts +12 -0
- package/dist/commands/chat.js +34 -0
- package/dist/commands/chat.js.map +1 -0
- package/dist/commands/do.d.ts +13 -0
- package/dist/commands/do.js +80 -0
- package/dist/commands/do.js.map +1 -0
- package/dist/commands/executions.d.ts +2 -0
- package/dist/commands/executions.js +143 -0
- package/dist/commands/executions.js.map +1 -0
- package/dist/commands/knowledge.d.ts +2 -0
- package/dist/commands/knowledge.js +97 -0
- package/dist/commands/knowledge.js.map +1 -0
- package/dist/commands/onboarding.d.ts +12 -0
- package/dist/commands/onboarding.js +86 -0
- package/dist/commands/onboarding.js.map +1 -0
- package/dist/commands/workflows.d.ts +2 -0
- package/dist/commands/workflows.js +429 -0
- package/dist/commands/workflows.js.map +1 -0
- package/dist/commands/workspace.d.ts +2 -0
- package/dist/commands/workspace.js +156 -0
- package/dist/commands/workspace.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.js +50 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/browser-auth.d.ts +24 -0
- package/dist/utils/browser-auth.js +172 -0
- package/dist/utils/browser-auth.js.map +1 -0
- package/dist/utils/output.d.ts +11 -0
- package/dist/utils/output.js +56 -0
- package/dist/utils/output.js.map +1 -0
- package/llms-full.txt +494 -0
- package/llms.txt +20 -0
- package/package.json +53 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Agentled CLI — Zero context-window cost access to workflows, apps, and knowledge.
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* agentled auth login --key wsk_...
|
|
7
|
+
* agentled workflows list
|
|
8
|
+
* agentled apps test web-scraping scrape --input '{"url": "..."}'
|
|
9
|
+
*
|
|
10
|
+
* Environment variables:
|
|
11
|
+
* AGENTLED_API_KEY — Workspace API key (wsk_*)
|
|
12
|
+
* AGENTLED_URL — Base URL (default: https://www.agentled.app)
|
|
13
|
+
* AGENTLED_WORKSPACE — Saved workspace id, alias, or name to target
|
|
14
|
+
*/
|
|
15
|
+
import { Command } from 'commander';
|
|
16
|
+
import { registerAuthCommands } from './commands/auth.js';
|
|
17
|
+
import { registerWorkflowCommands } from './commands/workflows.js';
|
|
18
|
+
import { registerExecutionCommands } from './commands/executions.js';
|
|
19
|
+
import { registerAppCommands } from './commands/apps.js';
|
|
20
|
+
import { registerKnowledgeCommands } from './commands/knowledge.js';
|
|
21
|
+
import { registerAiCommands } from './commands/ai.js';
|
|
22
|
+
import { registerWorkspaceCommands } from './commands/workspace.js';
|
|
23
|
+
import { registerDoCommand } from './commands/do.js';
|
|
24
|
+
import { registerChatCommands } from './commands/chat.js';
|
|
25
|
+
import { registerOnboardingCommands } from './commands/onboarding.js';
|
|
26
|
+
const program = new Command();
|
|
27
|
+
program
|
|
28
|
+
.name('agentled')
|
|
29
|
+
.description('Agentled CLI — manage workflows, apps, and knowledge. Optimized for AI agents.')
|
|
30
|
+
.version('0.1.1')
|
|
31
|
+
.option('--workspace <workspace>', 'Use a saved workspace by id, alias, or name for this command');
|
|
32
|
+
program.hook('preAction', (_thisCommand, actionCommand) => {
|
|
33
|
+
const workspace = actionCommand.optsWithGlobals().workspace;
|
|
34
|
+
if (workspace) {
|
|
35
|
+
process.env.AGENTLED_WORKSPACE = workspace;
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
// Register all command groups
|
|
39
|
+
registerAuthCommands(program);
|
|
40
|
+
registerWorkflowCommands(program);
|
|
41
|
+
registerExecutionCommands(program);
|
|
42
|
+
registerAppCommands(program);
|
|
43
|
+
registerKnowledgeCommands(program);
|
|
44
|
+
registerAiCommands(program);
|
|
45
|
+
registerWorkspaceCommands(program);
|
|
46
|
+
registerDoCommand(program);
|
|
47
|
+
registerChatCommands(program);
|
|
48
|
+
registerOnboardingCommands(program);
|
|
49
|
+
program.parse();
|
|
50
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AAEtE,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACF,IAAI,CAAC,UAAU,CAAC;KAChB,WAAW,CAAC,gFAAgF,CAAC;KAC7F,OAAO,CAAC,OAAO,CAAC;KAChB,MAAM,CAAC,yBAAyB,EAAE,8DAA8D,CAAC,CAAC;AAEvG,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,YAAY,EAAE,aAAa,EAAE,EAAE;IACtD,MAAM,SAAS,GAAG,aAAa,CAAC,eAAe,EAAE,CAAC,SAAS,CAAC;IAC5D,IAAI,SAAS,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,kBAAkB,GAAG,SAAS,CAAC;IAC/C,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,8BAA8B;AAC9B,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,wBAAwB,CAAC,OAAO,CAAC,CAAC;AAClC,yBAAyB,CAAC,OAAO,CAAC,CAAC;AACnC,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,yBAAyB,CAAC,OAAO,CAAC,CAAC;AACnC,kBAAkB,CAAC,OAAO,CAAC,CAAC;AAC5B,yBAAyB,CAAC,OAAO,CAAC,CAAC;AACnC,iBAAiB,CAAC,OAAO,CAAC,CAAC;AAC3B,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,0BAA0B,CAAC,OAAO,CAAC,CAAC;AAEpC,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser-based authentication for `agentled auth login`.
|
|
3
|
+
*
|
|
4
|
+
* 1. Starts a temporary HTTP server on localhost
|
|
5
|
+
* 2. Opens the browser to /cli/authorize?port=...&state=...
|
|
6
|
+
* 3. Waits for the callback with a signed JWT code
|
|
7
|
+
* 4. Exchanges the code for the raw API key via /api/cli/exchange
|
|
8
|
+
*
|
|
9
|
+
* Uses only Node.js built-ins (http, crypto, child_process).
|
|
10
|
+
*/
|
|
11
|
+
export interface BrowserLoginResult {
|
|
12
|
+
apiKey: string;
|
|
13
|
+
workspaceId: string;
|
|
14
|
+
workspaceName: string;
|
|
15
|
+
userId?: string;
|
|
16
|
+
userEmail?: string;
|
|
17
|
+
userName?: string;
|
|
18
|
+
isNewUser: boolean;
|
|
19
|
+
baseUrl: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Run the browser-based login flow.
|
|
23
|
+
*/
|
|
24
|
+
export declare function browserLogin(baseUrl: string): Promise<BrowserLoginResult>;
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser-based authentication for `agentled auth login`.
|
|
3
|
+
*
|
|
4
|
+
* 1. Starts a temporary HTTP server on localhost
|
|
5
|
+
* 2. Opens the browser to /cli/authorize?port=...&state=...
|
|
6
|
+
* 3. Waits for the callback with a signed JWT code
|
|
7
|
+
* 4. Exchanges the code for the raw API key via /api/cli/exchange
|
|
8
|
+
*
|
|
9
|
+
* Uses only Node.js built-ins (http, crypto, child_process).
|
|
10
|
+
*/
|
|
11
|
+
/* eslint-disable no-console */
|
|
12
|
+
import * as http from 'node:http';
|
|
13
|
+
import * as crypto from 'node:crypto';
|
|
14
|
+
import { spawn } from 'node:child_process';
|
|
15
|
+
import * as net from 'node:net';
|
|
16
|
+
const TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes
|
|
17
|
+
const PORT_RANGE_START = 9876;
|
|
18
|
+
const PORT_RANGE_END = 9999;
|
|
19
|
+
/**
|
|
20
|
+
* Find an available port in the range.
|
|
21
|
+
*/
|
|
22
|
+
function findFreePort(start, end) {
|
|
23
|
+
return new Promise((resolve, reject) => {
|
|
24
|
+
const tryPort = (port) => {
|
|
25
|
+
if (port > end) {
|
|
26
|
+
reject(new Error(`No free port found in range ${start}-${end}`));
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
const server = net.createServer();
|
|
30
|
+
server.once('error', () => tryPort(port + 1));
|
|
31
|
+
server.once('listening', () => {
|
|
32
|
+
server.close(() => resolve(port));
|
|
33
|
+
});
|
|
34
|
+
server.listen(port, '127.0.0.1');
|
|
35
|
+
};
|
|
36
|
+
tryPort(start);
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Open a URL in the user's default browser.
|
|
41
|
+
* Uses spawn with argument arrays to avoid shell injection.
|
|
42
|
+
*/
|
|
43
|
+
function openBrowser(targetUrl) {
|
|
44
|
+
const platform = process.platform;
|
|
45
|
+
let cmd;
|
|
46
|
+
let args;
|
|
47
|
+
if (platform === 'darwin') {
|
|
48
|
+
cmd = 'open';
|
|
49
|
+
args = [targetUrl];
|
|
50
|
+
}
|
|
51
|
+
else if (platform === 'win32') {
|
|
52
|
+
cmd = 'cmd';
|
|
53
|
+
args = ['/c', 'start', '', targetUrl];
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
cmd = 'xdg-open';
|
|
57
|
+
args = [targetUrl];
|
|
58
|
+
}
|
|
59
|
+
const child = spawn(cmd, args, { stdio: 'ignore', detached: true });
|
|
60
|
+
child.unref();
|
|
61
|
+
child.on('error', () => {
|
|
62
|
+
// Silently fail — the URL is printed to the terminal as fallback
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
const SUCCESS_HTML = `<!DOCTYPE html>
|
|
66
|
+
<html>
|
|
67
|
+
<head><title>Agentled CLI</title></head>
|
|
68
|
+
<body style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; display: flex; justify-content: center; align-items: center; min-height: 100vh; margin: 0; background: #f9fafb;">
|
|
69
|
+
<div style="text-align: center; padding: 2rem;">
|
|
70
|
+
<div style="width: 48px; height: 48px; margin: 0 auto 1rem; background: #d1fae5; border-radius: 50%; display: flex; align-items: center; justify-content: center;">
|
|
71
|
+
<svg width="24" height="24" fill="none" viewBox="0 0 24 24" stroke="#059669" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M5 13l4 4L19 7"/></svg>
|
|
72
|
+
</div>
|
|
73
|
+
<h1 style="font-size: 1.25rem; font-weight: 600; color: #111827; margin: 0 0 0.5rem;">Authentication Successful</h1>
|
|
74
|
+
<p style="color: #6b7280; font-size: 0.875rem;">You can close this tab and return to the CLI.</p>
|
|
75
|
+
</div>
|
|
76
|
+
</body>
|
|
77
|
+
</html>`;
|
|
78
|
+
function escapeHtml(s) {
|
|
79
|
+
return s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"');
|
|
80
|
+
}
|
|
81
|
+
const ERROR_HTML = (msg) => `<!DOCTYPE html>
|
|
82
|
+
<html>
|
|
83
|
+
<head><title>Agentled CLI</title></head>
|
|
84
|
+
<body style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; display: flex; justify-content: center; align-items: center; min-height: 100vh; margin: 0; background: #f9fafb;">
|
|
85
|
+
<div style="text-align: center; padding: 2rem;">
|
|
86
|
+
<h1 style="font-size: 1.25rem; font-weight: 600; color: #991b1b;">Authentication Failed</h1>
|
|
87
|
+
<p style="color: #6b7280; font-size: 0.875rem;">${escapeHtml(msg)}</p>
|
|
88
|
+
</div>
|
|
89
|
+
</body>
|
|
90
|
+
</html>`;
|
|
91
|
+
/**
|
|
92
|
+
* Run the browser-based login flow.
|
|
93
|
+
*/
|
|
94
|
+
export async function browserLogin(baseUrl) {
|
|
95
|
+
const state = crypto.randomBytes(16).toString('hex');
|
|
96
|
+
const port = await findFreePort(PORT_RANGE_START, PORT_RANGE_END);
|
|
97
|
+
return new Promise((resolve, reject) => {
|
|
98
|
+
let settled = false;
|
|
99
|
+
const server = http.createServer(async (req, res) => {
|
|
100
|
+
if (settled)
|
|
101
|
+
return;
|
|
102
|
+
const parsed = new URL(req.url || '', `http://127.0.0.1:${port}`);
|
|
103
|
+
if (parsed.pathname !== '/callback') {
|
|
104
|
+
res.writeHead(404);
|
|
105
|
+
res.end('Not found');
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
const callbackState = parsed.searchParams.get('state') || '';
|
|
109
|
+
const code = parsed.searchParams.get('code') || '';
|
|
110
|
+
// Verify state (CSRF protection)
|
|
111
|
+
if (callbackState !== state) {
|
|
112
|
+
res.writeHead(400, { 'Content-Type': 'text/html' });
|
|
113
|
+
res.end(ERROR_HTML('State mismatch. Possible CSRF attack.'));
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
if (!code) {
|
|
117
|
+
res.writeHead(400, { 'Content-Type': 'text/html' });
|
|
118
|
+
res.end(ERROR_HTML('No authorization code received.'));
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
// Serve success page immediately
|
|
122
|
+
res.writeHead(200, { 'Content-Type': 'text/html' });
|
|
123
|
+
res.end(SUCCESS_HTML);
|
|
124
|
+
// Exchange code for API key
|
|
125
|
+
try {
|
|
126
|
+
const exchangeRes = await fetch(`${baseUrl}/api/cli/exchange`, {
|
|
127
|
+
method: 'POST',
|
|
128
|
+
headers: { 'Content-Type': 'application/json' },
|
|
129
|
+
body: JSON.stringify({ code }),
|
|
130
|
+
});
|
|
131
|
+
if (!exchangeRes.ok) {
|
|
132
|
+
const data = await exchangeRes.json().catch(() => ({}));
|
|
133
|
+
throw new Error(data.error || `HTTP ${exchangeRes.status}`);
|
|
134
|
+
}
|
|
135
|
+
const result = await exchangeRes.json();
|
|
136
|
+
settled = true;
|
|
137
|
+
cleanup();
|
|
138
|
+
resolve(result);
|
|
139
|
+
}
|
|
140
|
+
catch (err) {
|
|
141
|
+
settled = true;
|
|
142
|
+
cleanup();
|
|
143
|
+
reject(new Error(`Code exchange failed: ${err.message}`));
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
// Timeout handler
|
|
147
|
+
const timer = setTimeout(() => {
|
|
148
|
+
if (!settled) {
|
|
149
|
+
settled = true;
|
|
150
|
+
cleanup();
|
|
151
|
+
reject(new Error('Login timed out. No response from browser within 5 minutes.'));
|
|
152
|
+
}
|
|
153
|
+
}, TIMEOUT_MS);
|
|
154
|
+
function cleanup() {
|
|
155
|
+
clearTimeout(timer);
|
|
156
|
+
server.close();
|
|
157
|
+
}
|
|
158
|
+
server.listen(port, '127.0.0.1', () => {
|
|
159
|
+
const authorizeUrl = `${baseUrl}/en/cli/authorize?port=${port}&state=${encodeURIComponent(state)}`;
|
|
160
|
+
console.error(`Opening browser to authenticate...`);
|
|
161
|
+
console.error(`If the browser doesn't open, visit:\n ${authorizeUrl}\n`);
|
|
162
|
+
openBrowser(authorizeUrl);
|
|
163
|
+
});
|
|
164
|
+
server.on('error', (err) => {
|
|
165
|
+
if (!settled) {
|
|
166
|
+
settled = true;
|
|
167
|
+
reject(new Error(`Failed to start local server: ${err.message}`));
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=browser-auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-auth.js","sourceRoot":"","sources":["../../src/utils/browser-auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Output formatting utilities.
|
|
3
|
+
*
|
|
4
|
+
* Default: JSON (optimized for AI agent parsing)
|
|
5
|
+
* --format table: Human-readable tables
|
|
6
|
+
* --format minimal: Compact single-line output for piping
|
|
7
|
+
*/
|
|
8
|
+
export type OutputFormat = 'json' | 'table' | 'minimal';
|
|
9
|
+
export declare function formatOutput(data: any, format?: OutputFormat): string;
|
|
10
|
+
export declare function printOutput(data: any, format?: OutputFormat): void;
|
|
11
|
+
export declare function printError(message: string): void;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Output formatting utilities.
|
|
3
|
+
*
|
|
4
|
+
* Default: JSON (optimized for AI agent parsing)
|
|
5
|
+
* --format table: Human-readable tables
|
|
6
|
+
* --format minimal: Compact single-line output for piping
|
|
7
|
+
*/
|
|
8
|
+
export function formatOutput(data, format = 'json') {
|
|
9
|
+
switch (format) {
|
|
10
|
+
case 'json':
|
|
11
|
+
return JSON.stringify(data, null, 2);
|
|
12
|
+
case 'minimal':
|
|
13
|
+
if (Array.isArray(data)) {
|
|
14
|
+
return data.map(item => {
|
|
15
|
+
if (typeof item === 'object' && item !== null) {
|
|
16
|
+
return item.id || item.name || JSON.stringify(item);
|
|
17
|
+
}
|
|
18
|
+
return String(item);
|
|
19
|
+
}).join('\n');
|
|
20
|
+
}
|
|
21
|
+
if (typeof data === 'object' && data !== null) {
|
|
22
|
+
return Object.entries(data)
|
|
23
|
+
.map(([k, v]) => `${k}=${typeof v === 'object' ? JSON.stringify(v) : v}`)
|
|
24
|
+
.join('\n');
|
|
25
|
+
}
|
|
26
|
+
return String(data);
|
|
27
|
+
case 'table':
|
|
28
|
+
if (Array.isArray(data) && data.length > 0) {
|
|
29
|
+
const keys = Object.keys(data[0]);
|
|
30
|
+
const widths = keys.map(k => Math.max(k.length, ...data.map(row => String(row[k] ?? '').length)));
|
|
31
|
+
// Cap column widths
|
|
32
|
+
const maxWidth = 40;
|
|
33
|
+
const cappedWidths = widths.map(w => Math.min(w, maxWidth));
|
|
34
|
+
const header = keys.map((k, i) => k.padEnd(cappedWidths[i])).join(' ');
|
|
35
|
+
const separator = cappedWidths.map(w => '-'.repeat(w)).join(' ');
|
|
36
|
+
const rows = data.map(row => keys.map((k, i) => {
|
|
37
|
+
const val = String(row[k] ?? '');
|
|
38
|
+
return val.length > maxWidth
|
|
39
|
+
? val.slice(0, maxWidth - 3) + '...'
|
|
40
|
+
: val.padEnd(cappedWidths[i]);
|
|
41
|
+
}).join(' '));
|
|
42
|
+
return [header, separator, ...rows].join('\n');
|
|
43
|
+
}
|
|
44
|
+
return formatOutput(data, 'json');
|
|
45
|
+
default:
|
|
46
|
+
return JSON.stringify(data, null, 2);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
export function printOutput(data, format = 'json') {
|
|
50
|
+
console.log(formatOutput(data, format));
|
|
51
|
+
}
|
|
52
|
+
export function printError(message) {
|
|
53
|
+
console.error(`Error: ${message}`);
|
|
54
|
+
process.exit(1);
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/utils/output.ts"],"names":[],"mappings":"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"}
|