rantera 0.0.0-stage → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,11 @@
1
+ import { type WakandaMessage } from "./api.js";
2
+ export interface AgentOptions {
3
+ cwd: string;
4
+ model?: string;
5
+ system?: string;
6
+ onText?: (text: string) => void;
7
+ onToolCall?: (name: string, args: Record<string, unknown>) => void;
8
+ onToolResult?: (name: string, output: string, ok: boolean) => void;
9
+ }
10
+ export declare function runAgent(userMessage: string, history: WakandaMessage[], opts: AgentOptions): Promise<string>;
11
+ //# sourceMappingURL=agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,cAAc,EAAE,MAAM,UAAU,CAAA;AAM/D,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAM,MAAM,CAAA;IACf,KAAK,CAAC,EAAG,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAQ,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IACrC,UAAU,CAAC,EAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA;IACpE,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,KAAK,IAAI,CAAA;CACnE;AAED,wBAAsB,QAAQ,CAC5B,WAAW,EAAE,MAAM,EACnB,OAAO,EAAM,cAAc,EAAE,EAC7B,IAAI,EAAS,YAAY,GACxB,OAAO,CAAC,MAAM,CAAC,CAoEjB"}
package/dist/agent.js ADDED
@@ -0,0 +1,65 @@
1
+ import { streamAgentTurn } from "./api.js";
2
+ import { executeTool } from "./tools/index.js";
3
+ import { printError } from "./ui.js";
4
+ const MAX_STEPS = 8;
5
+ export async function runAgent(userMessage, history, opts) {
6
+ const messages = [
7
+ ...history,
8
+ { role: "user", content: userMessage },
9
+ ];
10
+ const streamOpts = {
11
+ model: opts.model,
12
+ system: opts.system,
13
+ };
14
+ let steps = 0;
15
+ let finalText = "";
16
+ while (steps < MAX_STEPS) {
17
+ let toolCall = null;
18
+ let textAccum = "";
19
+ for await (const chunk of streamAgentTurn(messages, streamOpts)) {
20
+ if (chunk.type === "text" && chunk.text) {
21
+ textAccum += chunk.text;
22
+ opts.onText?.(chunk.text);
23
+ }
24
+ else if (chunk.type === "tool_call" && chunk.tool) {
25
+ toolCall = chunk.tool;
26
+ opts.onToolCall?.(chunk.tool.name, chunk.tool.args);
27
+ }
28
+ else if (chunk.type === "tool_result_inline") {
29
+ const result = chunk.result ?? "";
30
+ opts.onToolResult?.(chunk.tool_name, result, true);
31
+ messages.push({ role: "assistant", content: "" });
32
+ messages.push({ role: "tool_result", tool_name: chunk.tool_name, content: result });
33
+ }
34
+ else if (chunk.type === "error") {
35
+ printError(chunk.text ?? "Unknown error");
36
+ return finalText;
37
+ }
38
+ }
39
+ if (textAccum && !toolCall) {
40
+ finalText = textAccum;
41
+ break;
42
+ }
43
+ if (!toolCall)
44
+ break;
45
+ steps++;
46
+ const { output, ok } = await executeTool(toolCall.name, toolCall.args, opts.cwd);
47
+ opts.onToolResult?.(toolCall.name, output, ok);
48
+ messages.push({ role: "assistant", content: textAccum || "" });
49
+ messages.push({ role: "tool_result", tool_name: toolCall.name, content: output });
50
+ }
51
+ if (!finalText && steps >= MAX_STEPS) {
52
+ messages.push({
53
+ role: "user",
54
+ content: "You've reached the step limit. Summarize what you found and give your final answer now.",
55
+ });
56
+ for await (const chunk of streamAgentTurn(messages, streamOpts)) {
57
+ if (chunk.type === "text" && chunk.text) {
58
+ finalText += chunk.text;
59
+ opts.onText?.(chunk.text);
60
+ }
61
+ }
62
+ }
63
+ return finalText;
64
+ }
65
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
package/dist/api.d.ts ADDED
@@ -0,0 +1,22 @@
1
+ export interface WakandaMessage {
2
+ role: "user" | "assistant" | "tool_result";
3
+ content?: string;
4
+ tool_name?: string;
5
+ }
6
+ export interface ToolCall {
7
+ name: string;
8
+ args: Record<string, unknown>;
9
+ }
10
+ export interface ApiChunk {
11
+ type: "text" | "tool_call" | "tool_result_inline" | "error";
12
+ text?: string;
13
+ tool?: ToolCall;
14
+ tool_name?: string;
15
+ result?: string;
16
+ }
17
+ export interface StreamOptions {
18
+ model?: string;
19
+ system?: string;
20
+ }
21
+ export declare function streamAgentTurn(messages: WakandaMessage[], opts?: StreamOptions): AsyncGenerator<ApiChunk>;
22
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,aAAa,CAAA;IAC1C,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC9B;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,oBAAoB,GAAG,OAAO,CAAA;IAC3D,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,QAAQ,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAG,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,wBAAuB,eAAe,CACpC,QAAQ,EAAE,cAAc,EAAE,EAC1B,IAAI,GAAE,aAAkB,GACvB,cAAc,CAAC,QAAQ,CAAC,CAyH1B"}
package/dist/api.js ADDED
@@ -0,0 +1,114 @@
1
+ import { loadConfig, getApiKey } from "./config.js";
2
+ export async function* streamAgentTurn(messages, opts = {}) {
3
+ const apiKey = getApiKey();
4
+ if (!apiKey) {
5
+ yield { type: "error", text: "Not authenticated. Run `rantera auth login` first." };
6
+ return;
7
+ }
8
+ const config = loadConfig();
9
+ const url = `${config.apiUrl}/api/wakanda/agent`;
10
+ let res;
11
+ try {
12
+ res = await fetch(url, {
13
+ method: "POST",
14
+ headers: {
15
+ "Content-Type": "application/json",
16
+ Authorization: `Bearer ${apiKey}`,
17
+ },
18
+ body: JSON.stringify({
19
+ messages,
20
+ ...(opts.model && { model: opts.model }),
21
+ ...(opts.system && { system: opts.system }),
22
+ }),
23
+ });
24
+ }
25
+ catch (err) {
26
+ const isNetworkErr = String(err).includes("fetch failed") || String(err).includes("ECONNREFUSED");
27
+ if (isNetworkErr) {
28
+ const isLocal = url.includes("localhost") || url.includes("127.0.0.1");
29
+ const hint = isLocal
30
+ ? "Make sure your local server is running."
31
+ : "Check your connection, or point to a local server:\n rantera config set-url http://localhost:3000";
32
+ yield { type: "error", text: `Cannot reach the Rantera API at ${url}.\n${hint}` };
33
+ }
34
+ else {
35
+ yield { type: "error", text: `Could not reach Rantera API: ${err}` };
36
+ }
37
+ return;
38
+ }
39
+ if (!res.ok) {
40
+ const body = await res.text().catch(() => "");
41
+ yield { type: "error", text: `API error ${res.status}: ${body}` };
42
+ return;
43
+ }
44
+ if (!res.body) {
45
+ yield { type: "error", text: "No response body from API." };
46
+ return;
47
+ }
48
+ const reader = res.body.getReader();
49
+ const decoder = new TextDecoder();
50
+ let buffer = "";
51
+ while (true) {
52
+ const { done, value } = await reader.read();
53
+ if (done)
54
+ break;
55
+ buffer += decoder.decode(value, { stream: true });
56
+ // Process complete lines / sentinels out of the buffer
57
+ while (true) {
58
+ const toolIdx = buffer.indexOf("\n__WAKANDA_TOOL__:");
59
+ const resultIdx = buffer.indexOf("\n__WAKANDA_TOOL_RESULT__:");
60
+ if (toolIdx === -1 && resultIdx === -1) {
61
+ // No more sentinels — yield any accumulated plain text
62
+ // Keep a small tail in the buffer in case a sentinel is mid-arrival
63
+ const tail = 32;
64
+ if (buffer.length > tail) {
65
+ yield { type: "text", text: buffer.slice(0, buffer.length - tail) };
66
+ buffer = buffer.slice(buffer.length - tail);
67
+ }
68
+ break;
69
+ }
70
+ // Find the first sentinel
71
+ const nextIdx = toolIdx !== -1 && (resultIdx === -1 || toolIdx < resultIdx)
72
+ ? toolIdx
73
+ : resultIdx;
74
+ const isTool = nextIdx === toolIdx;
75
+ // Yield text before the sentinel
76
+ if (nextIdx > 0) {
77
+ yield { type: "text", text: buffer.slice(0, nextIdx) };
78
+ }
79
+ // Find the end of the sentinel line
80
+ const lineStart = nextIdx + 1;
81
+ const lineEnd = buffer.indexOf("\n", lineStart);
82
+ if (lineEnd === -1) {
83
+ // Sentinel not yet complete — wait for more data
84
+ buffer = buffer.slice(nextIdx);
85
+ break;
86
+ }
87
+ const line = buffer.slice(lineStart, lineEnd);
88
+ buffer = buffer.slice(lineEnd + 1);
89
+ const prefix = isTool ? "__WAKANDA_TOOL__:" : "__WAKANDA_TOOL_RESULT__:";
90
+ const json = line.slice(prefix.length);
91
+ try {
92
+ const parsed = JSON.parse(json);
93
+ if (isTool) {
94
+ yield { type: "tool_call", tool: { name: parsed.name, args: parsed.args } };
95
+ }
96
+ else {
97
+ yield {
98
+ type: "tool_result_inline",
99
+ tool_name: parsed.name,
100
+ result: parsed.result,
101
+ };
102
+ }
103
+ }
104
+ catch {
105
+ yield { type: "text", text: line };
106
+ }
107
+ }
108
+ }
109
+ // Flush remaining buffer
110
+ if (buffer.trim()) {
111
+ yield { type: "text", text: buffer };
112
+ }
113
+ }
114
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
package/dist/auth.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ export declare function login(apiUrl: string): Promise<void>;
2
+ export declare function logout(): Promise<void>;
3
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AA4FA,wBAAsB,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAuCzD;AAED,wBAAsB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAI5C"}
package/dist/auth.js ADDED
@@ -0,0 +1,131 @@
1
+ import chalk from "chalk";
2
+ import { spawn } from "child_process";
3
+ import { createServer } from "http";
4
+ import { loadConfig, saveConfig } from "./config.js";
5
+ const SUCCESS_PAGE = `<!DOCTYPE html>
6
+ <html lang="en">
7
+ <head>
8
+ <meta charset="UTF-8" />
9
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
10
+ <title>Rantera CLI — Authenticated</title>
11
+ <style>
12
+ *{margin:0;padding:0;box-sizing:border-box}
13
+ body{min-height:100vh;background:#0a0f0a;display:flex;align-items:center;justify-content:center;font-family:'Inter','Segoe UI',sans-serif;color:#fff}
14
+ .card{text-align:center;max-width:400px;padding:48px 32px}
15
+ .icon{width:72px;height:72px;border-radius:50%;background:rgba(0,107,63,.15);border:2px solid #006B3F;display:flex;align-items:center;justify-content:center;margin:0 auto 28px}
16
+ h1{font-size:22px;font-weight:700;color:#FCD116;margin-bottom:12px}
17
+ p{font-size:15px;color:#64748b;line-height:1.6;margin-bottom:8px}
18
+ code{color:#FCD116;background:rgba(252,209,22,.1);padding:2px 8px;border-radius:4px;font-size:14px}
19
+ .flags{display:flex;justify-content:center;gap:6px;margin-top:48px}
20
+ .bar{width:24px;height:3px;border-radius:2px;opacity:.6}
21
+ </style>
22
+ </head>
23
+ <body>
24
+ <div class="card">
25
+ <div class="icon">
26
+ <svg width="32" height="32" viewBox="0 0 24 24" fill="none">
27
+ <polyline points="20 6 9 17 4 12" stroke="#006B3F" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
28
+ </svg>
29
+ </div>
30
+ <h1>You're in.</h1>
31
+ <p>Rantera CLI is now authenticated.</p>
32
+ <p>You can close this tab and go back to your terminal.</p>
33
+ <p style="margin-top:16px;color:#334155;font-size:13px">Run <code>rantera</code> to start building.</p>
34
+ <div class="flags">
35
+ <div class="bar" style="background:#006B3F"></div>
36
+ <div class="bar" style="background:#FCD116"></div>
37
+ <div class="bar" style="background:#CE1126"></div>
38
+ </div>
39
+ </div>
40
+ </body>
41
+ </html>`;
42
+ const ERROR_PAGE = `<!DOCTYPE html>
43
+ <html lang="en">
44
+ <head>
45
+ <meta charset="UTF-8" />
46
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
47
+ <title>Rantera CLI — Login Failed</title>
48
+ <style>
49
+ *{margin:0;padding:0;box-sizing:border-box}
50
+ body{min-height:100vh;background:#0a0f0a;display:flex;align-items:center;justify-content:center;font-family:'Inter','Segoe UI',sans-serif;color:#fff}
51
+ .card{text-align:center;max-width:400px;padding:48px 32px}
52
+ .icon{width:72px;height:72px;border-radius:50%;background:rgba(206,17,38,.1);border:2px solid #CE1126;display:flex;align-items:center;justify-content:center;margin:0 auto 28px}
53
+ h1{font-size:20px;font-weight:700;color:#CE1126;margin-bottom:12px}
54
+ p{font-size:14px;color:#64748b;line-height:1.6;margin-bottom:8px}
55
+ code{color:#FCD116;background:rgba(252,209,22,.1);padding:2px 8px;border-radius:4px;font-size:14px}
56
+ .flags{display:flex;justify-content:center;gap:6px;margin-top:48px}
57
+ .bar{width:24px;height:3px;border-radius:2px;opacity:.6}
58
+ </style>
59
+ </head>
60
+ <body>
61
+ <div class="card">
62
+ <div class="icon">
63
+ <svg width="28" height="28" viewBox="0 0 24 24" fill="none">
64
+ <line x1="18" y1="6" x2="6" y2="18" stroke="#CE1126" stroke-width="2.5" stroke-linecap="round"/>
65
+ <line x1="6" y1="6" x2="18" y2="18" stroke="#CE1126" stroke-width="2.5" stroke-linecap="round"/>
66
+ </svg>
67
+ </div>
68
+ <h1>Login failed</h1>
69
+ <p>Something went wrong during authentication.</p>
70
+ <p>Close this tab and run <code>rantera auth login</code> to try again.</p>
71
+ <div class="flags">
72
+ <div class="bar" style="background:#006B3F"></div>
73
+ <div class="bar" style="background:#FCD116"></div>
74
+ <div class="bar" style="background:#CE1126"></div>
75
+ </div>
76
+ </div>
77
+ </body>
78
+ </html>`;
79
+ function openBrowser(url) {
80
+ // spawn + detached + stdio ignore = fire-and-forget, no blocking
81
+ if (process.platform === "win32") {
82
+ spawn("cmd.exe", ["/c", "start", "", url], { detached: true, stdio: "ignore" }).unref();
83
+ }
84
+ else if (process.platform === "darwin") {
85
+ spawn("open", [url], { detached: true, stdio: "ignore" }).unref();
86
+ }
87
+ else {
88
+ spawn("xdg-open", [url], { detached: true, stdio: "ignore" }).unref();
89
+ }
90
+ }
91
+ export async function login(apiUrl) {
92
+ const token = await new Promise((resolve, reject) => {
93
+ const server = createServer((req, res) => {
94
+ const reqUrl = new URL(req.url ?? "/", "http://localhost:9876");
95
+ const token = reqUrl.searchParams.get("token");
96
+ res.writeHead(200, { "Content-Type": "text/html; charset=utf-8" });
97
+ if (token) {
98
+ res.end(SUCCESS_PAGE);
99
+ server.close();
100
+ resolve(token);
101
+ }
102
+ else {
103
+ res.end(ERROR_PAGE);
104
+ server.close();
105
+ reject(new Error("No token received from Rantera"));
106
+ }
107
+ });
108
+ server.listen(9876, () => {
109
+ const callbackUrl = "http://localhost:9876";
110
+ const authUrl = `${apiUrl}/app/wakanda/cli-callback?callback=${encodeURIComponent(callbackUrl)}`;
111
+ console.log(chalk.hex("#FCD116")("\n Opening Rantera in your browser...\n"));
112
+ console.log(chalk.dim(" If the browser didn't open, visit:"));
113
+ console.log(" " + chalk.hex("#FCD116").underline(authUrl) + "\n");
114
+ openBrowser(authUrl);
115
+ });
116
+ setTimeout(() => {
117
+ server.close();
118
+ reject(new Error("Login timed out after 5 minutes. Try again."));
119
+ }, 5 * 60 * 1000);
120
+ });
121
+ const config = loadConfig();
122
+ config.apiKey = token;
123
+ config.apiUrl = apiUrl;
124
+ saveConfig(config);
125
+ }
126
+ export async function logout() {
127
+ const config = loadConfig();
128
+ delete config.apiKey;
129
+ saveConfig(config);
130
+ }
131
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export interface WakandaConfig {
2
+ apiKey?: string;
3
+ apiUrl: string;
4
+ model?: string;
5
+ }
6
+ export declare function loadConfig(): WakandaConfig;
7
+ export declare function saveConfig(config: WakandaConfig): void;
8
+ export declare function getApiKey(): string | undefined;
9
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,EAAG,MAAM,CAAA;IACf,KAAK,CAAC,EAAG,MAAM,CAAA;CAChB;AAOD,wBAAgB,UAAU,IAAI,aAAa,CAQ1C;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAGtD;AAED,wBAAgB,SAAS,IAAI,MAAM,GAAG,SAAS,CAE9C"}
package/dist/config.js ADDED
@@ -0,0 +1,29 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
2
+ import { homedir } from "os";
3
+ import { join } from "path";
4
+ const CONFIG_DIR = join(homedir(), ".wakanda");
5
+ const CONFIG_FILE = join(CONFIG_DIR, "config.json");
6
+ const DEFAULTS = {
7
+ apiUrl: "https://rantera.ai",
8
+ model: "hira",
9
+ };
10
+ export function loadConfig() {
11
+ if (!existsSync(CONFIG_FILE))
12
+ return { ...DEFAULTS };
13
+ try {
14
+ const raw = readFileSync(CONFIG_FILE, "utf-8");
15
+ return { ...DEFAULTS, ...JSON.parse(raw) };
16
+ }
17
+ catch {
18
+ return { ...DEFAULTS };
19
+ }
20
+ }
21
+ export function saveConfig(config) {
22
+ if (!existsSync(CONFIG_DIR))
23
+ mkdirSync(CONFIG_DIR, { recursive: true });
24
+ writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2), "utf-8");
25
+ }
26
+ export function getApiKey() {
27
+ return process.env.WAKANDA_API_KEY ?? loadConfig().apiKey;
28
+ }
29
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,IAAI,CAAA;AACvE,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAA;AAC5B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAE3B,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAA;AAC9C,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAA;AAQnD,MAAM,QAAQ,GAAkB;IAC9B,MAAM,EAAE,oBAAoB;IAC5B,KAAK,EAAG,MAAM;CACf,CAAA;AAED,MAAM,UAAU,UAAU;IACxB,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,EAAE,GAAG,QAAQ,EAAE,CAAA;IACpD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;QAC9C,OAAO,EAAE,GAAG,QAAQ,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAA;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,GAAG,QAAQ,EAAE,CAAA;IACxB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAqB;IAC9C,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACvE,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;AACtE,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,OAAO,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,UAAU,EAAE,CAAC,MAAM,CAAA;AAC3D,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}